Creare i mensili dai segna ore degli operatori

In questo esempio costruiremo un documento direttamente nel database. Ne creeremo uno per ogni nostro operatore e inseriremo le ore lavorate per un determinato mese. Vista l’operazione da eseguire, questo script è un’azione associata direttamente al programma.

Gruppo ScriptEvento
ProgrammaAzione Programma
output.clear()
finestra = program.newdataform()
finestra.settitle("Scegliere il mese")
mesi = {"Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"}

meseattuale = utility.datemonth(utility.getnow())
annoattuale = utility.dateyear(utility.getnow())
meseattuales = null

if meseattuale == 1 then meseattuales = "Gennaio" end
if meseattuale == 2 then meseattuales = "Febbraio" end
if meseattuale == 3 then meseattuales = "Marzo" end
if meseattuale == 4 then meseattuales = "Aprile" end
if meseattuale == 5 then meseattuales = "Maggio" end
if meseattuale == 6 then meseattuales = "Giugno" end
if meseattuale == 7 then meseattuales = "Luglio" end
if meseattuale == 8 then meseattuales = "Agosto" end
if meseattuale == 9 then meseattuales = "Settembre" end
if meseattuale == 10 then meseattuales = "Ottobre" end
if meseattuale == 11 then meseattuales = "Novembre" end
if meseattuale == 12 then meseattuales = "Dicembre" end

finestra.addfieldlist("Mese","MESE",mesi,meseattuales)
finestra.addfieldinteger("Anno","ANNO",annoattuale)
finestra.show()

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

Come prima cosa creiamo un dataform per richiedere all’utente quale mese e anno dovremmo analizzare. Per comodità imposterò noi i valori di default con il mese e l’anno corrente.

Nel caso in cui l’utente chiuda il dataform con la x, buona norma sarà bloccare l’esecuzione dello script.

tabella = database.getsql("SELECT * FROM segna_ore WHERE eli=0")
righe = tabella.getrows()
for i = 1,tabella.countrows() do
        m = utility.datemonth(righe[i].getvalue("data"))
        y = utility.dateyear(righe[i].getvalue("data"))
        ope = righe[i].getvalue("gguid_operatore")
        if m == meseattuale and y == annoattuale then
               voto = false
               for i,operatore in pairs(operatori) do
                       if operatore == ope then
                               voto = true
                       end
               end
               if voto == false then
                       table.insert(operatori,ope)
               end
        end
end

Recuperato il mese e l’anno da analizzare, iniziamo a girare la tabella Segna_ore per intercettare quali sono gli operatori che hanno lavorato in quel range di tempo. In questa fase salviamo solamente il gguid dell’operatore, poiché servirà per eseguire le ricerche sulle tabelle. Da qui avremo modo di sapere anche quanti documenti andremo a creare.

for i,operatore in pairs(operatori) do
        nomeoperatore = ""
        tariffaoraria = 0
        toperatore    = database.getsql("SELECT * FROM operatori WHERE gguid='" .. operatore .."' AND eli=0")
        if toperatore.countrows() > 0 then
               righeo = toperatore.getrows()
               nomeoperatore = righeo[1].getvalue("nome")
               tariffaoraria = righeo[1].getvalue("tariffa_oraria")
        end

Iniziamo a girare tutti gli operatori e, come prima cosa, recuperiamo per ognuno il nome e la sua tariffa oraria.

Attenzione: il ciclo for non è chiuso perché devono essere aggiunte anche le successive parti dello script.

if nomeoperatore ~= "" then
        --inizio a vedere se trovo un mensile con le caratteristiche richieste
        gguidmese = ""
        acconto   = 0
        tme = database.getsql("SELECT * FROM mensili
        WHERE eli=0 and gguid_operatore='" ..operatore .. "' and mese='" .. meseattuales .. "' and anno=" .. tostring(annoattuale) .."")
        if tme.countrows() == 0 then
               --devo creare una scheda nuova
               gguidmese = utility.gguid()
               stringa   = "INSERT INTO mensili(gguid,tid,eli,arc,ut, uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc,gguid_operatore,operatore,mese,anno, tariffa_oraria,data) VALUES ("stringa   = stringa .. "'" ..  gguidmese .. "'," .. tostring(utility.tid()) .. ",0,0,'','','',''," ..tostring(database.getind("mensili")) .. ",'','','',0,0,'',0,'" ..operatore .. "','" .. utility.convap(nomeoperatore) .. "','" .. meseattuales .."'," ..tostring(annoattuale) .. "," ..tostring(tariffaoraria) .. ",#" .. utility.formatdate(utility.getnow(),"yyyy-MM-dd") .. "#)"
               database.setsql(stringa)
        else
               righe = tme.getrows()
               gguidmese = righe[1].getvalue("gguid")
              totale_acconto = righe[1].getvalue("totale_acconti")
               --elimino le righe di dettaglio
               database.setsql("DELETE * FROM mensili_rows WHERE gguidp='"  .. gguidmese .. "'")
        end

Prendiamo in considerazione solamente gli operatori che hanno un nome valido e successivamente vediamo se esiste un mensile per questo operatore con il mese e l’anno richiesto. Se non esiste lo creiamo, altrimenti recuperiamo quello precedente eliminando le righe al suo interno poiché poi andremo a ricrearle.

Da notare la stringa di creazione dove sono riportati tutti i campi di gestione di Nios4 e i campi propri della tabella. Si ricorda inoltre che per evitare malfunzionamenti occorre dare sempre un valore a tutti i campi visto che la condizione null non è gestita.

Attenzione: anche in questo caso l’if iniziale non è chiuso.

--comincio a leggere i rapportini
tabella = database.getsql("SELECT * FROM segna_ore WHERE eli=0 and gguid_operatore='" .. operatore .. "'")
totaleore = 0
righe = tabella.getrows()
for i = 1,tabella.countrows() do
        m = utility.datemonth(righe[i].getvalue("data"))
        y = utility.dateyear(righe[i].getvalue("data"))
        ope = righe[i].getvalue("gguid_operatore")
        if m == meseattuale and y == annoattuale then
               --creo la riga e la salvo
               gguidr  = utility.gguid()
               stringa = "INSERT INTO mensili_rows(gguid,tid,eli,arc,ut,uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc)  VALUES ("stringa = stringa .. "'" .. gguidr .. "'," ..  tostring(utility.tid()) .. ",0,0,'','','','" .. gguidmese .. "'," .. tostring(database.getind("mensili_rows")) .. ",'mensili','','',0,0,'',0)"
               database.setsql(stringa)
               --aggiungo i valori mancanti
               stringa = "UPDATE mensili_rows SET data=#" .. utility.formatdate(righe[i].getvalue("data"),"yyyy-MM-dd") .. "#,"
               stringa = stringa .. "gguid_cliente='" .. righe[i].getvalue("gguid_cliente") .. "', cliente='" .. utility.convap(righe[i].getvalue("cliente")) .. "',"
               stringa = stringa .. "totale_ore=" .. utility.convi(righe[i].getvalue("totale_ore")) .. ","
               stringa = stringa .. "lavori_effettuati='" .. utility.convap(righe[i].getvalue("lavori_effettuati")) .. "',"
               stringa = stringa .. "sede='" .. utility.convap(righe[i].getvalue("sede")) .. "'"
               stringa = stringa .. " WHERE gguid='" .. gguidr .. "'"
               database.setsql(stringa)
               totaleore = totaleore +                righe[i].getvalue("totale_ore")
        end
end

Ora che abbiamo creato o recuperato la testa del documento del nostro mensile, iniziamo a estrapolare le righe dal segna ore in base all’operatore. In questo caso vengono eseguite due query di scrittura per comodità: la prima imposta la nuova riga inserendo i valori per il programma, mentre la seconda inserisce i nostri dati.

               --aggiorno la testa del mensile
               totale_mensile = totaleore * tariffaoraria
              saldo = totale_mensile – totale_acconto
               stringa = "UPDATE mensili SET totale_mensile=" ..  utility.convi(totale_mensile) ..  ",totale_ore=" .. utility.convi(totaleore) .. ",saldo=".. utility.convi(saldo)  .. " WHERE gguid='" .. gguidmese .."'" database.setsql(stringa)
        end
end
program.refreshsection("mensili")

Dopo aver girato tutte le righe, aggiorniamo la testa del mensile inserendo il prezzo totale e quanto abbiamo già pagato all’operatore.

Chiudiamo la condizione if riguardante il nome dell’operatore e il ciclo for.

Come ultima cosa forziamo il programma ad aggiornare le sezioni che utilizzano la tabella mensili per mostrare i documenti creati.