CREATE TABLE TBCONFERENCIA (
    ID INTEGER NOT NULL,
    TABELA VARCHAR(10),
    TABELA_ID INTEGER,
    DATAHORA TIMESTAMP DEFAULT 'NOW',
    USUARIO_ID INTEGER,
    STATUS INTEGER,
	JUSTIFICATIVA VARCHAR(100));

ALTER TABLE TBCONFERENCIA
ADD CONSTRAINT PK_TBCONFERENCIA
PRIMARY KEY (ID);


COMMENT ON COLUMN TBCONFERENCIA.TABELA IS
'NFE - NOTA FISCAL DE ENTRADA
NFS - NOTA FISCAL DE SAÍDA
PED - PEDIDOS';

COMMENT ON COLUMN TBCONFERENCIA.STATUS IS
'0 - CONFERÊNCIA NÃO REALIZADA
1 - CONFERÊNCIA NÃO FINALIZADA
2 - CONFERÊNCIA FINALIZADA OK
3 - CONFERÊNCIA FINALIZADA COM DIVERGÊNCIAS';

CREATE SEQUENCE GTBCONFERENCIA;

CREATE TRIGGER TBCONFERENCIA_B01I FOR TBCONFERENCIA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBCONFERENCIA,1);
END;


CREATE TABLE TBCONFERENCIA_ITEM (
    ID INTEGER NOT NULL,
    CONFERENCIA_ID INTEGER,
    PRODUTO_ID INTEGER,
    TAMANHO INTEGER,
    QTD_TOTAL NUMERIC(15,4),
    QTD_CONFERIDA NUMERIC(15,4));
	
	ALTER TABLE TBCONFERENCIA_ITEM
ADD CONSTRAINT PK_TBCONFERENCIA_ITEM
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCONFERENCIA_ITEM;

CREATE TRIGGER TBCONFERENCIA_ITEM_B01I FOR TBCONFERENCIA_ITEM
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBCONFERENCIA_ITEM,1);
END;






-- TRIGGERS
-- INSERT

CREATE OR ALTER TRIGGER TBCONFERENCIA_B02I FOR TBCONFERENCIA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE DESC_STTS_NEW VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN

  HISTORICO = '';

  IF(NEW.ID > 0) THEN
  BEGIN
        :DESC_STTS_NEW = '';

        IF(NEW.STATUS = 0) THEN
        BEGIN
           :DESC_STTS_NEW = 'NAO REALIZADA';
        END ELSE IF(NEW.STATUS = 1) THEN
        BEGIN
           :DESC_STTS_NEW = 'INICIADA';
        END ELSE IF(NEW.STATUS = 2) THEN
        BEGIN
           :DESC_STTS_NEW = 'FINALIZADA OK';
        END ELSE IF(NEW.STATUS = 3) THEN
        BEGIN
           :DESC_STTS_NEW = 'FINALIZADA COM DIVERGÊNCIAS';
        END

    HISTORICO = HISTORICO||'CONFERENCIA '||:DESC_STTS_NEW;
  END

  IF(HISTORICO <> '') THEN
  BEGIN
    IF(NEW.TABELA = 'NFE') THEN
    BEGIN
      :HISTORICO_ID = '01'||NEW.TABELA_ID;
    END ELSE IF(NEW.TABELA = 'NFS') THEN
    BEGIN
      :HISTORICO_ID = '02'||NEW.TABELA_ID;
    END ELSE IF (NEW.TABELA = 'PED') THEN
    BEGIN
      :HISTORICO_ID = '03'||NEW.TABELA_ID;
    END

    EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
  END
END;


-- UPDATE

CREATE OR ALTER TRIGGER TBCONFERENCIA_B01U FOR TBCONFERENCIA
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE DESC_STTS_OLD VARCHAR(500);
DECLARE VARIABLE DESC_STTS_NEW VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;

BEGIN
    :HISTORICO = '';

    IF ( OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        :DESC_STTS_OLD = '';
        :DESC_STTS_NEW = '';

        -- DESCRIÇÃO DE STATUS PARA ANTIGO STATUS DA CONFERÊNCIA
        IF(OLD.STATUS = 0) THEN
        BEGIN
           :DESC_STTS_OLD = 'NAO REALIZADA';
        END ELSE IF(OLD.STATUS = 1) THEN
        BEGIN
           :DESC_STTS_OLD = 'INICIADA';
        END ELSE IF(OLD.STATUS = 2) THEN
        BEGIN
           :DESC_STTS_OLD = 'FINALIZADA OK';
        END ELSE IF(OLD.STATUS = 3) THEN
        BEGIN
           :DESC_STTS_OLD = 'FINALIZADA COM DIVERGÊNCIAS';
        END

        -- DESCRIÇÃO DE STATUS PARA NOVO STATUS DA CONFERÊNCIA
        IF(NEW.STATUS = 0) THEN
        BEGIN
           :DESC_STTS_NEW = 'NAO REALIZADA';
        END ELSE IF(NEW.STATUS = 1) THEN
        BEGIN
           :DESC_STTS_NEW = 'INICIADA';
        END ELSE IF(NEW.STATUS = 2) THEN
        BEGIN
           :DESC_STTS_NEW = 'FINALIZADA OK';
        END ELSE IF(NEW.STATUS = 3) THEN
        BEGIN
           :DESC_STTS_NEW = 'FINALIZADA COM DIVERGÊNCIAS';
        END

        HISTORICO = HISTORICO||' STATUS: '|| :DESC_STTS_OLD ||'->'||:DESC_STTS_NEW;
    END

    IF(OLD.JUSTIFICATIVA <> NEW.JUSTIFICATIVA) THEN
    BEGIN
        HISTORICO = HISTORICO||' JUSTIF. '|| OLD.JUSTIFICATIVA ||'->'|| NEW.JUSTIFICATIVA;
    END

    -- GRAVAR HISTORICO
    IF(HISTORICO <> '') THEN
    BEGIN

        IF(NEW.TABELA = 'NFE') THEN
        BEGIN
          :HISTORICO_ID = '01'||NEW.TABELA_ID;
        END ELSE IF(NEW.TABELA = 'NFS') THEN
        BEGIN
          :HISTORICO_ID = '02'||NEW.TABELA_ID;
        END ELSE IF (NEW.TABELA = 'PED') THEN
        BEGIN
          :HISTORICO_ID = '03'||NEW.TABELA_ID;
        END
    
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
    END

END;

-- DELETE

CREATE OR ALTER TRIGGER TBCONFERENCIA_B01D FOR TBCONFERENCIA
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN

  HISTORICO = '';

  IF(OLD.ID > 0) THEN
  BEGIN
    HISTORICO = HISTORICO||'CONFERENCIA EXCLUIDA';
  END

  IF(HISTORICO <> '') THEN
  BEGIN
    IF(OLD.TABELA = 'NFE') THEN
    BEGIN
      :HISTORICO_ID = '01'||OLD.TABELA_ID;
    END ELSE IF(OLD.TABELA = 'NFS') THEN
    BEGIN
      :HISTORICO_ID = '02'||OLD.TABELA_ID;
    END ELSE IF (OLD.TABELA = 'PED') THEN
    BEGIN
      :HISTORICO_ID = '03'||OLD.TABELA_ID;
    END

    EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
  END
END;