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='MAL' 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='MAL' 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='MAL' 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 /************************************************* * STORED PROCEDURE stp_giust_insertQuery * * Aggiunge un giustificativo NUOVO * mod: S.E.L. - 2013.04.03 **************************************************/ create PROCEDURE stp_giust_insertQuery ( @dataLav date, @idxDipendente int, @codGiust nvarchar(5), @minuti int ) AS INSERT INTO Giustificativi (dataLav, idxDipendente, codGiust, minuti) VALUES (@dataLav, @idxDipendente, @codGiust, @minuti) 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 -- 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 commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; 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 -- 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(327, GETDATE()) GO SELECT * FROM LogUpdateDb ORDER BY Versione DESC