﻿create table CalendApertura(
  NumGG     int not null constraint PK_CalendApertura primary key,
  T1        int not null,
  T2        int not null,
  T3        int not null,
  oraInizio int,
  oraFine   int
)
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.CalendApertura
  VALUES (1, 8, 8, 8, 0, 24)
INSERT INTO dbo.CalendApertura
  VALUES (2, 8, 8, 8, 0, 24)
INSERT INTO dbo.CalendApertura
  VALUES (3, 8, 8, 8, 0, 24)
INSERT INTO dbo.CalendApertura
  VALUES (4, 8, 8, 8, 0, 24)
INSERT INTO dbo.CalendApertura
  VALUES (5, 8, 8, 8, 0, 24)
INSERT INTO dbo.CalendApertura
  VALUES (6, 8, 0, 0, 0, 14)
INSERT INTO dbo.CalendApertura
  VALUES (7, 0, 0, 8, 22, 24)
go

commit transaction
go


set xact_abort on
go

begin transaction
go

create table DatiProduzione(
  IdxConferma int           not null identity constraint PK_DatiProduzione primary key,
  IdxODL      int           not null,
  DataOraApp  datetime      not null,
  DataRif     datetime      not null,
  TurnoRif    int,
  CodArticolo nvarchar(50),
  IdxMacchina nvarchar(50)  not null,
  TCAssegnato decimal(18,8),
  MatrOpr     int,
  MatrApp     int           not null,
  DataOraFrom datetime,
  DataOraTo   datetime,
  TotPzProd   int,
  Tempo       decimal(18,8),
  ClasseTempo nvarchar(50)
)
go

exec sp_addextendedproperty 'MS_Description', 'matricola dell''operatore che ha lavorato sulla macchina', 'SCHEMA', 'dbo', 'TABLE', 'DatiProduzione', 'COLUMN', 'MatrOpr'
go

exec sp_addextendedproperty 'MS_Description', 'matricola dell''approvatore del record', 'SCHEMA', 'dbo', 'TABLE', 'DatiProduzione', 'COLUMN', 'MatrApp'
go

exec sp_addextendedproperty 'MS_Description', 'pezzi prodotti in ciclo', 'SCHEMA', 'dbo', 'TABLE', 'DatiProduzione', 'COLUMN', 'TotPzProd'
go

exec sp_addextendedproperty 'MS_Description', 'TCAssegnato x num pezzi prodotti', 'SCHEMA', 'dbo', 'TABLE', 'DatiProduzione', 'COLUMN', 'Tempo'
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiConf_conferma
* 	conferma la produzione per la macchina indicata
*
* modif.:	S.E.L.
* il:		2011.03.30
**************************************/
alter PROCEDURE stp_DatiConf_conferma
(
	@idxODL			INT,
	@idxMacchina	NVARCHAR(50),
	@MatrApp		INT,
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@turno			INT,
	@idxStato		INT,
	@pezziConf		INT
)
AS

BEGIN TRAN
	
	-- calcolo valori
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	DECLARE	@TCAss DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)
	-- versione semplificata: approva tutto x data e turno INIZIALE del periodo indicato
	INSERT INTO DatiConfermati(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom, DataOraTo, IdxStato, TotPzProd, TempoProdotto)
	VALUES (@idxODL, GETDATE(), @dataFrom, @turno, @CodArticolo, @idxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, @dataTo, @idxStato, @pezziConf, @pezziConf*@TCAss)

COMMIT TRAN

RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insAllPeriodo
* 	calcola il tempo da diario di bordo x una macchina dato periodo e inserisce in tabella dati prod INSIEME ai pezzi prodotti
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
create PROCEDURE stp_DatiProd_insAllPeriodo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT	
)
AS

BEGIN TRAN
	-- calcolo i pz prod da confermare per l'intero periodo
	DECLARE @pzProd AS INT
	SET		@pzProd = ( SELECT  ISNULL(SUM(PzProd),0)
							FROM	TempiCicloRilevati
							WHERE	IdxMacchina = @idxMacchina
							AND		DataOraRif BETWEEN @dataFrom AND @dataTo )

	-- calcolo l'ODL, l'articolo ed il TCiclo...
	DECLARE @idxODL		INT
	SET		@idxODL	= ( SELECT ISNULL(IdxODL, 0) FROM ODL WHERE (@dataFrom BETWEEN DataInizio AND ISNULL(DataFine, DATEADD(d, 1, GETDATE()))) AND NOT (DataInizio IS NULL) )
	
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	
	DECLARE	@TCAss		DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)

	-- dichiaro le ore che calcolo man mano...
	DECLARE @totOre		DECIMAL(18,8)
	DECLARE @ClasseTempo NVARCHAR(50)
			
	-- variabili x ricerca gg festivi o aperture/chiusure ND programmate
	DECLARE @chiusura	INT
	DECLARE @apertura	INT
	DECLARE @ggSett		INT
	-- verifico se sia giorno di chiusura, in tal caso carico 8 h in T_OFF_ND
	SET @chiusura = ( SELECT COUNT(*) FROM CalendFesteFerie WHERE data = @dataRif )
	-- verifico che da apertura sia un periodo valido e non di fermo programmato
	IF(@chiusura = 0)
		BEGIN
			-- controllo a seconda della data e turno a che gg di settimana e turno corrisponde...
			SET DATEFIRST 1; -- setto al lunedì inizio settimana
			SET @ggSett = DATEPART(dw, @dataFrom ) -- calcolo giorno
			SET @apertura = ( SELECT CASE @turnoRif WHEN 1 THEN T1 WHEN 2 THEN T2 ELSE T3 END FROM CalendApertura WHERE NumGG = @ggSett ) -- cerco ore apertura...
			SET @chiusura = ( SELECT CASE @apertura WHEN 8 THEN 0 ELSE 1 END ) -- e se sia turno valido (8h) o vuoto (0h) nel qual caso chiusura > 0
		END
	-- se c'è chiusura per turno singolo o per giorno intero...
	IF(@chiusura > 0)
		BEGIN
			SET		@ClasseTempo = 'T_OFF_ND'
			SET		@totOre = 8
			INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
										DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
			VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
										@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo)
		END
	ELSE -- normale dichiarazione
		BEGIN
			-- inserisco i dati di SOLO tempo prodotto e pz prodotti
			SET		@ClasseTempo = 'T_AutoRun'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo)
			END
			
			-- inserisco gli altri tempi, pezzi prod ZERO!!!
			SET		@ClasseTempo = 'T_Microfermo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, 0, @totOre, @ClasseTempo)
			END

			SET		@ClasseTempo = 'T_FermoGiallo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, 0, @totOre, @ClasseTempo)
			END
			
			SET		@ClasseTempo = 'T_FermoRosso'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, 0, @totOre, @ClasseTempo)
			END
			
			SET		@ClasseTempo = 'T_OFF'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, 0, @totOre, @ClasseTempo)
			END
		END

COMMIT TRAN
RETURN
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insert
* 	dichiara i dati x la machcina indicata x tab DatiProduzione
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
create PROCEDURE stp_DatiProd_insert
(
	@idxODL			INT,
	@idxMacchina	NVARCHAR(50),
	@MatrApp		INT,
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@turno			INT,
	@pezziConf		INT,
	@Tempo			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

BEGIN TRAN
	-- calcolo variabili
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	DECLARE	@TCAss DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)
	-- versione semplificata: approva tutto x data e turno INIZIALE del periodo indicato
	INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo)
	VALUES (@idxODL, GETDATE(), @dataFrom, @turno, @CodArticolo, @idxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, @dataTo, @pezziConf, @Tempo, @ClasseTempo)

COMMIT TRAN

RETURN
go

commit
go

set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* Function f_calcolaTempoClasse_ByInterv
* 	calcola il totale del tempo di una classe fermata per un intervallo date
*
* modif.:	S.E.L.
* il:		2011.06.07
**************************************/
create FUNCTION f_calcolaTempoClasse_ByInterv
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@classeTempo	NVARCHAR(50)
)
RETURNS DECIMAL(18,8)
AS
	BEGIN
	-- dichiaro out
	DECLARE @totOre AS DECIMAL(18,8)
	DECLARE @incl AS DECIMAL(18,8)
	DECLARE @start AS DECIMAL(18,8)
	DECLARE @end AS DECIMAL(18,8)
	DECLARE @full AS DECIMAL(18,8)
	
	-- inizio calcolando il tempo degli eventi totalmente inclusi nell'intervallo
	SET @incl = (SELECT  CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb INNER JOIN	AnagraficaStati a ON ddb.IdxStato = a.IdxStato
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato BETWEEN @dataFrom AND @dataTo) 
						AND		(ddb.FineStato BETWEEN @dataFrom AND @dataTo) 
						AND		a.ClasseTempo = @classeTempo)

	-- ora sommo gli eventi sui bordi: inizio...
	SET @start = (SELECT  CAST(ISNULL(DATEDIFF(n, @dataFrom, CASE WHEN ddb.FineStato < @dataTo THEN ddb.FineStato ELSE @dataTo END) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb INNER JOIN	AnagraficaStati a ON ddb.IdxStato = a.IdxStato
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato < @dataFrom) 
						AND		(ddb.FineStato BETWEEN @dataFrom AND @dataTo)
						AND		a.ClasseTempo = @classeTempo)
						
	-- ...e fine...
	SET @end = (SELECT  CAST(ISNULL(DATEDIFF(n, CASE WHEN ddb.InizioStato < @dataFrom THEN @dataFrom ELSE ddb.InizioStato END, @dataTo) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb INNER JOIN	AnagraficaStati a ON ddb.IdxStato = a.IdxStato
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato BETWEEN @dataFrom AND @dataTo)  
						AND		(ddb.FineStato > @dataTo) 
						AND		a.ClasseTempo = @classeTempo)
	
	-- ...e pure eventi totalmente overlapping...
	SET @full = (SELECT  CAST(ISNULL(DATEDIFF(n, @dataFrom, @dataTo) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb INNER JOIN	AnagraficaStati a ON ddb.IdxStato = a.IdxStato
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato < @dataFrom) 
						AND		(ddb.FineStato > @dataTo) 
						AND		a.ClasseTempo = @classeTempo)
					
	-- sommo!
	SET		@totOre = (ISNULL(@incl,0) + ISNULL(@start,0) + ISNULL(@end,0) + ISNULL(@full,0))
	
	RETURN	@totOre
	
	END
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_PzProd_getByMacchinaPeriodo
* 	recupera per la macchina indicata i pezzi prodotti nel periodo
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
create PROCEDURE stp_PzProd_getByMacchinaPeriodo
(
	@idxMacchina NVARCHAR(50),
	@startProd DATETIME,
	@endProd DATETIME
)
AS

BEGIN TRAN

	SELECT  @idxMacchina as idxMacchina, ISNULL(SUM(PzProd),0) as pezziNonConfermati, @startProd AS DataFrom, @endProd AS DataTo
	FROM	TempiCicloRilevati
	WHERE	IdxMacchina = @idxMacchina
	AND		DataOraRif BETWEEN @startProd AND @endProd

COMMIT TRAN

RETURN
go

/*************************************
* STORED PROCEDURE stp_TempoByIdxMaccPeriodClass
* 	calcola il tempo da diario di bordo x una macchian dato periodo e tipo classe stati
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
create PROCEDURE stp_TempoByIdxMaccPeriodClass
(
	@IdxMacchina NVARCHAR(50),
	@DataFrom DATETIME,
	@DataTo DATETIME,
	@ClasseTempo NVARCHAR(50)
)
AS


	SELECT	CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS ore FROM DiarioDiBordo ddb 
			INNER JOIN AnagraficaStati a ON ddb.IdxStato = a.IdxStato
			WHERE	(a.ClasseTempo = @ClasseTempo)
			AND		(ddb.IdxMacchina = @IdxMacchina) 
			AND		(ddb.InizioStato >= @DataFrom) 
			AND		(ddb.FineStato <= @DataTo) 

RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_Microfermo'
  WHERE IdxStato=1
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoGiallo'
  WHERE IdxStato=2
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoGiallo'
  WHERE IdxStato=3
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=4
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=5
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_Microfermo'
  WHERE IdxStato=6
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=7
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=8
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=9
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoGiallo'
  WHERE IdxStato=10
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_Microfermo'
  WHERE IdxStato=12
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=15
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoRosso'
  WHERE IdxStato=23
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoGiallo'
  WHERE IdxStato=24
UPDATE dbo.AnagraficaStati SET 
  ClasseTempo=N'T_FermoGiallo'
  WHERE IdxStato=25
INSERT INTO dbo.AnagraficaStati
  VALUES (26, N'Non Disponibile', N'S', 1, N'T_OFF_ND')
go

commit transaction
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.AnagClassiTempo
  VALUES (N'T_Microfermo', N'Microfermate')
INSERT INTO dbo.AnagClassiTempo
  VALUES (N'T_OFF', N'Macchina spenta')
INSERT INTO dbo.AnagClassiTempo
  VALUES (N'T_OFF_ND', N'Macchina in tempo Non Disponibile')
INSERT INTO dbo.AnagClassiTempo
  VALUES (N'T_FermoGiallo', N'Macchina in Automatico, ferma per attrezzaggi o fermi a ciclo')
INSERT INTO dbo.AnagClassiTempo
  VALUES (N'T_FermoRosso', N'Macchina Ferma in RUN')
go

commit transaction
go


set xact_abort on
go

begin transaction
go

DELETE FROM dbo.AnagClassiTempo WHERE ClasseTempo=N'T_Auto'
DELETE FROM dbo.AnagClassiTempo WHERE ClasseTempo=N'T_Fermo'
DELETE FROM dbo.AnagClassiTempo WHERE ClasseTempo=N'T_ND'
go

commit transaction
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.CalendFesteFerie
  VALUES ('2011-04-25 00:00:00.000', N'festa della liberazione')
INSERT INTO dbo.CalendFesteFerie
  VALUES ('2011-05-01 00:00:00.000', N'festa dei lavoratori')
INSERT INTO dbo.CalendFesteFerie
  VALUES ('2011-06-02 00:00:00.000', N'festa della repubblica')
go

commit transaction
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* Function f_calcolaTempoStato_ByInterv
* 	calcola il totale del tempo di uno stato per un intervallo date
*
* modif.:	S.E.L.
* il:		2011.06.23
**************************************/
create FUNCTION f_calcolaTempoStato_ByInterv
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@IdxStato		INT
)
RETURNS DECIMAL(18,8)
AS
	BEGIN
	-- dichiaro out
	DECLARE @totOre AS DECIMAL(18,8)
	DECLARE @incl AS DECIMAL(18,8)
	DECLARE @start AS DECIMAL(18,8)
	DECLARE @end AS DECIMAL(18,8)
	DECLARE @full AS DECIMAL(18,8)
	
	-- inizio calcolando il tempo degli eventi totalmente inclusi nell'intervallo
	SET @incl = (SELECT  CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato BETWEEN @dataFrom AND @dataTo) 
						AND		(ddb.FineStato BETWEEN @dataFrom AND @dataTo) 
						AND		IdxStato = @IdxStato)

	-- ora sommo gli eventi sui bordi: inizio...
	SET @start = (SELECT  CAST(ISNULL(DATEDIFF(n, @dataFrom, CASE WHEN ddb.FineStato < @dataTo THEN ddb.FineStato ELSE @dataTo END) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato < @dataFrom) 
						AND		(ddb.FineStato BETWEEN @dataFrom AND @dataTo)
						AND		IdxStato = @IdxStato)
						
	-- ...e fine...
	SET @end = (SELECT  CAST(ISNULL(DATEDIFF(n, CASE WHEN ddb.InizioStato < @dataFrom THEN @dataFrom ELSE ddb.InizioStato END, @dataTo) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato BETWEEN @dataFrom AND @dataTo)  
						AND		(ddb.FineStato > @dataTo) 
						AND		IdxStato = @IdxStato)
	
	-- ...e pure eventi totalmente overlapping...
	SET @full = (SELECT  CAST(ISNULL(DATEDIFF(n, @dataFrom, @dataTo) ,0) AS DECIMAL(18,8)) / 60 AS Tempo
						FROM	DiarioDiBordo ddb
						WHERE	(ddb.IdxMacchina = @IdxMacchina) 
						AND		(ddb.InizioStato < @dataFrom) 
						AND		(ddb.FineStato > @dataTo) 
						AND		IdxStato = @IdxStato)

					
	-- sommo!
	SET		@totOre = (ISNULL(@incl,0) + ISNULL(@start,0) + ISNULL(@end,0) + ISNULL(@full,0))
	
	RETURN	@totOre
	
	END
go

commit
go




set xact_abort on
go

begin transaction
go

alter table DatiProduzione add
  Causale nvarchar(50)
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insAllPeriodo
* 	calcola il tempo da diario di bordo x una macchina dato periodo e inserisce in tabella dati prod INSIEME ai pezzi prodotti
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
alter PROCEDURE stp_DatiProd_insAllPeriodo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT	
)
AS

BEGIN TRAN
	-- calcolo i pz prod da confermare per l'intero periodo
	DECLARE @pzProd AS INT
	SET		@pzProd = ( SELECT  ISNULL(SUM(PzProd),0)
							FROM	TempiCicloRilevati
							WHERE	IdxMacchina = @idxMacchina
							AND		DataOraRif BETWEEN @dataFrom AND @dataTo )

	-- calcolo l'ODL, l'articolo ed il TCiclo...
	DECLARE @idxODL		INT
	SET		@idxODL	= ( SELECT ISNULL(IdxODL, 0) FROM ODL WHERE (@dataFrom BETWEEN DataInizio AND ISNULL(DataFine, DATEADD(d, 1, GETDATE()))) AND NOT (DataInizio IS NULL) )
	
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	
	DECLARE	@TCAss		DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)

	-- dichiaro le ore che calcolo man mano...
	DECLARE @totOre		DECIMAL(18,8)
	DECLARE @ClasseTempo NVARCHAR(50)
			
	-- variabili x ricerca gg festivi o aperture/chiusure ND programmate
	DECLARE @chiusura	INT
	DECLARE @apertura	INT
	DECLARE @ggSett		INT
	-- verifico se sia giorno di chiusura, in tal caso carico 8 h in T_OFF_ND
	SET @chiusura = ( SELECT COUNT(*) FROM CalendFesteFerie WHERE data = @dataRif )
	-- verifico che da apertura sia un periodo valido e non di fermo programmato
	IF(@chiusura = 0)
		BEGIN
			-- controllo a seconda della data e turno a che gg di settimana e turno corrisponde...
			SET DATEFIRST 1; -- setto al lunedì inizio settimana
			SET @ggSett = DATEPART(dw, @dataFrom ) -- calcolo giorno
			SET @apertura = ( SELECT CASE @turnoRif WHEN 1 THEN T1 WHEN 2 THEN T2 ELSE T3 END FROM CalendApertura WHERE NumGG = @ggSett ) -- cerco ore apertura...
			SET @chiusura = ( SELECT CASE @apertura WHEN 8 THEN 0 ELSE 1 END ) -- e se sia turno valido (8h) o vuoto (0h) nel qual caso chiusura > 0
		END
	-- se c'è chiusura per turno singolo o per giorno intero...
	IF(@chiusura > 0)
		BEGIN
			SET		@ClasseTempo = 'T_OFF_ND'
			SET		@totOre = 8
			INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
										DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
			VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
										@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo, @ClasseTempo)
		END
	ELSE -- normale dichiarazione
		BEGIN
			-- inserisco i dati di SOLO tempo prodotto e pz prodotti
			SET		@ClasseTempo = 'T_AutoRun'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo, @ClasseTempo)
			END
			
			-- inserisco gli altri tempi, pezzi prod ZERO!!!
			SET		@ClasseTempo = 'T_Microfermo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END

			SET		@ClasseTempo = 'T_FermoGiallo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
			
			SET		@ClasseTempo = 'T_FermoRosso'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
			
			SET		@ClasseTempo = 'T_OFF'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
		END

COMMIT TRAN
RETURN
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insert
* 	dichiara i dati x la machcina indicata x tab DatiProduzione
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
alter PROCEDURE stp_DatiProd_insert
(
	@idxODL			INT,
	@idxMacchina	NVARCHAR(50),
	@MatrApp		INT,
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@turno			INT,
	@pezziConf		INT,
	@Tempo			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

BEGIN TRAN
	-- calcolo variabili
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	DECLARE	@TCAss DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)
	-- versione semplificata: approva tutto x data e turno INIZIALE del periodo indicato
	INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
	VALUES (@idxODL, GETDATE(), @dataFrom, @turno, @CodArticolo, @idxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, @dataTo, @pezziConf, @Tempo, @ClasseTempo, @ClasseTempo)

COMMIT TRAN

RETURN
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insClasseTempo
* 	inserisce i tempi di tutte le SIONGOLE causali rilevate per un intervallo di tempo ed una data classe tempo
*
* modif.:	S.E.L.
* il:		2011.06.23
**************************************/
create PROCEDURE stp_DatiProd_insClasseTempo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT,	
	@idxODL			INT,
	@CodArticolo	NVARCHAR(50),
	@TCAss			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

-- creo tab elenco delle fermate raggruppate x classe tempo 
WITH cte_stati AS(
SELECT DISTINCT ddb.IdxStato, Descrizione as Causale
FROM         DiarioDiBordo AS ddb INNER JOIN AnagraficaStati AS a ON ddb.IdxStato = a.IdxStato
WHERE     (ddb.InizioStato BETWEEN @dataFrom AND @dataTo) AND (a.ClasseTempo = @classeTempo) AND (IdxMacchina = @IdxMacchina)
)

--...e lo inserisco!
INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom,
							DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
					(
						SELECT @idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, 
							@dataTo, 0, dbo.f_calcolaTempoStato_ByInterv(@IdxMacchina,@dataFrom, @dataTo, IdxStato), @ClasseTempo, Causale
						FROM cte_stati
					)


RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

alter table AnagraficaStati add
  ShowArticolo bit
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insClasseTempo
* 	inserisce i tempi di tutte le SIONGOLE causali rilevate per un intervallo di tempo ed una data classe tempo
*
* modif.:	S.E.L.
* il:		2011.06.23
**************************************/
alter PROCEDURE stp_DatiProd_insClasseTempo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT,	
	@idxODL			INT,
	@CodArticolo	NVARCHAR(50),
	@TCAss			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

-- creo tab elenco delle fermate raggruppate x classe tempo 
WITH cte_stati AS(
SELECT DISTINCT ddb.IdxStato, Descrizione as Causale, a.ShowArticolo
FROM         DiarioDiBordo AS ddb INNER JOIN AnagraficaStati AS a ON ddb.IdxStato = a.IdxStato
WHERE     (ddb.InizioStato BETWEEN @dataFrom AND @dataTo) AND (a.ClasseTempo = @classeTempo) AND (IdxMacchina = @IdxMacchina)
)

--...e lo inserisco!
INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom,
							DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
					(
						SELECT @idxODL, GETDATE(), @dataRif, @turnoRif, CASE ShowArticolo WHEN 1 THEN @CodArticolo ELSE '' END AS CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, 
							@dataTo, 0, dbo.f_calcolaTempoStato_ByInterv(@IdxMacchina,@dataFrom, @dataTo, IdxStato), @ClasseTempo, Causale
						FROM cte_stati
					)


RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=1
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=2
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=3
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=4
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=5
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=6
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=7
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=8
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=9
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=10
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=11
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=12
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=13
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=14
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=15
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=23
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=24
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=1
  WHERE IdxStato=25
UPDATE dbo.AnagraficaStati SET 
  ShowArticolo=0
  WHERE IdxStato=26
go

commit transaction
go




set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insClasseTempo
* 	inserisce i tempi di tutte le SIONGOLE causali rilevate per un intervallo di tempo ed una data classe tempo
*
* modif.:	S.E.L.
* il:		2011.06.23
**************************************/
alter PROCEDURE stp_DatiProd_insClasseTempo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT,	
	@idxODL			INT,
	@CodArticolo	NVARCHAR(50),
	@TCAss			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

-- creo tab elenco delle fermate raggruppate x classe tempo 
WITH cte_stati AS(
SELECT DISTINCT ddb.IdxStato, Descrizione as Causale, a.ShowArticolo
FROM         DiarioDiBordo AS ddb INNER JOIN AnagraficaStati AS a ON ddb.IdxStato = a.IdxStato
WHERE     (ddb.InizioStato BETWEEN @dataFrom AND @dataTo) AND (a.ClasseTempo = @classeTempo) AND (IdxMacchina = @IdxMacchina)
)

--...e lo inserisco!
INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom,
							DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
					(
						SELECT @idxODL, GETDATE(), @dataRif, @turnoRif, CASE ShowArticolo WHEN 1 THEN @CodArticolo ELSE '' END AS CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, @dataFrom, 
							@dataTo, 0, dbo.f_calcolaTempoStato_ByInterv(@IdxMacchina,@dataFrom, @dataTo, IdxStato), @ClasseTempo, Causale
						FROM cte_stati
					)


RETURN
go

commit
go




set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insClasseTempo
* 	inserisce i tempi di tutte le SIONGOLE causali rilevate per un intervallo di tempo ed una data classe tempo
*
* modif.:	S.E.L.
* il:		2011.06.23
**************************************/
alter PROCEDURE stp_DatiProd_insClasseTempo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT,	
	@idxODL			INT,
	@CodArticolo	NVARCHAR(50),
	@TCAss			DECIMAL(18,8),
	@ClasseTempo	NVARCHAR(50)
)
AS

-- creo tab elenco delle fermate raggruppate x classe tempo 
WITH cte_stati AS(
SELECT DISTINCT ddb.IdxStato, Descrizione as Causale, a.ShowArticolo
FROM         DiarioDiBordo AS ddb INNER JOIN AnagraficaStati AS a ON ddb.IdxStato = a.IdxStato
WHERE     (ddb.InizioStato BETWEEN @dataFrom AND @dataTo) AND (a.ClasseTempo = @classeTempo) AND (IdxMacchina = @IdxMacchina)
)

--...e lo inserisco!
INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, DataOraFrom,
							DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
					(
						SELECT @idxODL, GETDATE(), @dataRif, @turnoRif, CASE ShowArticolo WHEN 1 THEN @CodArticolo ELSE '' END AS CodArticolo, @IdxMacchina, CASE ShowArticolo WHEN 1 THEN @TCAss ELSE 0 END AS TCAss, @MatrApp, @MatrApp, @dataFrom, 
							@dataTo, 0, dbo.f_calcolaTempoStato_ByInterv(@IdxMacchina,@dataFrom, @dataTo, IdxStato), @ClasseTempo, Causale
						FROM cte_stati
					)


RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiProd_insAllPeriodo
* 	calcola il tempo da diario di bordo x una macchina dato periodo e inserisce in tabella dati prod INSIEME ai pezzi prodotti
*
* modif.:	S.E.L.
* il:		2011.06.06
**************************************/
alter PROCEDURE stp_DatiProd_insAllPeriodo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME,
	@dataRif		DATETIME,
	@turnoRif		INT,
	@MatrApp		INT	
)
AS

BEGIN TRAN
	-- calcolo i pz prod da confermare per l'intero periodo
	DECLARE @pzProd AS INT
	SET		@pzProd = ( SELECT  ISNULL(SUM(PzProd),0)
							FROM	TempiCicloRilevati
							WHERE	IdxMacchina = @idxMacchina
							AND		DataOraRif BETWEEN @dataFrom AND @dataTo )

	-- calcolo l'ODL, l'articolo ed il TCiclo...
	DECLARE @idxODL		INT
	SET		@idxODL	= ( SELECT ISNULL(IdxODL, 0) FROM ODL WHERE (@dataFrom BETWEEN DataInizio AND ISNULL(DataFine, DATEADD(d, 1, GETDATE()))) AND NOT (DataInizio IS NULL) )
	
	DECLARE	@CodArticolo NVARCHAR(50)
	SET		@CodArticolo = ISNULL((SELECT ISNULL(CodArticolo,'') FROM ODL WHERE IdxODL = @idxODL), '')
	
	DECLARE	@TCAss		DECIMAL(18,8)
	SET		@TCAss = ISNULL((SELECT ISNULL(TCAssegnato, 1) FROM ODL WHERE IdxODL = @idxODL), 1)

	-- dichiaro le ore che calcolo man mano...
	DECLARE @totOre		DECIMAL(18,8)
	DECLARE @ClasseTempo NVARCHAR(50)
			
	-- variabili x ricerca gg festivi o aperture/chiusure ND programmate
	DECLARE @chiusura	INT
	DECLARE @apertura	INT
	DECLARE @ggSett		INT
	-- verifico se sia giorno di chiusura, in tal caso carico 8 h in T_OFF_ND
	SET @chiusura = ( SELECT COUNT(*) FROM CalendFesteFerie WHERE data = @dataRif )
	-- verifico che da apertura sia un periodo valido e non di fermo programmato
	IF(@chiusura = 0)
		BEGIN
			-- controllo a seconda della data e turno a che gg di settimana e turno corrisponde...
			SET DATEFIRST 1; -- setto al lunedì inizio settimana
			SET @ggSett = DATEPART(dw, @dataFrom ) -- calcolo giorno
			SET @apertura = ( SELECT CASE @turnoRif WHEN 1 THEN T1 WHEN 2 THEN T2 ELSE T3 END FROM CalendApertura WHERE NumGG = @ggSett ) -- cerco ore apertura...
			SET @chiusura = ( SELECT CASE @apertura WHEN 8 THEN 0 ELSE 1 END ) -- e se sia turno valido (8h) o vuoto (0h) nel qual caso chiusura > 0
		END
	-- se c'è chiusura per turno singolo o per giorno intero...
	IF(@chiusura > 0)
		BEGIN
			SET		@ClasseTempo = 'T_OFF_ND'
			SET		@totOre = 8
			INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
										DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
			VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, '', @IdxMacchina, 0, @MatrApp, @MatrApp, -- non metto ne tempo ne cod articolo...
										@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo, @ClasseTempo)
		END
	ELSE -- normale dichiarazione
		BEGIN
			-- inserisco i dati di SOLO tempo prodotto e pz prodotti
			SET		@ClasseTempo = 'T_AutoRun'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				INSERT INTO DatiProduzione(IdxODL, DataOraApp, DataRif, TurnoRif, CodArticolo, IdxMacchina, TCAssegnato, MatrOpr, MatrApp, 
											DataOraFrom, DataOraTo, TotPzProd, Tempo, ClasseTempo, Causale)
				VALUES (@idxODL, GETDATE(), @dataRif, @turnoRif, @CodArticolo, @IdxMacchina, @TCAss, @MatrApp, @MatrApp, 
											@dataFrom, @dataTo, @pzProd, @totOre, @ClasseTempo, @ClasseTempo)
			END
			
			-- inserisco gli altri tempi, pezzi prod ZERO!!!
			SET		@ClasseTempo = 'T_Microfermo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END

			SET		@ClasseTempo = 'T_FermoGiallo'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
			
			SET		@ClasseTempo = 'T_FermoRosso'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
			
			SET		@ClasseTempo = 'T_OFF'
			SET		@totOre = dbo.f_calcolaTempoClasse_ByInterv(@IdxMacchina, @dataFrom, @dataTo, @ClasseTempo)
			IF(@totOre > 0)
			BEGIN
				-- scrivo tutti gli eventi della classe
				EXEC stp_DatiProd_insClasseTempo @IdxMacchina, @dataFrom, @dataTo, @dataRif, @turnoRif, @MatrApp, @idxODL, @CodArticolo, @TCAss, @ClasseTempo	
			END
		END

COMMIT TRAN
RETURN
go

commit
go



set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_DatiConf_getByPeriodo
* 	
* recupera i dati confermati x un periodo, ordinati in data DESC
*
* modif.:	S.E.L.
* il:		2011.07.04
**************************************/
create PROCEDURE stp_DatiConf_getByPeriodo
(
	@dataFrom		DATETIME,
	@dataTo			DATETIME
)
AS

SELECT		*
FROM		DatiConfermati
WHERE		(DataRif >= @dataFrom AND DataRif <= @dataTo)
ORDER BY	DataRif DESC

RETURN
go

/*************************************
* STORED PROCEDURE stp_DatiProd_getByMacchPeriodo
* 	
* recupera i dati confermati x una macchina e periodo, ordinati in data DESC
*
* modif.:	S.E.L.
* il:		2011.07.04
**************************************/
create PROCEDURE stp_DatiProd_getByMacchPeriodo
(
	@idxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME
)
AS

SELECT		*
FROM		DatiProduzione
WHERE		IdxMacchina = @idxMacchina AND (DataRif >= @dataFrom AND DataRif <= @dataTo)
ORDER BY	DataRif DESC

RETURN
go

/*************************************
* STORED PROCEDURE stp_DatiProd_getByPeriodo
* 	
* recupera i dati confermati x un periodo, ordinati in data DESC
*
* modif.:	S.E.L.
* il:		2011.07.04
**************************************/
create PROCEDURE stp_DatiProd_getByPeriodo
(
	@dataFrom		DATETIME,
	@dataTo			DATETIME
)
AS

SELECT		*
FROM		DatiProduzione
WHERE		(DataRif >= @dataFrom AND DataRif <= @dataTo)
ORDER BY	DataRif DESC

RETURN
go

commit
go









-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(300, GETDATE())
GO
