SET TERM ^ ;

CREATE OR ALTER procedure SPUI_VOUCHER_NF (
    VOUCHER_ID integer,
    VALOR_PARCELA numeric(15,2),
    ACAO integer = 1)
as
BEGIN

    IF(:ACAO = 1) THEN /* DESFAZER BAIXA DE SALDO PARA VOUCHERS */
    BEGIN
         UPDATE TBVOUCHER SET SALDO = SALDO + :VALOR_PARCELA
            WHERE ID = :VOUCHER_ID;

    END ELSE
    IF(:ACAO = 2) THEN /* REALIZAR BAIXA DE VOUCHERS */
    BEGIN
        UPDATE TBVOUCHER SET SALDO = SALDO - :VALOR_PARCELA
            WHERE ID = :VOUCHER_ID;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbnfs_parcelamento_b04d for tbnfs_parcelamento
active before delete position 1
AS
DECLARE VARIABLE VREGISTROS INTEGER;
BEGIN
    
        EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', OLD.CONTROLE, OLD.NFS_CONTROLE,
         OLD.ESTABELECIMENTO_CODIGO, OLD.EMPRESA_CODIGO, OLD.CONTA_RECEBER_OPERACAO,
         OLD.NUMERO_NOTAFISCAL, OLD.PARCELA, OLD.DATA_EMISSAO, OLD.VALOR_SALDO, OLD.VALOR, 'D', OLD.SERIE, OLD.AVULSO, 2);

        IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
        BEGIN
            /* DESFAZER BAIXA DE DEVOLUCAO */
            EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(OLD.PDV_DEVOLUCAO_TROCA_ID, OLD.VALOR, 1);
        END

        IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
        BEGIN
            /* DESFAZER BAIXA DE VOUCHER */
            EXECUTE PROCEDURE SPUI_VOUCHER_NF(OLD.VOUCHER_ID, OLD.VALOR, 1);
        END

END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbnfs_parcelamento_b05i for tbnfs_parcelamento
active before insert position 4
AS
DECLARE VARIABLE PDV_CFE_ID                INTEGER;
DECLARE VARIABLE PDV_CAIXA_ID              INTEGER;
DECLARE VARIABLE INCLUIR_PARCELA_SEM_SALDO VARCHAR(1);
DECLARE VARIABLE VALOR_SALDO NUMERIC(10,4);
BEGIN
   :INCLUIR_PARCELA_SEM_SALDO = 0;
   IF (NEW.GC_WEB = 1) THEN
       BEGIN
            :INCLUIR_PARCELA_SEM_SALDO = COALESCE((SELECT FIRST 1 A.parcelas_sem_saldo FROM TBPAGAMENTO_FORMA A WHERE A.CODIGO = NEW.PAGAMENTO_FORMA),'0');
            IF(:INCLUIR_PARCELA_SEM_SALDO = '1')THEN
            BEGIN
               NEW.VALOR_SALDO = 0;
            END

            IF(NEW.NF_NATUREZA = 2) THEN
            BEGIN
                EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE,
                 NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                 NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);

                IF(COALESCE(NEW.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                BEGIN
                    /* REALIZAR BAIXA DE DEVOLUCAO */
                    EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_TROCA_ID, NEW.VALOR, 2);
                END

                IF(COALESCE(NEW.VOUCHER_ID, 0) > 0) THEN
                BEGIN
                    /* REALIZAR BAIXA DE VOUCHER */
                    EXECUTE PROCEDURE SPUI_VOUCHER_NF(NEW.VOUCHER_ID, NEW.VALOR, 2);
                END

            END
            ELSE
            BEGIN
              IF(NEW.NF_SITUACAO = 2) THEN
              BEGIN
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE,
                     NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                     NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);

                    IF(COALESCE(NEW.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_TROCA_ID, NEW.VALOR, 2);
                    END

                    IF(COALESCE(NEW.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(NEW.VOUCHER_ID, NEW.VALOR, 2);
                    END
              END
              ELSE
              BEGIN
                  IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
                  BEGIN
                    FOR SELECT FIRST 1 B.ID, (SELECT FIRST 1 T.PDV_CAIXA_ID FROM TBPDV_MOVIMENTO_CAIXA T WHERE T.ID = B.PDV_MOVIMENTO_CAIXA_ID) AS PDV_CAIXA_ID
                         FROM TBPDV_CFE_FORMA_PAGAMENTO A, TBPDV_CFE B
                          WHERE A.ID = NEW.PDV_CFE_FORMA_PAGAMENTO_ID
                          AND A.PDV_CFE_ID = B.ID
                          AND A.ID IS NOT NULL INTO :PDV_CFE_ID,:PDV_CAIXA_ID DO
                          BEGIN
                              EXECUTE PROCEDURE SP_CFE_LANCAMENTO_PARCELA('CFE', NEW.CONTROLE, NEW.PDV_CFE_FORMA_PAGAMENTO_ID,
                                 NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO, NEW.CONTA_RECEBER_BANCO,
                                 NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);

                          END
                  END
              END
            END

            IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0 AND COALESCE(NEW.PDV_CFE_ID, 0) = 0)THEN
            BEGIN
               NEW.PDV_CFE_ID = COALESCE((SELECT FIRST 1 CFE.PDV_CFE_ID FROM TBPDV_CFE_FORMA_PAGAMENTO CFE WHERE CFE.ID = NEW.PDV_CFE_FORMA_PAGAMENTO_ID),0);
            END
       END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbnfs_parcelamento_b08u for tbnfs_parcelamento
active before update position 4
AS
DECLARE VARIABLE VREGISTROS INTEGER;
BEGIN

   IF (NEW.GC_WEB = 1) THEN
       BEGIN

            IF((OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 2) OR (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1) ) THEN
            BEGIN
                -- DELETAR LANÇAMENTO DE PARCELA
                EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
                IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0 AND (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1)) THEN
                BEGIN
                    /* DESFAZER BAIXA DE DEVOLUCAO */
                    EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(OLD.PDV_DEVOLUCAO_TROCA_ID, OLD.VALOR, 1);
                END

                IF(COALESCE(OLD.VOUCHER_ID, 0) > 0 AND (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1)) THEN
                BEGIN
                    /* DESFAZER BAIXA DE VOUCHER */
                    EXECUTE PROCEDURE SPUI_VOUCHER_NF(OLD.VOUCHER_ID, OLD.VALOR, 1);
                END
    
                IF(NEW.NF_NATUREZA = 2) THEN
                BEGIN
                    -- INCLUIR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);

                    IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_TROCA_ID, NEW.VALOR, 2);
                    END

                    IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(NEW.VOUCHER_ID, NEW.VALOR, 2);
                    END
                END
    
           END ELSE
           IF(OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 2) THEN
           BEGIN
             -- VREGISTROS = (SELECT COUNT(CONTROLE) FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFS_CONTROLE = OLD.NFS_CONTROLE AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE);
                IF(NEW.ESTABELECIMENTO_CODIGO   <> OLD.ESTABELECIMENTO_CODIGO OR
                   NEW.EMPRESA_CODIGO           <> OLD.EMPRESA_CODIGO OR
                   NEW.VALOR                    <> OLD.VALOR) THEN
                   BEGIN
                    IF (OLD.VALOR_SALDO <> OLD.VALOR) THEN
                        EXCEPTION "..." 'PARCELAMENTO COM LANCAMENTOS VINCULADOS, ALTERACAO CANCELADA!';
    
                    VREGISTROS = (SELECT COUNT(CONTROLE) FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFS_CONTROLE = OLD.NFS_CONTROLE AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE);
                    IF (VREGISTROS > 1) THEN
                        EXCEPTION "..." 'PARCELAMENTO COM LANCAMENTOS VINCULADOS, ALTERACAO CANCELADA!';
                   END
    
                -- ATUALIZAR LANÇAMENTO DE PARCELA

                IF(OLD.ESTABELECIMENTO_CODIGO  <> NEW.ESTABELECIMENTO_CODIGO
                OR OLD.EMPRESA_CODIGO          <> NEW.EMPRESA_CODIGO
                OR OLD.NUMERO_NOTAFISCAL       <> NEW.NUMERO_NOTAFISCAL
                OR OLD.PARCELA                 <> NEW.PARCELA
                OR OLD.DATA_EMISSAO            <> NEW.DATA_EMISSAO
                OR OLD.SERIE                   <> NEW.SERIE
                OR OLD.REPRESENTANTE_ID        <> NEW.REPRESENTANTE_ID
                OR OLD.VENDEDOR_ID             <> NEW.VENDEDOR_ID
                OR OLD.REPRESENTANTE_COMISSAO  <> NEW.REPRESENTANTE_COMISSAO
                OR OLD.VENDEDOR_COMISSAO       <> NEW.VENDEDOR_COMISSAO )THEN
                BEGIN
                 EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                 NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 3);
                END

                IF((COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) <> COALESCE(NEW.PDV_DEVOLUCAO_TROCA_ID, 0)) OR (NEW.VALOR <> OLD.VALOR)) THEN
                BEGIN
                    IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(OLD.PDV_DEVOLUCAO_TROCA_ID, OLD.VALOR, 1);

                         /* REALIZAR BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_TROCA_ID, NEW.VALOR, 2);
                    END
                END

                IF((COALESCE(OLD.VOUCHER_ID, 0) <> COALESCE(NEW.VOUCHER_ID, 0)) OR (NEW.VALOR <> OLD.VALOR)) THEN
                BEGIN
                    IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(OLD.VOUCHER_ID, OLD.VALOR, 1);

                         /* REALIZAR BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(NEW.VOUCHER_ID, NEW.VALOR, 2);
                    END
                END

           END ELSE
           IF(OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 1) THEN
           BEGIN
                IF(OLD.NF_SITUACAO = 1 AND NEW.NF_SITUACAO = 2) THEN
                BEGIN
                    
                    IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_TROCA_ID, NEW.VALOR, 2);
                    END

                    IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* REALIZAR BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(NEW.VOUCHER_ID, NEW.VALOR, 2);
                    END

                    -- INCLUIR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);
    
                END ELSE
                IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 1) THEN
                BEGIN

                    IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(OLD.PDV_DEVOLUCAO_TROCA_ID, OLD.VALOR, 1);
                    END

                    IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(OLD.VOUCHER_ID, OLD.VALOR, 1);
                    END

                    -- DELETAR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
                END ELSE
                IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 3) THEN
                BEGIN
                    
                    IF(COALESCE(OLD.PDV_DEVOLUCAO_TROCA_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE DEVOLUCAO */
                        EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(OLD.PDV_DEVOLUCAO_TROCA_ID, OLD.VALOR, 1);
                    END

                    IF(COALESCE(OLD.VOUCHER_ID, 0) > 0) THEN
                    BEGIN
                        /* DESFAZER BAIXA DE VOUCHER */
                        EXECUTE PROCEDURE SPUI_VOUCHER_NF(OLD.VOUCHER_ID, OLD.VALOR, 1);
                    END

                    -- DELETAR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
                END
           END

       END

END
^

SET TERM ; ^

