SET TERM ^ ;

CREATE OR ALTER procedure SP_NF_CONTABIL (
    ORIGEM varchar(3),
    NF_ID integer)
returns (
    ESTABELECIMENTO_ID integer,
    NUMERO_NOTAFISCAL integer,
    EMPRESA_ID integer,
    NFE_ID integer,
    NFS_ID integer,
    CFE_ID integer,
    DATA date,
    HISTORICO_CONTABIL varchar(100),
    CONTA_DEBITO varchar(50),
    CONTA_CREDITO varchar(50),
    VALOR numeric(18,2),
    VFALHAS varchar(100))
as
declare variable CONTA_PARCELA varchar(50);
declare variable SALDO_PARCELA numeric(18,2);
declare variable VALOR_SALDO numeric(18,2);
BEGIN

    CONTA_DEBITO = 'FALHA, PARCELAMENTO SEM CONTA CONTABIL';
    SALDO_PARCELA = 0;
    NFS_ID = 0;
    NFE_ID = 0;
    DELETE FROM TMP_SPI_NF_CONTABIL WHERE TRUE;

  IF (ORIGEM = 'NFS') THEN
      BEGIN

      FOR SELECT ESTABELECIMENTO_CODIGO,NUMERO_NOTAFISCAL,CONTROLE
            FROM TBNFS
           WHERE CONTROLE = :NF_ID
             AND (NATUREZA = 1 AND SITUACAO = 2 OR
                  NATUREZA = 2 AND SITUACAO = 1)
      INTO :ESTABELECIMENTO_ID,:NUMERO_NOTAFISCAL,:NFS_ID
      DO BEGIN

            FOR
            SELECT IIF(O.CONTA_DEBITO='0' AND O.TIPO_DEBITO = 'A',E.CONTA_CONTABIL,
                   IIF(O.CONTA_DEBITO='0' AND O.TIPO_DEBITO = 'P',E.CONTA_CONTABIL2,
                   IIF(CHAR_LENGTH(O.CONTA_DEBITO) > 1, O.CONTA_DEBITO, ''))) CONTA_DEBITO,
                   SUM(N.VALOR) VALOR
              FROM TBEMPRESA E, TBNFS_PARCELAMENTO N, TBCONTA_RECEBER_OPERACAO O
             WHERE E.CODIGO = N.EMPRESA_CODIGO
               AND N.CONTA_RECEBER_OPERACAO = O.CODIGO
               AND N.NFS_CONTROLE = :NFS_ID
               AND CHAR_LENGTH(O.CONTA_DEBITO) > 0
             GROUP BY 1
             INTO :CONTA_PARCELA, :SALDO_PARCELA
             DO BEGIN
                INSERT INTO TMP_SPI_NF_CONTABIL (CONTA, VALOR) VALUES (:CONTA_PARCELA, :SALDO_PARCELA);
                END

            FOR
                SELECT NFS_ID,DATA,HISTORICO_CONTABIL,CONTA_DEBITO, CONTA_CREDITO, SUM(VALOR) VALOR
                FROM (
                SELECT I.NFS_CONTROLE AS NFS_ID,
                       I.DATA_EMISSAO AS DATA,
                       V.HISTORICO_CONTABIL||' NF.'||I.NUMERO_NOTAFISCAL HISTORICO_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_DEBITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_DEBITO) > 1, V.CONTA_DEBITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_DEBITO,
                
                       IIF(V.CONTA_CREDITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_CREDITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_CREDITO) > 1, V.CONTA_CREDITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_CREDITO,
                
                       ABS(IIF(V.VALOR_ITEM = '+',      I.VALOR_TOTAL,                         IIF(V.VALOR_ITEM = '-',              I.VALOR_TOTAL * (-1)                                    , 0))+
                       IIF(V.VALOR_ICMS = '+',          I.FISCAL_VALOR_ICMS,                   IIF(V.VALOR_ICMS = '-',              I.FISCAL_VALOR_ICMS * (-1)                              , 0))+
                       IIF(V.VALOR_ICMS_ST = '+',       I.FISCAL_VALOR_ICMS_ST,                IIF(V.VALOR_ICMS_ST = '-',           I.FISCAL_VALOR_ICMS_ST * (-1)                           , 0))+
                       IIF(V.VALOR_IPI = '+',           I.FISCAL_VALOR_IPI,                    IIF(V.VALOR_IPI = '-',               I.FISCAL_VALOR_IPI * (-1)                               , 0))+
                       IIF(V.VALOR_PIS = '+',           I.FISCAL_VALOR_PIS,                    IIF(V.VALOR_PIS = '-',               I.FISCAL_VALOR_PIS * (-1)                               , 0))+
                       IIF(V.VALOR_COFINS = '+',        I.FISCAL_VALOR_COFINS,                 IIF(V.VALOR_COFINS = '-',            I.FISCAL_VALOR_COFINS * (-1)                            , 0))+
                       IIF(V.VALOR_ACRESCIMOS = '+',    I.VALOR_ACRESCIMO,                     IIF(V.VALOR_ACRESCIMOS = '-',        I.VALOR_ACRESCIMO * (-1)                                , 0))+
                       IIF(V.VALOR_DESCONTOS = '+',     (I.VALOR_DESCONTO + I.VALOR_SUFRAMA),  IIF(V.VALOR_DESCONTOS = '-',         ((I.VALOR_DESCONTO + I.VALOR_SUFRAMA) * (-1))           , 0))+
                       IIF(V.VALOR_FRETE = '+',         I.VALOR_FRETE,                         IIF(V.VALOR_FRETE = '-',             I.VALOR_FRETE * (-1)                                    , 0))+
                       IIF(V.VALOR_SEGURO = '+',        I.VALOR_SEGURO,                        IIF(V.VALOR_SEGURO = '-',            I.VALOR_SEGURO * (-1)                                   , 0))+
                       IIF(V.RETENCAO_PIS = '+'     ,        COALESCE(TOT.RETENCAO_VALOR_PIS, 0),                IIF(V.RETENCAO_PIS = '-'    ,         COALESCE(TOT.RETENCAO_VALOR_PIS, 0) * (-1)                           , 0))+
                       IIF(V.RETENCAO_COFINS = '+'  ,        COALESCE(TOT.RETENCAO_VALOR_COFINS, 0),             IIF(V.RETENCAO_COFINS = '-' ,         COALESCE(TOT.RETENCAO_VALOR_COFINS, 0) * (-1)                        , 0))+
                       IIF(V.RETENCAO_CSLL = '+'    ,        COALESCE(TOT.RETENCAO_VALOR_CSLL, 0),               IIF(V.RETENCAO_CSLL = '-'   ,         COALESCE(TOT.RETENCAO_VALOR_CSLL, 0) * (-1)                          , 0))+
                       IIF(V.RETENCAO_INSS = '+'    ,        COALESCE(TOT.RETENCAO_VALOR_INSS, 0),               IIF(V.RETENCAO_INSS = '-'   ,         COALESCE(TOT.RETENCAO_VALOR_INSS, 0) * (-1)                          , 0))+
                       IIF(V.RETENCAO_IRRF = '+'    ,        COALESCE(TOT.RETENCAO_VALOR_IRRF, 0),               IIF(V.RETENCAO_IRRF = '-'   ,         COALESCE(TOT.RETENCAO_VALOR_IRRF, 0) * (-1)                          , 0))+
                       IIF(V.RETENCAO_ISSQN = '+'   ,        COALESCE(TOT.RETENCAO_VALOR_ISSQN, 0),              IIF(V.RETENCAO_ISSQN = '-'  ,         COALESCE(TOT.RETENCAO_VALOR_ISSQN, 0) * (-1)                         , 0))) VALOR
                
                  FROM TBOPERACAO_VINCULO_CONTABIL V,
                       TBEMPRESA E,
                       TBNFS_TOTAIS TOT,
                       TBNFS_ITEM I
                       LEFT JOIN (SELECT POC.PRODUTO_ID, POC.OPERACAO_CODIGO, POC.CCUSTO, MAX(POC.CONTA_CONTABIL) CONTA_CONTABIL
                                    FROM TBPRODUTO_OPERACAO_CONTABIL POC GROUP BY 1,2,3) PC
                                      ON I.PRODUTO_CODIGO = PC.PRODUTO_ID AND I.OPERACAO_CODIGO = PC.OPERACAO_CODIGO AND PC.CCUSTO = I.CCUSTO
                
                 WHERE I.ESTABELECIMENTO_CODIGO = V.ESTABELECIMENTO_CODIGO
                   AND I.OPERACAO_CODIGO = V.OPERACAO_CODIGO
                   AND I.EMPRESA_CODIGO = E.CODIGO
                   AND TOT.NFS_CONTROLE = I.NFS_CONTROLE
                   AND I.NFS_CONTROLE = :NFS_ID

                ) GROUP BY NFS_ID, DATA, HISTORICO_CONTABIL, CONTA_DEBITO, CONTA_CREDITO
             INTO :NFS_ID,:DATA,:HISTORICO_CONTABIL,:CONTA_DEBITO,:CONTA_CREDITO,:VALOR
             DO
                BEGIN

                VFALHAS = '';
                IF (:CONTA_DEBITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_DEBITO;
                    CONTA_DEBITO = '';
                    END

                IF (:CONTA_CREDITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_CREDITO;
                    CONTA_DEBITO = '';
                    END

                IF (VALOR > 0) THEN
                    BEGIN
                    VALOR_SALDO = VALOR;

                    IF (CONTA_DEBITO = 'PARCELAMENTO') THEN
                        BEGIN
    
                          FOR
                          SELECT CONTA, VALOR
                            FROM TMP_SPI_NF_CONTABIL
                           WHERE VALOR > 0
                             AND CHAR_LENGTH(CONTA) > 0
                           ORDER BY VALOR DESC
                            INTO :CONTA_PARCELA, :SALDO_PARCELA
                              DO BEGIN

                                 IF (:VALOR_SALDO = :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :VALOR_SALDO;
                                      CONTA_DEBITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = 0 WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                      BREAK;
                                     END ELSE
                                 IF (:VALOR_SALDO < :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :VALOR_SALDO;
                                      CONTA_DEBITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = VALOR - :VALOR WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                      BREAK;
                                     END ELSE
                                 IF (:VALOR_SALDO > :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :SALDO_PARCELA;
                                      CONTA_DEBITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = 0 WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                     END

                                 END

                        IF (VALOR_SALDO > 0) THEN
                            BEGIN
                               CONTA_DEBITO  = :CONTA_PARCELA;
                               VALOR         = :VALOR_SALDO;
                               VFALHAS = 'FALHA, ITENS COM VALORES A MAIOR';
                               SUSPEND;
                            END

                        END --IF (CONTA_DEBITO = 'PARCELAMENTO') THEN
                        ELSE
                        BEGIN
                        SUSPEND;
                        END
                    END --IF (VALOR > 0) THEN

                END
         END --FOR TBNFS
      END --IF (ORIGEM = 'NFS') THEN







  IF (ORIGEM = 'NFE') THEN
      BEGIN

      FOR SELECT ESTABELECIMENTO_CODIGO,NUMERO_NOTAFISCAL,CONTROLE
            FROM TBNFE
           WHERE CONTROLE = :NF_ID
             AND (NATUREZA = 1 AND SITUACAO = 2 OR
                  NATUREZA = 2 AND SITUACAO = 1)
      INTO :ESTABELECIMENTO_ID,:NUMERO_NOTAFISCAL,:NFE_ID
      DO BEGIN

            FOR
            SELECT IIF(O.CONTA_CREDITO='0' AND O.TIPO_CREDITO = 'A',E.CONTA_CONTABIL,
                   IIF(O.CONTA_CREDITO='0' AND O.TIPO_CREDITO = 'P',E.CONTA_CONTABIL2,
                   IIF(CHAR_LENGTH(O.CONTA_CREDITO) > 1, O.CONTA_CREDITO, ''))) CONTA_CREDITO,
                   SUM(N.VALOR) VALOR
              FROM TBEMPRESA E, TBNFE_PARCELAMENTO N, TBCONTA_PAGAR_OPERACAO O
             WHERE E.CODIGO = N.EMPRESA_CODIGO
               AND N.CONTA_PAGAR_OPERACAO = O.CODIGO
               AND N.NFE_CONTROLE = :NFE_ID
               AND CHAR_LENGTH(O.CONTA_CREDITO) > 0
             GROUP BY 1
             INTO :CONTA_PARCELA, :SALDO_PARCELA
             DO BEGIN
                INSERT INTO TMP_SPI_NF_CONTABIL (CONTA, VALOR) VALUES (:CONTA_PARCELA, :SALDO_PARCELA);
                END

            FOR
                SELECT NFE_ID,DATA,HISTORICO_CONTABIL, CONTA_DEBITO, CONTA_CREDITO, SUM(VALOR) VALOR
                FROM (
                SELECT I.NFE_CONTROLE AS NFE_ID,
                       I.DATA_ENTRADA AS DATA,
                       V.HISTORICO_CONTABIL||' NF.'||I.NUMERO_NOTAFISCAL HISTORICO_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_DEBITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, EMITENTE SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, EMITENTE SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_DEBITO) > 1, V.CONTA_DEBITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_DEBITO,
                
                       IIF(V.CONTA_CREDITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_CREDITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, EMITENTE SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, EMITENTE SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_CREDITO) > 1, V.CONTA_CREDITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_CREDITO,
                
                       ABS(IIF(V.VALOR_ITEM         = '+', I.VALOR_TOTAL,           IIF(V.VALOR_ITEM         = '-', I.VALOR_TOTAL           * (-1), 0))+
                           IIF(V.VALOR_ICMS         = '+', I.FISCAL_VALOR_ICMS,     IIF(V.VALOR_ICMS         = '-', I.FISCAL_VALOR_ICMS     * (-1), 0))+
                           IIF(V.VALOR_ICMS_ST      = '+', I.FISCAL_VALOR_ICMS_ST,  IIF(V.VALOR_ICMS_ST      = '-', I.FISCAL_VALOR_ICMS_ST  * (-1), 0))+
                           IIF(V.VALOR_IPI          = '+', I.FISCAL_VALOR_IPI,      IIF(V.VALOR_IPI          = '-', I.FISCAL_VALOR_IPI      * (-1), 0))+
                           IIF(V.VALOR_PIS          = '+', I.FISCAL_VALOR_PIS,      IIF(V.VALOR_PIS          = '-', I.FISCAL_VALOR_PIS      * (-1), 0))+
                           IIF(V.VALOR_COFINS       = '+', I.FISCAL_VALOR_COFINS,   IIF(V.VALOR_COFINS       = '-', I.FISCAL_VALOR_COFINS   * (-1), 0))+
                           IIF(V.VALOR_ACRESCIMOS   = '+', I.VALOR_ACRESCIMO,       IIF(V.VALOR_ACRESCIMOS   = '-', I.VALOR_ACRESCIMO       * (-1), 0))+
                           IIF(V.VALOR_DESCONTOS    = '+', I.VALOR_DESCONTO,        IIF(V.VALOR_DESCONTOS    = '-', I.VALOR_DESCONTO        * (-1), 0))+
                           IIF(V.VALOR_FRETE        = '+', I.VALOR_FRETE,           IIF(V.VALOR_FRETE        = '-', I.VALOR_FRETE           * (-1), 0))+
                           IIF(V.VALOR_IOF          = '+', I.DI_VALOR_IOF,          IIF(V.VALOR_IOF          = '-', I.DI_VALOR_IOF          * (-1), 0))+
                           IIF(V.VALOR_II           = '+', I.DI_VALOR_II,           IIF(V.VALOR_II           = '-', I.DI_VALOR_II           * (-1), 0))+
                           IIF(V.VALOR_PEDAGIO_ILPUB= '+', I.VALOR_PEDAGIO,         IIF(V.VALOR_PEDAGIO_ILPUB= '-', I.VALOR_PEDAGIO         * (-1), 0))+
                           IIF(V.VALOR_SEGURO = '+',        I.VALOR_SEGURO,                        IIF(V.VALOR_SEGURO = '-',            I.VALOR_SEGURO * (-1)                                   , 0))+
                           IIF(V.RETENCAO_PIS = '+'     ,     COALESCE(TOT.RETENCAO_VALOR_PIS, 0),                IIF(V.RETENCAO_PIS = '-'       ,         COALESCE(TOT.RETENCAO_VALOR_PIS, 0) * (-1)                           , 0))+
                           IIF(V.RETENCAO_COFINS = '+'  ,     COALESCE(TOT.RETENCAO_VALOR_COFINS, 0),             IIF(V.RETENCAO_COFINS = '-'    ,         COALESCE(TOT.RETENCAO_VALOR_COFINS, 0) * (-1)                        , 0))+
                           IIF(V.RETENCAO_CSLL = '+'    ,     COALESCE(TOT.RETENCAO_VALOR_CSLL, 0),               IIF(V.RETENCAO_CSLL = '-'      ,         COALESCE(TOT.RETENCAO_VALOR_CSLL, 0) * (-1)                          , 0))+
                           IIF(V.RETENCAO_INSS = '+'    ,     COALESCE(TOT.RETENCAO_VALOR_INSS, 0),               IIF(V.RETENCAO_INSS = '-'      ,         COALESCE(TOT.RETENCAO_VALOR_INSS, 0) * (-1)                          , 0))+
                           IIF(V.RETENCAO_IRRF = '+'    ,     COALESCE(TOT.RETENCAO_VALOR_IRRF, 0),               IIF(V.RETENCAO_IRRF = '-'      ,         COALESCE(TOT.RETENCAO_VALOR_IRRF, 0) * (-1)                          , 0))+
                           IIF(V.RETENCAO_ISSQN = '+'   ,     COALESCE(TOT.RETENCAO_VALOR_ISSQN, 0),              IIF(V.RETENCAO_ISSQN = '-'     ,         COALESCE(TOT.RETENCAO_VALOR_ISSQN, 0) * (-1)                         , 0))) VALOR
                
                  FROM TBOPERACAO_VINCULO_CONTABIL V,
                       TBEMPRESA E, TBNFE_TOTAIS TOT, TBNFE_ITEM I
                  LEFT JOIN (SELECT POC.PRODUTO_ID, POC.OPERACAO_CODIGO, POC.CCUSTO,
                                    MAX(POC.CONTA_CONTABIL) CONTA_CONTABIL
                               FROM TBPRODUTO_OPERACAO_CONTABIL POC GROUP BY 1,2,3) PC
                                 ON I.PRODUTO_CODIGO = PC.PRODUTO_ID AND I.OPERACAO_CODIGO = PC.OPERACAO_CODIGO AND PC.CCUSTO = I.CCUSTO
                
                 WHERE I.ESTABELECIMENTO_CODIGO = V.ESTABELECIMENTO_CODIGO
                   AND I.OPERACAO_CODIGO = V.OPERACAO_CODIGO
                   AND I.EMPRESA_CODIGO = E.CODIGO
                   AND I.NFE_CONTROLE = TOT.NFE_CONTROLE
                   AND I.NFE_CONTROLE = :NFE_ID

                ) GROUP BY NFE_ID, DATA, HISTORICO_CONTABIL, CONTA_DEBITO, CONTA_CREDITO
             INTO :NFE_ID,:DATA,HISTORICO_CONTABIL,:CONTA_DEBITO,:CONTA_CREDITO,:VALOR
             DO
                BEGIN

                VFALHAS = '';
                IF (:CONTA_DEBITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_DEBITO;
                    CONTA_DEBITO = '';
                    END

                IF (:CONTA_CREDITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_CREDITO;
                    CONTA_DEBITO = '';
                    END

                IF (VALOR > 0) THEN
                    BEGIN
                    VALOR_SALDO = VALOR;

                    IF (CONTA_CREDITO = 'PARCELAMENTO') THEN
                        BEGIN

                          FOR
                          SELECT CONTA, VALOR
                            FROM TMP_SPI_NF_CONTABIL
                           WHERE VALOR > 0
                             AND CHAR_LENGTH(CONTA) > 0
                           ORDER BY VALOR DESC
                            INTO :CONTA_PARCELA, :SALDO_PARCELA
                              DO BEGIN

                                 IF (:VALOR_SALDO = :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :VALOR_SALDO;
                                      CONTA_CREDITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = 0 WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                      BREAK;
                                     END ELSE
                                 IF (:VALOR_SALDO < :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :VALOR_SALDO;
                                      CONTA_CREDITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = VALOR - :VALOR WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                      BREAK;
                                     END ELSE
                                 IF (:VALOR_SALDO > :SALDO_PARCELA) THEN
                                     BEGIN
                                      VALOR = :SALDO_PARCELA;
                                      CONTA_CREDITO = :CONTA_PARCELA;
                                      UPDATE TMP_SPI_NF_CONTABIL SET VALOR = 0 WHERE CONTA = :CONTA_PARCELA;
                                      SUSPEND;
                                      VALOR_SALDO = :VALOR_SALDO - :VALOR;
                                     END

                                 END

                        IF (VALOR_SALDO > 0) THEN
                            BEGIN
                               CONTA_CREDITO = :CONTA_PARCELA;
                               VALOR         = :VALOR_SALDO;
                               VFALHAS = 'FALHA, ITENS COM VALORES A MAIOR';
                               SUSPEND;
                            END

                        END ELSE
                        BEGIN
                        SUSPEND;
                        END
                    END
                END
         END
      END --IF (ORIGEM = 'NFE') THEN





  IF (ORIGEM = 'CFI') THEN
      BEGIN

      FOR SELECT CF.ESTABELECIMENTO_ID,CF.NUMERO_CFE, CF.CLIENTE_ID, CF.ID,CF.DATA_EMISSAO, p.conta_contabil
            FROM TBPDV_CFE CF, tbpdv p
           WHERE CF.ID = :NF_ID
           AND CF.SITUACAO = 2
           and cf.pdv_id = p.id
      INTO :ESTABELECIMENTO_ID,:NUMERO_NOTAFISCAL, :EMPRESA_ID, :CFE_ID,:DATA, :CONTA_PARCELA
      DO BEGIN

            FOR
                SELECT CFE_ID, HISTORICO_CONTABIL, CONTA_DEBITO, CONTA_CREDITO, SUM(VALOR) VALOR
                FROM (
                SELECT I.PDV_CFE_ID AS CFE_ID,
                       V.HISTORICO_CONTABIL||' NF. '||:NUMERO_NOTAFISCAL HISTORICO_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_DEBITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_DEBITO = '0' AND V.TIPO_DEBITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_DEBITO) > 1, V.CONTA_DEBITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_DEBITO,
                
                       IIF(V.CONTA_CREDITO = '3' AND CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,PC.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '3' AND NOT CHAR_LENGTH(PC.CONTA_CONTABIL) > 1,'FALHA, PRODUTO SEM CONTA CONTABIL!',
                       IIF(V.CONTA_CREDITO = '2', 'PARCELAMENTO',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND CHAR_LENGTH(E.CONTA_CONTABIL) > 1,E.CONTA_CONTABIL,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'A' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(A)',
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,E.CONTA_CONTABIL2,
                       IIF(V.CONTA_CREDITO = '0' AND V.TIPO_CREDITO = 'P' AND NOT CHAR_LENGTH(E.CONTA_CONTABIL2) > 1,'FALHA, DESTINATARIO SEM CONTA CONTABIL(P)',
                       IIF(CHAR_LENGTH(V.CONTA_CREDITO) > 1, V.CONTA_CREDITO, 'FALHA, OPERACAO SEM CONTA CONTABIL CONFIGURADA(D)')))))))) CONTA_CREDITO,
                
                       ABS(IIF(V.VALOR_ITEM = '+',      I.VALOR_TOTAL,                         IIF(V.VALOR_ITEM = '-',              I.VALOR_TOTAL * (-1)                                    , 0))+
                       IIF(V.VALOR_ICMS = '+',          I.FISCAL_VALOR_ICMS,                   IIF(V.VALOR_ICMS = '-',              I.FISCAL_VALOR_ICMS * (-1)                              , 0))+
                       IIF(V.VALOR_ICMS_ST = '+',       I.FISCAL_VALOR_ICMS_ST,                IIF(V.VALOR_ICMS_ST = '-',           I.FISCAL_VALOR_ICMS_ST * (-1)                           , 0))+
                       IIF(V.VALOR_IPI = '+',           I.FISCAL_VALOR_IPI,                    IIF(V.VALOR_IPI = '-',               I.FISCAL_VALOR_IPI * (-1)                               , 0))+
                       IIF(V.VALOR_PIS = '+',           I.FISCAL_VALOR_PIS,                    IIF(V.VALOR_PIS = '-',               I.FISCAL_VALOR_PIS * (-1)                               , 0))+
                       IIF(V.VALOR_COFINS = '+',        I.FISCAL_VALOR_COFINS,                 IIF(V.VALOR_COFINS = '-',            I.FISCAL_VALOR_COFINS * (-1)                            , 0))+
                       IIF(V.VALOR_ACRESCIMOS = '+',    I.VALOR_ACRESCIMO,                     IIF(V.VALOR_ACRESCIMOS = '-',        I.VALOR_ACRESCIMO * (-1)                                , 0))+
                       IIF(V.VALOR_DESCONTOS = '+',     (I.VALOR_DESCONTO + I.VALOR_SUFRAMA),  IIF(V.VALOR_DESCONTOS = '-',         ((I.VALOR_DESCONTO + I.VALOR_SUFRAMA) * (-1))           , 0))+
                       IIF(V.VALOR_FRETE = '+',         I.VALOR_FRETE,                         IIF(V.VALOR_FRETE = '-',             I.VALOR_FRETE * (-1)                                    , 0))+
                       IIF(V.VALOR_SEGURO = '+',        0,                                     IIF(V.VALOR_SEGURO = '-',            0                                                       , 0))) VALOR
                
                  FROM TBOPERACAO_VINCULO_CONTABIL V,
                       TBEMPRESA E,
                       TBPDV_CFE_ITEM I
                       LEFT JOIN (SELECT POC.PRODUTO_ID, POC.OPERACAO_CODIGO, POC.CCUSTO, MAX(POC.CONTA_CONTABIL) CONTA_CONTABIL
                                    FROM TBPRODUTO_OPERACAO_CONTABIL POC GROUP BY 1,2,3) PC
                                      ON I.PRODUTO_ID = PC.PRODUTO_ID AND I.OPERACAO_CODIGO = PC.OPERACAO_CODIGO AND PC.CCUSTO = ''
                
                 WHERE V.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                   AND I.OPERACAO_CODIGO = V.OPERACAO_CODIGO
                   AND E.CODIGO = :EMPRESA_ID
                   AND I.PDV_CFE_ID = :CFE_ID

                ) GROUP BY CFE_ID, HISTORICO_CONTABIL, CONTA_DEBITO, CONTA_CREDITO
             INTO :CFE_ID,:HISTORICO_CONTABIL,:CONTA_DEBITO,:CONTA_CREDITO,:VALOR
             DO
                BEGIN

                VFALHAS = '';
                IF (:CONTA_DEBITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_DEBITO;
                    CONTA_DEBITO = '';
                    END

                IF (:CONTA_CREDITO LIKE 'FALHA%') THEN
                    BEGIN
                    VFALHAS = :CONTA_CREDITO;
                    CONTA_DEBITO = '';
                    END

                IF (VALOR > 0) THEN
                    BEGIN
                    VALOR_SALDO = VALOR;

                    IF (CONTA_DEBITO = 'PARCELAMENTO') THEN
                        BEGIN

                            VALOR           = :VALOR_SALDO;
                            CONTA_DEBITO    = :CONTA_PARCELA;
                            SUSPEND;

                            VALOR_SALDO = :VALOR_SALDO - :VALOR;

                            IF (VALOR_SALDO > 0) THEN
                            BEGIN
                               CONTA_DEBITO     = :CONTA_PARCELA;
                               VALOR            = :VALOR_SALDO;
                               VFALHAS          = 'FALHA, ITENS COM VALORES A MAIOR';
                               SUSPEND;
                            END

                        END --IF (CONTA_DEBITO = 'PARCELAMENTO') THEN
                        ELSE
                        BEGIN
                        SUSPEND;
                        END
                    END --IF (VALOR > 0) THEN

                END
         END --FOR TBPDV_CF
      END --IF (ORIGEM = 'CFI') THEN

   FOR
   SELECT CONTA, VALOR
     FROM TMP_SPI_NF_CONTABIL
    WHERE VALOR > 0
     INTO :CONTA_PARCELA, :SALDO_PARCELA
       DO BEGIN
           CONTA_CREDITO = :CONTA_PARCELA;
           VALOR         = :SALDO_PARCELA;
           VFALHAS = 'FALHA, PARCELAMENTOS COM VALORES A MAIOR';
           SUSPEND;
          END

END
^

SET TERM ; ^

