Files
2021-03-26 17:17:28 +01:00

418 lines
14 KiB
Transact-SQL

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