SET TERM ^ ;

CREATE OR ALTER procedure SPI_GERAR_COMISSAO2 (
    TABELA_ID integer,
    ORIGEM varchar(3),
    TIPO integer = 0,
    GERACAO_FORCADA 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,5);
declare variable COMISSAO_REPRESENTANTE numeric(15,5);
declare variable COMISSAO_VENDEDOR numeric(15,5);
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;
declare variable TIPO_COMISSAO_PDV_CFE integer;
declare variable VALOR_COMISSAO_CHEQUE numeric(15,5);
declare variable VALOR_COMISSAO_PARCELAS numeric(15,5);
declare variable VALOR_COMISSAO_PREPEDIDO numeric(15,5);
declare variable PERCENTUAL_COMISSAO_CHEQUES numeric(15,5);
declare variable PERCENTUAL_COMISSAO_PREPEDIDO numeric(15,5);
declare variable QUANTIDADE_PARCELAS_CHEQUES integer;
declare variable PERCENTUAL_COMISSAO_PARCELAS numeric(15,5);
declare variable TEXTO_OBSERVACAO_PARCELAS varchar(200);
declare variable NUMERO_DOCUMENTO_PARCELA varchar(50);
declare variable PARCELA_AVULSA char(1);
declare variable COMISSAO_FORCADA integer = 0;
declare variable PARCELA_FORCADA integer;
BEGIN
          IF(:ORIGEM = 'CFE')THEN
          BEGIN
                FOR
                 SELECT A.ID,
                    A.ESTABELECIMENTO_ID,
                    A.REPRESENTANTE_ID,
                    0 AS COMISSAO_REPRESENTANTE,
                    COALESCE((SELECT FIRST 1 REP.gerar_comissao FROM TBREPRESENTANTE REP WHERE REP.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((SELECT SUM(B.VALOR) FROM TBPDV_CFE_FORMA_PAGAMENTO C, TBNFS_PARCELAMENTO B, TBPAGAMENTO_FORMA PF WHERE C.PDV_CFE_ID = A.ID AND B.PDV_CFE_FORMA_PAGAMENTO_ID = C.ID
                    AND COALESCE(PF.TIPO_CALCULO_COMISSAO,0) = 1 AND PF.CODIGO = B.pagamento_forma AND COALESCE(PF.PARCELAS_SEM_SALDO,'0') = '0'),0.00) AS VALOR_TOTAL
        
                    FROM (
                      SELECT A.*
                            FROM (
                              SELECT A.*,
                                 COALESCE((SELECT FIRST 1 ITEM.conferencia_id FROM TBPDV_CFE_ITEM ITEM WHERE ITEM.conferencia_item_id > 0 AND ITEM.pdv_cfe_id = a.id),0) AS PRE_PEDIDO_ID
                                FROM TBPDV_CFE A
                                WHERE A.ID = :TABELA_ID
                            ) A
                      WHERE A.PRE_PEDIDO_ID > 0
                    ) A
                    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_VENDEDOR      = 0;
                            :VALOR_COMISSAO_CORRETOR      = 0;
                            :VALOR_COMISSAO_PREPEDIDO     = 0;
                            :VALOR_COMISSAO_REPRESENTANTE = 0;
                            
                              FOR
                                SELECT
                                  iif(B.representante_comissao > 0,
                                    (cast(B.representante_comissao as double precision)/cast(100.00 as double precision))
                                    *COALESCE(B.VALOR,0.00000),0.00000) AS VALOR_COMISSAO_PARCELAS

                                  FROM TBPDV_CFE_FORMA_PAGAMENTO C, TBNFS_PARCELAMENTO B, TBPAGAMENTO_FORMA PF
                                  WHERE C.PDV_CFE_ID = :TABELA_ID
                                  AND B.PDV_CFE_FORMA_PAGAMENTO_ID = C.ID
                                  --AND PF.nfe_tippag NOT IN ('02','15','80','16')
                                  AND COALESCE(PF.TIPO_CALCULO_COMISSAO,0) = 1
                                  AND PF.CODIGO = B.pagamento_forma
                                  AND COALESCE(PF.PARCELAS_SEM_SALDO,'0') = '0'
                                  INTO :VALOR_COMISSAO_PARCELAS DO
                                  BEGIN
                                     :VALOR_COMISSAO_PREPEDIDO = :VALOR_COMISSAO_PREPEDIDO + :VALOR_COMISSAO_PARCELAS;
                                  END
    
                              IF(:VALOR_COMISSAO_PREPEDIDO > 0)THEN
                              BEGIN
                                 :PERCENTUAL_COMISSAO_PREPEDIDO = (CAST(:VALOR_COMISSAO_PREPEDIDO AS DOUBLE PRECISION)/CAST(:VALOR_TOTAL AS DOUBLE PRECISION))*CAST(100.00000 AS DOUBLE PRECISION);
                              END
                            --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_PREPEDIDO > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                            BEGIN

                                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_PREPEDIDO,
                                     :VALOR_COMISSAO_PREPEDIDO,
                                     :PERCENTUAL_COMISSAO_PREPEDIDO,
                                     0,
                                     1
                                   )
                                 MATCHING(ORIGEM, TABELA_ID, TIPO);

                            END
                         END
                    END
            END

            IF(:ORIGEM = 'CHE')THEN
            BEGIN
             :COMISSAO_FORCADA = COALESCE(IIF((SELECT FIRST 1 A.ID FROM TBCOMISSAO A WHERE A.TABELA_ID = :tabela_id AND A.origem = 'CHE' AND A.geracao_forcada = 1) > 0,1,0),0);
             IF(:COMISSAO_FORCADA = 0)THEN
             BEGIN
              -- exception "..." 'geracao forcada: '||:GERACAO_FORCADA;
              /* CHEQUES */
              FOR
              SELECT W.ID,
                  W.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.COMISSAO_REPRESENTANTE,
                  0 AS VENDEDOR_ID,
                  0 AS COMISSAO_VENDEDOR,
                  0 AS GERAR_COMISSAO_VENDEDOR,
                  0 AS CORRETOR_ID,
                  0 AS COMISSAO_CORRETOR,
                  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_PARCELAS,0.00) AS NUMERIC(15,2)) AS VALOR_TOTAL
          
                  FROM(
                      SELECT
                          W.*,
                          COALESCE((SELECT FIRST 1 A.REPRESENTANTE_ID
                          FROM tbpdv_cfe a, TBPDV_CFE_ITEM b, TBPDV_CFE_FORMA_PAGAMENTO C,
                          TBCHEQUE_ITEM CHEQUE, TBNFS_PARCELAMENTO PARC, TBPAGAMENTO_FORMA PAG
                          WHERE A.ID           = B.PDV_CFE_ID
                          AND A.ID             = C.PDV_CFE_ID
                          AND B.PDV_CFE_ID     = C.PDV_CFE_ID
                          AND C.ID             = PARC.pdv_cfe_forma_pagamento_id
                          AND PARC.CONTROLE    = CHEQUE.documento_id
                          AND CHEQUE.CHEQUE_ID = W.ID 
                          AND PAG.CODIGO       = PARC.pagamento_forma 
                          AND ((COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2 AND W.SITUACAO = 1)
                            OR (:GERACAO_FORCADA = 1 AND W.SITUACAO IN (3) AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) <> 0))
                          AND PAG.nfe_tippag IN ('02')
                          AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2
                          AND B.conferencia_item_id > 0),0.00) REPRESENTANTE_ID,
    
                          0 AS COMISSAO_REPRESENTANTE,

                          COALESCE((SELECT FIRST 1 LANC.DATA_LANCAMENTO FROM TBCAIXABANCO_LANCAMENTO LANC WHERE LANC.cheque_id = W.ID AND LANC.tipo = 'L'),CURRENT_DATE) AS DATA_EMISSAO,
    
                          COALESCE((
                              SELECT SUM(z.VALOR) AS VALOR
                              FROM
                              (SELECT
                              COALESCE(cheque.VALOR,0.00) AS VALOR
                              FROM TBNFS_PARCELAMENTO PARC, TBCHEQUE_ITEM CHEQUE, TBPDV_CFE_FORMA_PAGAMENTO C, tbpdv_cfe a, TBPAGAMENTO_FORMA PAG
                              WHERE CHEQUE.cheque_id = W.ID
                              AND PARC.CONTROLE    = CHEQUE.documento_id
                              AND C.ID             = PARC.pdv_cfe_forma_pagamento_id
                              AND A.ID             = C.PDV_CFE_ID
                              AND C.ID             = PARC.pdv_cfe_forma_pagamento_id
                              AND PAG.CODIGO       = PARC.pagamento_forma
                              AND ((COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2 AND W.SITUACAO = 1)
                                OR (:GERACAO_FORCADA = 1 AND W.SITUACAO IN (3) AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) <> 0))
                              AND PAG.nfe_tippag IN ('02')
                              AND (SELECT FIRST 1 ITEM.ID FROM TBPDV_CFE_ITEM ITEM WHERE ITEM.PDV_CFE_ID = A.ID AND ITEM.PDV_CFE_ID = C.pdv_cfe_id AND ITEM.conferencia_id > 0) > 0) Z
    
                          ),0.00) AS VALOR_PARCELAS
                          FROM TBCHEQUE W
                          WHERE W.ID = :TABELA_ID
                          AND (W.SITUACAO = 1 or (:GERACAO_FORCADA = 1 AND W.SITUACAO IN (3)))
                  ) W
                  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_CHEQUE        = 0;
                      :VALOR_COMISSAO_VENDEDOR      = 0;
                      :VALOR_COMISSAO_CORRETOR      = 0;
                      :VALOR_COMISSAO_REPRESENTANTE = 0;
                      :QUANTIDADE_PARCELAS_CHEQUES  = 0;
                      :TEXTO_OBSERVACAO_PARCELAS    = '';
                      FOR
                        SELECT
                          iif(parc.representante_comissao > 0,
                            (cast(parc.representante_comissao as double precision)/cast(100.00 as double precision))
                            *COALESCE(CHEQUE.VALOR,0.00000),0.00000) AS VALOR_COMISSAO_PARCELAS,
                            IIF(PARC.representante_comissao > 0, PARC.REPRESENTANTE_COMISSAO,0.00000) AS PERCENTUAL_COMISSAO_PARCELAS,
                            FN_LPAD(PARC.NUMERO_NOTAFISCAL,5,0)||'/'||FN_LPAD(PARC.parcela,2,0) AS NUMERO_DOCUMENTO_PARCELA

                          FROM TBNFS_PARCELAMENTO PARC, TBCHEQUE_ITEM CHEQUE, TBPDV_CFE_FORMA_PAGAMENTO C, tbpdv_cfe a, TBPAGAMENTO_FORMA PAG
                          WHERE CHEQUE.cheque_id = :TABELA_ID
                          AND PARC.CONTROLE    = CHEQUE.documento_id
                          AND C.ID             = PARC.pdv_cfe_forma_pagamento_id
                          AND A.ID             = C.PDV_CFE_ID
                          AND C.ID             = PARC.pdv_cfe_forma_pagamento_id
                          AND PAG.CODIGO       = PARC.pagamento_forma
                          AND PAG.nfe_tippag IN ('02')
                          AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2
                          AND (SELECT FIRST 1 ITEM.ID FROM TBPDV_CFE_ITEM ITEM WHERE ITEM.PDV_CFE_ID = A.ID AND ITEM.PDV_CFE_ID = C.pdv_cfe_id AND ITEM.conferencia_id > 0) > 0
                          INTO :VALOR_COMISSAO_PARCELAS,:PERCENTUAL_COMISSAO_PARCELAS,:NUMERO_DOCUMENTO_PARCELA DO
                          BEGIN
                             :VALOR_COMISSAO_CHEQUE        = :VALOR_COMISSAO_CHEQUE + :VALOR_COMISSAO_PARCELAS;
                             :QUANTIDADE_PARCELAS_CHEQUES  = QUANTIDADE_PARCELAS_CHEQUES + 1;
                             --

                             :TEXTO_OBSERVACAO_PARCELAS    = IIF(:TEXTO_OBSERVACAO_PARCELAS = '',:NUMERO_DOCUMENTO_PARCELA,:TEXTO_OBSERVACAO_PARCELAS||','||:NUMERO_DOCUMENTO_PARCELA);
                          END

                      IF(:VALOR_COMISSAO_CHEQUE > 0 AND :quantidade_parcelas_cheques > 1)THEN
                      BEGIN
                         :PERCENTUAL_COMISSAO_CHEQUES = (CAST(:VALOR_COMISSAO_CHEQUE AS DOUBLE PRECISION)/CAST(:VALOR_TOTAL AS DOUBLE PRECISION))*CAST(100 AS DOUBLE PRECISION);
                         --EXCEPTION "..." ' COM.PARCELA1:'||:PERCENTUAL_COMISSAO_PARCELAS;
                      END

                      IF(:VALOR_COMISSAO_CHEQUE > 0 AND :quantidade_parcelas_cheques = 1)THEN
                      BEGIN
                         :PERCENTUAL_COMISSAO_CHEQUES = :PERCENTUAL_COMISSAO_PARCELAS;
                         --EXCEPTION "..." ' COM.PARCELA2:'||:PERCENTUAL_COMISSAO_PARCELAS;
                      END

                      --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_CHEQUE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                      BEGIN
                          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,
                              OBSERVACAO,
                              GERACAO_FORCADA
                              )
                          VALUES
                            (
                              :ESTABELECIMENTO_ID,
                              :REPRESENTANTE_ID,
                              0,
                              0,
                              :DATA_EMISSAO,
                              :DATA_VENCIMENTO,
                              :ORIGEM,
                              :TABELA_ID,
                              :VALOR_COMISSAO_CHEQUE,
                              :VALOR_COMISSAO_CHEQUE,
                              :PERCENTUAL_COMISSAO_CHEQUES,
                              0,
                              1,
                              :TEXTO_OBSERVACAO_PARCELAS,
                              :GERACAO_FORCADA
                            )
                          MATCHING(ORIGEM, TABELA_ID, TIPO);

                      END
                    END

                  END
                END
          END

      
          IF(:ORIGEM = 'LAN')THEN
          BEGIN

             :PARCELA_FORCADA = COALESCE((SELECT FIRST 1 1
                      FROM TBCAIXABANCO_LANCAMENTO_REG W, TBNFS_PARCELAMENTO PARC, TBCOMISSAO C
                        WHERE W.CONTROLE                    = :TABELA_ID
                        AND W.NFS_CONTROLE                  = PARC.NFS_CONTROLE
                        AND W.nfs_parcelamento_controle     = PARC.CONTROLE
                        AND W.TIPO                          = 'C'
                        AND C.tabela_id                     = PARC.CONTROLE
                        AND C.ORIGEM                        = :ORIGEM),0);

             :COMISSAO_FORCADA = COALESCE((SELECT FIRST 1 C.ID FROM TBCOMISSAO C WHERE C.tabela_id = :TABELA_ID AND C.origem = :ORIGEM AND C.geracao_forcada = 1),0);

             IF(:GERACAO_FORCADA = 1 AND :COMISSAO_FORCADA = 0)THEN
             BEGIN
                /* LAN??AMENTOS COMISSAO POR LIQUIDEZ PARA PARCELAS AVULSAS */
                 FOR
                    SELECT PARC.CONTROLE AS ID,
                        PARC.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                        PARC.REPRESENTANTE_ID,
                        COALESCE((SELECT FIRST 1 R.GERAR_COMISSAO FROM TBREPRESENTANTE R WHERE R.CODIGO = PARC.REPRESENTANTE_ID), 0) AS GERAR_COMISSAO_REPRESENTANTE,
                        PARC.representante_comissao,
                        0 AS VENDEDOR_ID,
                        0 AS COMISSAO_VENDEDOR,
                        0 AS GERAR_COMISSAO_VENDEDOR,
                        0 AS CORRETOR_ID,
                        0 AS COMISSAO_CORRETOR,
                        0 AS GERAR_COMISSAO_CORRETOR,
                        PARC.DATA_EMISSAO,
                        DATEADD(FN_PARAMETRO('SISTEMA.PRAZO_VOUCHER') DAY TO PARC.DATA_EMISSAO) AS DATA_VENCIMENTO,
                        CAST(FN_PARAMETRO('SISTEMA.TIPO_COMISSAO') AS INTEGER) AS TIPO_COMISSAO,
                        CAST(COALESCE(PARC.VALOR,0.00) AS NUMERIC(15,2)) AS VALOR_TOTAL,
                        'PARCELA: '||FN_LPAD(PARC.parcela,2,0) AS NUMERO_DOCUMENTO_PARCELA
                    
                        FROM TBNFS_PARCELAMENTO PARC, TBPAGAMENTO_FORMA PAG
                        WHERE PARC.CONTROLE                 = :TABELA_ID
                        AND PAG.codigo                      = PARC.pagamento_forma
                        AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2
                    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,
                         :NUMERO_DOCUMENTO_PARCELA
                    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
                        --exception "..." 'vr.com:'||:VALOR_COMISSAO_REPRESENTANTE||', ger.com:'||:GERAR_COMISSAO_REPRESENTANTE||', TIPO: '||:TIPO;
                        IF(:VALOR_COMISSAO_REPRESENTANTE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                        BEGIN
                            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,
                                 OBSERVACAO,
                                 GERACAO_FORCADA
                                )
                             VALUES
                               (
                                 :ESTABELECIMENTO_ID,
                                 :REPRESENTANTE_ID,
                                 0,
                                 0,
                                 :DATA_EMISSAO,
                                 :DATA_VENCIMENTO,
                                 :ORIGEM,
                                 :TABELA_ID,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :VALOR_COMISSAO_REPRESENTANTE,
                                 :COMISSAO_REPRESENTANTE,
                                 0,
                                 1,
                                 :NUMERO_DOCUMENTO_PARCELA,
                                 :GERACAO_FORCADA
                               )
                             MATCHING(ORIGEM, TABELA_ID, TIPO);
    
                        END
                     END
                  END
             END

             IF(:PARCELA_FORCADA = 0 AND :GERACAO_FORCADA <> 1 AND :COMISSAO_FORCADA = 0)THEN
             BEGIN
    
                 :PARCELA_AVULSA = COALESCE((SELECT FIRST 1 A.AVULSO
                                        FROM TBNFS_PARCELAMENTO A, TBCAIXABANCO_LANCAMENTO_REG B
                                        WHERE B.CONTROLE = :TABELA_ID
                                          AND A.AVULSO = '1'
                                          AND B.nfs_parcelamento_controle = A.CONTROLE
                                          AND B.NFS_CONTROLE = A.NFS_CONTROLE),'0');
    
                  IF(:PARCELA_AVULSA = 1) THEN
                  BEGIN
                     /* LAN??AMENTOS COMISSAO POR LIQUIDEZ PARA PARCELAS AVULSAS */
                     FOR
                     SELECT W.CONTROLE AS ID,
                            W.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.COMISSAO_REPRESENTANTE,
                            0 AS VENDEDOR_ID,
                            0 AS COMISSAO_VENDEDOR,
                            0 AS GERAR_COMISSAO_VENDEDOR,
                            0 AS CORRETOR_ID,
                            0 AS COMISSAO_CORRETOR,
                            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_TOTAL,0.00) AS NUMERIC(15,2)) AS VALOR_TOTAL
                        
                            FROM(
                                SELECT
                                    W.*,
                                    PARC.estabelecimento_codigo AS ESTABELECIMENTO_ID,
                                    W.DATA AS DATA_EMISSAO,
                                    PARC.representante_id,
                                    PARC.representante_comissao as COMISSAO_REPRESENTANTE
                        
                                    FROM TBCAIXABANCO_LANCAMENTO_REG W, TBNFS_PARCELAMENTO PARC, TBPAGAMENTO_FORMA PAG,tbconta_receber_operacao ope
                                    WHERE W.CONTROLE                    = :TABELA_ID
                                    AND W.NFS_CONTROLE                  = PARC.NFS_CONTROLE
                                    AND W.nfs_parcelamento_controle     = PARC.CONTROLE
                                    AND PAG.codigo                      = PARC.pagamento_forma
                                    AND W.TIPO                          = 'C'
                                    --AND PAG.nfe_tippag                 IN ('15','80','16')
                                    AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2
                                    AND COALESCE(W.tarifa_adquirente,'0') <> '1'
                                    AND W.operacao_codigo               = OPE.codigo
                                    AND OPE.comissao                    = '1'
                                    AND PARC.AVULSO                     = '1'
                                    AND W.NFS_PARCELAMENTO_CONTROLE > 0
                            ) W
                        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
                            --exception "..." 'vr.com:'||:VALOR_COMISSAO_REPRESENTANTE||', ger.com:'||:GERAR_COMISSAO_REPRESENTANTE||', TIPO: '||:TIPO;
                            IF(:VALOR_COMISSAO_REPRESENTANTE > 0 AND :REPRESENTANTE_ID > 0 AND :GERAR_COMISSAO_REPRESENTANTE > 0 AND (:TIPO = 0 OR :TIPO = 1))THEN
                            BEGIN
                                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,
                                     0,
                                     1
                                   )
                                 MATCHING(ORIGEM, TABELA_ID, TIPO);
        
                            END
                         END
                      END
                  END
    
                  IF(:PARCELA_AVULSA = 0) THEN
                  BEGIN
                     /* LAN??AMENTOS COMISSAO POR LIQUIDEZ PARA PARCELAS NAO AVULSAS */
                     FOR
                     SELECT W.CONTROLE AS ID,
                            W.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.COMISSAO_REPRESENTANTE,
                            0 AS VENDEDOR_ID,
                            0 AS COMISSAO_VENDEDOR,
                            0 AS GERAR_COMISSAO_VENDEDOR,
                            0 AS CORRETOR_ID,
                            0 AS COMISSAO_CORRETOR,
                            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_TOTAL,0.00) AS NUMERIC(15,2)) AS VALOR_TOTAL,
                            W.TEXTO_OBSERVACAO_PARCELAS
                        
                            FROM(
                                SELECT
                                    W.*,
                                    CFE.estabelecimento_id,
                                    W.DATA AS DATA_EMISSAO,
                                    CFE.representante_id,
                                    PARC.representante_comissao as COMISSAO_REPRESENTANTE,
                                    'PARC.'||FN_LPAD(PARC.parcela,2,0) AS TEXTO_OBSERVACAO_PARCELAS
                        
                                    FROM TBCAIXABANCO_LANCAMENTO_REG W, TBNFS_PARCELAMENTO PARC, TBPAGAMENTO_FORMA PAG, TBPDV_CFE_FORMA_PAGAMENTO CFE_PAG, tbpdv_cfe cfe, tbconta_receber_operacao ope
                                    WHERE W.CONTROLE                    = :TABELA_ID AND
                                    W.NFS_CONTROLE                      = PARC.NFS_CONTROLE
                                    AND W.nfs_parcelamento_controle     = PARC.CONTROLE
                                    AND PAG.codigo                      = PARC.pagamento_forma
                                    AND W.TIPO                          = 'C'
                                    --AND PAG.nfe_tippag                 IN ('15','80','16')
                                    AND COALESCE(PAG.TIPO_CALCULO_COMISSAO,0) = 2
                                    AND PARC.pdv_cfe_forma_pagamento_id = CFE_PAG.id
                                    and CFE.id                          = CFE_PAG.pdv_cfe_id
                                    AND COALESCE(W.tarifa_adquirente,'0') <> '1'
                                    AND W.operacao_codigo               = OPE.codigo
                                    AND OPE.comissao                    = '1'
                                    AND W.NFS_PARCELAMENTO_CONTROLE > 0
                            ) W
                        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,
                             :TEXTO_OBSERVACAO_PARCELAS 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
                                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,
                                     OBSERVACAO
                                    )
                                 VALUES
                                   (
                                     :ESTABELECIMENTO_ID,
                                     :REPRESENTANTE_ID,
                                     0,
                                     0,
                                     :DATA_EMISSAO,
                                     :DATA_VENCIMENTO,
                                     :ORIGEM,
                                     :TABELA_ID,
                                     :VALOR_COMISSAO_REPRESENTANTE,
                                     :VALOR_COMISSAO_REPRESENTANTE,
                                     :COMISSAO_REPRESENTANTE,
                                     0,
                                     1,
                                     :TEXTO_OBSERVACAO_PARCELAS
                                   )
                                 MATCHING(ORIGEM, TABELA_ID, TIPO);
        
                            END
                         END
                      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,
            'PARC.'||FN_LPAD(W.PARCELA,2,0) AS TEXTO_OBSERVACAO_PARCELAS
    
            FROM TBNFS_PARCELAMENTO W, TBPAGAMENTO_FORMA P
            WHERE W.ACEITE          = 'S'
            AND   W.SITUACAO        = 1
            AND   W.AVULSO          = '1'
            AND   W.pagamento_forma = P.CODIGO
            AND COALESCE(P.PARCELAS_SEM_SALDO,'0') = '0'
            AND P.nfe_tippag NOT IN ('02')
            --AND P.nfe_tippag NOT IN ('02','15','80','16')
            AND COALESCE(P.TIPO_CALCULO_COMISSAO,0) = 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,
                 :TEXTO_OBSERVACAO_PARCELAS 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
                    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,
                         OBSERVACAO
                        )
                     VALUES
                       (
                         :ESTABELECIMENTO_ID,
                         :REPRESENTANTE_ID,
                         0,
                         0,
                         :DATA_EMISSAO,
                         :DATA_VENCIMENTO,
                         :ORIGEM,
                         :TABELA_ID,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :VALOR_COMISSAO_REPRESENTANTE,
                         :COMISSAO_REPRESENTANTE,
                         0,
                         1,
                         :TEXTO_OBSERVACAO_PARCELAS
                       )
                     MATCHING(ORIGEM, TABELA_ID, TIPO);
                END
             END
          END
      END
END
^

SET TERM ; ^

