SET TERM ^ ;

ALTER TABLE TBCONCILIACAO_CARTAO ADD IMP SMALLINT^

ALTER TABLE TBCONCILIACAO_CARTAO_PARCELAS ADD IMP SMALLINT^

ALTER TABLE TBCONCILIACAO_CARTAO_RECEBER ADD IMP SMALLINT^

ALTER TABLE TBCONCILIACAO_CARTAO_DEBITOS ADD IMP SMALLINT^

CREATE OR ALTER procedure SPU_AJUSTAR_PARC_ADQ_IMP (
    DATA_INICIAL date = current_date,
    DATA_FINAL date = current_date,
    ADQUIRENTE_ID integer = 0,
    VENDA_IMPORTADA_ID integer = 0)
as
declare variable ID integer;
declare variable VALOR numeric(15,2);
declare variable PARCELAS integer;
declare variable NSU numeric(18,0);
declare variable CODIGO_AUTORIZACAO varchar(50);
declare variable VALOR_TAXAS numeric(15,2);
declare variable BANDEIRA integer;
declare variable NUMERO_RESUMO_VENDA numeric(18,0);
declare variable MERCHANT_ID varchar(50);
declare variable TIPO varchar(50);
declare variable REFAZER_PARCELAS integer;
declare variable VALOR_PARCELAS numeric(18,2);
declare variable TAXA_PARCELAS numeric(18,2);
declare variable TOTAL_PARCELAS numeric(18,2);
declare variable TOTAL_TAXAS numeric(18,2);
declare variable DIFF_PARCELAS numeric(18,4);
declare variable DIFF_TAXAS numeric(18,4);
declare variable VALOR_LIQUIDO_PARCELAS numeric(18,4);
declare variable DATA_MOVIMENTO date = current_date;
declare variable DATA_EXPIRACAO date = current_date;
declare variable ID_PARCELA_INSERIDA integer;
declare variable COUNT_PARCELAS integer;
BEGIN

    :COUNT_PARCELAS = 0;

     FOR
        SELECT
            T.ID,
            T.VALOR,
            T.PARCELAS,
            T.NSU,
            T.CODIGO_AUTORIZACAO,
            (COALESCE(T.desconto1,0.00)+COALESCE(T.desconto2,0.00)) AS VALOR_TAXAS,
            T.BANDEIRA,
            T.NUMERO_RESUMO_VENDA,
            T.MERCHANT_ID,
            T.DATA_MOVIMENTO,
            T.TIPO,
            COALESCE((SELECT FIRST 1 1 FROM TBCONCILIACAO_CARTAO_PARCELAS PARC
                        WHERE PARC.NSU                          = T.NSU
                        AND PARC.ADQUIRENTE_ID                  = T.ADQUIRENTE_ID
                        AND PARC.data_venda                     = T.DATA_VENDA
                        AND PARC.NUMERO_RESUMO_VENDA            = T.NUMERO_RESUMO_VENDA
                        AND PARC.MERCHANT_ID                    = T.MERCHANT_ID),0) AS REFAZER_PARCELAS
            FROM TBCONCILIACAO_CARTAO T
            WHERE T.DATA_VENDA BETWEEN :DATA_INICIAL AND :DATA_FINAL
            AND T.ADQUIRENTE_ID = :ADQUIRENTE_ID
            AND IIF(:VENDA_IMPORTADA_ID > 0, T.ID = :VENDA_IMPORTADA_ID, TRUE)
            AND T.IMP = 1
            AND T.STATUS <> 'CANCELLED'

            INTO
                ID,
                VALOR,
                PARCELAS,
                NSU,
                CODIGO_AUTORIZACAO,
                VALOR_TAXAS,
                BANDEIRA,
                NUMERO_RESUMO_VENDA,
                MERCHANT_ID,
                DATA_MOVIMENTO,
                TIPO,
                REFAZER_PARCELAS
            
            DO
            BEGIN
        
               IF(:REFAZER_PARCELAS > 0)THEN
               BEGIN
                   DELETE FROM TBCONCILIACAO_CARTAO_PARCELAS PARC
                        WHERE PARC.NSU                = :NSU
                        AND PARC.ADQUIRENTE_ID        = :ADQUIRENTE_ID
                        AND PARC.DATA_VENDA           = :DATA_MOVIMENTO
                        AND PARC.NUMERO_RESUMO_VENDA  = :NUMERO_RESUMO_VENDA
                        AND PARC.MERCHANT_ID          = :MERCHANT_ID;
               END
        
               IF(:PARCELAS > 0)THEN
               BEGIN
                  --EXCEPTION "..." 'ENTROU';
                   :COUNT_PARCELAS = 0;
                   :TOTAL_PARCELAS = 0;
                   :TOTAL_TAXAS    = 0;
        
                   :VALOR_PARCELAS = ROUND(CAST(:VALOR AS DOUBLE PRECISION)/CAST(:PARCELAS AS DOUBLE PRECISION),2);
                   IF(:VALOR_TAXAS > 0)THEN
                   BEGIN
                      :TAXA_PARCELAS = ROUND(CAST(:VALOR_TAXAS AS DOUBLE PRECISION)/CAST(:PARCELAS AS DOUBLE PRECISION),2);
                   END
                   ELSE
                   BEGIN
                      :TAXA_PARCELAS = 0;
                   END
        
                   WHILE(:COUNT_PARCELAS < :PARCELAS) DO
                     BEGIN

                        :COUNT_PARCELAS = :COUNT_PARCELAS + 1;
                        :TOTAL_PARCELAS = CAST(:TOTAL_PARCELAS AS DOUBLE PRECISION)+CAST(:VALOR_PARCELAS AS DOUBLE PRECISION);
                        :TOTAL_TAXAS    = CAST(:TOTAL_TAXAS AS DOUBLE PRECISION)+CAST(:TAXA_PARCELAS AS DOUBLE PRECISION);
        
                        IF(:TIPO = 'DEBIT')THEN
                        BEGIN
                          :DATA_EXPIRACAO = DATEADD(DAY,1,:DATA_MOVIMENTO);
                        END
                        ELSE
                        BEGIN
                          :DATA_EXPIRACAO = DATEADD(DAY,(30*:COUNT_PARCELAS),:DATA_MOVIMENTO);
                        END
        
                        :ID_PARCELA_INSERIDA = GEN_ID(GTBCONCILI_CARTAO_PARCELA,1);
        
                        INSERT INTO tbconciliacao_cartao_parcelas (ID,  VALOR, NUMERO_PARCELA, DATA_EXPIRACAO, DESCONTO1, DESCONTO2, VALOR_VENDA, DATA_VENDA,
                            NUMERO_RESUMO_VENDA, TID, DATA_MOVIMENTO, NSU, VALOR_LIQUIDO, ADQUIRENTE_ID, CONCILIACAO, ESTABELECIMENTO_REDE, MERCHANT_ID, DATA_ARQUIVO,STATUS_BAIXA,
                            VALOR_ORIGINAL, TARIFA_ORIGINAL, VALOR_LIQ_ORIGINAL, DATA_ADIANTAMENTO, TARIFA_ADIANTAMENTO, IMP)
                        VALUES(:ID_PARCELA_INSERIDA, :VALOR_PARCELAS, :COUNT_PARCELAS, :DATA_EXPIRACAO, :TAXA_PARCELAS, 0, :VALOR, :DATA_MOVIMENTO,
                            :NUMERO_RESUMO_VENDA, NULL, :DATA_MOVIMENTO, :NSU, :VALOR_LIQUIDO_PARCELAS, :ADQUIRENTE_ID, 0, NULL, :MERCHANT_ID, :DATA_MOVIMENTO, NULL,
                            :VALOR_PARCELAS, :TAXA_PARCELAS, :VALOR_LIQUIDO_PARCELAS, NULL, 0, 1);
        
                        IF(:COUNT_PARCELAS = :PARCELAS)THEN
                        BEGIN
                            :DIFF_PARCELAS = ROUND(CAST(:TOTAL_PARCELAS AS DOUBLE PRECISION)-CAST(:VALOR AS DOUBLE PRECISION),2);
                            :DIFF_TAXAS    = ROUND(CAST(:TOTAL_TAXAS AS DOUBLE PRECISION)-CAST(:VALOR_TAXAS AS DOUBLE PRECISION),2);
                            --EXCEPTION "..." 'DIF.PARCELAS: '||:DIFF_PARCELAS||', DIFF.TAXAS:'||:DIFF_TAXAS;
                            IF(:DIFF_PARCELAS <> 0 OR :DIFF_TAXAS <> 0)THEN
                            BEGIN
        
                               UPDATE TBCONCILIACAO_CARTAO_PARCELAS PARC
                                  SET PARC.VALOR     = PARC.VALOR     - :DIFF_PARCELAS,
                                      PARC.DESCONTO1 = PARC.DESCONTO1 - :DIFF_TAXAS
                                  WHERE PARC.ID = :ID_PARCELA_INSERIDA;
        
                            END
                        END
                       --SUSPEND;
                   END
        
        
               END
            END

END^

SET TERM ; ^