ALTER TABLE TBCOMISSAO
ADD PERCENTUAL_ORIGINAL NUMERIC(15,2)
DEFAULT 0^

ALTER TABLE TBCOMISSAO
ADD PERCENTUAL_COMISSAO NUMERIC(15,2)
DEFAULT 0^

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 AND COALESCE((SELECT FIRST 1 P.PARCELAS_SEM_SALDO FROM TBPAGAMENTO_FORMA P WHERE P.CODIGO = B.PAGAMENTO_FORMA),'0') = '0'
                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,
                                 PERCENTUAL_ORIGINAL,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 :REPRESENTANTE_ID,
                                 0,
                                 0,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :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,
                                 PERCENTUAL_ORIGINAL,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 0,
                                 0,
                                 :VENDEDOR_ID,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_VENDEDOR,
                                 :VALOR_COMISSAO_VENDEDOR,
                                 :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,
                                 PERCENTUAL_ORIGINAL,
                                 PREVISAO_ID,
                                 TIPO
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 0,
                                 :CORRETOR_ID,
                                 0,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_CORRETOR,
                                 :VALOR_COMISSAO_CORRETOR,
                                 :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 AND COALESCE((SELECT FIRST 1 P.PARCELAS_SEM_SALDO FROM TBPAGAMENTO_FORMA P WHERE P.CODIGO = B.PAGAMENTO_FORMA),'0') = '0'
           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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         :REPRESENTANTE_ID,
                         0,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         0,
                         :VENDEDOR_ID,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_VENDEDOR,
                         :VALOR_COMISSAO_VENDEDOR,
                         :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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         :CORRETOR_ID,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_CORRETOR,
                         :VALOR_COMISSAO_CORRETOR,
                         :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 COALESCE((SELECT FIRST 1 P.PARCELAS_SEM_SALDO FROM TBPAGAMENTO_FORMA P WHERE P.CODIGO = W.PAGAMENTO_FORMA),'0') = '0'
            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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         :REPRESENTANTE_ID,
                         0,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         0,
                         :VENDEDOR_ID,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_VENDEDOR,
                         :VALOR_COMISSAO_VENDEDOR,
                         :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,
                         PERCENTUAL_ORIGINAL,
                         PREVISAO_ID,
                         TIPO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         0,
                         :CORRETOR_ID,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_CORRETOR,
                         :VALOR_COMISSAO_CORRETOR,
                         :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^