-- STEP 3: stored & functions
set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_creaListaPrelievo
*
* crea un nuovo record nella ElencoListePrelievo e restituisce il codice ID appena creato
*
* Steamware, S.E.L. 8 (FROM Stintino)
* mod: 2010.07.30
*
************************************/
alter PROCEDURE stp_creaListaPrelievo
(
	@Anno NVARCHAR(2),
	@Mese NVARCHAR(2),
	@CodTipoLista NVARCHAR(10),
	@CodCS NCHAR(2),
	@CodCliente NVARCHAR(6),
	@RagSociale NVARCHAR(35),
	@CodSoggetto NCHAR(17),
	@Particolare NVARCHAR(15),
	@DescParticolare NVARCHAR(30),
	@DisegnoGrezzo NVARCHAR(30),
	@Esponente NVARCHAR(6),
	@Figura NVARCHAR(4),
	@CodImballo NVARCHAR(15),
	@QtaTot DECIMAL(10,2),
	@Destinatario NVARCHAR(50),
	@DestinatarioDescrizione NVARCHAR(50)
)
AS

-- Dichiarazioni iniziali
DECLARE @CodLista AS NVARCHAR(12)
DECLARE @numLista AS INT
DECLARE @temp AS INT
DECLARE @ora AS DATETIME
	
------------------------------------------------------------------------------------------------------
-- codice lista di prelievo KAAMM00000 - K = start char, AA = anno, MM = mese, 00000 = progressivo
------------------------------------------------------------------------------------------------------
-- controllo se ci sia già una lista di prelievo per company / flusso anno
BEGIN TRAN
	-- cerco nella tab contatori liste prelievo l'ultimo valido
	SET @numLista = (
		SELECT COUNT(*)
		FROM ContatoriListePrelievo
		WHERE	CodCS		=	@CodCS
		AND		Anno		=	@Anno
		AND		Mese		=	@Mese
	)
	-- controllo se record c'è...
	IF(@numLista > 0)
		BEGIN
			-- se c'è incremento di 1 in tab
			UPDATE ContatoriListePrelievo
			SET LastIdx = LastIdx  + 1
			WHERE	CodCS		=	@CodCS
			AND		Anno		=	@Anno
			AND		Mese		=	@Mese

		END
	ELSE
		BEGIN
			-- lo creo!
			INSERT INTO ContatoriListePrelievo(CodCS, Anno, Mese, LastIdx)
			VALUES (@CodCS, @Anno, @Mese, 1)
		END		
	-- aggiorno numero lista prelievo
	SET @numLista = (
		SELECT LastIdx
		FROM ContatoriListePrelievo
		WHERE	CodCS		=	@CodCS
		AND		Anno		=	@Anno
		AND		Mese		=	@Mese

	)
COMMIT TRAN
------------------------------------------------------------------------------------------------------

BEGIN TRAN

	------------------------------------------------------------------------------------------------------
	-- Ciclo principale x inserimento nuovo record	
	------------------------------------------------------------------------------------------------------
	-- ottengo il nuovo codice lista di prelievo completo
	SET @CodLista = 'K' + @CodCS + @Anno + dbo.f_padLeft(CAST(@Mese AS NVARCHAR(2)), 2, '0') + + dbo.f_padLeft(CAST(@numLista AS NVARCHAR(5)), 5, '0')

	INSERT INTO ElencoListePrelievo
			(CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario, DestinatarioDescrizione, DataModStato)
	VALUES  (@CodLista, @CodTipoLista, @CodCS, GETDATE(), @CodCliente, @RagSociale, @CodSoggetto, @Particolare, @DescParticolare, @DisegnoGrezzo, @Esponente,@Figura, @CodImballo, @QtaTot, 0, @Destinatario, @DestinatarioDescrizione, GETDATE() )

COMMIT TRAN

SELECT CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario, DestinatarioDescrizione
FROM V_elencoListePrelievo WHERE CodLista = @CodLista;

RETURN
go

commit;
go



--- modifica manuale da testare... manca db ACG...
set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*****************************************
* STORED stp_DtMtrx_import
*
* Recupera dati Gitterbox/DataMatrix partendo leggendo dati successivi all'ultimo import e importanto in tab GMW
*
* Steamware, S.E.L.
* mod: 2011.04.29
*
****************************************/
alter PROCEDURE stp_DtMtrx_import
(
	@CodCS VARCHAR(2),
	@IdxPosizione INT,
	@CodSoggetto VARCHAR(17)
)
AS

SET XACT_ABORT ON;
SET NOCOUNT ON;

------------------------------------------------------------------------------------------------------
-- leggo data ultimo import (o creo record...)
------------------------------------------------------------------------------------------------------
DECLARE		@nomeFlusso AS NVARCHAR(50)
DECLARE		@lastImport AS DATETIME
DECLARE		@trovati AS INT

-- imposto valori
SET		@nomeFlusso = 'DataMatrix'
SET		@lastImport = DATEADD(yy,-10,GETDATE()) -- inizializzo a -10 anni ...
-- sistemo tab registrazione import...
BEGIN TRAN
	-- cerco nella tab log ultima data caricamento
	SET @trovati = (
		SELECT	COUNT(*)
		FROM	logImportFlussi
		WHERE	NomeFlusso = @nomeFlusso
	)
	-- controllo se record c'è...
	IF(@trovati > 0)
		BEGIN
			SET	@lastImport = ( SELECT LastImport FROM LogImportFlussi WHERE	NomeFlusso	= @nomeFlusso )
		END
	ELSE
		BEGIN
			-- lo creo!
			INSERT INTO LogImportFlussi(NomeFlusso, LastImport)
			VALUES (@nomeFlusso, @lastImport)
		END		
COMMIT TRAN
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- ora gestisco il vero caricamento...
------------------------------------------------------------------------------------------------------
	-- filtro e salvo in tabella... gitterbox validi SOLO se iniziano per "U"
	-- verifico già se esite già l'UDC/Gitterbox in ElencoCartellini
	DECLARE @newData TABLE
	(
		RowNumber int,
		CodDataMatrix numeric(23, 0) ,
		CodGitterbox varchar(10) ,
		NumConchiglia int ,
		NumDisegno numeric(7, 0) ,
		EsponenteDisegno tinyint ,
		CodDifettoScarto varchar(5) ,
		InizioPreparazione smalldatetime ,
		FinePreparazione smalldatetime ,
		InizioIniezione smalldatetime ,
		FineIniezione smalldatetime ,
		MagDestinazione varchar(2) ,
		DataImport smalldatetime ,
		UDC varchar(50)
	)
    INSERT INTO @newData	
    SELECT 
           ROW_NUMBER() OVER(PARTITION BY CodGitterbox ORDER BY InizioIniezione ASC),
           dm.CodDataMatrix, LTRIM(RTRIM(dm.CodGitterbox)), dm.NumConchiglia, dm.NumDisegno, dm.EsponenteDisegno,dm.CodDifettoScarto, dm.InizioPreparazione, dm.FinePreparazione, dm.InizioIniezione, dm.FineIniezione, dm.MagDestinazione, dm.DataImport,
           ec.UDC
    FROM dbo.v_trasfDataMatrix AS dm
    LEFT JOIN dbo.ElencoCartellini AS ec 
	 ON dm.CodGitterbox = ec.UDC
	WHERE DataImport > @lastImport AND LEFT(CodGitterbox, 1) = 'U'
	AND CodDifettoScarto = '00' -- non importa gli scarti!!!
	
	/* INIZIO MODIFICA  

		   Note GCarlo : 
		   
           Se il Gitterbox è già stato trasferito e/o cmq già presente non viene caricato, al 
           limite vengono caricati i Datamatrix non ancora presenti ma con Gitterbox = EmptyGBox

		   Se non trovo il Particolare in dbo.v_transcParticolari i datamatrix non vengono importati
		   Posso reimportarli spostando la data di import indietro in LogImportFlussi
		   
		   ATTENZIONE! Si presuppone che i DataMatrix siano coerenti ovvero stesso Particolare ecc. ecc.
    */
    BEGIN TRAN;

		-- creo UDC da gitterbox nuovi ( Se UDC già presenti non li carico )
        -- GCARLO messo un RowCount prima e prendo solo il primo DataMatrix
	    INSERT INTO ElencoCartellini(UDC,CodCS, Particolare, DescParticolare, DisegnoGrezzo, Esponente, DataFus, Qta, 
	                CodSoggetto, CodStato, IdxPosizione,CreateDate, ModDate, Figura, CodImballo, Tara, PesoTot, PesoCad, NumCont, TurnoFus, CodEvento )
		SELECT DISTINCT  nd.CodGitterbox, @CodCS, tp.Particolare, an.DescParticolare, an.DisegnoGrezzo, an.EsponenteModifica 
		                ,InizioIniezione, dbo.getNumDatamatrix(nd.CodGitterbox), @CodSoggetto As CodSoggetto, 'FinGBox' AS CodStato
		                ,@IdxPosizione, GETDATE(), GETDATE()
		                ,'' AS Figura, '' AS CodImballo,0 AS Tara,0 AS PesoTot,0 AS PesoCad,1 AS NumCont,0 AS TurnoFus, 'UDC_GBOX' AS CodEvento
		FROM @newData nd
		INNER JOIN dbo.v_transcParticolari tp           -- solo se PArticolare è presente in Trascodifica
		    ON nd.NumDisegno = tp.NumDisegno AND nd.EsponenteDisegno = tp.EsponenteDisegno
		LEFT JOIN RilPro.AnagParticolari an             -- Leggo il disegno in anagrafica
		    ON tp.Particolare = an.Particolare
		WHERE nd.RowNumber = 1                          -- Prendo solo i dati del First DataMatrix ( data iniezione )
		  AND nd.UDC IS NULL                            -- solo Gitterbox Nuovi

        
		DECLARE @udc NVARCHAR(50)
		DECLARE @Particolare NVARCHAR(50)
		DECLARE @NumDisegno NVARCHAR(50)
		DECLARE @EsponenteDisegno NVARCHAR(50)
		DECLARE @IdxCellaTo INT
		DECLARE @adesso DATETIME
		DECLARE @posTrovate INT
		
		SET		@adesso = GETDATE()
		SET		@posTrovate = 0

        -- indico cella UDC corrente... calcolo la prima cella della nuova posizione...
		SET		@IdxCellaTo = ( SELECT dbo.f_getCellaByPos(CAST(@IdxPosizione AS NVARCHAR(50))) )
		
		DECLARE cursoreImport CURSOR FOR
		SELECT DISTINCT CodGitterbox
		FROM @newData
		WHERE UDC IS NULL                            -- solo x Gitterbox Nuovi
		
		OPEN cursoreImport
		FETCH NEXT FROM cursoreImport INTO @udc

		WHILE @@FETCH_STATUS = 0
		BEGIN
		
			-- controllo se posizione non ancora creata...
			SET @posTrovate = ( SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE UDC = @udc )
			IF( @posTrovate = 0)
			BEGIN
				INSERT INTO PosizioneUdcCorrente(UDC,IdxCella, CodCS, DataRif, CodSoggetto)
				VALUES (@udc, @IdxCellaTo, @CodCS, @adesso, @CodSoggetto)
			END
			
			FETCH NEXT FROM cursoreImport INTO @udc
		END

		CLOSE cursoreImport
		DEALLOCATE cursoreImport

	    -- CARICAMENTO DATAMATRIX -- 
		
		-- Carico i datamatrix se UDC/Gitterbox nuovi
		INSERT INTO dbo.ElencoDataMatrix
        SELECT  nw.CodDataMatrix
               ,nw.CodGitterbox
               ,nw.NumConchiglia
               ,nw.NumDisegno
               ,nw.EsponenteDisegno
               ,nw.CodDifettoScarto
               ,nw.InizioPreparazione
               ,nw.FinePreparazione
               ,nw.InizioIniezione
               ,nw.FineIniezione
               ,nw.MagDestinazione
               ,nw.DataImport
        FROM @newData AS nw
        LEFT JOIN dbo.ElencoDataMatrix AS el
          ON nw.CodDataMatrix = el.CodDataMatrix
        WHERE el.CodDataMatrix IS NULL              -- Nuovi Datamatrix 
              AND nw.UDC IS NULL                    -- Solo per Gitterbox nuovi

        -- Se esistono Datamatrix di UDC già caricati in precedenza li inserisco ma senza 
        -- assegnare l'UDC ma lo metto a EmptyGBox perchè potrebbero essere UDC già spediti o
        -- movimentati e dovrei anche aggiornare la giacenza in ElencoCartellini
        INSERT INTO dbo.ElencoDataMatrix
        SELECT  nw.CodDataMatrix
               ,'EmptyGBox' AS CodGitterbox
               ,nw.NumConchiglia
               ,nw.NumDisegno
               ,nw.EsponenteDisegno
               ,nw.CodDifettoScarto
               ,nw.InizioPreparazione
               ,nw.FinePreparazione
               ,nw.InizioIniezione
               ,nw.FineIniezione
               ,nw.MagDestinazione
               ,nw.DataImport
        FROM @newData AS nw
        LEFT JOIN dbo.ElencoDataMatrix AS el
          ON nw.CodDataMatrix = el.CodDataMatrix
        WHERE el.CodDataMatrix IS NULL
          AND nw.UDC IS NOT NULL

	    -- aggiorno dati ultimo caricamento
	    SET		@lastImport = ISNULL( ( SELECT MAX(DataImport)FROM @newData ),@lastImport )
	    UPDATE	LogImportFlussi
	    SET		LastImport = @lastImport
	    WHERE	NomeFlusso = @nomeFlusso
   COMMIT TRAN;

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_elencoListePrelievoUpdateStato
*
* aggiorna la lista di prelievo indicando lo stato richiesto
*
* Steamware, S.E.L.
* mod: 2010.07.06
*
************************************/
alter PROCEDURE stp_elencoListePrelievoUpdateStato
(
	@NewCodSoggetto NCHAR(17),
	@CodListaAttuale AS varchar(12),
	@CodStatoLista INT
)
AS

UPDATE ElencoListePrelievo
SET  CodSoggetto   = @NewCodSoggetto
    ,CodStatoLista = @CodStatoLista 
    ,DataModStato  = GETDATE()
WHERE (CodLista = @CodListaAttuale)


SELECT CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario, DestinatarioDescrizione
FROM V_elencoListePrelievo WHERE (CodLista = @CodListaAttuale)
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_EP_delete
*
* elimina una postazione + stampante

* Steamware, S.E.L.
* mod: 2012.10.02
*
****************************************/
alter PROCEDURE stp_EP_delete
(
	@Original_codPostazione	NVARCHAR(250)
)
AS

DELETE
FROM	ElencoPostazioni
WHERE	codPostazione = @Original_codPostazione

RETURN
go

/***************************************
* STORED stp_EP_update
*
* update di una postazione + stampante

* Steamware, S.E.L.
* mod: 2012.10.02
*
****************************************/
alter PROCEDURE stp_EP_update
(
	@Original_codPostazione	NVARCHAR(250),
	@codPostazione			NVARCHAR(250),
	@stampante				NVARCHAR(250),
	@note					NVARCHAR(250)
)
AS

UPDATE	ElencoPostazioni
SET		codPostazione	= @codPostazione,
		stampante		= @stampante,
		note			= @note
WHERE	codPostazione	= @Original_codPostazione

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_getUdcDetailFullCode_storico
*
* ottiene ULTIM dati UDC DA STORICO con i dati significativi partendo da un codice UDC COMPLETO
*
* Steamware, S.E.L.
* mod: 2012.10.01
*
****************************************/
create PROCEDURE stp_getUdcDetailFullCode_storico
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME,
	@UDC			NVARCHAR(50),
	@CodCS			NVARCHAR(2)	
)
AS

WITH myCTE AS
(
	SELECT	TOP 1 *
	FROM	StoricoCartellini
	WHERE	DataEv BETWEEN @DataOraFrom AND @DataOraTo
	AND		UDC = @UDC
	ORDER BY DataEv DESC
)

SELECT        stc.UDC, ISNULL(stc.RagSociale, N'nd') AS RagSociale, ISNULL(stc.Particolare, N'nd') AS Particolare,
			  ISNULL(stc.DescParticolare, N'nd') AS DescParticolare, ISNULL(stc.DisegnoGrezzo, N'nd') AS DisegnoGrezzo, 
              ISNULL(stc.Esponente, N'nd') AS Esponente, ISNULL(stc.DescImpianto, N'nd') AS DescImpianto,
              ISNULL(stc.DataFus, N'') AS DataFus, ISNULL(stc.TurnoFus, 0) AS TurnoFus, stc.CodImballo, 
              stc.Qta,  ISNULL(AnagStatiProdotto.DescStato, N'nd') AS DescStato, stc.ModDate, 
              CASE WHEN(stc.IdxPosizione < 0)  THEN 'Consum' ELSE ISNULL(Blocchi.CodMag, N'nd') END AS CodMag, 
              ISNULL(Blocchi.CodBlocco, N'nd') AS CodBlocco, ISNULL(Celle.CodCella, N'nd') AS CodCella, ISNULL(dbo.Celle.IdxCella, 0) AS IdxCella,
              ISNULL(Celle.X, 0) AS X, ISNULL(Celle.Y, 0) AS Y, ISNULL(Celle.Z, 0) AS Z, stc.IdxPosizione, ISNULL(stc.Note,'') AS Note
FROM          AnagStatiProdotto RIGHT OUTER JOIN
              myCTE stc ON AnagStatiProdotto.CodStato = stc.CodStato AND AnagStatiProdotto.CodStato = stc.CodStato 
              LEFT OUTER JOIN Celle INNER JOIN PosizioneUdcCorrente ON Celle.IdxCella = PosizioneUdcCorrente.IdxCella 
              AND Celle.IdxCella = PosizioneUdcCorrente.IdxCella AND Celle.IdxCella = PosizioneUdcCorrente.IdxCella 
              INNER JOIN Blocchi ON Celle.IdxBlocco = Blocchi.IdxBlocco INNER JOIN AnagMag ON Blocchi.CodMag = AnagMag.CodMag 
              AND Blocchi.CodCS = AnagMag.CodCS AND Blocchi.CodMag = AnagMag.CodMag AND Blocchi.CodCS = AnagMag.CodCS AND Blocchi.CodMag = AnagMag.CodMag 
              AND Blocchi.CodCS = AnagMag.CodCS ON stc.UDC = PosizioneUdcCorrente.UDC
WHERE        (stc.UDC = @UDC) AND (stc.CodCS = @CodCS)

RETURN
go

/***************************************
* STORED stp_MagFifoByParticolare
*
* restituisce elenco giacenze a magazzino in logica FIFO per un dato particolare
*
* Steamware, S.E.L.
* mod: 2012.10.01
*
****************************************/
create PROCEDURE stp_MagFifoByParticolare
(
	@CodCS VARCHAR(2),
	@Particolare VARCHAR(20)
)
AS

	SELECT	      b.IdxBlocco, b.CodBlocco, b.DescBlocco, ec.Particolare
	            , COUNT(puc.UDC) AS NumUDC
				, ISNULL(MIN(puc.DataRif) , GETDATE()) AS Oldest
				, ISNULL(MAX(puc.DataRif) , GETDATE()) AS Newest
				, SUM(ec.Qta) AS QtaTotPz
	FROM		AnagMag am 
	INNER JOIN Blocchi b ON am.CodMag = b.CodMag AND am.CodCS = b.CodCS 
	INNER JOIN Celle c 
	INNER JOIN ElencoCartellini ec 
	LEFT OUTER JOIN PosizioneUdcCorrente puc ON ec.UDC = puc.UDC ON c.IdxCella = puc.IdxCella ON b.IdxBlocco = c.IdxBlocco 
	INNER JOIN  AnagStatiProdotto asp ON ec.CodStato = asp.CodStato
	WHERE		(c.Attiva = 1) 
	            AND b.CodMag <> 'VMLP' 
	            AND (am.CodCS = @CodCS) 
	            AND (ec.Particolare = @Particolare)
	GROUP BY	b.IdxBlocco, b.CodBlocco, b.DescBlocco, ec.Particolare
	ORDER BY	Oldest ASC
		
RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_prtCartFusiByUDC
*
* ottiene il record del Cartellino FUSI dato l'UDC richiesto x la stampa
*
* Steamware, G.A.R.
* mod: 2012.02.27
*
****************************************/
create PROCEDURE stp_prtCartFusiByUDC
(
	@UDC NVARCHAR(50)
)
AS

    -- estraggo i trattamenti nelle note ( x max 10 trattamenti )
	DECLARE @tmp		NVARCHAR(500)
	DECLARE @NoteTratt	NVARCHAR(500)
	SET @NoteTratt = ''

	-- SET @NoteTratt = (SELECT SUBSTRING(@tmp, 0, LEN(@tmp)))

	-- ora seleziono i dati veri e propri
	SELECT
		ElencoCartellini.UDC, ElencoCartellini.CodCS, ISNULL(ElencoCartellini.CodCliente, N'') AS codcliente, 
		ISNULL(ElencoCartellini.RagSociale, N'') AS ragsociale, ISNULL(ElencoCartellini.Particolare, N'') AS particolare,
		ISNULL(ElencoCartellini.DescParticolare, N'') AS DescParticolare, ISNULL(ElencoCartellini.DisegnoGrezzo, N'') AS DisegnoGrezzo, 
		ISNULL(ElencoCartellini.Esponente, N'') AS esponente, ISNULL(ElencoCartellini.CodImpianto, N'') AS CodImpianto,
		ISNULL(ElencoCartellini.DescImpianto, N'') AS DescImpianto, ISNULL(ElencoCartellini.CodStampo, N'') AS codstampo, 
		ISNULL(ElencoCartellini.Figura, N'') AS figura, ISNULL(ElencoCartellini.DataFus, N'') AS datafus,
		ISNULL(ElencoCartellini.TurnoFus, N'') AS turnofus, ISNULL(ElencoCartellini.CodImballo, N'') AS CodImballo, 
		ISNULL(ElencoCartellini.CodSoggetto, N'') AS CodSoggetto, ISNULL(ElencoCartellini.NumCont, N'') AS NumCont,
		ISNULL(ElencoCartellini.Tara, N'') AS tara, ISNULL(ElencoCartellini.Qta, N'') AS qta, ISNULL(ElencoCartellini.CodStato, N'') AS CodStato, 
		ISNULL(ElencoCartellini.IdxPosizione, N'') AS IdxPosizione,
		ISNULL(ElencoCartellini.PesoTot, N'') AS PesoTot, ISNULL(ElencoCartellini.PesoCad, N'') AS PesoCad, ElencoCartellini.CreateDate, 
		ElencoCartellini.ModDate, ISNULL(RilPro.AnagOperatori.Cognome, N'') AS cognome,
		ISNULL(RilPro.AnagOperatori.Nome, N'') AS nome, ISNULL(AnagStatiProdotto.DescStato, N'') AS DescStato, 
		ISNULL(RilPro.AnagImballi.DescImballo, N'') AS DescImballo, RilPro.AnagParticolari.CodFamiglia, RilPro.AnagFamiglie.DescFamiglia,
		ISNULL(ElencoCartellini.Note, N'') AS Note, @NoteTratt AS NoteTratt
	FROM
		RilPro.AnagParticolari 
	LEFT OUTER JOIN
		RilPro.AnagFamiglie 
	ON
		RilPro.AnagParticolari.CodFamiglia = RilPro.AnagFamiglie.CodFamiglia 
	RIGHT OUTER JOIN
		ElencoCartellini 
	ON
		RilPro.AnagParticolari.Particolare = ElencoCartellini.Particolare 
	LEFT OUTER JOIN
		AnagStatiProdotto 
	ON
		ElencoCartellini.CodStato = AnagStatiProdotto.CodStato 
	LEFT OUTER JOIN
		RilPro.AnagOperatori 
	ON
		ElencoCartellini.CodSoggetto = RilPro.AnagOperatori.CodSoggetto 
	LEFT OUTER JOIN
		RilPro.AnagImballi 
	ON
		ElencoCartellini.CodImballo = RilPro.AnagImballi.CodImballo 
	WHERE
		(ElencoCartellini.UDC = @UDC)
 

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_riattivaUdc
*
* riattiva un dato UDC (da mag consumato negativo a corrispettivo positivo) --> se era positivo NON FA NULLA!!! (perchè uso ABS e controllo sia < 0)
*
* Steamware, S.E.L.
* mod: 2012.05.30
*
****************************************/
alter PROCEDURE stp_riattivaUdc
(
	@UDC VARCHAR(50),
	@CodSoggetto NVARCHAR(17)
)
AS

DECLARE @CodEvento VARCHAR(10)
DECLARE @CodTipoDichiaraz VARCHAR(1)
DECLARE @IdxCella INT
DECLARE @CodCS NVARCHAR(2)

SET @UDC = UPPER(@UDC)   -- metto ad Upper nel caso venga passato in minuscolo ( es. da terminalino )

SET @CodEvento = 'UDC_RIA'
SET @CodTipoDichiaraz = 'U'

BEGIN TRAN
	
	-- faccio update posizione
	UPDATE      ElencoCartellini
	SET         IdxPosizione = ABS(IdxPosizione)
			   ,ModDate=GETDATE()
			   ,CodEvento	= @CodEvento
			   ,CodSoggetto = @CodSoggetto
	WHERE		UDC = @UDC AND IdxPosizione IN (SELECT IdxPosizione FROM AnagPosizioni WHERE (IsRiattivaEnabled = 1)
)
	
	-- lo elimino da eventuali precedenti liste di prelievo sennò poi non potrei + prelevarlo
	DELETE FROM RigheListePrelievo
	WHERE UDC = @UDC
	
	-- imposto posizione CELLA corrente x l'udc nella prima libera 
	SET @IdxCella = (SELECT c.IdxCella FROM Celle c inner join Blocchi b ON c.IdxBlocco=b.IdxBlocco INNER JOIN ElencoCartellini e ON b.CodMag = CAST(e.IdxPosizione AS NVARCHAR(50)) WHERE e.UDC = @UDC)
	SET @CodCS = (SELECT CodCS FROM ElencoCartellini WHERE UDC = @UDC)
	INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto)
	VALUES(@Udc, @IdxCella, @CodCS, GETDATE(), @CodSoggetto)

	
COMMIT TRAN

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*stp_SAO_getByIdxEv
* STORED stp_SAO_getBySearch
*
* cerca riga in Storico Azioni Operatore
* Steamware, S.E.L.
* mod: 2012.09.25
*
****************************************/
create PROCEDURE stp_SAO_getByIdxEv
(
	@idxEvento	INT=0
)
AS
	SELECT	*
	FROM	StoricoAzioniOperatore
	WHERE	idxEvento = @idxEvento

RETURN
go

/***************************************
* STORED stp_SAO_getBySearch
*
* effettua ricerca nello Storico Azioni Operatore
* Steamware, S.E.L.
* mod: 2012.09.25
*
****************************************/
create PROCEDURE stp_SAO_getBySearch
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME,
	@CodSoggetto	NVARCHAR(17)='*',
	@codPostazione	NVARCHAR(250)='*',
	@UDC			NVARCHAR(50),
	@Particolare	NVARCHAR(15),
	@codAzione		NVARCHAR(10)='*'
)
AS
	SELECT	*
	FROM	StoricoAzioniOperatore
	WHERE	DataOra BETWEEN @DataOraFrom AND @DataOraTo
	AND		codPostazione = CASE WHEN ISNULL(@codPostazione,'*') = '*' THEN codPostazione ELSE @codPostazione END -- NON VA!!!
	AND		CodSoggetto = CASE WHEN ISNULL(@CodSoggetto,'*') = '*' THEN CodSoggetto ELSE @CodSoggetto END
	AND		codAzione = CASE WHEN ISNULL(@codAzione,'*') = '*' THEN codAzione ELSE @codAzione END
	AND		UDC = CASE WHEN ISNULL(@UDC,'*') = '*' THEN UDC ELSE @UDC END
	AND		Particolare = CASE WHEN ISNULL(@Particolare,'*') = '*' THEN Particolare ELSE @Particolare END
	ORDER BY IdxEvento DESC

RETURN
go

/***************************************
* STORED stp_SAO_getLastPostazione
*
* ultimi record SAO x postazione
* Steamware, S.E.L.
* mod: 2012.09.25
*
****************************************/
create PROCEDURE stp_SAO_getLastPostazione
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME,
	@codPostazione	NVARCHAR(250)=''
)
AS
	SELECT		*
	FROM		StoricoAzioniOperatore
	WHERE		DataOra BETWEEN @DataOraFrom AND @DataOraTo
	AND			codPostazione = @codPostazione
	ORDER BY	DataOra DESC

RETURN
go

/***************************************
* STORED stp_SAO_insert
*
* inserisce nuova riga nello Storico Azioni Operatore
*
* Steamware, S.E.L.
* mod: 2012.09.25
*
****************************************/
create PROCEDURE stp_SAO_insert
(
	@DataOra		DATETIME,
	@CodSoggetto	NVARCHAR(17),
	@codPostazione	NVARCHAR(250),
	@clientIp		NVARCHAR(250)='',
	@UDC			NVARCHAR(50),
	@Particolare	NVARCHAR(15),
	@codAzione		NVARCHAR(10),
	@descrizione	NVARCHAR(500)
)
AS

BEGIN tran

	-- inserisco nuovo record storico azioni operatore
	INSERT	INTO StoricoAzioniOperatore(DataOra, CodSoggetto, codPostazione, clientIp, UDC, Particolare, codAzione, descrizione)
	VALUES	(@DataOra, @CodSoggetto, @codPostazione, @clientIp, @UDC, @Particolare, @codAzione, @descrizione)

COMMIT tran

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_scaricaUdc
*
* elimina dalle posizioni correnti un UDC, salvandone la posizione precedente nella tab storica (per scaricamento / spedizione)
*
* Steamware, S.E.L.
* mod: 2012.05.30
*
****************************************/
alter PROCEDURE stp_scaricaUdc
(
	@UDC VARCHAR(50),
	@IdxPosizione INT,
	@CodEvento VARCHAR(10),
	@CodSoggetto NVARCHAR(17)
)
AS

BEGIN TRAN

/*  Tolto da GCarlo xche non salvo utente che cancella x adesso
	-- aggiorno utente x la posizione corrente, in modo da poter POI salvare l'utente che scarica UDC
	UPDATE	PosizioneUdcCorrente
	SET		CodSoggetto = @CodSoggetto
	WHERE	UDC = @UDC
*/
    
    -- Tabella del record cancellato ( al momento NON usata ) RIATTIVARE x QUANDO Voglio lo STORICO cancellati
--    DECLARE @MyTableVar table ( IdxCella int, CodCS nchar(2) );

	-- libero la posizione attuale dell'UDC (se c'è...) 
	DELETE
	FROM	dbo.PosizioneUdcCorrente
--	OUTPUT DELETED.IdxCella , DELETED.CodCS INTO @MyTableVar    RIATTIVARE x QUANDO Voglio lo STORICO cancellati
	WHERE	UDC = @UDC;

--   ( al momento NON usata ) RIATTIVARE x QUANDO Voglio lo STORICO cancellati
      -- Inserisco in Storico Posizione il record di chi ha cancellato
--    INSERT dbo.PosizioneUdcStorico ( UDC, IdxCella, DataInizio, DataFine, CodCS, CodSoggetto )
--    SELECT @UDC, IdxCella, GETDATE(), GETDATE(), CodCS, @CodSoggetto FROM @MyTableVar
	
	-- aggiorno l'UDC come posizione finale...
	UPDATE	dbo.ElencoCartellini
	SET		IdxPosizione = @IdxPosizione
		   ,ModDate = GETDATE()
		   ,CodEvento = @CodEvento
		   ,CodSoggetto = @CodSoggetto
	WHERE	UDC = @UDC	
	
COMMIT TRAN

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_selMagByConditio
*
* Steamware, S.E.L.
* mod: 2012.10.08
*
************************************/
create PROCEDURE stp_selMagByConditio
(
	@conditio	NVARCHAR(2)
)
AS

SELECT      value, label, conditio
FROM        v_selMag
WHERE       (conditio = @conditio)
ORDER BY	label

RETURN
go

/***************************************
* STORED stp_selMagLogicoByConditio
*
* Steamware, S.E.L.
* mod: 2012.10.08
*
************************************/
create PROCEDURE stp_selMagLogicoByConditio
(
	@conditio	NVARCHAR(2)
)
AS

SELECT		value, label, conditio
FROM		v_selMagLogico
WHERE		(conditio = @conditio)
ORDER BY	label

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_spostaUdc
*
* sposta un UDC, salvandone la posizione precedente (se esiste) nella tab storica
*
* Steamware, S.E.L.
* mod: 2010.06.11
*
****************************************/
alter PROCEDURE stp_spostaUdc
(
	@CodCS VARCHAR(2),
	@UDC VARCHAR(50),
	@IdxCellaTo INT,
	@resetRLP BIT,
	@CodSoggetto VARCHAR(17)
)
AS

SET @UDC = UPPER(@UDC)   -- metto ad Upper nel caso venga passato in minuscolo ( es. smart LDP da terminalino )

BEGIN TRAN
	
	-- DICHIARAZIONI iniziali variabili
	DECLARE @IdxCellaFrom INT
	DECLARE @capienza INT
	DECLARE @numUdc INT
	DECLARE @udcInLdpPrel BIT
	
	-- controllo cella di partenza
	SET		@IdxCellaFrom = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
	SET		@IdxCellaFrom = ISNULL(@IdxCellaFrom,0) -- controllo x cella null...
	
	-- controllo UDC, se faccia parte di LDP che NON permette MOV...
	SET		@udcInLdpPrel = ( SELECT ISNULL(COUNT(rldp.UDC),0)
								FROM	RigheListePrelievo rldp INNER JOIN ElencoListePrelievo ldp 
									ON ldp.CodLista=rldp.CodLista INNER JOIN AnagStatiListe asl
									ON ldp.CodStatoLista = asl.CodStatoLista
								WHERE	asl.canMovUDC = 0
								AND		rldp.UDC=@UDC )
	-- controllo se cella di destinazione e di partenza coincidono NON FACCIO NULLA... altrimenti procedo
	IF (@IdxCellaTo <> @IdxCellaFrom)
		BEGIN
			-- controllo UDC "libero" da LDP (ovvero non faccia parte di LDP in uno stato che NON permette MOV, nel qual caso NON sposto)
			IF (@udcInLdpPrel = 0)
				-- tutto ok PROCEDO!
				BEGIN
					
					-- controllo se la cella di partenza vada indicata come piena o meno
					SET		@capienza = (
											SELECT tc.Capienza 
												FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
												WHERE c.IdxCella = @IdxCellaFrom	
										)
					SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaFrom)
					-- se capienza cella di partenza NON raggiunta aggiorno NON Piena
					IF(@numUdc -1 < @capienza)
						BEGIN
							EXEC stp_celle_updPiena @IdxCellaFrom, 0
						END

					---- aggiorno utente x la posizione corrente, in modo da poter POI salvare l'utente che scarica UDC
					--UPDATE	PosizioneUdcCorrente
					--SET		CodSoggetto = @CodSoggetto
					--WHERE	UDC = @UDC
	
					---- cancello posizione occupata ( non serve più faccio UPDATE )
					--DELETE
					--FROM	PosizioneUdcCorrente
					--WHERE	UDC = @UDC
					
					-- SE RICHIESTO cancello eventuali righe liste di prelievo FUSI per l'UDC
					IF(@resetRLP = 1)
					BEGIN
						DELETE FROM RigheListePrelievo
							WHERE UDC = @UDC AND CodLista IN ( 
								SELECT CodLista FROM ElencoListePrelievo 
								--WHERE CodTipoLista='01-PreFus'
								WHERE CodStatoLista < 4
							)
					END

					-- modifico la posizione per l'UDC se esiste altrimenti la inserisco
					IF @IdxCellaFrom <> 0 
					    UPDATE PosizioneUdcCorrente
					    SET IdxCella = @IdxCellaTo, 
					        DataRif  = GETDATE(),
					        CodSoggetto = @CodSoggetto
					    FROM PosizioneUdcCorrente WHERE UDC = @UDC AND CodCS = @CodCS AND IdxCella = @IdxCellaFrom
					ELSE
					    INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto)
					    VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE(), @CodSoggetto);


					SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo)
				
					-- controllo se la cella di dest vada indicata come piena, altrimenti NON la indicherò (mai) come piena...
					SET		@capienza = (
											SELECT CASE CheckPiena WHEN 1 THEN tc.Capienza ELSE @numUdc + 1 END
												FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
												WHERE c.IdxCella = @IdxCellaTo	
										)
				
				
					-- se capienza raggiunta aggiorno...
					IF(@numUdc >= @capienza)
						BEGIN
							EXEC stp_celle_updPiena @IdxCellaTo, 1
						END
						
				END -- cellaFrom e cellaTo non coincidono...
		END -- UDC NON appartiene a LDP già prelevate...
	
COMMIT TRAN

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_UDC_delete
*
* elimina un dato UDC
*
* Steamware, S.E.L.
* mod: 2012.09.25
*
****************************************/
create PROCEDURE stp_UDC_delete
(
	@UDC			NVARCHAR(50)
)
AS

BEGIN tran

	-- annullo cella piena
	UPDATE dbo.Celle
	SET Piena = 0
	FROM PosizioneUdcCorrente p
		INNER JOIN dbo.Celle c ON p.IdxCella = c.IdxCella
	WHERE c.Piena = 1 AND p.UDC = @UDC
	
	-- cancello posizione
	DELETE 
	FROM	PosizioneUdcCorrente
	WHERE	UDC = @UDC

	-- cancello UDC
	DELETE
	FROM	ElencoCartellini
	WHERE	UDC = @UDC

COMMIT tran

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_UDC_FifoByParticolareBlocco
*
* restituisce elenco UDC a magazzino in logica FIFO per un dato particolare+blocco
*
* Steamware, S.E.L.
* mod: 2012.10.01
*
****************************************/
create PROCEDURE stp_UDC_FifoByParticolareBlocco
(
	@CodCS			VARCHAR(2),
	@Particolare	VARCHAR(20),
	@idxBlocco		INT
)
AS

	SELECT	ec.UDC, c.CodCella, puc.DataRif, ec.Qta
	FROM	AnagMag am 
	INNER JOIN Blocchi b ON am.CodMag = b.CodMag AND am.CodCS = b.CodCS 
	INNER JOIN Celle c 
	INNER JOIN ElencoCartellini ec 
	LEFT OUTER JOIN PosizioneUdcCorrente puc ON ec.UDC = puc.UDC ON c.IdxCella = puc.IdxCella ON b.IdxBlocco = c.IdxBlocco 
	INNER JOIN AnagStatiProdotto asp ON ec.CodStato = asp.CodStato
	WHERE	(c.Attiva = 1) 
	        AND b.CodMag <> 'VMLP' 
	        AND (am.CodCS = @CodCS) 
	        AND (ec.Particolare = @Particolare) 
	        AND b.IdxBlocco = @idxBlocco
	GROUP BY	ec.UDC, c.CodCella, puc.DataRif, ec.Qta
	ORDER BY	puc.DataRif ASC
		
RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_v_selPartic_SAO
*
* elenco particolari x ricerca dato periodo analisi
* Steamware, S.E.L.
* mod: 2012.09.28
*
****************************************/
create PROCEDURE stp_v_selPartic_SAO
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME
)
AS
	SELECT	DISTINCT value, label, GETDATE() AS conditio
	FROM	v_selPartic_SAO
	WHERE	conditio BETWEEN @DataOraFrom AND @DataOraTo
	
RETURN
go

/***************************************
* STORED stp_v_selPostazioni_SAO
*
* elenco Postazioni x ricerca dato periodo analisi
* Steamware, S.E.L.
* mod: 2012.10.02
*
****************************************/
create PROCEDURE stp_v_selPostazioni_SAO
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME
)
AS
	SELECT	DISTINCT value, label, GETDATE() AS conditio
	FROM	v_selPostazioni_SAO
	WHERE	conditio BETWEEN @DataOraFrom AND @DataOraTo
	
RETURN
go

/***************************************
* STORED stp_v_selSoggetti_SAO
*
* elenco soggetti x ricerca dato periodo analisi
* Steamware, S.E.L.
* mod: 2012.10.02
*
****************************************/
create PROCEDURE stp_v_selSoggetti_SAO
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME
)
AS
	SELECT	DISTINCT value, label, GETDATE() AS conditio
	FROM	v_selSoggetti_SAO
	WHERE	conditio BETWEEN @DataOraFrom AND @DataOraTo
	
RETURN
go

/***************************************
* STORED stp_v_selUDC_SAO
*
* elenco UDC x ricerca dato periodo analisi
* Steamware, S.E.L.
* mod: 2012.09.28
*
****************************************/
create PROCEDURE stp_v_selUDC_SAO
(
	@DataOraFrom	DATETIME,
	@DataOraTo		DATETIME
)
AS
	SELECT	DISTINCT value, label, GETDATE() AS conditio
	FROM	v_selUDC_SAO
	WHERE	conditio BETWEEN @DataOraFrom AND @DataOraTo
	
RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_UDC_insNewFull
*
* crea un nuovo record nella TabStatoOdpUdc FULL (con pesi, qta...) e restituisce il codice UDC appena creato
*
* Steamware, S.E.L.
* mod: 2010.04.28
*
****************************************/
alter PROCEDURE stp_UDC_insNewFull
(
	@CodCS VARCHAR(2),
	@Flusso VARCHAR(2),
	@Anno VARCHAR(2),
	@CodCliente VARCHAR(6),
	@Particolare VARCHAR(15),
	@CodImpianto AS VARCHAR(50),
	@CodStampo VARCHAR(8),
	@Esponente VARCHAR(6),
	@Figura VARCHAR(4),
	@DataFus DATETIME,
	@TurnoFus INT,
	@CodImballo VARCHAR(15),
	@CodSoggetto VARCHAR(17),	
	@Tara FLOAT,
	@IdxPosizione INT,
	@CodTipoDichiaraz CHAR(1),
	@CodEvento VARCHAR(10),
	@Qta DECIMAL(10,2),
	@PesoTot FLOAT,
	@PesoCad FLOAT,
	@CodStato VARCHAR(50),
	@UDC_parent VARCHAR(50),
	@DoDeleteUdcParent BIT,
	@Note NVARCHAR(500)
)
AS

-- DECLARE iniziali
DECLARE @UDC AS VARCHAR(50)
DECLARE @RagSociale AS VARCHAR(35)
DECLARE @DescParticolare AS VARCHAR(30)
DECLARE @DescImpianto AS VARCHAR(50)
DECLARE @DisegnoGrezzo AS VARCHAR(30)
DECLARE @NumCont AS INT
DECLARE @numFlu AS INT
DECLARE @numUdc AS INT
DECLARE @nextUdc AS INT
DECLARE @IdxCella AS INT

SET @UDC_parent = UPPER(@UDC_parent) -- nel caso sia passato in minuscolo

------------------------------------------------------------------------------------------------------
-- Caricamento Dati da anagrafica
------------------------------------------------------------------------------------------------------
-- cerco la ragione sociale...
SET @RagSociale = ISNULL(
(
	SELECT        RagSociale
	FROM            RilPro.AnagClienti
	WHERE        (CodCliente = @CodCliente)
)
, '') 

-- Cerco descrizione del particolare...
SET @DescParticolare = ISNULL(
(
	SELECT        DescParticolare
	FROM            RilPro.AnagParticolari
	WHERE        (Particolare = @Particolare)
)
, 'ND')

-- se non lo trova provo anche nell'anagrafica leghe
IF(@DescParticolare = 'ND')-- OR (@DescParticolare is null)
	BEGIN
		SET @DescParticolare = ISNULL(
		(
			SELECT        DescLega
			FROM            RilPro.AnagLeghe
			WHERE        ('L'+CodLega = @Particolare)
		)
		, '')
	END
-- cerco codice disegno grezzo
SET @DisegnoGrezzo = ISNULL(
(
	SELECT        DisegnoGrezzo
	FROM            RilPro.AnagParticolari
	WHERE        (Particolare = @Particolare)
)
, '')

-- cerco descrizione Impianto
SET @DescImpianto = ISNULL(
(
	SELECT        DescImpianto
	FROM            AnagImpianti
	WHERE        (CodImpianto = @CodImpianto)
)
, '')


-- Calcolo contatore intero successivo x il contenitore...
SET @NumCont = (
	SELECT      ISNULL(MAX(NumCont), 0) + 1 AS NumCont
	FROM        ElencoCartellini
	WHERE       (Particolare = @Particolare)
	AND			(DataFus = @DataFus)
	AND			(TurnoFus = @TurnoFus)
	AND			(CodImpianto = @CodImpianto)
	AND			(CodStampo = @CodStampo)
	AND			(Figura = @Figura)	
)


------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Flusso
------------------------------------------------------------------------------------------------------
-- controllo se esiste il flusso (bilancia)...
SET @numFlu = (
	SELECT count(*)
	FROM AnagBilance
	WHERE	CodBilancia	= @Flusso
)
-- ...sennò lo creo...
IF(@numFlu = 0)
	BEGIN
		-- se c'è inserisco in tab
		INSERT INTO AnagBilance(CodBilancia, DescrImpianto, CodCS)
		VALUES (@Flusso, @Flusso, @CodCS)
	END
------------------------------------------------------------------------------------------------------

		
------------------------------------------------------------------------------------------------------
-- UDC
------------------------------------------------------------------------------------------------------
-- controllo se ci sia già un UDC per company / flusso anno
BEGIN TRAN
	-- cerco nella tab contatori se esiste contatore x il flusso
    -- controllo se record c'è...
	IF EXISTS(  SELECT TOP 1 Flusso FROM ContatoriUdc 
		        WHERE	CodCS		=	@CodCS
		        AND		Flusso		=	@Flusso
		        AND		Anno		=	@Anno )
	    BEGIN
			-- se c'è incremento di 1 in tab
			UPDATE ContatoriUdc
			SET LastIdx = LastIdx  + 1
			WHERE	CodCS		=	@CodCS
			AND		Flusso		=	@Flusso
			AND		Anno		=	@Anno
		END
	ELSE
		BEGIN
			-- lo creo!
			INSERT INTO ContatoriUdc(CodCS, Flusso, Anno, LastIdx)
			VALUES (@CodCS, @Flusso, @Anno, 1)
		END
	-- aggiorno numero UDC
	SET @numUdc = (
		SELECT LastIdx
		FROM ContatoriUdc
		WHERE	CodCS		=	@CodCS
		AND		Flusso		=	@Flusso
		AND		Anno		=	@Anno
	)
COMMIT TRAN
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Ciclo principale x inserimento nuovo record
------------------------------------------------------------------------------------------------------
BEGIN TRAN
	-- ottengo il nuovo codice UDC completo
	SET @UDC = dbo.componiUdc(@CodCS, @Flusso, @Anno, @numUdc)
		
	-- inserisco un nuovo record
	INSERT INTO ElencoCartellini(UDC, CodCS, CodCliente, RagSociale, Particolare, DescParticolare, DisegnoGrezzo, Esponente, CodImpianto, DescImpianto, CodStampo, Figura, DataFus, TurnoFus, CodImballo, CodSoggetto, NumCont, Tara, Qta, CodStato, IdxPosizione, PesoTot, PesoCad, CreateDate, ModDate, Note, CodEvento)
	VALUES	(@UDC, @CodCS, @CodCliente, @RagSociale, @Particolare, @DescParticolare, @DisegnoGrezzo, @Esponente, @CodImpianto, @DescImpianto, @CodStampo, @Figura, @DataFus, @TurnoFus, @CodImballo, @CodSoggetto, @NumCont, @Tara, @Qta, @CodStato, @IdxPosizione, @PesoTot, @PesoCad, GETDATE(), GETDATE(), @Note, @CodEvento)

	-- inserisco relazione parent-child tra UDC vecchio (tara) e nuovo (pesa) SSE UDC_parent valido
	IF((NOT @UDC_parent IS NULL) AND (NOT @UDC_parent = ''))
	BEGIN
		INSERT INTO RelazUDC(UDC_parent, UDC_child)
		VALUES (@UDC_parent, @UDC)
	END
COMMIT TRAN

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Ciclo secondario x eventuale cancellazione UDC tara parent e inserimento in posizione
------------------------------------------------------------------------------------------------------
	-- se richiesto elimino l'UDC parent (tara)
	IF(@DoDeleteUdcParent = 1)
		BEGIN
			DELETE FROM ElencoCartellini WHERE UDC = @UDC_parent
		END
	
	-- cerco in TabTranPosizEventi record x calcolare cella
	DECLARE @IdxBloccoTo INT
	SET @IdxBloccoTo = 0

	/* da testare... */
	SET @IdxBloccoTo =	(
						SELECT ISNULL(
							(
							SELECT	IdxBloccoTo
							FROM	TabTranPosizEventi
							WHERE	CodEvento = @CodEvento
							AND		IdxPosizione = 0
							AND		IdxPosizioneTo = @IdxPosizione
							AND		CodStatoTo	= @CodStato
							), 0)
						)
	-- se non lo trovo cerco con CodStatoTo null ( x stato UDC non specifico ) ...
	IF(@IdxBloccoTo = 0)
	BEGIN
		SET @IdxBloccoTo =	(
							SELECT ISNULL(
								(
								SELECT	IdxBloccoTo
								FROM	TabTranPosizEventi
								WHERE	CodEvento = @CodEvento
								AND		IdxPosizione = 0
								AND		IdxPosizioneTo = @IdxPosizione
								), 0)
						)
	END
	/* fine modifica da testare */

	-- se NON HO trovato una conf x @IdxBloccoTo utilizzo questo valore utilizzo modalità "vecchia"
	IF(@IdxBloccoTo = 0)
		BEGIN
			-- calcolo la prima cella della posizione indicata..
			SET @IdxCella = (
							SELECT TOP 1 c.IdxCella 
								FROM Celle c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco 
								WHERE b.CodMag = CAST(@IdxPosizione AS NVARCHAR(50))
							)
		END
	ELSE
		BEGIN
			-- calcolo la prima cella della posizione indicata..
			SET @IdxCella = (
							SELECT TOP 1 c.IdxCella 
								FROM Celle c 
								WHERE c.IdxBlocco = @IdxBloccoTo
							)
		END


	-- inserisco il cartellino nella prima cella della posizione indicata...
	INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto)
	VALUES(@Udc, @IdxCella, @CodCS, GETDATE(), @CodSoggetto)
------------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------
-- restituisco la tab dati con l'udc appena inserito
------------------------------------------------------------------------------------------------------
SELECT * 
FROM ElencoCartellini
WHERE  UDC = @UDC
------------------------------------------------------------------------------------------------------

RETURN
go

/***************************************
* STORED stp_UDC_insNewFull_fixUDC
*
* crea un nuovo record nella TabStatoOdpUdc FULL (con pesi, qta...) avendo in entrata il codice UDC da 

utilizzare
*
* Steamware, S.E.L.
* mod: 2011.12.07
*
****************************************/
alter PROCEDURE stp_UDC_insNewFull_fixUDC
(
	@UDC AS NVARCHAR(50),
	@CodCS VARCHAR(2),
	@Flusso VARCHAR(2),
	@Anno VARCHAR(2),
	@CodCliente VARCHAR(6),
	@Particolare VARCHAR(15),
	@CodImpianto AS VARCHAR(50),
	@CodStampo VARCHAR(8),
	@Esponente VARCHAR(6),
	@Figura VARCHAR(4),
	@DataFus DATETIME,
	@TurnoFus INT,
	@CodImballo VARCHAR(15),
	@CodSoggetto VARCHAR(17),	
	@Tara FLOAT,
	@IdxPosizione INT,
	@CodTipoDichiaraz CHAR(1),
	@CodEvento VARCHAR(10),
	@Qta DECIMAL(10,2),
	@PesoTot FLOAT,
	@PesoCad FLOAT,
	@CodStato VARCHAR(50),
	@UDC_parent VARCHAR(50),
	@DoDeleteUdcParent BIT,
	@Note NVARCHAR(500)
)
AS

-- DECLARE iniziali
DECLARE @RagSociale AS VARCHAR(35)
DECLARE @DescParticolare AS VARCHAR(30)
DECLARE @DescImpianto AS VARCHAR(50)
DECLARE @DisegnoGrezzo AS VARCHAR(30)
DECLARE @NumCont AS INT
DECLARE @numFlu AS INT
DECLARE @numUdc AS INT
DECLARE @nextUdc AS INT
DECLARE @IdxCella AS INT

------------------------------------------------------------------------------------------------------
-- Caricamento Dati da anagrafica
------------------------------------------------------------------------------------------------------
-- cerco la ragione sociale...
SET @RagSociale = ISNULL(
(
	SELECT        RagSociale
	FROM            RilPro.AnagClienti
	WHERE        (CodCliente = @CodCliente)
)
, '') 

-- Cerco descrizione del particolare...
SET @DescParticolare = ISNULL(
(
	SELECT DescParticolare
	FROM   RilPro.AnagParticolari
	WHERE  (Particolare = @Particolare)
)
, 'ND')

-- se non lo trova provo anche nell'anagrafica leghe
IF(@DescParticolare = 'ND')-- OR (@DescParticolare is null)
	BEGIN
		SET @DescParticolare = ISNULL(
		(
			SELECT DescLega
			FROM   RilPro.AnagLeghe
			WHERE  ('L'+CodLega = @Particolare)
		)
		, '')
	END
-- cerco codice disegno grezzo
SET @DisegnoGrezzo = ISNULL(
(
	SELECT DisegnoGrezzo
	FROM   RilPro.AnagParticolari
	WHERE  (Particolare = @Particolare)
)
, '')

-- cerco descrizione Impianto
SET @DescImpianto = ISNULL(
(
	SELECT DescImpianto
	FROM   AnagImpianti
	WHERE  (CodImpianto = @CodImpianto)
)
, '')



-- Calcolo contatore intero successivo x il contenitore...
SET @NumCont = (
	SELECT      ISNULL(MAX(NumCont), 0) + 1 AS NumCont
	FROM        ElencoCartellini
	WHERE       (Particolare = @Particolare)
	AND			(DataFus = @DataFus)
	AND			(TurnoFus = @TurnoFus)
	AND			(CodImpianto = @CodImpianto)
	AND			(CodStampo = @CodStampo)
	AND			(Figura = @Figura)	
)


------------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------
-- Ciclo principale x inserimento nuovo record
------------------------------------------------------------------------------------------------------
BEGIN TRAN
		
	-- inserisco un nuovo record
	INSERT INTO ElencoCartellini(UDC, CodCS, CodCliente, RagSociale, Particolare, DescParticolare, 

DisegnoGrezzo, Esponente, CodImpianto, DescImpianto, CodStampo, Figura, DataFus, TurnoFus, CodImballo, 

CodSoggetto, NumCont, Tara, Qta, CodStato, IdxPosizione, PesoTot, PesoCad, CreateDate, ModDate, Note, CodEvento)
	VALUES	(@UDC, @CodCS, @CodCliente, @RagSociale, @Particolare, @DescParticolare, @DisegnoGrezzo, 

@Esponente, @CodImpianto, @DescImpianto, @CodStampo, @Figura, @DataFus, @TurnoFus, @CodImballo, 

@CodSoggetto, @NumCont, @Tara, @Qta, @CodStato, @IdxPosizione, @PesoTot, @PesoCad, GETDATE(), GETDATE(), 

@Note, @CodEvento)

	-- inserisco relazione parent-child tra UDC vecchio (tara) e nuovo (pesa) SSE UDC_parent valido
	IF((NOT @UDC_parent IS NULL) AND (NOT @UDC_parent = ''))
	BEGIN
		INSERT INTO RelazUDC(UDC_parent, UDC_child)
		VALUES (@UDC_parent, @UDC)
	END
COMMIT TRAN

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Ciclo secondario x eventuale cancellazione UDC tara parent e inserimento in posizione
------------------------------------------------------------------------------------------------------
	-- se richiesto elimino l'UDC parent (tara)
	IF(@DoDeleteUdcParent = 1)
		BEGIN
			DELETE FROM ElencoCartellini WHERE UDC = @UDC_parent
		END
	
	-- cerco in TabTranPosizEventi record x calcolare cella
	DECLARE @IdxBloccoTo INT
	SET @IdxBloccoTo = 0

	/* da testare...*/
	SET @IdxBloccoTo =	(
						SELECT ISNULL(
							(
							SELECT	IdxBloccoTo
							FROM	TabTranPosizEventi
							WHERE	CodEvento = @CodEvento
							AND		IdxPosizione = 0
							AND		IdxPosizioneTo = @IdxPosizione
							AND		CodStatoTo	= @CodStato
							), 0)
						)
	-- se non lo trovo cerco con CodStatoTo null...
	IF(@IdxBloccoTo = 0)
	BEGIN
		SET @IdxBloccoTo =	(
							SELECT ISNULL(
								(
								SELECT	IdxBloccoTo
								FROM	TabTranPosizEventi
								WHERE	CodEvento = @CodEvento
								AND		IdxPosizione = 0
								AND		IdxPosizioneTo = @IdxPosizione
								), 0)
						)
	END
	/* fine test */

	-- se NON HO trovato una conf x @IdxBloccoTo utilizzo questo valore utilizzo modalità "vecchia"
	IF(@IdxBloccoTo = 0)
		BEGIN
			-- calcolo la prima cella della posizione indicata..
			SET @IdxCella = (
							SELECT TOP 1 c.IdxCella 
								FROM Celle c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco 
								WHERE b.CodMag = CAST(@IdxPosizione AS NVARCHAR(50))
							)
		END
	ELSE
		BEGIN
			-- calcolo la prima cella della posizione indicata..
			SET @IdxCella = (
							SELECT TOP 1 c.IdxCella 
								FROM Celle c 
								WHERE c.IdxBlocco = @IdxBloccoTo
							)
		END

	-- inserisco il cartellino nella prima cella della posizione indicata..
	INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto)
	VALUES(@Udc, @IdxCella, @CodCS, GETDATE(), @CodSoggetto)
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- restituisco la tab dati con l'udc appena inserito
------------------------------------------------------------------------------------------------------
SELECT * 
FROM ElencoCartellini
WHERE  UDC = @UDC
------------------------------------------------------------------------------------------------------

RETURN
go

commit;
go








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