SET TERM ^ ;

ALTER TABLE TBCAIXABANCO_LANCAMENTO_REG ADD CALCULO_MULTA_JUROS SMALLINT DEFAULT 0^

CREATE INDEX ITBCAIXABANCO_LANCAMENTO_30 ON TBCAIXABANCO_LANCAMENTO_REG (CALCULO_MULTA_JUROS)^

COMMENT ON COLUMN TBCAIXABANCO_LANCAMENTO_REG.CALCULO_MULTA_JUROS IS 'SE 1 INDICA QUE O LANCAMENTO E RESULTANTE DE UM CALCULO DE JUROS/MULTA'^

CREATE OR ALTER procedure SPUI_CALCULO_MULTA_JUROS (
    PARCELA_CONTROLE integer = 0,
    OPERACAO char(1) = 'A')
as
declare variable CONTROLE integer;
declare variable NFS_CONTROLE integer;
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable EMPRESA_CODIGO integer;
declare variable NUMERO_NOTAFISCAL integer;
declare variable PARCELA integer;
declare variable SERIE varchar(3);
declare variable DATA_EMISSAO date;
declare variable VALOR numeric(18,5);
declare variable VALOR_SALDO numeric(18,5);
declare variable VALOR_JUROS_DIARIO numeric(18,5);
declare variable VALOR_MULTA numeric(18,5);
declare variable OPERACAO_CODIGO integer;
declare variable MOVCONTABIL_ID integer;
declare variable MOVCONTMESTRE_ID integer;
declare variable LANCAMENTO_JUROS_MULTA integer;
declare variable HISTORICO_CONTABIL varchar(200);
declare variable CCUSTO varchar(20);
declare variable CONTA_CONTABIL varchar(20);
declare variable CONTA_DEBITO varchar(20);
declare variable CONTA_CREDITO varchar(20);
BEGIN
   FOR
      SELECT
        A.CONTROLE,
        A.NFS_CONTROLE,
        A.ESTABELECIMENTO_CODIGO,
        A.EMPRESA_CODIGO,
        A.NUMERO_NOTAFISCAL,
        A.PARCELA,
        a.SERIE,
        a.DATA_EMISSAO,
        a.valor,
        a.valor_saldo,
        CAST(IIF(coalesce(pag.juros_diario,0.00) > 0,
            datediff(DAY FROM A.data_vencimento TO CURRENT_DATE)*(CAST(coalesce(A.VALOR,0.00) AS DOUBLE PRECISION) * CAST(coalesce(pag.juros_diario,0.00) AS DOUBLE PRECISION)/100.00),
            0.00) AS NUMERIC(15,2)) AS VALOR_JUROS_DIARIO,
        CAST(IIF(coalesce(pag.multa,0.00) > 0,
            (CAST(coalesce(A.VALOR,0.00) AS DOUBLE PRECISION) * CAST(coalesce(pag.multa,0.00) AS DOUBLE PRECISION)/100.00),
            0.00) AS NUMERIC(15,2)) AS VALOR_MULTA,
        COALESCE((SELECT FIRST 1 LANC.CONTROLE
            FROM tbcaixabanco_lancamento_reg LANC
            WHERE LANC.nfs_parcelamento_controle = A.CONTROLE
            AND LANC.nfs_controle = A.nfs_controle
            AND COALESCE(LANC.CALCULO_MULTA_JUROS,0) = 1),0) AS LANCAMENTO_JUROS_MULTA
    
        FROM TBNFS_PARCELAMENTO A, tbpagamento_forma PAG, TBCAIXABANCO_LANCAMENTO_REG LANC2
        WHERE A.data_vencimento < CURRENT_DATE
          AND A.valor_saldo     > 0
          AND LANC2.tarifa_adquirente <> '1'
          AND LANC2.registro_mestre = '1'
          AND COALESCE(LANC2.CALCULO_MULTA_JUROS,0) <> 1
          AND LANC2.nfs_parcelamento_controle = A.CONTROLE
          AND LANC2.nfs_controle              = A.nfs_controle
          AND A.PAGAMENTO_FORMA = PAG.CODIGO
          AND (IIF(:PARCELA_CONTROLE > 0,A.CONTROLE = :PARCELA_CONTROLE, TRUE))
          AND (PAG.juros_diario > 0 OR PAG.multa > 0)
          INTO :CONTROLE, :NFS_CONTROLE, :ESTABELECIMENTO_CODIGO, :EMPRESA_CODIGO, :NUMERO_NOTAFISCAL, :PARCELA,
               :SERIE, :DATA_EMISSAO, :VALOR, :VALOR_SALDO, :VALOR_JUROS_DIARIO, :VALOR_MULTA, :LANCAMENTO_JUROS_MULTA
          DO BEGIN

             IF(:LANCAMENTO_JUROS_MULTA > 0)THEN
             BEGIN

                UPDATE TBCAIXABANCO_LANCAMENTO_REG LANC
                    SET LANC.valor_total = CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2))
                 WHERE LANC.CONTROLE = :LANCAMENTO_JUROS_MULTA
                    AND LANC.CALCULO_MULTA_JUROS = 1;
                
        
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(:NFS_CONTROLE,:CONTROLE);

                update tbnfs_parcelamento parc set parc.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = parc.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = parc.controle),0.00)
                    where  parc.controle     = :CONTROLE
                       and parc.nfs_controle = :NFS_CONTROLE;

             END ELSE
             BEGIN

                 :MOVCONTABIL_ID   = 0;
                 :MOVCONTMESTRE_ID = 0;

                 FOR
                   SELECT FIRST 1
                     F.CODIGO,
                     F.HISTORICO_CONTABIL,
                     CASE
                     WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     ELSE F.CONTA_CREDITO
                     END AS CONTA_CREDITO,
                     CASE
                     WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     ELSE F.CONTA_DEBITO
                     END AS CONTA_DEBITO,
                     F.CCUSTO
                     FROM TBCONTA_RECEBER_OPERACAO F
                     WHERE F.TIPO = 'D'
                     AND F.STATUS = '1'
                     AND F.CODIGO = COALESCE(FN_PARAMETRO('SISTEMA.OPERACAO_CALCULO_MULTA_JUROS'),0)
                     INTO :OPERACAO_CODIGO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :CCUSTO DO
                     BEGIN
                     END

                INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                    CONTROLE, 
                    ESTABELECIMENTO_CODIGO,
                    EMPRESA_CODIGO,
                    NFS_PARCELAMENTO_CONTROLE,
                    OPERACAO_CODIGO,
                    DOCUMENTO_NUMERO,
                    PARCELA,
                    REGISTRO_MESTRE,
                    DATA,
                    VALOR,
                    VALOR_SALDO,
                    VALOR_TOTAL,
                    TIPO,
                    SERIE,
                    NFE_CONTROLE,
                    NFS_CONTROLE,
                    CODORIGEM,
                    CONTA_DEBITO,
                    CONTA_CREDITO,
                    MOVCONTABIL_ID,
                    MOVCONTMESTRE_ID,
                    CALCULO_MULTA_JUROS,
                    HISTORICO,
                    CCUSTO
                    )
                    VALUES
                    (
                    GEN_ID(GTBCAIXABANCO_LANCAMENTO_REG,1),
                    :ESTABELECIMENTO_CODIGO,
                    :EMPRESA_CODIGO,
                    :CONTROLE,
                    :OPERACAO_CODIGO,
                    :NUMERO_NOTAFISCAL,
                    :PARCELA,
                    '1',
                    CURRENT_DATE,
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    'D',
                    :SERIE,
                    0,
                    :NFS_CONTROLE,
                    'CRE',
                    :CONTA_DEBITO,
                    :CONTA_CREDITO,
                    :MOVCONTABIL_ID,
                    :MOVCONTMESTRE_ID,
                    1,
                    :HISTORICO_CONTABIL,
                    :CCUSTO
                    );
        
        
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(:NFS_CONTROLE,:CONTROLE);

                update tbnfs_parcelamento parc set parc.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = parc.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = parc.controle),0.00)
                    where  parc.controle     = :CONTROLE
                       and parc.nfs_controle = :NFS_CONTROLE;

             END

          END
END^ 

SET TERM ; ^