-- STEP 1: struttura tabelle + INDICI, TRIGGERS...

create table AnagAzioniUtente(
  codAzione   nvarchar(10) not null constraint PK_AnagAzioniUtente primary key,
  descrAzione nvarchar(50)
);
go

set xact_abort on;
go

begin transaction;
go

drop table AS400_BatchMovimenti;
go

create table AS400_BatchMovimenti(
  IdxBatch     int           not null identity constraint PK_AS400_BatchMovimenti primary key,
  DataIns      datetime      not null,
  numOp        int,
  CodEvento    nvarchar(10)  not null,
  Particolare  nvarchar(15)  not null,
  UDC          nvarchar(50)  not null,
  CodMagAS     nvarchar(50)  not null,
  Quantita     decimal(10,2) not null,
  DataBatch    datetime,
  DataVerifica datetime
);
go

alter table AS400_BatchMovimenti add
  constraint FK_AS400_BatchMovimenti_AS400_MagCont foreign key(CodMagAS) references AS400_MagCont(CodMagAS) on update cascade,
  constraint FK_AS400_BatchMovimenti_AnagTipoEvento foreign key(CodEvento) references AnagTipoEvento(CodEvento) on update cascade;
go

create index IX_AS400_BatchMovimenti_DataBatch_Filter on AS400_BatchMovimenti(DataBatch)
  where ([DataBatch] IS NULL);
go

exec sp_addextendedproperty 'MS_Description', 'dataora inserimento in coda caricamento', 'SCHEMA', 'dbo', 'TABLE', 'AS400_BatchMovimenti', 'COLUMN', 'DataIns';
go

exec sp_addextendedproperty 'MS_Description', 'NON MODIFICARE: nel codice si usano questi campi x chiamate...', 'SCHEMA', 'dbo', 'TABLE', 'AS400_BatchMovimenti', 'COLUMN', 'CodEvento';
go

exec sp_addextendedproperty 'MS_Description', 'dataora di caricamento batch verso AS', 'SCHEMA', 'dbo', 'TABLE', 'AS400_BatchMovimenti', 'COLUMN', 'DataBatch';
go

exec sp_addextendedproperty 'MS_Description', N'dataora in cui è stato verificato il caricamento su AS', 'SCHEMA', 'dbo', 'TABLE', 'AS400_BatchMovimenti', 'COLUMN', 'DataVerifica';
go

commit;
go


set xact_abort on;
go

begin transaction;
go

drop index i_IdxPosizione on ElencoCartellini;
go

create index i_IdxPosizione on ElencoCartellini(IdxPosizione,CodCS)
  include(Particolare);
go

commit;
go



set xact_abort on;
go

begin transaction;
go

alter table ElencoListePrelievo add
  DataModStato datetime constraint DataModStato_default default (getdate());
go

create index IX_ElencoListePrelievo_DataCreaz on ElencoListePrelievo(DataCreaz);
go

create index ix_ElencoListePrelievo_CodTipoLista_CodSoggettoCodStatoLista on ElencoListePrelievo(CodTipoLista,CodSoggetto,CodStatoLista)
  include(CodLista);
go

update ElencoListePrelievo set DataModStato=(getdate());
go



commit;
go



set xact_abort on;
go

begin transaction;
go

alter table ElencoListePrelievo_storico add
  DataModStato datetime;
go

drop index ix_ElencoListePrelievo_storico_CodStatoLista_Filtered on ElencoListePrelievo_storico;
go


commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

-- =============================================
-- Author:	
-- Create date: 2011-06-21
-- Description:	trigger x storico in tab
-- storico LDP completata e Reset LDP Scaricata
-- Mod. Date : 2012-10-17
-- =============================================
alter TRIGGER trg_ListePrelievoUpd
   ON ElencoListePrelievo
   AFTER UPDATE
AS 
BEGIN
    
    -- Se nessun aggiornamento esco ( DEVE essere il primo comando )
    IF (@@ROWCOUNT = 0) RETURN

	-- setup variabili e verbosità
	SET NOCOUNT ON;
	DECLARE	@dataOra AS DATETIME = GETDATE()
	
	IF( UPDATE(CodStatoLista))  
	BEGIN
 	  INSERT INTO ElencoListePrelievo_storico
		(DataOraDelete,CodLista,CodTipoLista,CodCS,DataCreaz,CodCliente,RagSociale,CodSoggetto,Particolare,DescParticolare,DisegnoGrezzo,
		Esponente,Figura,CodImballo,QtaTot,CodStatoLista,Destinatario,DestinatarioDescrizione, DataModStato)
	  SELECT @dataOra, d.CodLista,d.CodTipoLista,d.CodCS,d.DataCreaz,d.CodCliente,d.RagSociale,d.CodSoggetto,d.Particolare,d.DescParticolare,d.DisegnoGrezzo,
		d.Esponente,d.Figura,d.CodImballo,d.QtaTot,d.CodStatoLista,d.Destinatario,d.DestinatarioDescrizione, d.DataModStato
	  FROM	deleted AS d
      INNER JOIN inserted AS i ON d.CodLista = i.CodLista
      WHERE ( d.CodStatoLista <> i.CodStatoLista )             -- 99 solo se lo stato lista è cambiato
         AND NOT ( ( d.CodStatoLista = 0 AND i.CodStatoLista = 1 AND d.CodTipoLista = '00-Smart' )    -- escludo la storicizzazione dei primi due stati 
         OR        ( d.CodStatoLista = 1 AND i.CodStatoLista = 2 AND d.CodTipoLista = '00-Smart' )  ) -- delle smart list che sono creati contemporaneamente

      --WHERE ( d.CodStatoLista = 3 AND i.CodStatoLista = 4 )  -- Storicizzo chi ha completato la Lista
      --  OR  ( d.CodStatoLista = 4 AND i.CodStatoLista < 4 )  -- Storicizzo se la lista Scaricata è viene resettata
      --  OR  ( d.CodStatoLista = 3 AND i.CodStatoLista < 3 )  -- Storicizzo se la lista Completata è viene resettata
      --  OR  ( d.CodStatoLista = 0 AND i.CodStatoLista > 0 )  -- Storicizzo lo stato Bozza
      --  OR  ( d.CodStatoLista = 1 AND i.CodStatoLista > 1 )  -- Storicizzo lo stato Generata
      --  OR  ( d.CodStatoLista = 2 AND i.CodStatoLista > 2 )  -- Storicizzo lo stato In Carico
    END
END
go

-- =============================================
-- Author:		Samuele E. Locatelli
-- Create date: 2011-05-20
-- Description:	trigger x inserimento in tab
-- storico record cancellati
-- Mod. Date : 2012-10-17
-- =============================================
alter TRIGGER trg_ListePrelievoDel
   ON ElencoListePrelievo
   AFTER DELETE
AS 
BEGIN

    -- Se nessun aggiornamento esco ( DEVE essere il primo comando )
    IF (@@ROWCOUNT = 0) RETURN

	-- setup variabili e verbosità
	SET NOCOUNT ON;
	-- inserisco in storico
	INSERT INTO ElencoListePrelievo_storico 
		(DataOraDelete,CodLista,CodTipoLista,CodCS,DataCreaz,CodCliente,RagSociale,CodSoggetto,Particolare,DescParticolare,DisegnoGrezzo,
		Esponente,Figura,CodImballo,QtaTot,CodStatoLista,Destinatario,DestinatarioDescrizione, DataModStato)
	
	SELECT	GETDATE(), CodLista,CodTipoLista,CodCS,DataCreaz,CodCliente,RagSociale,CodSoggetto,Particolare,DescParticolare,DisegnoGrezzo,
		Esponente,Figura,CodImballo,QtaTot,CodStatoLista,Destinatario,DestinatarioDescrizione, DataModStato
	FROM	deleted
	

END
go

commit;
go

set xact_abort on;
go

begin transaction;
go

alter table ElencoPostazioni add
  note nvarchar(250);
go

set ANSI_NULLS on;
go

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

* Steamware, S.E.L.
* mod: 2012.10.02
*
****************************************/
create 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

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

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

DELETE
FROM	ElencoPostazioni
WHERE	codPostazione = @Original_codPostazione

RETURN
go

commit;
go

set xact_abort on;
go

begin transaction;
go

alter table PosizioneUdcCorrente add
  CodSoggetto nchar(17);
go

create index IX_PosizioneUdcCorrente_idxCella on PosizioneUdcCorrente(IdxCella)
  include(DataRif);
go



commit;
go


set xact_abort on;
go

begin transaction;
go

alter table PosizioneUdcStorico add
  CodSoggetto nchar(17);
go


commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

-- =============================================
-- Author:		Samuele E. Locatelli
-- Create date: 2009-09-13
-- Mod date:	2012-09-17
-- Description:	trigger x inserimento valori in archivio storico alla cancellazione/modifica del dato (tranne curr user)
-- =============================================
alter TRIGGER trg_storico 
   ON  PosizioneUdcCorrente 
   AFTER DELETE,UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    DECLARE @FlaStoricizza AS Bit = 0;  -- impostazione x test storicizza sempre attivo

    -- Se è una cancellazione Storicizzo
    IF ( SELECT COUNT(*) FROM inserted ) = 0   
       SET @FlaStoricizza = 1 ;

	-- devo EVITARE di salvare se c'è solo modifica del CodSoggetto...
	IF( UPDATE(UDC) OR UPDATE(IdxCella) OR UPDATE(CodCS) OR UPDATE(DataRif) ) 
	   SET @FlaStoricizza = 1;


--	IF( UPDATE(UDC) OR UPDATE(IdxCella) OR UPDATE(CodCS) OR UPDATE(DataRif) )

    IF @FlaStoricizza = 1
	BEGIN
        -- metto in storico la posizione attuale dell'UDC (SE esiste) CANCELLATO
		INSERT INTO PosizioneUdcStorico(UDC, IdxCella, CodCS, DataInizio, DataFine, CodSoggetto)
		(
			SELECT	UDC, IdxCella, CodCS, DataRif as DataInizio, GETDATE() as DataFine, CodSoggetto
			FROM	deleted
		)
	END
END
go

commit;
go


set xact_abort on;
go

begin transaction;
go

drop index IX_RigheListePrelievo_UDC_Prelevato on RigheListePrelievo;
go

create index ix_RigheListePrelievo_UDC_Prelevato on RigheListePrelievo(UDC,Prelevato)
  include(Qta);
go

create index IX_RigheListePrelievo_NON_Prelevate on RigheListePrelievo(Prelevato)
  include(CodLista,Qta)
  where ([PRELEVATO]=(0));
go

commit;
go

set xact_abort on;
go

begin transaction;
go

drop index i_dataRap on RilPro.RapQual;
go

create index i_dataRap on RilPro.RapQual(DataRapQual)
  include(BenesQual,CodFor,CodLega,nRapQual,Qta,UDC);
go

commit;
go


set xact_abort on;
go

begin transaction;
go

create table StoricoAzioniOperatore(
  idxEvento     int           not null identity constraint PK_StoricoAzioniOperatore primary key,
  DataOra       datetime      not null,
  CodSoggetto   nchar(17)     not null,
  codPostazione nvarchar(250),
  clientIP      nvarchar(250),
  UDC           nvarchar(50),
  Particolare   nvarchar(15),
  codAzione     nvarchar(10),
  descrizione   nvarchar(500)
);
go

alter table StoricoAzioniOperatore add
  constraint FK_StoricoAzioniOperatore_AnagAzioniUtente foreign key(codAzione) references AnagAzioniUtente(codAzione) on update cascade;
go

create index ix_dataOra on StoricoAzioniOperatore(DataOra);
go

commit;
go


set xact_abort on;
go

begin transaction;
go

exec sp_rename 'PK_StoricoEventi', 'tmp__PK_StoricoEventi', 'OBJECT';
go

exec sp_rename 'StoricoCartellini', 'tmp__StoricoCartellini_0', 'OBJECT';
go

create table StoricoCartellini(
  IdxEv           int           not null identity constraint PK_StoricoEventi primary key,
  DataEv          datetime      not null,
  CodEvento       nvarchar(10),
  ModDate         datetime,
  UDC             nvarchar(50)  not null,
  CodCS           nchar(2),
  CodCliente      nvarchar(6),
  RagSociale      nvarchar(35),
  Particolare     nvarchar(15),
  DescParticolare nvarchar(30),
  DisegnoGrezzo   nvarchar(30),
  Esponente       nvarchar(6),
  CodImpianto     nvarchar(50),
  DescImpianto    nvarchar(50),
  CodStampo       nvarchar(8),
  Figura          nvarchar(4),
  DataFus         datetime,
  TurnoFus        int,
  CodImballo      nvarchar(15),
  CodSoggetto     nchar(17),
  NumCont         int,
  Tara            float,
  Qta             decimal(10,2),
  CodStato        nvarchar(50),
  IdxPosizione    int,
  PesoTot         float,
  PesoCad         float,
  Note            nvarchar(500)
);
go

exec sp_addextendedproperty 'MS_Description', 'NON MODIFICARE: nel codice si usano questi campi x chiamate...', 'SCHEMA', 'dbo', 'TABLE', 'StoricoCartellini', 'COLUMN', 'CodEvento';
go

set identity_insert StoricoCartellini on;
go

insert into StoricoCartellini(IdxEv,DataEv,CodEvento,ModDate,UDC,CodCS,CodCliente,RagSociale,Particolare,DescParticolare,DisegnoGrezzo,Esponente,CodImpianto,DescImpianto,CodStampo,Figura,DataFus,TurnoFus,CodImballo,CodSoggetto,NumCont,Tara,Qta,CodStato,IdxPosizione,PesoTot,PesoCad,Note) select IdxEv,DataEv,CodEvento,ModDate,UDC,CodCS,CodCliente,RagSociale,Particolare,DescParticolare,DisegnoGrezzo,Esponente,CodImpianto,DescImpianto,CodStampo,Figura,DataFus,TurnoFus,CodImballo,CodSoggetto,NumCont,Tara,Qta,CodStato,IdxPosizione,PesoTot,PesoCad,Note from tmp__StoricoCartellini_0;
go

set identity_insert StoricoCartellini off;
go

drop table tmp__StoricoCartellini_0;
go

commit;
go










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