set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /*---------------------------------- * Trigger su insert/update * * Aggiorna giustificativi nella tab TimbratureExpl * * creato da: S.E. Locatelli - 2012.12.04 * ultima modifica: *----------------------------------*/ alter TRIGGER trg_giustUpdateTimbr ON Giustificativi FOR INSERT, UPDATE AS -- controllo se rescord esista altrimenti lo creo!!! DECLARE @trovate INT = 0 DECLARE @idxDipendente INT DECLARE @dataRif DATETIME -- carico dati SET @trovate = ISNULL( ( SELECT COUNT(*) FROM TimbratureExpl te INNER JOIN inserted g ON te.idxDipendente = g.idxDipendente AND te.dataLav = g.dataLav) ,0) SELECT @idxDipendente = idxDipendente, @dataRif=dataLav FROM inserted IF(@trovate = 0) BEGIN EXEC stp_ricalcolaTimbratureExpl @idxDipendente, @dataRif END -- CONTROLLO SE IL RECORD NON SIA BLOCCATO con where nell'update -- prendo tutte le "vecchie" righe (deleted) e x le giornate relative TOLGO i minuti dei giustificativi UPDATE TimbratureExpl SET minMal = CASE WHEN g.codGiust IN('MAL','MAT','INF') THEN 0 ELSE minMal END, minFer = CASE WHEN g.codGiust='FER' THEN 0 ELSE minFer END, minFest = CASE WHEN g.codGiust='FEST' THEN 0 ELSE minFest END, minPerm = CASE WHEN g.codGiust='PERM' THEN 0 ELSE minPerm END FROM TimbratureExpl te INNER JOIN deleted g ON te.idxDipendente = g.idxDipendente AND te.dataLav = g.dataLav WHERE te.block = 0 -- prendo le "nuove" righe (inserted) e x le giornate relative AGGIUNGO i minuti dei giustificativi UPDATE TimbratureExpl SET minMal = CASE WHEN g.codGiust IN('MAL','MAT','INF') THEN g.minuti ELSE minMal END, minFer = CASE WHEN g.codGiust='FER' THEN g.minuti ELSE minFer END, minFest = CASE WHEN g.codGiust='FEST' THEN g.minuti ELSE minFest END, minPerm = CASE WHEN g.codGiust='PERM' THEN g.minuti ELSE minPerm END FROM TimbratureExpl te INNER JOIN inserted g ON te.idxDipendente = g.idxDipendente AND te.dataLav = g.dataLav WHERE te.block = 0 -- verifico SE codice orario richieda una chkFun eseguo calcolo... IF(dbo.f_chkFunDip(@idxDipendente)<>'') BEGIN EXEC stp_TE_doChkFun @idxDipendente, @dataRif END go /*---------------------------------- * Trigger su delete * * Aggiorna giustificativi nella tab TimbratureExpl * * creato da: S.E. Locatelli - 2012.12.04 * ultima modifica: *----------------------------------*/ alter TRIGGER trg_giustDelUpdTimbr ON Giustificativi FOR DELETE AS -- controllo se rescord esista altrimenti lo creo!!! DECLARE @trovate INT = 0 DECLARE @idxDipendente INT DECLARE @dataRif DATETIME -- carico dati SELECT @idxDipendente = idxDipendente, @dataRif=dataLav FROM deleted -- CONTROLLO SE IL RECORD NON SIA BLOCCATO in update con where -- prendo tutte le "vecchie" righe (deleted) e x le giornate relative TOLGO i minuti dei giustificativi UPDATE TimbratureExpl SET minMal = CASE WHEN g.codGiust IN('MAL','MAT','INF') THEN 0 ELSE minMal END, minFer = CASE WHEN g.codGiust='FER' THEN 0 ELSE minFer END, minFest = CASE WHEN g.codGiust='FEST' THEN 0 ELSE minFest END, minPerm = CASE WHEN g.codGiust='PERM' THEN 0 ELSE minPerm END FROM TimbratureExpl te INNER JOIN deleted g ON te.idxDipendente = g.idxDipendente AND te.dataLav = g.dataLav WHERE te.block = 0 -- verifico SE codice orario richieda una chkFun eseguo calcolo... IF(dbo.f_chkFunDip(@idxDipendente)<>'') BEGIN EXEC stp_TE_doChkFun @idxDipendente, @dataRif END go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /******************************************************************************* * stp_ricalcolaTimbratureExpl * * Aggiorna la tab timbrature expl ricalcolando la giornata del record interessato * mod: S.E.L. - 2012.02.06 ********************************************************************************/ alter PROCEDURE stp_ricalcolaTimbratureExpl ( @idxDipendente AS INT, @dataRif AS DATETIME ) AS -- variabili DECLARE @minArr INT SELECT @minArr=dbo.f_minArrotDip(@idxDipendente) -- CONTROLLO SE IL RECORD NON SIA BLOCCATO!!! DECLARE @block BIT SET @block = ( SELECT ISNULL(( SELECT block FROM TimbratureExpl WHERE (idxDipendente = @idxDipendente) AND CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif) ),0) ) IF(@block = 0) BEGIN -- elimino i periodi della data indicata... DELETE FROM TimbratureExpl WHERE (idxDipendente = @idxDipendente) AND CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif) -- inserisco i dati minimi per la data indicata INSERT INTO TimbratureExpl(idxDipendente, dataLav) VALUES(@idxDipendente, CONVERT(DATE,@dataRif)) -- aggiorno cognome nome BEGIN TRY UPDATE te SET CognomeNome = ISNULL(vcn.CognomeNome,'') FROM TimbratureExpl te INNER JOIN v_cognomeNome vcn ON te.idxDipendente = vcn.idxDipendente WHERE CONVERT(DATE,te.dataLav) = CONVERT(DATE,@dataRif) AND te.idxDipendente = @idxDipendente END TRY BEGIN CATCH -- non faccio nulla END CATCH -- aggiorno 1° timbratura UPDATE te SET te.entrata_1 = pl.entrata, te.uscita_1 = pl.uscita FROM TimbratureExpl te INNER JOIN PeriodiLav pl ON te.idxDipendente = pl.idxDipendente AND (CONVERT(DATE,te.dataLav) = CONVERT(DATE,pl.entrata)) WHERE pl.rowNum = 1 AND te.idxDipendente = @idxDipendente AND CONVERT(DATE,pl.entrata) = CONVERT(DATE,@dataRif) -- aggiorno 2° timbratura UPDATE te SET te.entrata_2 = pl.entrata, te.uscita_2 = pl.uscita FROM TimbratureExpl te INNER JOIN PeriodiLav pl ON te.idxDipendente = pl.idxDipendente AND (CONVERT(DATE,te.dataLav) = CONVERT(DATE,pl.entrata)) WHERE pl.rowNum = 2 AND te.idxDipendente = @idxDipendente AND CONVERT(DATE,pl.entrata) = CONVERT(DATE,@dataRif) -- aggiorno 3° timbratura UPDATE te SET te.entrata_3 = pl.entrata, te.uscita_3 = pl.uscita FROM TimbratureExpl te INNER JOIN PeriodiLav pl ON te.idxDipendente = pl.idxDipendente AND (CONVERT(DATE,te.dataLav) =CONVERT(DATE,pl.entrata)) WHERE pl.rowNum = 3 AND te.idxDipendente = @idxDipendente AND CONVERT(DATE,pl.entrata) = CONVERT(DATE,@dataRif) -- aggiorno 4° timbratura UPDATE te SET te.entrata_4 = pl.entrata, te.uscita_4 = pl.uscita FROM TimbratureExpl te INNER JOIN PeriodiLav pl ON te.idxDipendente = pl.idxDipendente AND (CONVERT(DATE,te.dataLav) =CONVERT(DATE,pl.entrata)) WHERE pl.rowNum = 4 AND te.idxDipendente = @idxDipendente AND CONVERT(DATE,pl.entrata) = CONVERT(DATE,@dataRif) -- calcolo ore totali... UPDATE TimbratureExpl SET h_lav = CAST(FLOOR((ISNULL(DATEDIFF(n,entrata_1,uscita_1),0) + ISNULL(DATEDIFF(n,entrata_2,uscita_2),0) + ISNULL(DATEDIFF(n,entrata_3,uscita_3),0) + ISNULL(DATEDIFF(n,entrata_4,uscita_4),0))/@minArr) AS FLOAT)*@minArr/60 FROM TimbratureExpl WHERE (CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif)) AND idxDipendente = @idxDipendente -- verifico: se c'è anche solo 1 timbratura non approvata metto flag isOkApp a falso UPDATE TimbratureExpl SET isOkApp = ISNULL(( SELECT MIN(CASE WHEN Approv=0 THEN 0 ELSE 1 END) AS isOk FROM Timbrature WHERE idxDipendente = @idxDipendente AND (CONVERT(DATE,dataOra) = CONVERT(DATE,@dataRif)) GROUP BY CONVERT(DATE,dataOra) ),1) FROM TimbratureExpl WHERE (CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif)) AND idxDipendente = @idxDipendente -- verifico: se entrate <> uscite flag isOkTim a falso UPDATE TimbratureExpl SET isOkTim = ( SELECT CASE WHEN ISNULL( (SELECT COUNT(*) as timb FROM Timbrature AS t WHERE t.idxDipendente = @idxDipendente AND (CONVERT(DATE,dataOra) = CONVERT(DATE,@dataRif)) GROUP BY t.idxDipendente , CONVERT(DATE,t.dataOra) HAVING COUNT ( CASE Entrata WHEN 1 THEN dataOra END ) <> COUNT ( CASE Entrata WHEN 0 THEN dataOra END ) ),0) > 0 THEN 0 ELSE 1 END ) FROM TimbratureExpl WHERE (CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif)) AND idxDipendente = @idxDipendente -- calcolo resoconto MINUTI giornaliero, imposto LUN x inizio settimana SET DATEFIRST 1 -- MIN lavorati, ordinari (con arrotondamento...) UPDATE TimbratureExpl SET minLav = CAST((ISNULL(DATEDIFF(n,entrata_1,uscita_1),0) + ISNULL(DATEDIFF(n,entrata_2,uscita_2),0) + ISNULL(DATEDIFF(n,entrata_3,uscita_3),0) + ISNULL(DATEDIFF(n,entrata_4,uscita_4),0)) AS FLOAT) ,minOrd = dbo.f_oreOrdDip(idxDipendente,dataLav) * 60 -- da schema orario dip attivo FROM TimbratureExpl WHERE (CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif)) AND idxDipendente = @idxDipendente -- MIN non lavorati, straordinari (con arrotondamento...) UPDATE TimbratureExpl SET minNonLav = (CEILING(CONVERT(FLOAT,CASE WHEN minOrd <= minLav THEN (0) ELSE minOrd-minLav END)/@minArr)*@minArr) ,minStra = (FLOOR(CONVERT(FLOAT,CASE WHEN minOrd < minLav AND minLav > (0) THEN minLav-minOrd ELSE (0) END)/@minArr)*@minArr) FROM TimbratureExpl WHERE (CONVERT(DATE,dataLav) = CONVERT(DATE,@dataRif)) AND idxDipendente = @idxDipendente -- MIN da tab giustificativi (feste, ferie, malattia, permessi) UPDATE TimbratureExpl SET minMal = CASE WHEN g.codGiust IN('MAL','MAT','INF') THEN g.minuti ELSE minMal END, minFer = CASE WHEN g.codGiust='FER' THEN g.minuti ELSE minFer END, minFest = CASE WHEN g.codGiust='FEST' THEN g.minuti ELSE minFest END, minPerm = CASE WHEN g.codGiust='PERM' THEN g.minuti ELSE minPerm END, chkFunCod = '', chkFunRes = '' FROM TimbratureExpl te INNER JOIN Giustificativi g ON te.idxDipendente = g.idxDipendente AND te.dataLav = g.dataLav WHERE (CONVERT(DATE,te.dataLav) = CONVERT(DATE,@dataRif)) AND te.idxDipendente = @idxDipendente -- verifico SE codice orario richieda una chkFun eseguo calcolo... IF(dbo.f_chkFunDip(@idxDipendente)<>'') BEGIN EXEC stp_TE_doChkFun @idxDipendente, @dataRif END END RETURN go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /************************************************* * STORED PROCEDURE stp_giust_insByDate * * Aggiunge un giustificativo per coprire la durata necessaria a chiudere la giornata indicata * mod: S.E.L. - 2012.12.10 **************************************************/ alter PROCEDURE stp_giust_insByDate ( @idxDipendente INT = 0, @dataRif DATETIME, @codGiust NVARCHAR(5) = 'PERM' ) AS BEGIN TRAN DECLARE @minPerm INT = 0 -- min necessari x chiudere giornata DECLARE @isPP BIT = 0 SELECT @isPP = CASE WHEN ISNULL(chkFunCod,'')='P' THEN 1 ELSE 0 END FROM TimbratureExpl WHERE idxDipendente=@idxDipendente AND dataLav=@dataRif IF(@isPP=1) BEGIN -- recupero tipo di fuction da usare DECLARE @chkFun NVARCHAR(50) = '' DECLARE @minPP INT = 0 -- imposto variabili SELECT @chkFun = dbo.f_chkFunDip(@idxDipendente), @codGiust = 'PERM' -- controllo tipo di funzione... e imposto risultato! /* IF(@chkFun = 'PP60m') BEGIN SET @minPP = 60 END ELSE IF(@chkFun = 'PP30m') BEGIN SET @minPP = 30 END */ IF(@chkFun LIKE 'PP%m') BEGIN SELECT @minPP=REPLACE(REPLACE(@chkFun,'PP',''),'m','') END -- calcolo quota permesso SELECT @minPerm = @minPP - (minArcoPres - minLav) FROM TimbratureExpl WHERE idxDipendente = @idxDipendente AND dataLav = @dataRif -- INSERT giustificativo! INSERT INTO Giustificativi VALUES (@dataRif,@idxDipendente,@codGiust,@minPerm,1) END ELSE BEGIN -- variabili DECLARE @minArr INT --SELECT @minArr=dbo.f_minArrotDip(@idxDipendente) SELECT @minArr = ISNULL(valInt,1) FROM AnagKeyValue WHERE nomeVar = 'minutiRoundDay' -- calcolo minuti SELECT @minPerm = (CEILING(CONVERT(FLOAT,minOrd-minLav)/@minArr)*@minArr) FROM TimbratureExpl WHERE isOkLav = 0 AND idxDipendente = @idxDipendente AND dataLav = @dataRif -- INSERT giustificativo! INSERT INTO Giustificativi VALUES (@dataRif,@idxDipendente,@codGiust,@minPerm,1) END COMMIT TRAN RETURN go /******************************************************************************* * STORED PROCEDURE stp_TE_doChkFun * * effettua check finali sulla riga di timbrature esplore indicata, contiene varie logiche * anche da + installazioni clienti * * mod: S.E.L. 2013.03.28 * *******************************************************************************/ alter PROCEDURE stp_TE_doChkFun ( @idxDipendente INT, @dataRif DATETIME ) AS SET NOCOUNT ON; -- recupero tipo di fuction da usare DECLARE @chkFun NVARCHAR(50) = '' DECLARE @chkFunCod NVARCHAR(50) = '' DECLARE @chkFunRes NVARCHAR(50) = '' DECLARE @minPP INT = 0 SELECT @chkFun = dbo.f_chkFunDip(@idxDipendente) -- controllo tipo di funzione... e imposto risultato! /* IF(@chkFun = 'PP60m') BEGIN SELECT @minPP = 60, @chkFunCod = 'P', @chkFunRes = 'Mancata pausa pranzo 60m' END ELSE IF(@chkFun = 'PP30m') BEGIN SELECT @minPP = 30, @chkFunCod = 'P', @chkFunRes = 'Mancata pausa pranzo 30m' END */ IF(@chkFun LIKE 'PP%m') BEGIN SELECT @minPP=REPLACE(REPLACE(@chkFun,'PP',''),'m',''), @chkFunCod = 'P' SELECT @chkFunRes = 'Mancata pausa pranzo ' + CAST(@minPP AS NVARCHAR) + 'm' END -- se c'è check da fare faccio COMUNQUE update! IF(@chkFun <>'') BEGIN UPDATE TimbratureExpl SET chkFunCod = CASE WHEN (minArcoPres - minLav) < @minPP - minPerm THEN @chkFunCod ELSE '' END, -- chk pause > PP imposta (- minuti permesso caricati) chkFunRes = CASE WHEN (minArcoPres - minLav) < @minPP - minPerm THEN @chkFunRes ELSE '' END -- chk pause > PP imposta (- minuti permesso caricati) WHERE idxDipendente = @idxDipendente AND dataLav = @dataRif AND (minOrd > 0 AND minLav > 0) -- controllo DEBBA lavorare e ABBIA lavorato AND block = 0 -- controllo NON sia bloccato END RETURN go commit; go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(328, GETDATE()) GO SELECT * FROM LogUpdateDb ORDER BY Versione DESC