ALTER TABLE TBCONFERENCIA_ITEM
    ADD STATUS CHAR(1) DEFAULT '0',
	ADD NF_ID INTEGER;

COMMENT ON COLUMN TBCONFERENCIA_ITEM.STATUS IS
'0 - EM ABERTO;
1 - FATURADO;';

COMMENT ON COLUMN TBCONFERENCIA_ITEM.NF_ID IS
'Quando Item com Status 1 - ID da NF é preenchido';

CREATE INDEX ITBCONFERENCIA_ITEM_04
ON TBCONFERENCIA_ITEM (TAMANHO);

CREATE INDEX ITBCONFERENCIA_ITEM_05
ON TBCONFERENCIA_ITEM (NF_ID);

/*************************************************************************/
/*************************************************************************/

/********* Trigger dos Itens do Pedido e Procedure da Nota Fiscal ********/

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_a01u for tbpedido_item
active after update position 1
AS
DECLARE VARIABLE CONFERENCIA_ITEM_ID INTEGER;
DECLARE VARIABLE CONFERENCIA_ID INTEGER;
DECLARE VARIABLE STATUS CHAR(1);

DECLARE VARIABLE SALDO_DISPONIVEL NUMERIC(15,4);
DECLARE VARIABLE QTD_TOTAL_CONF INTEGER;
DECLARE VARIABLE QTD_FATURADA_CONF INTEGER;
BEGIN
    
    IF(OLD.QTD_EST <> NEW.QTD_EST) THEN
    BEGIN

        SELECT FIRST 1
            K.ID,
            K.CONFERENCIA_ID,
            COALESCE(K.STATUS, '0') AS STATUS
        FROM TBCONFERENCIA_ITEM K, TBCONFERENCIA C
        WHERE K.CONFERENCIA_ID = C.ID
        AND C.TABELA = 'PED'
        AND C.TABELA_ID = NEW.PEDIDO
        AND C.STATUS >= 2
        AND K.TABELA_ITEM_ID = NEW.CONTROLE INTO :CONFERENCIA_ITEM_ID, :CONFERENCIA_ID, :STATUS;

        IF(COALESCE(:CONFERENCIA_ITEM_ID, 0) > 0) THEN
        BEGIN

            IF (:STATUS = '0') THEN
            BEGIN

                IF (NEW.QTD_EST = 0) THEN
                BEGIN
                
                    :SALDO_DISPONIVEL = COALESCE((SELECT FIRST 1
                        IIF((FN_ESTOQUE_SALDO_DISPONIVEL(B.ESTABELECIMENTO_CODIGO, B.LOCALIZACAO_ID, B.PRODUTO_CODIGO, B.TAMANHO)) > B.QUANTIDADE, B.QUANTIDADE, (FN_ESTOQUE_SALDO_DISPONIVEL(B.ESTABELECIMENTO_CODIGO, B.LOCALIZACAO_ID, B.PRODUTO_CODIGO, B.TAMANHO)))
                    FROM TBCONFERENCIA A, TBCONFERENCIA_ITEM T
                    INNER JOIN TBPEDIDO_ITEM B ON B.CONTROLE = T.TABELA_ITEM_ID
                    WHERE A.ID = T.CONFERENCIA_ID
                    AND A.TABELA = 'PED'
                    AND T.ID = :CONFERENCIA_ITEM_ID), 0);
                
                END ELSE
                BEGIN
                
                    :SALDO_DISPONIVEL = NEW.QTD_EST;
                
                END
        
                UPDATE TBCONFERENCIA_ITEM T SET
                    T.QTD_ALOCADA       = NEW.QTD_EST,
                    T.QTD_DISPONIVEL    = :SALDO_DISPONIVEL
                WHERE T.ID = :CONFERENCIA_ITEM_ID;
    
            END

            QTD_FATURADA_CONF = COALESCE((SELECT COUNT(K.CONFERENCIA_ID) FROM TBCONFERENCIA_ITEM K WHERE K.CONFERENCIA_ID = :CONFERENCIA_ID AND K.STATUS = 1), 0);
            QTD_TOTAL_CONF    = COALESCE((SELECT COUNT(K.CONFERENCIA_ID) FROM TBCONFERENCIA_ITEM K WHERE K.CONFERENCIA_ID = :CONFERENCIA_ID), 0);
                 -- exception "..." :QTD_FATURADA_CONF||' - '||:QTD_TOTAL_CONF;
            IF (QTD_FATURADA_CONF = 0) THEN
            BEGIN
                UPDATE TBCONFERENCIA T SET
                    T.STATUS = '2'
                WHERE T.TABELA_ID = NEW.PEDIDO
                AND T.TABELA = 'PED'
                AND T.ID = :CONFERENCIA_ID;
            END ELSE IF (QTD_FATURADA_CONF = QTD_TOTAL_CONF) THEN
            BEGIN
                UPDATE TBCONFERENCIA T SET
                    T.STATUS = '4'
                WHERE T.TABELA_ID = NEW.PEDIDO
                AND T.TABELA = 'PED'
                AND T.ID = :CONFERENCIA_ID;
            END ELSE
            BEGIN
                UPDATE TBCONFERENCIA T SET
                    T.STATUS = '5'
                WHERE T.TABELA_ID = NEW.PEDIDO
                AND T.TABELA = 'PED'
                AND T.ID = :CONFERENCIA_ID;
            END
        
        END
    
    END
END
^

SET TERM ; ^

/*******************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPU_NFS_PEDIDO (
    NFS_CONTROLE integer,
    CONTROLE integer)
as
declare variable PRODUTO_CODIGO integer;
declare variable PEDIDO_ITEM_PE_CONTROLE integer;
declare variable IQUANTIDADE numeric(10,5);
declare variable IT01 numeric(10,5);
declare variable IT02 numeric(10,5);
declare variable IT03 numeric(10,5);
declare variable IT04 numeric(10,5);
declare variable IT05 numeric(10,5);
declare variable IT06 numeric(10,5);
declare variable IT07 numeric(10,5);
declare variable IT08 numeric(10,5);
declare variable IT09 numeric(10,5);
declare variable IT10 numeric(10,5);
declare variable IT11 numeric(10,5);
declare variable IT12 numeric(10,5);
declare variable IT13 numeric(10,5);
declare variable IT14 numeric(10,5);
declare variable IT15 numeric(10,5);
declare variable IT16 numeric(10,5);
declare variable IT17 numeric(10,5);
declare variable IT18 numeric(10,5);
declare variable IT19 numeric(10,5);
declare variable IT20 numeric(10,5);
declare variable CONFERENCIA_ID numeric(10,5);
BEGIN

    FOR
    SELECT A.PRODUTO_CODIGO, A.PEDIDO_ITEM_PE_CONTROLE, A.QUANTIDADE,
    A.T01,A.T02,A.T03,A.T04,A.T05,A.T06,A.T07,A.T08,A.T09,A.T10,
    A.T11,A.T12,A.T13,A.T14,A.T15,A.T16,A.T17,A.T18,A.T19,A.T20,

    COALESCE((SELECT FIRST 1 K.ID
        FROM TBCONFERENCIA_ITEM K
        WHERE K.STATUS <> 1
        AND K.TABELA_ITEM_ID = A.PEDIDO_ITEM_PE_CONTROLE), 0) AS CONFERENCIA_ID

    FROM TBNFS_ITEM A
    WHERE A.PEDIDO_ITEM_PE_CONTROLE > 0
      AND A.NFS_CONTROLE = :NFS_CONTROLE
      AND A.CONTROLE = :CONTROLE
    INTO
    :PRODUTO_CODIGO, :PEDIDO_ITEM_PE_CONTROLE,:IQUANTIDADE,
    :IT01,:IT02,:IT03,:IT04,:IT05,:IT06,:IT07,:IT08,:IT09,:IT10,
    :IT11,:IT12,:IT13,:IT14,:IT15,:IT16,:IT17,:IT18,:IT19,:IT20, :CONFERENCIA_ID
    DO BEGIN

       IF (:PRODUTO_CODIGO > 0) THEN
           BEGIN

               IF(:CONFERENCIA_ID > 0) THEN
               BEGIN
                    UPDATE TBCONFERENCIA_ITEM T SET T.STATUS = 1, T.NF_ID = :NFS_CONTROLE WHERE T.TABELA_ITEM_ID = :PEDIDO_ITEM_PE_CONTROLE;
               END
    
               UPDATE TBPEDIDO_ITEM_SALDO SET
               QUANTIDADE = QUANTIDADE - :IQUANTIDADE,
               T01 = T01 - :IT01,   T02 = T02 - :IT02,   T03 = T03 - :IT03,
               T04 = T04 - :IT04,   T05 = T05 - :IT05,   T06 = T06 - :IT06,
               T07 = T07 - :IT07,   T08 = T08 - :IT08,   T09 = T09 - :IT09,
               T10 = T10 - :IT10,   T11 = T11 - :IT11,   T12 = T12 - :IT12,
               T13 = T13 - :IT13,   T14 = T14 - :IT14,   T15 = T15 - :IT15,
               T16 = T16 - :IT16,   T17 = T17 - :IT17,   T18 = T18 - :IT18,
               T19 = T19 - :IT19,   T20 = T20 - :IT20
               WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_PE_CONTROLE;

           END

       END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPD_NFS_PEDIDO (
    NFS_CONTROLE integer,
    CONTROLE integer)
as
declare variable PEDIDO_ITEM_PE_CONTROLE integer;
declare variable QUANTIDADE numeric(10,5);
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
declare variable CONFERENCIA_ID numeric(10,5);
BEGIN
SELECT A.PEDIDO_ITEM_PE_CONTROLE, A.QUANTIDADE,
A.T01,A.T02,A.T03,A.T04,A.T05,A.T06,A.T07,A.T08,A.T09,A.T10,
A.T11,A.T12,A.T13,A.T14,A.T15,A.T16,A.T17,A.T18,A.T19,A.T20,

COALESCE((SELECT FIRST 1 K.ID
        FROM TBCONFERENCIA_ITEM K
        WHERE K.STATUS = 1
        AND K.TABELA_ITEM_ID = A.PEDIDO_ITEM_PE_CONTROLE), 0) AS CONFERENCIA_ID

FROM TBNFS_ITEM A
WHERE
    A.PEDIDO_ITEM_PE_CONTROLE > 0
    AND A.PRODUTO_CODIGO > 0
    AND A.NFS_CONTROLE = :NFS_CONTROLE
    AND A.CONTROLE = :CONTROLE
INTO
:PEDIDO_ITEM_PE_CONTROLE, :QUANTIDADE,
:T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,:T11,:T12,:T13,:T14,
:T15,:T16,:T17,:T18,:T19,:T20, :CONFERENCIA_ID;

    IF (:PEDIDO_ITEM_PE_CONTROLE > 0) THEN
        BEGIN

            IF(:CONFERENCIA_ID > 0) THEN
           BEGIN
                UPDATE TBCONFERENCIA_ITEM T SET T.STATUS = 0, T.NF_ID = 0 WHERE T.TABELA_ITEM_ID = :PEDIDO_ITEM_PE_CONTROLE;
           END

           UPDATE TBPEDIDO_ITEM_SALDO SET
           QUANTIDADE = QUANTIDADE + :QUANTIDADE,
           T01 = T01+ :T01, T02 = T02+ :T02, T03 = T03+ :T03, T04 = T04+ :T04,
           T05 = T05+ :T05, T06 = T06+ :T06, T07 = T07+ :T07, T08 = T08+ :T08,
           T09 = T09+ :T09, T10 = T10+ :T10, T11 = T11+ :T11, T12 = T12+ :T12,
           T13 = T13+ :T13, T14 = T14+ :T14, T15 = T15+ :T15, T16 = T16+ :T16,
           T17 = T17+ :T17, T18 = T18+ :T18, T19 = T19+ :T19, T20 = T20+ :T20
           WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_PE_CONTROLE;

        END

END
^

SET TERM ; ^

/************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01ud for tbconferencia_item
active before update or delete position 0
AS
DECLARE VARIABLE NF_SITUACAO INTEGER;
DECLARE VARIABLE DOCUMENTO VARCHAR(500);
BEGIN

    SELECT FIRST 1
        COALESCE(A.SITUACAO, 0),
        FN_LPAD(A.NUMERO_NOTAFISCAL, 9, '0')||'/'||FN_LPAD(A.SERIE, 3, '0')
    FROM TBNFS A
    WHERE A.CONTROLE = OLD.NF_ID
    AND A.SITUACAO <> 3 INTO :NF_SITUACAO, :DOCUMENTO;

    IF (:NF_SITUACAO > 0) THEN
    BEGIN

        IF (UPDATING) THEN
        BEGIN

            IF (OLD.QTD_TOTAL <> NEW.QTD_TOTAL) THEN
            BEGIN
                EXCEPTION "..." 'CONFERENCIA VINCULADA AO DOCUMENTO FISCAL: '||:DOCUMENTO||'. OPERACAO CANCELADA!';
            END
        
            IF (OLD.QTD_CONFERIDA <> NEW.QTD_CONFERIDA) THEN
            BEGIN
                EXCEPTION "..." 'CONFERENCIA VINCULADA AO DOCUMENTO FISCAL: '||:DOCUMENTO||'. OPERACAO CANCELADA!';
            END

        END
        IF (DELETING) THEN
        BEGIN
            EXCEPTION "..." 'CONFERENCIA VINCULADA AO DOCUMENTO FISCAL: '||:DOCUMENTO||'. OPERACAO CANCELADA!';
        END

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b01ud for tbpedido_item
active before update or delete position 0
AS
DECLARE VARIABLE CONFERENCIA_CODIGO VARCHAR(500);
DECLARE VARIABLE QTD_TOTAL_CONFERENCIA NUMERIC(18,4);
BEGIN

    SELECT
        COALESCE(LIST(FN_LPAD(B.TABELA_ID, 8, '0')||B.SEQUENCIA, ', '), ''),
        COALESCE(SUM(A.QTD_TOTAL), 0)
    FROM TBCONFERENCIA_ITEM A, TBCONFERENCIA B
    WHERE A.CONFERENCIA_ID = B.ID
    AND B.TABELA = 'PED'
    AND B.TABELA_ID = OLD.PEDIDO
    AND B.STATUS >= 2
    AND A.TABELA_ITEM_ID = OLD.CONTROLE
    INTO :CONFERENCIA_CODIGO, :QTD_TOTAL_CONFERENCIA;

    IF (:CONFERENCIA_CODIGO <> '') THEN
    BEGIN

        IF (UPDATING) THEN
        BEGIN

            IF (OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
            BEGIN
                IF (NEW.QUANTIDADE < :QTD_TOTAL_CONFERENCIA) THEN
                BEGIN
                    EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' JA VINCULADO NA(S) CONFERENCIA(S): '||:CONFERENCIA_CODIGO||'. OPERACAO CANCELADA!';
                END
            END

        END
        IF (DELETING) THEN
        BEGIN
            EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' JA VINCULADO NA(S) CONFERENCIA(S): '||:CONFERENCIA_CODIGO||'. OPERACAO CANCELADA!';
        END

    END
END
^

SET TERM ; ^

