418 lines
14 KiB
Transact-SQL
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
|