SET TERM ^ ;

ALTER TABLE TBCOMISSAO
ADD PREVISAO_ID INTEGER
DEFAULT 0^

ALTER TABLE TBCOMISSAO
ADD CORRETOR_ID INTEGER
DEFAULT 0^

ALTER TABLE TBCOMISSAO
ADD VENDEDOR_ID INTEGER
DEFAULT 0^

ALTER TABLE TBCORRETOR
ADD FORNECEDOR_ID INTEGER
DEFAULT 0^

ALTER TABLE TBCOMISSAO
ADD STATUS SMALLINT
DEFAULT 1^

COMMENT ON COLUMN TBCOMISSAO.STATUS IS
'1 - ATIVO
0 - INATIVO'^

ALTER TABLE TBCOMISSAO
ADD TIPO SMALLINT^

COMMENT ON COLUMN TBCOMISSAO.TIPO IS
'1 - COMISSAO DE REPRESENTANTE
2 - COMISSAO DE VENDEDOR
3 - COMISSAO DE CORRETOR'^

ALTER TABLE TBNFS_PARCELAMENTO
ADD CORRETOR_ID INTEGER
DEFAULT 0^

ALTER TABLE TBREPRESENTANTE
ADD GERAR_COMISSAO INTEGER
DEFAULT 0^

ALTER TABLE TBREPRESENTANTE_VENDEDOR
ADD GERAR_COMISSAO INTEGER
DEFAULT 0^

ALTER TABLE TBCORRETOR
ADD GERAR_COMISSAO INTEGER
DEFAULT 0^

UPDATE OR INSERT INTO TBPARAMETRO (
        TABELA,  
        CODIGO, 
        DESCRICAO, 
        VALOR, 
        OBSERVACAO, 
        GRUPO,
        DATAHORA, 
        USUARIO_ID)
     VALUES (
       'SISTEMA',
       'TIPO_COMISSAO',
       'INDICA QUAL O TIPO DE COMISSAO UTILIZADA NO SISTEMA',
       '7',
       'SE 0 - UTILIZAR REPRESENTANTE,
        1 - UTILIZAR VENDEDOR,
        2 - UTILIZAR CORRETOR,
        3 - UTILIZAR CORRETOR E REPRESENTANTE,
        4 - UTILIZAR CORRETOR E VENDEDOR,
        5 - UTILIZAR REPRESENTANTE E VENDEDOR,
        6 - UTILIZAR REPRESENTANTE, VENDEDOR E CORRETOR
		7 - NAO GERA COMISSAO',
       'WEB20430',
       '2022-06-14 14:14:00',
       666)
     MATCHING (TABELA, CODIGO)^

	UPDATE OR INSERT INTO TBPARAMETRO (
        TABELA,  
        CODIGO, 
        DESCRICAO, 
        VALOR, 
        OBSERVACAO, 
        GRUPO,
        DATAHORA, 
        USUARIO_ID)
     VALUES (
       'TBESTABELECIMENTO',
       'COMISSAO_CLASSIF_FINANCEIRA',
       'INDICA QUAL A CLASSIFICACAO FINANCEIRA USADA NA BAIXA DAS COMISSOES',
       '',
       'CODIGO DA CLASSIFICACAO SEM MASCARA',
       'WEB20430',
       '2022-06-14 15:00:00',
       666)
     MATCHING (TABELA, CODIGO)^

     UPDATE OR INSERT INTO TBPARAMETRO (
        TABELA,  
        CODIGO, 
        DESCRICAO, 
        VALOR, 
        OBSERVACAO, 
        GRUPO,
        DATAHORA, 
        USUARIO_ID)
     VALUES (
       'TBESTABELECIMENTO',
       'COMISSAO_CCUSTO',
       'INDICA QUAL O CENTRO DE CUSTO USADO NA BAIXA DAS COMISSOES',
       '0',
       'CODIGO DO CENTRO DE CUSTO SEM MASCARA',
       'WEB20430',
       '2022-06-14 14:14:00',
       666)
     MATCHING (TABELA, CODIGO)^ 

     UPDATE OR INSERT INTO TBPARAMETRO (
        TABELA,  
        CODIGO, 
        DESCRICAO, 
        VALOR, 
        OBSERVACAO, 
        GRUPO,
        DATAHORA, 
        USUARIO_ID)
     VALUES (
       'TBESTABELECIMENTO',
       'COMISSAO_PAGAMENTO_FORMA',
       'INDICA QUAL A FORMA DE PAGAMENTO UTILIZADA NA PREVISAO DAS COMISSOES',
       '0',
       'CODIGO DO CENTRO DE CUSTO SEM MASCARA',
       'WEB20430',
       '2022-06-14 14:14:00',
       666)
     MATCHING (TABELA, CODIGO)^

     UPDATE OR INSERT INTO TBPARAMETRO (
        TABELA,  
        CODIGO, 
        DESCRICAO, 
        VALOR, 
        OBSERVACAO, 
        GRUPO,
        DATAHORA, 
        USUARIO_ID)
     VALUES (
       'TBESTABELECIMENTO',
       'COMISSAO_CAIXABANCO',
       'INDICA QUAL O CAIXA/BANCO USADO NA BAIXA DAS COMISSOES',
       '0',
       '',
       'WEB20430',
       '2022-06-14 14:14:00',
       666)
     MATCHING (TABELA, CODIGO)^


CREATE OR ALTER PROCEDURE SPI_PROVISAO_COMISSAO (
    ESTABELECIMENTO_CODIGO INTEGER,
    CAIXABANCO_CODIGO INTEGER,
    DATA_PREVISAO DATE,
    DATA_COMPETENCIA DATE,
    VALOR_TOTAL NUMERIC(10,5),
    CONTROLE INTEGER,
    CCUSTO VARCHAR(20),
    CLASSIFICACAO_CONTABIL VARCHAR(20),
    EMPRESA_ID INTEGER,
    FORMA_PAGAMENTO_ID INTEGER)
AS
BEGIN
    INSERT INTO TBCAIXABANCO_PREVISAO
       (
        ESTABELECIMENTO_CODIGO, 
        CAIXABANCO_CODIGO, 
        DATA_PREVISAO, 
        DATA_COMPETENCIA, 
        TIPO, 
        VALOR_TOTAL, 
        HISTORICO, 
        USUARIO_CODIGO, 
        CONTROLE, 
        DATA, 
        PENDENTE, 
        DOCUMENTO, 
        CCUSTO, 
        CLASSIFICACAO_CONTABIL, 
        PARCELA, 
        AGRUPAMENTO_ID, 
        EMPRESA_ID,
        SALDO_REUTILIZADO,
        OBSERVACAO,
        FORMA_PAGAMENTO_ID,
        ORIGEM
        )
    VALUES (
        :ESTABELECIMENTO_CODIGO, 
        :CAIXABANCO_CODIGO,
        :DATA_PREVISAO, 
        :DATA_COMPETENCIA, 
        'C',
        :VALOR_TOTAL,
        'PGTO COMISSAO',
        FN_CURRENT_USER_ID(),
        :CONTROLE, 
        CURRENT_DATE,
        1,
        0,
        :CCUSTO, 
        :CLASSIFICACAO_CONTABIL, 
        1,
        GEN_ID(GTBCAIXABANCO_PREVISAO_AGP,1),
        :EMPRESA_ID,
        '1',
        '',
        :FORMA_PAGAMENTO_ID,
        '0'
        );
END^

CREATE OR ALTER PROCEDURE SPI_GERAR_COMISSAO (
    TABELA_ID INTEGER,
    ORIGEM VARCHAR(3),
    TIPO INTEGER = 0)
AS
DECLARE VARIABLE REPRESENTANTE_ID             INTEGER;
DECLARE VARIABLE VALOR_TOTAL                  NUMERIC(15,2);
DECLARE VARIABLE ESTABELECIMENTO_ID           INTEGER;
DECLARE VARIABLE DATA_EMISSAO                 DATE = 'NOW';
DECLARE VARIABLE DATA_VENCIMENTO              DATE = 'NOW';
DECLARE VARIABLE CORRETOR_ID                  INTEGER;
DECLARE VARIABLE VENDEDOR_ID                  INTEGER;
DECLARE VARIABLE TIPO_COMISSAO                INTEGER;
DECLARE VARIABLE COMISSAO_CORRETOR            NUMERIC(15,2);
DECLARE VARIABLE COMISSAO_REPRESENTANTE       NUMERIC(15,2);
DECLARE VARIABLE COMISSAO_VENDEDOR            NUMERIC(15,2);
DECLARE VARIABLE VALOR_COMISSAO_CORRETOR      NUMERIC(15,2);
DECLARE VARIABLE VALOR_COMISSAO_REPRESENTANTE NUMERIC(15,2);
DECLARE VARIABLE VALOR_COMISSAO_VENDEDOR      NUMERIC(15,2);
DECLARE VARIABLE CONTROLE_PROVISAO            INTEGER;
DECLARE VARIABLE GERAR_COMISSAO_CORRETOR      INTEGER;
DECLARE VARIABLE GERAR_COMISSAO_REPRESENTANTE INTEGER;
DECLARE VARIABLE GERAR_COMISSAO_VENDEDOR      INTEGER;
BEGIN
      IF(:ORIGEM = 'CFE')THEN
      BEGIN
         FOR
             SELECT A.ID,
                A.ESTABELECIMENTO_ID,
                A.REPRESENTANTE_ID,
                A.REPRESENTANTE_COMISSAO AS COMISSAO_REPRESENTANTE,
                COALESCE((SELECT FIRST 1 R.GERAR_COMISSAO FROM TBREPRESENTANTE R WHERE R.CODIGO = A.REPRESENTANTE_ID), 0) AS GERAR_COMISSAO_REPRESENTANTE,
                COALESCE(A.CORRETOR_ID,0) AS CORRETOR_ID,
                COALESCE((SELECT FIRST 1 C.COMISSAO FROM TBCORRETOR C WHERE C.ID = A.CORRETOR_ID), 0) AS COMISSAO_CORRETOR,
                COALESCE((SELECT FIRST 1 C.GERAR_COMISSAO FROM TBCORRETOR C WHERE C.ID = A.CORRETOR_ID), 0) AS GERAR_COMISSAO_CORRETOR,
                A.VENDEDOR_ID,
                COALESCE((SELECT FIRST 1 V.COMISSAO FROM TBREPRESENTANTE_VENDEDOR V WHERE V.CODIGO = A.VENDEDOR_ID), 0) AS COMISSAO_VENDEDOR,
                COALESCE((SELECT FIRST 1 V.GERAR_COMISSAO FROM TBREPRESENTANTE_VENDEDOR V WHERE V.CODIGO = A.VENDEDOR_ID), 0) AS GERAR_COMISSAO_VENDEDOR,
                A.DATA_EMISSAO,
                DATEADD(FN_PARAMETRO('SISTEMA.PRAZO_VOUCHER') DAY TO A.DATA_EMISSAO) AS DATA_VENCIMENTO,
                CAST(FN_PARAMETRO('SISTEMA.TIPO_COMISSAO') AS INTEGER) AS TIPO_COMISSAO,
                COALESCE(SUM(B.VALOR),0) AS VALOR_TOTAL
    
                FROM TBPDV_CFE A
                LEFT JOIN TBPDV_CFE_FORMA_PAGAMENTO C ON C.PDV_CFE_ID                 = A.ID
                LEFT JOIN TBNFS_PARCELAMENTO        B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = C.ID
                WHERE A.ID = :TABELA_ID
                GROUP BY A.ID, A.ESTABELECIMENTO_ID, A.REPRESENTANTE_ID, A.REPRESENTANTE_COMISSAO, A.CORRETOR_ID, A.VENDEDOR_ID, A.VENDEDOR_COMISSAO, C.PDV_CFE_ID, A.DATA_EMISSAO
                INTO :TABELA_ID, :ESTABELECIMENTO_ID, :REPRESENTANTE_ID, :COMISSAO_REPRESENTANTE, :GERAR_COMISSAO_REPRESENTANTE, :CORRETOR_ID, :COMISSAO_CORRETOR, :GERAR_COMISSAO_CORRETOR, :VENDEDOR_ID,
                     :COMISSAO_VENDEDOR, :GERAR_COMISSAO_VENDEDOR, :DATA_EMISSAO, :DATA_VENCIMENTO, :TIPO_COMISSAO, :VALOR_TOTAL
                DO
                BEGIN
                     IF(:VALOR_TOTAL > 0)THEN
                     BEGIN
                        :VALOR_COMISSAO_REPRESENTANTE = 0;
                        :VALOR_COMISSAO_VENDEDOR      = 0;
                        :VALOR_COMISSAO_CORRETOR      = 0;
                        --SE COMISSAO FOR REPRESENTANTE
                        IF(:TIPO_COMISSAO = 0)THEN BEGIN :CORRETOR_ID      = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                        --SE COMISSAO FOR VENDEDOR
                        IF(:TIPO_COMISSAO = 1)THEN BEGIN :CORRETOR_ID      = 0; :REPRESENTANTE_ID = 0;:VALOR_COMISSAO_VENDEDOR      = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                        --SE COMISSAO FOR CORRETOR
                        IF(:TIPO_COMISSAO = 2)THEN BEGIN :REPRESENTANTE_ID = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                        --SE COMISSAO FOR CORRETOR E REPRESENTANTE
                        IF(:TIPO_COMISSAO = 3)THEN BEGIN :VENDEDOR_ID      = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                        --SE COMISSAO FOR CORRETOR E VENDEDOR
                        IF(:TIPO_COMISSAO = 4)THEN BEGIN :REPRESENTANTE_ID = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                        --SE COMISSAO FOR REPRESENTANTE E VENDEDOR
                        IF(:TIPO_COMISSAO = 5)THEN BEGIN :CORRETOR_ID      = 0; :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                        --SE COMISSAO FOR PARA TODOS
                        IF(:TIPO_COMISSAO = 6)THEN BEGIN :VALOR_COMISSAO_CORRETOR = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
    
                        IF(:VALOR_COMISSAO_REPRESENTANTE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                        BEGIN
                            CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                            UPDATE OR INSERT INTO TBCOMISSAO
                               (
                                 ESTABELECIMENTO_ID,
                                 REPRESENTANTE_ID,
                                 CORRETOR_ID,
                                 VENDEDOR_ID,
                                 DATA_EMISSAO,
                                 DATA_VENCIMENTO,
                                 ORIGEM,
                                 TABELA_ID,
                                 VALOR,
                                 SALDO,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 :REPRESENTANTE_ID,
                                 0,
                                 0,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :CONTROLE_PROVISAO,
                                 1
                               )
                             MATCHING(ORIGEM, TABELA_ID, TIPO);
    
                            EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                                :ESTABELECIMENTO_ID,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                                :DATA_EMISSAO,
                                :DATA_EMISSAO,
                                :VALOR_COMISSAO_REPRESENTANTE,
                                :CONTROLE_PROVISAO,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                                :REPRESENTANTE_ID,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                        END
                        
                        IF(:VALOR_COMISSAO_VENDEDOR > 0 AND :VENDEDOR_ID > 0 AND :GERAR_COMISSAO_VENDEDOR > 0 AND (:TIPO = 0 OR :TIPO = 2))THEN
                        BEGIN
                            CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                            UPDATE OR INSERT INTO TBCOMISSAO
                               (
                                 ESTABELECIMENTO_ID,
                                 REPRESENTANTE_ID,
                                 CORRETOR_ID,
                                 VENDEDOR_ID,
                                 DATA_EMISSAO,
                                 DATA_VENCIMENTO,
                                 ORIGEM,
                                 TABELA_ID,
                                 VALOR,
                                 SALDO,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 0,
                                 0,
                                 :VENDEDOR_ID,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_VENDEDOR,
                                 :VALOR_COMISSAO_VENDEDOR,
                                 :CONTROLE_PROVISAO,
                                 2
                               )
                             MATCHING(ORIGEM, TABELA_ID, TIPO);
    
                             EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                                :ESTABELECIMENTO_ID,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                                :DATA_EMISSAO,
                                :DATA_EMISSAO,
                                :VALOR_COMISSAO_VENDEDOR,
                                :CONTROLE_PROVISAO,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                                0,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                        END
    
                        
                        IF(:VALOR_COMISSAO_CORRETOR > 0 AND :CORRETOR_ID > 0 AND :GERAR_COMISSAO_CORRETOR > 0 AND (:TIPO = 0 OR :TIPO = 3))THEN
                        BEGIN
                            CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                            UPDATE OR INSERT INTO TBCOMISSAO
                               (
                                 ESTABELECIMENTO_ID,
                                 REPRESENTANTE_ID,
                                 CORRETOR_ID,
                                 VENDEDOR_ID,
                                 DATA_EMISSAO,
                                 DATA_VENCIMENTO,
                                 ORIGEM,
                                 TABELA_ID,
                                 VALOR,
                                 SALDO,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 0,
                                 :CORRETOR_ID,
                                 0,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_CORRETOR,
                                 :VALOR_COMISSAO_CORRETOR,
                                 :CONTROLE_PROVISAO,
                                 3
                               )
                             MATCHING(ORIGEM, TABELA_ID, TIPO);
    
                             EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                                :ESTABELECIMENTO_ID,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                                :DATA_EMISSAO,
                                :DATA_EMISSAO,
                                :VALOR_COMISSAO_CORRETOR,
                                :CONTROLE_PROVISAO,
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                                COALESCE((SELECT FIRST 1 C.FORNECEDOR_ID FROM TBCORRETOR C WHERE C.ID = :CORRETOR_ID),0),
                                FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                        END
                     END
                END
      END
      
      IF(:ORIGEM = 'NFS')THEN
      BEGIN
       FOR
        SELECT A.CONTROLE,
           A.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
           A.REPRESENTANTE_CODIGO AS REPRESENTANTE_ID,
           COALESCE((SELECT FIRST 1 R.GERAR_COMISSAO FROM TBREPRESENTANTE R WHERE R.CODIGO = A.REPRESENTANTE_CODIGO), 0) AS GERAR_COMISSAO_REPRESENTANTE,
           A.REPRESENTANTE_COMISSAO AS COMISSAO_REPRESENTANTE,
           COALESCE(A.CORRETOR_ID,0) AS CORRETOR_ID,
           COALESCE((SELECT FIRST 1 C.COMISSAO FROM TBCORRETOR C WHERE C.ID = A.CORRETOR_ID), 0) AS COMISSAO_CORRETOR,
           COALESCE((SELECT FIRST 1 C.GERAR_COMISSAO FROM TBCORRETOR C WHERE C.ID = A.CORRETOR_ID), 0) AS GERAR_COMISSAO_CORRETOR,
           A.VENDEDOR_ID,
           COALESCE((SELECT FIRST 1 V.COMISSAO FROM TBREPRESENTANTE_VENDEDOR V WHERE V.CODIGO = A.VENDEDOR_ID), 0) AS COMISSAO_VENDEDOR,
           COALESCE((SELECT FIRST 1 V.GERAR_COMISSAO FROM TBREPRESENTANTE_VENDEDOR V WHERE V.CODIGO = A.VENDEDOR_ID), 0) AS GERAR_COMISSAO_VENDEDOR,
           A.DATA_EMISSAO,
           DATEADD(FN_PARAMETRO('SISTEMA.PRAZO_VOUCHER') DAY TO A.DATA_EMISSAO) AS DATA_VENCIMENTO,
           CAST(FN_PARAMETRO('SISTEMA.TIPO_COMISSAO') AS INTEGER) AS TIPO_COMISSAO,
           COALESCE(SUM(B.VALOR),0) AS VALOR_TOTAL
    
           FROM TBNFS A
           LEFT JOIN TBNFS_PARCELAMENTO B ON B.NFS_CONTROLE = A.CONTROLE
           WHERE A.CONTROLE = :TABELA_ID
           GROUP BY A.CONTROLE, A.ESTABELECIMENTO_CODIGO, A.REPRESENTANTE_CODIGO, A.REPRESENTANTE_COMISSAO, A.CORRETOR_ID, A.VENDEDOR_ID, A.VENDEDOR_COMISSAO, A.DATA_EMISSAO, B.NFS_CONTROLE
        INTO :TABELA_ID, :ESTABELECIMENTO_ID, :REPRESENTANTE_ID,:GERAR_COMISSAO_REPRESENTANTE, :COMISSAO_REPRESENTANTE, :CORRETOR_ID, :COMISSAO_CORRETOR, :GERAR_COMISSAO_CORRETOR, :VENDEDOR_ID,
             :COMISSAO_VENDEDOR,:GERAR_COMISSAO_VENDEDOR, :DATA_EMISSAO, :DATA_VENCIMENTO, :TIPO_COMISSAO, :VALOR_TOTAL
         DO
         BEGIN
          IF(:VALOR_TOTAL > 0)THEN
          BEGIN
                :VALOR_COMISSAO_REPRESENTANTE = 0;
                :VALOR_COMISSAO_VENDEDOR      = 0;
                :VALOR_COMISSAO_CORRETOR      = 0;
                --SE COMISSAO FOR REPRESENTANTE
                IF(:TIPO_COMISSAO = 0)THEN BEGIN :CORRETOR_ID      = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR VENDEDOR
                IF(:TIPO_COMISSAO = 1)THEN BEGIN :CORRETOR_ID      = 0; :REPRESENTANTE_ID = 0;:VALOR_COMISSAO_VENDEDOR      = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                --SE COMISSAO FOR CORRETOR
                IF(:TIPO_COMISSAO = 2)THEN BEGIN :REPRESENTANTE_ID = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                --SE COMISSAO FOR CORRETOR E REPRESENTANTE
                IF(:TIPO_COMISSAO = 3)THEN BEGIN :VENDEDOR_ID      = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR CORRETOR E VENDEDOR
                IF(:TIPO_COMISSAO = 4)THEN BEGIN :REPRESENTANTE_ID = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR REPRESENTANTE E VENDEDOR
                IF(:TIPO_COMISSAO = 5)THEN BEGIN :CORRETOR_ID      = 0; :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR PARA TODOS
                IF(:TIPO_COMISSAO = 6)THEN BEGIN :VALOR_COMISSAO_CORRETOR = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END

                IF(:VALOR_COMISSAO_REPRESENTANTE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         :REPRESENTANTE_ID,
                         0,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :CONTROLE_PROVISAO,
                         1
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                    EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_REPRESENTANTE,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        :REPRESENTANTE_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END
                
                IF(:VALOR_COMISSAO_VENDEDOR > 0 AND :VENDEDOR_ID > 0 AND :GERAR_COMISSAO_VENDEDOR > 0 AND (:TIPO = 0 OR :TIPO = 2))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         0,
                         :VENDEDOR_ID,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_VENDEDOR,
                         :VALOR_COMISSAO_VENDEDOR,
                         :CONTROLE_PROVISAO,
                         2
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                     EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_VENDEDOR,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        0,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END

                
                IF(:VALOR_COMISSAO_CORRETOR > 0 AND :CORRETOR_ID > 0 AND :GERAR_COMISSAO_CORRETOR > 0 AND (:TIPO = 0 OR :TIPO = 3))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         :CORRETOR_ID,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_CORRETOR,
                         :VALOR_COMISSAO_CORRETOR,
                         :CONTROLE_PROVISAO,
                         3
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                     EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_CORRETOR,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        COALESCE((SELECT FIRST 1 C.FORNECEDOR_ID FROM TBCORRETOR C WHERE C.ID = :CORRETOR_ID),0),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END
             END
          END
      END
    
      IF(:ORIGEM = 'AVU')THEN
      BEGIN
         /* PARCELAS AVULSAS */
         FOR
         SELECT W.CONTROLE,
            W.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
            W.REPRESENTANTE_ID,
            COALESCE((SELECT FIRST 1 R.GERAR_COMISSAO FROM TBREPRESENTANTE R WHERE R.CODIGO = W.REPRESENTANTE_ID), 0) AS GERAR_COMISSAO_REPRESENTANTE,
            W.REPRESENTANTE_COMISSAO AS COMISSAO_REPRESENTANTE,
            W.VENDEDOR_ID,
            COALESCE((SELECT FIRST 1 Z.COMISSAO FROM TBREPRESENTANTE_VENDEDOR Z WHERE Z.CODIGO = W.VENDEDOR_ID),0) AS COMISSAO_VENDEDOR,
            COALESCE((SELECT FIRST 1 V.GERAR_COMISSAO FROM TBREPRESENTANTE_VENDEDOR V WHERE V.CODIGO = W.VENDEDOR_ID), 0) AS GERAR_COMISSAO_VENDEDOR,
            COALESCE(W.CORRETOR_ID,0) AS CORRETOR_ID,
            COALESCE((SELECT FIRST 1 Z.COMISSAO FROM TBCORRETOR Z WHERE Z.ID = W.CORRETOR_ID),0) AS COMISSAO_CORRETOR,
            COALESCE((SELECT FIRST 1 C.GERAR_COMISSAO FROM TBCORRETOR C WHERE C.ID = W.CORRETOR_ID), 0) AS GERAR_COMISSAO_CORRETOR,
            W.DATA_EMISSAO,
            DATEADD(FN_PARAMETRO('SISTEMA.PRAZO_VOUCHER') DAY TO W.DATA_EMISSAO) AS DATA_VENCIMENTO,
            CAST(FN_PARAMETRO('SISTEMA.TIPO_COMISSAO') AS INTEGER) AS TIPO_COMISSAO,
            CAST(COALESCE(W.VALOR,0) AS NUMERIC(15,2))  AS VALOR_TOTAL
    
            FROM TBNFS_PARCELAMENTO W
            WHERE W.ACEITE   = 'S'
            AND   W.SITUACAO = 1
            AND   W.AVULSO   = '1'
            AND   W.CONTROLE = :TABELA_ID
            INTO :TABELA_ID, :ESTABELECIMENTO_ID, :REPRESENTANTE_ID, :GERAR_COMISSAO_REPRESENTANTE, :COMISSAO_REPRESENTANTE, :VENDEDOR_ID, :COMISSAO_VENDEDOR,
                 :GERAR_COMISSAO_VENDEDOR, :CORRETOR_ID, :COMISSAO_CORRETOR, :GERAR_COMISSAO_CORRETOR, :DATA_EMISSAO, :DATA_VENCIMENTO, :TIPO_COMISSAO, :VALOR_TOTAL DO
            BEGIN
              IF(:VALOR_TOTAL > 0)THEN
              BEGIN
                :VALOR_COMISSAO_REPRESENTANTE = 0;
                :VALOR_COMISSAO_VENDEDOR      = 0;
                :VALOR_COMISSAO_CORRETOR      = 0;
                --SE COMISSAO FOR REPRESENTANTE
                IF(:TIPO_COMISSAO = 0)THEN BEGIN :CORRETOR_ID      = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR VENDEDOR
                IF(:TIPO_COMISSAO = 1)THEN BEGIN :CORRETOR_ID      = 0; :REPRESENTANTE_ID = 0;:VALOR_COMISSAO_VENDEDOR      = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                --SE COMISSAO FOR CORRETOR
                IF(:TIPO_COMISSAO = 2)THEN BEGIN :REPRESENTANTE_ID = 0; :VENDEDOR_ID      = 0;:VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2))     ; END
                --SE COMISSAO FOR CORRETOR E REPRESENTANTE
                IF(:TIPO_COMISSAO = 3)THEN BEGIN :VENDEDOR_ID      = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR CORRETOR E VENDEDOR
                IF(:TIPO_COMISSAO = 4)THEN BEGIN :REPRESENTANTE_ID = 0; :VALOR_COMISSAO_CORRETOR      = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR REPRESENTANTE E VENDEDOR
                IF(:TIPO_COMISSAO = 5)THEN BEGIN :CORRETOR_ID      = 0; :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
                --SE COMISSAO FOR PARA TODOS
                IF(:TIPO_COMISSAO = 6)THEN BEGIN :VALOR_COMISSAO_CORRETOR = CAST(((:COMISSAO_CORRETOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_REPRESENTANTE = CAST(((:COMISSAO_REPRESENTANTE/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); :VALOR_COMISSAO_VENDEDOR = CAST(((:COMISSAO_VENDEDOR/100.00) * :VALOR_TOTAL) AS NUMERIC(15,2)); END
        
                
                IF(:VALOR_COMISSAO_REPRESENTANTE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         :REPRESENTANTE_ID,
                         0,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :CONTROLE_PROVISAO,
                         1
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                    EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_REPRESENTANTE,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        :REPRESENTANTE_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END
                
                IF(:VALOR_COMISSAO_VENDEDOR > 0 AND :VENDEDOR_ID > 0 AND :GERAR_COMISSAO_VENDEDOR > 0 AND (:TIPO = 0 OR :TIPO = 2))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         0,
                         :VENDEDOR_ID,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_VENDEDOR,
                         :VALOR_COMISSAO_VENDEDOR,
                         :CONTROLE_PROVISAO,
                         2
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                     EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_VENDEDOR,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        0,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END

                
                IF(:VALOR_COMISSAO_CORRETOR > 0 AND :CORRETOR_ID > 0 AND :GERAR_COMISSAO_CORRETOR > 0 AND (:TIPO = 0 OR :TIPO = 3))THEN
                BEGIN
                    CONTROLE_PROVISAO = GEN_ID(GTBCAIXABANCO_PREVISAO,1);
                    UPDATE OR INSERT INTO TBCOMISSAO
                       (
                         ESTABELECIMENTO_ID,
                         REPRESENTANTE_ID,
                         CORRETOR_ID,
                         VENDEDOR_ID,
                         DATA_EMISSAO,
                         DATA_VENCIMENTO,
                         ORIGEM,
                         TABELA_ID,
                         VALOR,
                         SALDO,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         :CORRETOR_ID,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_CORRETOR,
                         :VALOR_COMISSAO_CORRETOR,
                         :CONTROLE_PROVISAO,
                         3
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);

                     EXECUTE PROCEDURE SPI_PROVISAO_COMISSAO (
                        :ESTABELECIMENTO_ID,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CAIXABANCO',:ESTABELECIMENTO_ID),
                        :DATA_EMISSAO,
                        :DATA_EMISSAO,
                        :VALOR_COMISSAO_CORRETOR,
                        :CONTROLE_PROVISAO,
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CCUSTO',:ESTABELECIMENTO_ID),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_CLASSIF_FINANCEIRA',:ESTABELECIMENTO_ID),
                        COALESCE((SELECT FIRST 1 C.FORNECEDOR_ID FROM TBCORRETOR C WHERE C.ID = :CORRETOR_ID),0),
                        FN_PARAMETRO('TBESTABELECIMENTO.COMISSAO_PAGAMENTO_FORMA',:ESTABELECIMENTO_ID));
                END
             END
          END
      END
END^

CREATE OR ALTER TRIGGER TTBREPRESENTANTE_B9U FOR TBREPRESENTANTE
ACTIVE BEFORE UPDATE POSITION 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

   HISTORICO = '';

   IF (OLD.COMISSAO <> NEW.COMISSAO) THEN
       BEGIN
       HISTORICO = :HISTORICO||' %COMISSAO:'||OLD.COMISSAO||'->'||NEW.COMISSAO;
       END
   IF (OLD.FORMA_COMISSAO <> NEW.FORMA_COMISSAO) THEN
       BEGIN
       HISTORICO = :HISTORICO||' FORM.COMIS:'||OLD.FORMA_COMISSAO||'->'||NEW.FORMA_COMISSAO;
       END
   IF (OLD.SUPERVISOR_ID <> NEW.SUPERVISOR_ID) THEN
       BEGIN
       HISTORICO = :HISTORICO||' SUPERV:'||OLD.SUPERVISOR_ID||'->'||NEW.SUPERVISOR_ID;
       END
   IF (OLD.GERAR_COMISSAO <> NEW.GERAR_COMISSAO) THEN
       BEGIN
       HISTORICO = :HISTORICO||' GERAR COMISSAO:'||OLD.GERAR_COMISSAO||'->'||NEW.GERAR_COMISSAO;
       END

   IF (:HISTORICO <> '') THEN
       BEGIN
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBEMPRESA', OLD.CODIGO,
      (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
      (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
       :HISTORICO);
       END
END^

CREATE OR ALTER TRIGGER TTBCORRETOR_B01U FOR TBCORRETOR
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

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

    IF (OLD.COMISSAO <> NEW.COMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' COMISSÃO:'||OLD.COMISSAO||'->'||NEW.COMISSAO;
    END
    
    IF (OLD.CODIGO <> NEW.CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' CODIGO:'||OLD.CODIGO||'->'||NEW.CODIGO;
    END  
    
    IF (OLD.GERAR_COMISSAO <> NEW.GERAR_COMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' GERAR COMISSAO:'||OLD.GERAR_COMISSAO||'->'||NEW.GERAR_COMISSAO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = ' REGISTRO ALTERADO: '||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCORRETOR', NEW.ID, HISTORICO);
    END

END^

CREATE OR ALTER TRIGGER TTBREPRESENTANTE_VENDEDOR_B03U FOR TBREPRESENTANTE_VENDEDOR
ACTIVE BEFORE UPDATE POSITION 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

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

    IF (OLD.COMISSAO <> NEW.COMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' COMISSÃO:'||OLD.COMISSAO||'->'||NEW.COMISSAO;
    END
    
    IF (OLD.REPRESENTANTE_CODIGO <> NEW.REPRESENTANTE_CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' REP:'||OLD.REPRESENTANTE_CODIGO||'->'||NEW.REPRESENTANTE_CODIGO;
    END  
    
    IF (OLD.GERAR_COMISSAO <> NEW.GERAR_COMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' GERAR COMISSAO:'||OLD.GERAR_COMISSAO||'->'||NEW.GERAR_COMISSAO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = ' REGISTRO ALTERADO: '||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBREPRESENTANTE_VENDEDOR', NEW.CODIGO, HISTORICO);
    END

END^

CREATE OR ALTER TRIGGER TTBCOMISSAO_B01U FOR TBCOMISSAO
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO       VARCHAR(1000);
DECLARE VARIABLE HISTORICO_SALDO VARCHAR(1000);
BEGIN
     HISTORICO       = '';
     HISTORICO_SALDO = '';
     IF((NEW.REPRESENTANTE_ID   <> OLD.REPRESENTANTE_ID
      OR OLD.DATA_VENCIMENTO    <> NEW.DATA_VENCIMENTO
      OR OLD.ORIGEM             <> NEW.ORIGEM
      OR OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID
      OR OLD.VALOR              <> NEW.VALOR
      OR OLD.DATA_EMISSAO       <> NEW.DATA_EMISSAO
      OR OLD.CORRETOR_ID        <> NEW.CORRETOR_ID
      OR OLD.VENDEDOR_ID        <> NEW.VENDEDOR_ID
      OR OLD.STATUS             <> NEW.STATUS)
      AND OLD.SALDO = 0)THEN
     BEGIN
        EXCEPTION "..." 'COMISSAO '||FN_LPAD(OLD.ID,5,0)||', DT.EMISSAO:'||FN_DATE(OLD.DATA_EMISSAO,'DD/MM/YYYY')||', VALOR:'||OLD.VALOR||' JA UTILIZADA, ALTERACAO CANCELADA!';
     END

     IF(NEW.ESTABELECIMENTO_ID <> OLD.ESTABELECIMENTO_ID)THEN
     BEGIN
          HISTORICO = HISTORICO||' ESTAB:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
     END

     IF(NEW.REPRESENTANTE_ID <> OLD.REPRESENTANTE_ID)THEN
     BEGIN
          HISTORICO = HISTORICO||' REP:'||OLD.REPRESENTANTE_ID||'->'||NEW.REPRESENTANTE_ID;
     END

     IF(NEW.VALOR <> OLD.VALOR)THEN
     BEGIN
          HISTORICO = HISTORICO||' VR:'||OLD.VALOR||'->'||NEW.VALOR;
     END

     IF(NEW.DATA_VENCIMENTO <> OLD.DATA_VENCIMENTO)THEN
     BEGIN
          HISTORICO = HISTORICO||' DT.VENC:'||FORMATDATE(OLD.DATA_VENCIMENTO)||'->'||FORMATDATE(NEW.DATA_VENCIMENTO);
     END

     IF(NEW.SALDO <> OLD.SALDO)THEN
     BEGIN
          IF(NEW.SALDO = 0)THEN
          BEGIN
             HISTORICO_SALDO = HISTORICO_SALDO||' COMISSAO BAIXADA.';
          END
          
          IF(NEW.SALDO = OLD.VALOR)THEN
          BEGIN
             HISTORICO_SALDO = HISTORICO_SALDO||' BAIXA DE COMISSAO DESFEITA.';
          END
     END

     IF(HISTORICO <> '') THEN
     BEGIN
          EXECUTE PROCEDURE SPI_HISTORICO('TBCOMISSAO', OLD.ID, HISTORICO);
     END

     IF(HISTORICO_SALDO <> '') THEN
     BEGIN
          EXECUTE PROCEDURE SPI_HISTORICO('TBCOMISSAO', OLD.ID, HISTORICO_SALDO);
     END

END^

CREATE OR ALTER TRIGGER TTBCOMISSAO_B01D FOR TBCOMISSAO
ACTIVE BEFORE DELETE POSITION 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
     HISTORICO = '';
     IF(OLD.ID > 0)THEN
     BEGIN
         HISTORICO = HISTORICO||'REG. EXCLUIDO.';
     END

     IF(HISTORICO <> '') THEN
     BEGIN
          EXECUTE PROCEDURE SPI_HISTORICO('TBCOMISSAO', OLD.ID, HISTORICO);
     END
END^

CREATE OR ALTER TRIGGER TTBCOMISSAO_B02D FOR TBCOMISSAO
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
   IF((COALESCE(OLD.SALDO,0) = 0 AND COALESCE(OLD.VALOR,0) > 0) OR (COALESCE(OLD.SALDO,0) < COALESCE(OLD.VALOR,0))) THEN
   BEGIN
      EXCEPTION "..." 'COMISSAO '||FN_LPAD(OLD.ID,5,0)||', DT.EMISSAO:'||FN_DATE(OLD.DATA_EMISSAO,'DD/MM/YYYY')||', VALOR:'||OLD.VALOR||' JA UTILIZADA, EXCLUSAO CANCELADA!';
   END

   IF(COALESCE(OLD.PREVISAO_ID, 0) > 0) THEN
   BEGIN
      DELETE FROM TBCAIXABANCO_PREVISAO A WHERE A.CONTROLE = OLD.PREVISAO_ID;
   END
END^

CREATE OR ALTER TRIGGER TTBNFS_B8U FOR TBNFS
ACTIVE BEFORE UPDATE POSITION 8
AS
DECLARE VARIABLE VENDEDOR_COMISSAO NUMERIC(15,2);
DECLARE VARIABLE CORRETOR_COMISSAO NUMERIC(15,2);
BEGIN

   IF(COALESCE(NEW.REPRESENTANTE_CODIGO,0)      <> COALESCE(OLD.REPRESENTANTE_CODIGO,0)      OR
      COALESCE(NEW.VENDEDOR_ID ,0)              <> COALESCE(OLD.VENDEDOR_ID ,0)              OR
      COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0.00) OR
      COALESCE(NEW.VENDEDOR_COMISSAO,0.00)      <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0.00) OR
      COALESCE(NEW.CORRETOR_ID,0.00)            <> COALESCE(OLD.CORRETOR_ID,0.00)) THEN
      BEGIN
        UPDATE TBNFS_PARCELAMENTO SET
            REPRESENTANTE_ID       = NEW.REPRESENTANTE_CODIGO,
            REPRESENTANTE_COMISSAO = NEW.REPRESENTANTE_COMISSAO,
            VENDEDOR_ID            = NEW.VENDEDOR_ID,
            VENDEDOR_COMISSAO      = NEW.VENDEDOR_COMISSAO
        WHERE NFS_CONTROLE = NEW.CONTROLE;

        IF(COALESCE(NEW.REPRESENTANTE_CODIGO,0)      <> COALESCE(OLD.REPRESENTANTE_CODIGO,0)
        OR COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0.00))THEN
        BEGIN
          IF(COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) > 0 AND COALESCE(NEW.REPRESENTANTE_CODIGO,0) > 0)THEN
          BEGIN
            EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.CONTROLE,'NFS',1);
          END
          ELSE
          BEGIN
               DELETE FROM TBCOMISSAO A
                 WHERE A.TABELA_ID        = NEW.CONTROLE
                   AND A.ORIGEM           = 'NFS'
                   AND A.REPRESENTANTE_ID > 0;
          END
        END

        IF(COALESCE(NEW.VENDEDOR_ID,0) <> COALESCE(OLD.VENDEDOR_ID,0))THEN
        BEGIN
           :VENDEDOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBREPRESENTANTE_VENDEDOR B WHERE B.CODIGO = NEW.VENDEDOR_ID AND B.GERAR_COMISSAO = 1),0);
           IF(:VENDEDOR_COMISSAO > 0)THEN
           BEGIN
               EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.CONTROLE,'NFS',2);
           END
           ELSE
           BEGIN
               DELETE FROM TBCOMISSAO A
                 WHERE A.TABELA_ID     = NEW.CONTROLE
                   AND A.ORIGEM        = 'NFS'
                   AND A.VENDEDOR_ID   > 0;
           END
        END

        IF(COALESCE(NEW.CORRETOR_ID,0) <> COALESCE(OLD.CORRETOR_ID,0))THEN
        BEGIN
           :CORRETOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBCORRETOR B WHERE B.ID = NEW.CORRETOR_ID AND B.GERAR_COMISSAO = 1),0);
           IF(:CORRETOR_COMISSAO > 0)THEN
           BEGIN
               EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.CONTROLE,'NFS',3);
           END
           ELSE
           BEGIN
               DELETE FROM TBCOMISSAO A
                 WHERE A.TABELA_ID     = NEW.CONTROLE
                   AND A.ORIGEM        = 'NFS'
                   AND A.CORRETOR_ID   > 0;
           END
        END

      END

END^


CREATE OR ALTER TRIGGER TTBPDV_CFE_B10U FOR TBPDV_CFE
ACTIVE BEFORE UPDATE POSITION 10
AS
DECLARE VARIABLE VENDEDOR_COMISSAO NUMERIC(15,2);
DECLARE VARIABLE CORRETOR_COMISSAO NUMERIC(15,2);
BEGIN
  IF(OLD.REPRESENTANTE_ID       <> NEW.REPRESENTANTE_ID
  OR OLD.REPRESENTANTE_COMISSAO <> NEW.REPRESENTANTE_COMISSAO
  OR OLD.ESTABELECIMENTO_ID     <> NEW.ESTABELECIMENTO_ID
  OR OLD.VENDEDOR_ID            <> NEW.VENDEDOR_ID
  OR OLD.CORRETOR_ID            <> NEW.CORRETOR_ID)THEN
  BEGIN
     --EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE');
    IF(COALESCE(NEW.REPRESENTANTE_ID,0)      <> COALESCE(OLD.REPRESENTANTE_ID,0)
    OR COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0.00))THEN
    BEGIN
      IF(COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) > 0 AND COALESCE(NEW.REPRESENTANTE_ID,0) > 0)THEN
      BEGIN
         EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE',1);
      END
      ELSE
      BEGIN
           DELETE FROM TBCOMISSAO A
             WHERE A.TABELA_ID        = NEW.ID
               AND A.ORIGEM           = 'CFE'
               AND A.REPRESENTANTE_ID > 0;
      END
    END

    IF(COALESCE(NEW.VENDEDOR_ID,0) <> COALESCE(OLD.VENDEDOR_ID,0))THEN
    BEGIN
       :VENDEDOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBREPRESENTANTE_VENDEDOR B WHERE B.CODIGO = NEW.VENDEDOR_ID AND B.GERAR_COMISSAO = 1),0);
       IF(:VENDEDOR_COMISSAO > 0)THEN
       BEGIN
           EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE',2);
       END
       ELSE
       BEGIN
           DELETE FROM TBCOMISSAO A
             WHERE A.TABELA_ID     = NEW.ID
               AND A.ORIGEM        = 'CFE'
               AND A.VENDEDOR_ID   > 0;
       END
    END

    IF(COALESCE(NEW.CORRETOR_ID,0) <> COALESCE(OLD.CORRETOR_ID,0))THEN
    BEGIN
       :CORRETOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBCORRETOR B WHERE B.ID = NEW.CORRETOR_ID AND B.GERAR_COMISSAO = 1),0);
       IF(:CORRETOR_COMISSAO > 0)THEN
       BEGIN
           EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE',3);
       END
       ELSE
       BEGIN
           DELETE FROM TBCOMISSAO A
             WHERE A.TABELA_ID     = NEW.ID
               AND A.ORIGEM        = 'CFE'
               AND A.CORRETOR_ID   > 0;
       END
    END
  END
END^

CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B11U FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE UPDATE POSITION 8
AS
DECLARE VARIABLE OPERACAO           NUMERIC(18,2);
DECLARE VARIABLE TIPO_LANC          VARCHAR(3);
DECLARE VARIABLE CONTA_CREDITO      VARCHAR(50);
DECLARE VARIABLE CONTA_DEBITO       VARCHAR(50);
DECLARE VARIABLE CCUSTO_OPERACAO    VARCHAR(10);
DECLARE VARIABLE DESC_CONTA_CREDITO VARCHAR(200);
DECLARE VARIABLE DESC_CONTA_DEBITO  VARCHAR(200);
DECLARE VARIABLE HISTORICO_CONTABIL VARCHAR(250);
DECLARE VARIABLE VALOR_SALDO        NUMERIC(15,8);
DECLARE VARIABLE MOVCONTMESTRE_ID   INTEGER;
DECLARE VARIABLE MOVCONTABIL_ID     INTEGER;
DECLARE VARIABLE CONTROLE           INTEGER;
DECLARE VARIABLE VENDEDOR_COMISSAO NUMERIC(15,2);
DECLARE VARIABLE CORRETOR_COMISSAO NUMERIC(15,2);
BEGIN
  IF(NEW.CONTA_RECEBER_BANCO <> OLD.CONTA_RECEBER_BANCO OR NEW.CONTA_RECEBER_OPERACAO <> OLD.CONTA_RECEBER_OPERACAO) THEN
  BEGIN
     UPDATE TBCAIXABANCO_LANCAMENTO_REG
        SET OPERACAO_CODIGO             = NEW.CONTA_RECEBER_OPERACAO,
            CAIXABANCO_CODIGO           = NEW.CONTA_RECEBER_BANCO
        WHERE ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
          AND EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
          AND DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
          AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
          AND NFS_CONTROLE              = OLD.NFS_CONTROLE
          AND OPERACAO_CODIGO           = OLD.CONTA_RECEBER_OPERACAO
          AND CAIXABANCO_CODIGO         = OLD.CONTA_RECEBER_BANCO
          AND REGISTRO_MESTRE           = 1 ;
  END

  IF(OLD.AVULSO = '1'
      AND ( COALESCE(NEW.REPRESENTANTE_ID,0)       <> COALESCE(OLD.REPRESENTANTE_ID,0)
         OR COALESCE(NEW.VENDEDOR_ID,0)            <> COALESCE(OLD.VENDEDOR_ID,0)
         OR COALESCE(NEW.REPRESENTANTE_COMISSAO,0) <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0)
         OR COALESCE(NEW.CORRETOR_ID,0)            <> COALESCE(OLD.CORRETOR_ID,0)))
        THEN
        BEGIN
            IF(COALESCE(NEW.REPRESENTANTE_ID,0)      <> COALESCE(OLD.REPRESENTANTE_ID,0)
            OR COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) <> COALESCE(OLD.REPRESENTANTE_COMISSAO,0.00))THEN
            BEGIN
              IF(COALESCE(NEW.REPRESENTANTE_COMISSAO,0.00) > 0 AND COALESCE(NEW.REPRESENTANTE_ID,0) > 0)THEN
              BEGIN
                EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.NFS_CONTROLE,'AVU',1);
              END
              ELSE
              BEGIN
                   DELETE FROM TBCOMISSAO A
                     WHERE A.TABELA_ID        = NEW.NFS_CONTROLE
                       AND A.ORIGEM           = 'AVU'
                       AND A.REPRESENTANTE_ID > 0;
              END
            END
    
            IF(COALESCE(NEW.VENDEDOR_ID,0) <> COALESCE(OLD.VENDEDOR_ID,0))THEN
            BEGIN
               :VENDEDOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBREPRESENTANTE_VENDEDOR B WHERE B.CODIGO = NEW.VENDEDOR_ID AND B.GERAR_COMISSAO = 1),0);
               IF(:VENDEDOR_COMISSAO > 0)THEN
               BEGIN
                   EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.NFS_CONTROLE,'AVU',2);
               END
               ELSE
               BEGIN
                   DELETE FROM TBCOMISSAO A
                     WHERE A.TABELA_ID     = NEW.NFS_CONTROLE
                       AND A.ORIGEM        = 'AVU'
                       AND A.VENDEDOR_ID   > 0;
               END
            END
    
            IF(COALESCE(NEW.CORRETOR_ID,0) <> COALESCE(OLD.CORRETOR_ID,0))THEN
            BEGIN
               :CORRETOR_COMISSAO = COALESCE((SELECT FIRST 1 B.COMISSAO FROM TBCORRETOR B WHERE B.ID = NEW.CORRETOR_ID AND B.GERAR_COMISSAO = 1),0);
               IF(:CORRETOR_COMISSAO > 0)THEN
               BEGIN
                   EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.NFS_CONTROLE,'AVU',3);
               END
               ELSE
               BEGIN
                   DELETE FROM TBCOMISSAO A
                     WHERE A.TABELA_ID     = NEW.NFS_CONTROLE
                       AND A.ORIGEM        = 'AVU'
                       AND A.CORRETOR_ID   > 0;
               END
            END
    
        END

  IF((OLD.PERCENTUAL_TAXA <> NEW.PERCENTUAL_TAXA AND NEW.PERCENTUAL_TAXA > 0) OR (OLD.PERCENTUAL_TAXA IS NULL AND NEW.PERCENTUAL_TAXA > 0)) THEN
  BEGIN
     MOVCONTABIL_ID      = 0;
     MOVCONTMESTRE_ID    = 0;
     CONTROLE            = 0;
     OPERACAO            = 0;
     DESC_CONTA_CREDITO  = '';
     DESC_CONTA_DEBITO   = '';

     /* CONSULTAR OPERAÇÃO CADASTRADA PARA O ADQUIRENTE */
     IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
     BEGIN
        FOR
         
            SELECT
             X.OPERACAO_TAXA_MFE,
             X.HISTORICO_CONTABIL,
             X.CONTA_CREDITO,
             X.CONTA_DEBITO,
             COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
             COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO,
             X.CCUSTO
             FROM
            (SELECT FIRST 1
                E.OPERACAO_TAXA_MFE,
                F.HISTORICO_CONTABIL,
                CASE
                WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_CREDITO
                END AS CONTA_CREDITO,
                CASE
                WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_DEBITO
                END AS CONTA_DEBITO,
                F.CCUSTO
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                    INNER JOIN TBNFS_PARCELAMENTO       B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                    LEFT  JOIN TBPAGAMENTO_FORMA        C ON C.CODIGO                     = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' OR C.NFE_TIPPAG = '04')
                    LEFT  JOIN TBCARTAO_BANDEIRA        D ON D.DESCRICAO                  = A.BANDEIRA_CARTAO
                    LEFT  JOIN TBPDV_ADQUIRENTE         E ON E.ADQUIRENTE_ID              = A.ADQUIRENTE_ID
                    LEFT  JOIN TBCONTA_RECEBER_OPERACAO F ON F.CODIGO                     = E.OPERACAO_TAXA_MFE
                WHERE C.EMPRESA_ID > 0
                AND A.ID         = NEW.PDV_CFE_FORMA_PAGAMENTO_ID
                AND B.CONTROLE   = NEW.CONTROLE) X

                LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO

                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO, :CCUSTO_OPERACAO DO
                BEGIN

                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF( CHAR_LENGTH(TRIM(:CCUSTO_OPERACAO)) = 0) THEN
                    BEGIN
                        EXCEPTION "..." 'CENTRO DE CUSTO DA OPERACAO DE TAXA DE CARTAO : '||:OPERACAO||' NAO ENCONTRADO, OPERACAO CANCELADA!';
                    END

                   FOR
                     SELECT FIRST 1 COALESCE(A.MOVCONTABIL_ID,0), COALESCE(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          AND A.REGISTRO_MESTRE           = 1
                          AND A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --EXCEPTION "..."' MOV.CONT: '||:MOVCONTABIL_ID||', MOV.MESTRE: '||:MOVCONTMESTRE_ID||' BCO.ID:'||:CONTROLE;
                          END
                     
                END

     END
     ELSE
     BEGIN
        FOR SELECT
                 X.OPERACAO_TAXA,
                 X.HISTORICO_CONTABIL,
                 X.CONTA_CREDITO,
                 X.CONTA_DEBITO,
                 COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
                 COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO,
                 X.CCUSTO
                 FROM
                (SELECT FIRST 1
                    E.OPERACAO_TAXA,
                    F.HISTORICO_CONTABIL,
                    CASE
                    WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_CREDITO
                    END AS CONTA_CREDITO,
                    CASE
                    WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_DEBITO
                    END AS CONTA_DEBITO,
                    F.CCUSTO
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' OR B.NFE_TIPPAG = '04')
                    LEFT JOIN TBCONTA_RECEBER_COBRANCA  C ON C.CODIGO     = A.CONTA_RECEBER_COBRANCA
                    LEFT JOIN TBCARTAO_BANDEIRA         D ON D.NFE_TBAND  = C.NFE_TBAND
                    LEFT JOIN TBPDV_ADQUIRENTE          E ON E.EMPRESA_ID = B.EMPRESA_ID
                    LEFT  JOIN TBCONTA_RECEBER_OPERACAO F ON F.CODIGO     = E.OPERACAO_TAXA
                    WHERE B.EMPRESA_ID > 0 AND A.AVULSO = NEW.AVULSO
                    AND (A.NFS_CONTROLE = NEW.NFS_CONTROLE)
                    AND A.CONTROLE      = NEW.CONTROLE) X
                    LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                    LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO
                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO, :CCUSTO_OPERACAO DO
                BEGIN
                
                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF( CHAR_LENGTH(TRIM(:CCUSTO_OPERACAO)) = 0) THEN
                    BEGIN
                        EXCEPTION "..." 'CENTRO DE CUSTO DA OPERACAO DE TAXA DE CARTAO : '||:OPERACAO||' NAO ENCONTRADO, OPERACAO CANCELADA!';
                    END
                     
                   FOR
                     SELECT FIRST 1 COALESCE(A.MOVCONTABIL_ID,0), COALESCE(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          AND A.REGISTRO_MESTRE           = 1
                          AND A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --EXCEPTION "..."' MOV.CONT: '||:MOVCONTABIL_ID||', MOV.MESTRE: '||:MOVCONTMESTRE_ID||' BCO.ID:'||:CONTROLE;
                          END
                     
                END
    END

    IF(CHAR_LENGTH(COALESCE(NEW.CCUSTO,'')) > 0)THEN
    BEGIN
       :CCUSTO_OPERACAO = COALESCE(NEW.CCUSTO,'');
    END

    IF(:OPERACAO = 0)THEN
    BEGIN
        EXCEPTION "..." 'OPERAÇÃO DE TAXA DO ADQUIRENTE NÃO ENCONTRADA!, OPERAÇÃO CANCELADA.';
    END

    IF(CHAR_LENGTH(TRIM(:HISTORICO_CONTABIL)) > 0)THEN
    BEGIN
      :HISTORICO_CONTABIL = REPLACE(:HISTORICO_CONTABIL,'#NUMERO_NOTAFISCAL#', FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0));
    END

    /* AO ATUALIZAR O CAMPO DO PERCENTUAL DA TAXA DO ADQUIRENTE GERAR LANÇAMENTO DE JUROS */
    IF(CONTROLE = 0) THEN
    BEGIN
       CONTROLE  = GEN_ID(GTBCAIXABANCO_REGISTRO,1);
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 AND :MOVCONTMESTRE_ID = 0)THEN
    BEGIN
        MOVCONTMESTRE_ID = GEN_ID(GTBMOVCONTMESTRE,1);

        INSERT INTO TBMOVCONTMESTRE(ID, CODESTABELECIMENTO, DATA)
          VALUES (:MOVCONTMESTRE_ID, NEW.ESTABELECIMENTO_CODIGO, NEW.DATA_EMISSAO);

        MOVCONTABIL_ID     = GEN_ID(TBMOVCONT_ID_GEN,1);
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (:MOVCONTABIL_ID, NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'C', :CONTA_CREDITO, NEW.DATA_EMISSAO,
            :CONTROLE, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
            
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (GEN_ID(TBMOVCONT_ID_GEN,1), NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'D', :CONTA_DEBITO, NEW.DATA_EMISSAO,
            :CONTROLE, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 AND :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        UPDATE TBMOVCONTMESTRE
          SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
              DATA = NEW.DATA_EMISSAO
          WHERE ID = :MOVCONTMESTRE_ID;

        UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     =  :CONTA_CREDITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID = :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;

         UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     = :CONTA_DEBITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID <> :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) < 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) < 3 AND :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        DELETE FROM TBMOVCONTMESTRE WHERE ID        = :MOVCONTMESTRE_ID;
        DELETE FROM TBMOVCONTABIL   WHERE IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    IF(NEW.AVULSO = 1)THEN
    BEGIN
       TIPO_LANC = 'AVU';
    END
    ELSE
    BEGIN
       IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
       BEGIN
          TIPO_LANC = 'CFE';
       END
       ELSE
       BEGIN
          TIPO_LANC = 'NFS';
       END
    END

    FOR SELECT FIRST 1 CAST(COALESCE(A.VALOR_SALDO,0) AS NUMERIC(15,2)) VALOR_SALDO
        FROM TBNFS_PARCELAMENTO A
        WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
        AND A.CONTROLE = NEW.CONTROLE INTO :VALOR_SALDO DO
        BEGIN
            IF(:VALOR_SALDO > 0) THEN
            BEGIN
                --EXCEPTION "..." 'ATENÇÃO SALDO DA PARCELA('||:VALOR_SALDO||'), OPERACAO CANCELADA!';
                UPDATE OR INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                    CONTROLE, 
                    ESTABELECIMENTO_CODIGO,
                    EMPRESA_CODIGO,
                    NFS_PARCELAMENTO_CONTROLE,
                    OPERACAO_CODIGO,
                    DOCUMENTO_NUMERO,
                    PARCELA,
                    REGISTRO_MESTRE,
                    DATA,
                    VALOR,
                    VALOR_SALDO,
                    VALOR_TOTAL,
                    TIPO,
                    SERIE,
                    NFE_CONTROLE,
                    NFS_CONTROLE,
                    CODORIGEM,
                    CONTA_DEBITO,
                    CONTA_CREDITO,
                    MOVCONTABIL_ID,
                    MOVCONTMESTRE_ID,
                    TARIFA_ADQUIRENTE,
                    HISTORICO,
                    CCUSTO
                    )
                    VALUES
                    (
                    :CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.EMPRESA_CODIGO,
                    NEW.CONTROLE,
                    :OPERACAO,
                    NEW.NUMERO_NOTAFISCAL,
                    NEW.PARCELA,
                    '1',
                    NEW.DATA_EMISSAO,
                    NEW.VALOR_TAXA,
                    NEW.VALOR_SALDO,
                    NEW.VALOR_TAXA,
                    'C',
                    NEW.SERIE,
                    0,
                    NEW.NFS_CONTROLE,
                    'CRE',
                    :CONTA_DEBITO,
                    :CONTA_CREDITO,
                    :MOVCONTABIL_ID,
                    :MOVCONTMESTRE_ID,
                    1,
                    :HISTORICO_CONTABIL,
                    :CCUSTO_OPERACAO
                    )
                MATCHING(CONTROLE,TARIFA_ADQUIRENTE);
        
        
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(NEW.NFS_CONTROLE,NEW.CONTROLE);
               

                NEW.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = NEW.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = NEW.CONTROLE),0);
        
--                UPDATE TBNFS_PARCELAMENTO A SET A.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
--                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
--                    WHERE B.NFS_CONTROLE = A.NFS_CONTROLE
--                    AND B.TIPO IN ('D','C')
--                    AND B.NFS_PARCELAMENTO_CONTROLE = A.CONTROLE),0)
--                    WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
--                    AND A.CONTROLE = NEW.CONTROLE;
        

                IF(NEW.VALOR_SALDO < 0) THEN
                BEGIN
                     EXCEPTION "..." 'ATENÇÃO SALDO DA PARCELA NEGATIVO, OPERACAO CANCELADA!';
                END

            END
        END

  END
END^

UPDATE TBMENU SET DESCRICAO = 'REGISTRO DE PROVISIONAMENTO DE COMISSOES' WHERE CONTROLE = 20430 AND GRUPO = 'FIN'^

SET TERM ; ^

