Crear los mensuales a partir de los marcadores de hora de los operadores

En este ejemplo, crearemos un documento directamente en la base de datos. Crearemos uno para cada uno de nuestros operadores e insertaremos las horas trabajadas para un mes determinado. Dada la operación a realizar, este script es una acción asociada directamente con el programa.

Grupo ScriptEvento
ProgramaAcción Programa
output.clear()
finestra = program.newdataform()
dataform.settitle("Select month")
months = {"January","February","March","April","May","June","July","August","September","October","November","December"}
actualmonth = utility.datemonth(utility.getnow())
actualyear = utility.dateyear(utility.getnow())
actualmonths = null

if actualmonth == 1 then actualmonths = "January" end
if actualmonth == 2 then actualmonths = "February" end
if actualmonth == 3 then actualmonths = "March" end
if actualmonth == 4 then actualmonths = "April" end
if actualmonth == 5 then actualmonths = "May" end
if actualmonth == 6 then actualmonths = "June" end
if actualmonth == 7 then actualmonths = "July" end
if actualmonth == 8 then actualmonths = "August" end
if actualmonth == 9 then actualmonths = "September" end
if actualmonth == 10 then actualmonths = "October" end
if actualmonth == 11 then actualmonths = "November" end
if actualmonth == 12 then actualmonths = "December" end

dataform.addfieldlist("Month","MONTH",months,actualmonths)
dataform.addfieldinteger("Year","YEAR",actualyear)
dataform.show()

if dataform.closewithx == true then
        do return end
end

Primero creamos un dataform para preguntarle al usuario qué mes y año debemos analizar. Para mayor comodidad, estableceremos los valores de defecto para el mes y año actuales.

En el caso de que el usuario cierre la forma de datos con la x, una buena regla general será bloquear la ejecución del script.

table_rows = database.getsql("SELECT * FROM work_hour WHERE eli=0")
rows = table_rows.getrows()
for i = 1,table_rows.countrows() do
        m = utility.datemonth(rows[i].getvalue("date"))
        y = utility.dateyear(rows[i].getvalue("date"))
        wrk = rows[i].getvalue("gguid_worker")
        if m == actualmonth and y == actualyear then
               vote = false
               for i,worker in pairs(workers) do
                       if worker == wrk then
                               vote = true
                       end
               end
               if vote == false then
                       table.insert(worker,wrk)
               end
        end
end

Una vez recuperado el mes y el año a analizar, comenzamos a pasar la tabla work_hour para interceptar qué operadores (workers) han trabajado en ese rango de tiempo. En esta fase, solo guardamos el gguid del operador, ya que se usará para realizar búsquedas en las tablas. Desde aquí también podremos saber cuántos documentos crearemos.

for i,worker in pairs(workers) do
        workername = ""
        hourlyrate = 0
        tworker    = database.getsql("SELECT * FROM workers WHERE gguid='" .. worker .."' AND eli=0")
        if tworker.countrows() > 0 then
               rowso = tworker.getrows()
               workername = rowso[1].getvalue("name")
               hourlyrate = rowso[1].getvalue("hourly_rate")
        end

Comenzamos a activar todos los operadores y, en primer lugar, recuperamos el nombre (name) y su tarifa por hora (hourly_rate) para cada uno.

Advertencia: el ciclo for no está cerrado porque también se deben agregar partes posteriores del script.

if workername ~= "" then
        -- start to see if I find a monthly with the required characteristics
        gguidmonth = ""
        account   = 0
        tme = database.getsql("SELECT * FROM monthly
        WHERE eli=0 and gguid_worker='" ..worker .. "' and month='" .. actualmonths .. "' and year=" .. tostring(actualyear) .."")
        if tme.countrows() == 0 then
               --I have to create a new card
               gguidmonth = utility.gguid()
               sql   = "INSERT INTO monthly(gguid,tid,eli,arc,ut, uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc,gguid_worker,workername,[month],[year], hourly_rate,date) VALUES ("sql   = sql .. "'" ..  gguidmonth .. "'," .. tostring(utility.tid()) .. ",0,0,'','','',''," ..tostring(database.getind("monthly")) .. ",'','','',0,0,'',0,'" ..worker .. "','" .. utility.convap(workername) .. "','" .. actualmonths .."'," ..tostring(actualyear) .. "," ..tostring(hourlyrate) .. ",#" .. utility.formatdate(utility.getnow(),"yyyy-MM-dd") .. "#)"
               database.setsql(sql)
        else
               rows = tme.getrows()
               gguidmonth = rows[1].getvalue("gguid")
              total_account = rows[1].getvalue("total_account")
               --I eliminate the detail lines
               database.setsql("DELETE * FROM monthly_rows WHERE gguidp='"  .. gguidmonth .. "'")
        end

Tomamos en consideración solo a los operadores que tienen un nombre válido y luego vemos si hay un mes para este operador con el mes y año solicitados. Si no existe, lo creamos, de lo contrario recuperamos el anterior eliminando las líneas dentro de él, ya que las recrearemos.

Tenga en cuenta la cadena de creación que contiene todos los campos de administración de Nios4 y los campos propios de la tabla. También recordamos que para evitar el mal funcionamiento, todos los campos siempre deben tener un valor dado que la condición null no se gestiona.

Advertencia: también en este caso el if inicial no está cerrado.

--I begin to read the reports
table_rows = database.getsql("SELECT * FROM work_hour WHERE eli=0 and gguid_worker='" .. worker .. "'")
totalhour = 0
rows = table_rows.getrows()
for i = 1,table_rows.countrows() do
        m = utility.datemonth(rows[i].getvalue("date"))
        y = utility.dateyear(rows[i].getvalue("date"))
        wrk = rows[i].getvalue("gguid_worker")
        if m == actualmonth and y == actualyear then
               - I create the row and save it
               gguidr  = utility.gguid()
               sql = "INSERT INTO monthly_rows(gguid,tid,eli,arc,ut,uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc)  VALUES ("sql = sql .. "'" .. gguidr .. "'," ..  tostring(utility.tid()) .. ",0,0,'','','','" .. gguidmonth .. "'," .. tostring(database.getind("monthly_rows")) .. ",'monthly','','',0,0,'',0)"
               database.setsql(sql)
               - add the missing values
               sql = "UPDATE monthly_rows SET date=#" .. utility.formatdate(rows[i].getvalue("date"),"yyyy-MM-dd") .. "#,"
               sql = sql .. "gguid_customer='" .. rows[i].getvalue("gguid_customer") .. "', customer='" .. utility.convap(rows[i].getvalue("customer")) .. "',"
               sql = sql .. "total_hour=" .. utility.convi(rows[i].getvalue("total_hour")) .. ","
               sql = sql .. "work_done=" .. utility.convap(rows[i].getvalue("work_done")) .. "',"
               sql = sql .. "site='" .. utility.convap(rows[i].getvalue("site")) .. "'"
               sql = sql .. " WHERE gguid='" .. gguidr .. "'"
               database.setsql(sql)
               totalhour = totalhour +                rows[i].getvalue("total_hour")
        end
end

Ahora que hemos creado o recuperado el encabezado de nuestro documento mensual, comencemos a extrapolar las líneas del marcador de hora (work_hour) en función del operador. En este caso, se realizan dos consultas de escritura por conveniencia: la primera establece la nueva línea insertando los valores para el programa, mientras que la segunda inserta nuestros datos.

               -- update the head of the monthly
               total_month = totalhour * hourlyrate
              balance = total_month– total_account
               sql = "UPDATE monthly SET total_month=" ..  utility.convi(total_month) ..  ",total_hour=" .. utility.convi(totalhour) .. ",balance=".. utility.convi(balance)  .. " WHERE gguid='" .. gguidmonth .."'" database.setsql(sql)
        end
end
program.refreshsection("monthly")

Después de pasar todas las líneas, actualizamos el encabezado del mes ingresando el precio total y lo que ya hemos pagado al operador.

Cerramos la condición if con respecto al nombre del operador y el ciclo for.

Finalmente, forzamos al programa a actualizar las secciones que usan la tabla monthly para mostrar los documentos creados.