        SELECT
          'MOPREDOCUMXITENS' tabelaSistema,
          b.idItemPreDocumento idTabelaSistema,
          101 origemContabil,
          b.preDocumento idDocumento,
          cab.dataEmissao data,
          cab.fatoContabil,
          cab.estabelecimento,
          cab.pessoa,
          TO_CHAR (CASE WHEN cab.documentoFiscal = 0 THEN cab.preDocumento ELSE cab.documentoFiscal END) documento,
          COALESCE (SUBSTR (RTRIM (
            COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
            WITHIN GROUP (ORDER BY infCompl.sequencia)
            FROM MOPREDOCUMXINFOCOMPLENT infCompl
            WHERE infCompl.preDocumento = b.preDocumento
            AND infCompl.geradoPeloSistema = 0
            AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 120),' ') complemento,
          CASE
            WHEN cab.statusPreDocumento = 'E'
            THEN 1
            ELSE 0
          END documentoAberto,
          gradProd.produto,
          cab.contaFinanceira,
          0 carteiraFinanceira,
          b.valorLiquidoItem valorContabil,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorAcrescimoExtempTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.valorICMSST,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.valorICMSEfetivo,
          b.valorICMSUFDestinatario,
          b.valorICMSUFRemetente,
          b.valorFCP,
          b.valorFCPST,
          b.valorFCPSTAnteriormente,
          b.valorFCPUFDestinatario,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorCustoOperacao,
          b.valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MOPREDOCUMXITENS b
        JOIN MOPREDOCUMENTOS cab
        ON cab.preDocumento = b.preDocumento
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = cab.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        WHERE cab.fatoContabil = a.fatoContabil
        AND b.cancelado = 0
        AND cab.statusPreDocumento <> 'C'
        UNION ALL
        SELECT
          'MOFINANCEIROS' tabelaSistema,
          b.idFinanceiro idTabelaSistema,
          200 origemContabil,
          b.idFinanceiro idDocumento,
          b.dataEmissao data,
          b.fatoContabil,
          b.estabelecimento,
          b.pessoa,
          b.documento,
          COALESCE (RTRIM (SUBSTR (b.complemento, 1, 120)), ' ') complemento,
          0 documentoAberto,
          0 produto,
          b.contaFinanceira,
          b.carteiraFinanceira,
          b.valor valorContabil,
          0 valorFreteTotal,
          0 valorSeguroTotal,
          0 valorDescontoTotal,
          0 valorOutrasDespesasTotal,
          0 valorAdicFreteMarinhaMerTotal,
          0 valorDespesasAduaneirasTotal,
          0 valorDescontoCustoOpTotal,
          0 valorAcrescimoCustoOpTotal,
          0 valorAcrescimoExtempTotal,
          0 retidoISSQN,
          0 valorISSQN,
          0 valorRetIRRF,
          0 valorRetINSS,
          0 valorRetPIS,
          0 valorRetCOFINS,
          0 valorRetCSLL,
          0 valorRetOutros,
          0 valorII,
          0 valorIOF,
          0 valorIPI,
          0 valorIPIDevolucao,
          0 valorPIS,
          0 valorPISST,
          0 valorCOFINS,
          0 valorCOFINSST,
          0 valorCreditoSimplesNacional,
          0 valorICMSOperacao,
          0 valorICMSDiferido,
          0 valorICMS,
          0 valorICMSDesoneracao,
          0 valorICMSST,
          0 valorICMSSTAnteriormente,
          0 valorICMSProprioSubstituto,
          0 valorICMSEfetivo,
          0 valorICMSUFDestinatario,
          0 valorICMSUFRemetente,
          0 valorFCP,
          0 valorFCPST,
          0 valorFCPSTAnteriormente,
          0 valorFCPUFDestinatario,
          0 valorEstimadoImpFederais,
          0 valorEstimadoImpEstaduais,
          0 valorEstimadoImpMunicipais,
          0 valorCustoOperacao,
          0 valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MOFINANCEIROS b
        WHERE b.fatoContabil = a.fatoContabil
        AND b.idPagamentoPreDocumento = 0
        AND b.idPagamentoDocFiscal = 0
        UNION ALL
        SELECT
          'MOFINANCEIROXBAIXAS' tabelaSistema,
          b.idBaixaFinanceiro idTabelaSistema,
          300 origemContabil,
          b.idBaixaFinanceiro idDocumento,
          b.data,
          b.fatoContabil,
          b.estabelecimento,
          financ.pessoa,
          financ.documento,
          COALESCE (RTRIM (SUBSTR (b.observacoes, 1, 120)), ' ') complemento,
          0 documentoAberto,
          0 produto,
          b.contaFinanceira,
          b.carteiraFinanceira,
          b.valorLiquido valorContabil,
          0 valorFreteTotal,
          0 valorSeguroTotal,
          0 valorDescontoTotal,
          0 valorOutrasDespesasTotal,
          0 valorAdicFreteMarinhaMerTotal,
          0 valorDespesasAduaneirasTotal,
          0 valorDescontoCustoOpTotal,
          0 valorAcrescimoCustoOpTotal,
          0 valorAcrescimoExtempTotal,
          0 retidoISSQN,
          0 valorISSQN,
          0 valorRetIRRF,
          0 valorRetINSS,
          0 valorRetPIS,
          0 valorRetCOFINS,
          0 valorRetCSLL,
          0 valorRetOutros,
          0 valorII,
          0 valorIOF,
          0 valorIPI,
          0 valorIPIDevolucao,
          0 valorPIS,
          0 valorPISST,
          0 valorCOFINS,
          0 valorCOFINSST,
          0 valorCreditoSimplesNacional,
          0 valorICMSOperacao,
          0 valorICMSDiferido,
          0 valorICMS,
          0 valorICMSDesoneracao,
          0 valorICMSST,
          0 valorICMSSTAnteriormente,
          0 valorICMSProprioSubstituto,
          0 valorICMSEfetivo,
          0 valorICMSUFDestinatario,
          0 valorICMSUFRemetente,
          0 valorFCP,
          0 valorFCPST,
          0 valorFCPSTAnteriormente,
          0 valorFCPUFDestinatario,
          0 valorEstimadoImpFederais,
          0 valorEstimadoImpEstaduais,
          0 valorEstimadoImpMunicipais,
          0 valorCustoOperacao,
          0 valorCMV,
          b.valorVariacaoIndexador baixa_valorVariacaoIndexador,
          b.valorJurosDeMora baixa_valorJurosDeMora,
          b.valorMulta baixa_valorMulta,
          b.valorTarifaCartao baixa_valorTarifaCartao,
          b.valorDescontos baixa_valorDescontos,
          b.valorOutrosAcrescimos baixa_valorOutrosAcrescimos
        FROM MOFINANCEIROXBAIXAS b
        JOIN MOFINANCEIROS financ
        ON financ.idFinanceiro = b.idFinanceiro
        WHERE b.fatoContabil = a.fatoContabil
        AND b.baixaAutomatica = 0)
      LOOP
        SELECT COALESCE (MAX (c.idRegraContabilizacao), 0)
        INTO v_idRegraContabilizacao
        FROM (
          SELECT
            c.idRegraContabilizacao,
            ROW_NUMBER() OVER (
              ORDER BY
                c.ordenacao,
                c.idRegraContabilizacao) ordenacao
          FROM (
            SELECT
              c.idRegraContabilizacao,
              c.ordenacao,
              c.id,
              MIN (c.valido) valido
            FROM (
              SELECT
                c.idRegraContabilizacao,
                c.ordenacao,
                c.id,
                c.filtroContabil,
                MAX (c.valido) valido
              FROM (
                SELECT
                  regra.idRegraContabilizacao,
                  regra.ordenacao,
                  COALESCE (regraXFiltro.id, 0) id,
                  COALESCE (regraXFiltro.filtroContabil, 0) filtroContabil,
                  CASE
                    WHEN regraXFiltro.filtroContabil IS NULL
                    THEN 1
                    WHEN filtro.campoSelect IS NULL
                      OR filtro.campoSelect = ' '
                    THEN 0
                    ELSE FUNC_ADD_EXECUTE_IMMEDIATE_N ('SELECT
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM PAREGRACONTABXFILTROS regraXFiltro
        LEFT JOIN SIFILTROSCONTABEIS filtro
        ON filtro.filtroContabil = regraXFiltro.filtroContabil
        LEFT JOIN SITABELASSISTEMA tabelaSistema
        ON tabelaSistema.tabelaSistema = filtro.tabelaSistema'
  || CASE b.tabelaSistema
       WHEN 'MODOCFISCALXITENS'
       THEN '
        JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = ' || TO_CHAR (b.idTabelaSistema) || CASE WHEN filtro.cabecalhoItemPagamento = 'C' THEN '
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal' ELSE '' END
       WHEN 'MOPREDOCUMXITENS'
       THEN '
        JOIN MOPREDOCUMXITENS itemDoc
        ON itemDoc.idItemPreDocumento = ' || TO_CHAR (b.idTabelaSistema) || CASE WHEN filtro.cabecalhoItemPagamento = 'C' THEN '
        JOIN MOPREDOCUMENTOS cabDoc
        ON cabDoc.preDocumento = itemDoc.preDocumento' ELSE '' END
       WHEN 'MOFINANCEIROS'
       THEN '
        JOIN MOFINANCEIROS financ
        ON financ.idFinanceiro = ' || TO_CHAR (b.idTabelaSistema)
       WHEN 'MOFINANCEIROXBAIXAS'
       THEN '
        JOIN MOFINANCEIROXBAIXAS baixa
        ON baixa.idBaixaFinanceiro = ' || TO_CHAR (b.idTabelaSistema)
       ELSE ''
     END
  || CASE
       WHEN filtro.campoJoin IS NULL OR filtro.campoJoin = ' '
       THEN ''
       ELSE '
       ' || filtro.campoJoin
     END
  || '
        WHERE regraXFiltro.id = ' || TO_CHAR (regraXFiltro.id) || '
        AND (' || filtro.campoSelect || ') '
                      || CASE
                           WHEN filtro.tabelaSistema <> ' '
                           THEN 'IN ('
                             || CAST (regraXFiltro.campoIn AS VARCHAR2 (4000))
                             || ')'
                           WHEN filtro.tipoCampo = 'L'
                           THEN '= '
                             || CASE
                                  WHEN regraXFiltro.faixaDe IN ('S','1')
                                  THEN '1'
                                  ELSE '0'
                                END
                           WHEN filtro.tipoCampo = 'N'
                           THEN 'BETWEEN '
                             || CASE
                                  WHEN regraXFiltro.faixaDe = ' '
                                  THEN '0'
                                  ELSE REPLACE (regraXFiltro.faixaDe,',','.')
                                END
                             || ' AND '
                             || CASE
                                  WHEN regraXFiltro.faixaAte = ' '
                                  THEN '0'
                                  ELSE REPLACE (regraXFiltro.faixaAte,',','.')
                                END
                           ELSE 'BETWEEN '
                             || regraXFiltro.faixaDe
                             || ' AND '
                             || regraXFiltro.faixaAte
                         END || ')
      THEN 1
      ELSE 0
    END
  FROM DUAL')
                  END valido
                FROM PAREGRASCONTABILIZACAO regra
                JOIN PAESTABELECIMENTOS estab
                ON estab.estabelecimento = b.estabelecimento
                LEFT JOIN PAREGRACONTABXFILTROS regraXFiltro
                ON regraXFiltro.idRegraContabilizacao = regra.idRegraContabilizacao
                LEFT JOIN SIFILTROSCONTABEIS filtro
                ON filtro.filtroContabil = regraXFiltro.filtroContabil
                LEFT JOIN SITABELASSISTEMA tabelaSistema
                ON tabelaSistema.tabelaSistema = filtro.tabelaSistema
                WHERE regra.idRegraContabilizacao > 0
                AND regra.idPlanoContaContabil = estab.idPlanoContaContabil
                AND regra.origemContabil = CASE WHEN b.origemContabil = 101 THEN 100 ELSE b.origemContabil END
                AND regra.ativo = 1
                AND TRUNC (regra.dataValidadeInicial) <= TRUNC (SYSDATE)
                AND TRUNC (regra.dataValidadeFinal) >= TRUNC (SYSDATE)) c
              GROUP BY
                c.idRegraContabilizacao,
                c.ordenacao,
                c.id,
                c.filtroContabil) c
            GROUP BY
              c.idRegraContabilizacao,
              c.ordenacao,
              c.id) c
          WHERE c.valido = 1) c
        WHERE c.ordenacao = 1;
        SELECT
          idPlanoContaContabil,
          tipoAglutinacaoContabil
        INTO
          v_idPlanoContaContabil,
          v_tipoAglutinacaoContabil
        FROM PAREGRASCONTABILIZACAO
        WHERE idRegraContabilizacao = v_idRegraContabilizacao;
        FOR c IN (
          SELECT
            c.linhaContabil,
            c.debitoCredito,
            c.tipoContabilizacao,
            c.categoriaContabil,
            c.idContaContabil,
            c.valor,
            c.historicoContabil
          FROM (
            SELECT
              c.linhaContabil,
              c.debitoCredito,
              c.tipoContabilizacao,
              c.categoriaContabil,
              c.idContaContabil,
              CASE c.linhaContabil
                -- 110 Valor Frete
                WHEN 110 THEN b.valorFreteTotal
                -- 111 Valor Seguro
                WHEN 111 THEN b.valorSeguroTotal
                -- 112 Valor Desconto
                WHEN 112 THEN b.valorDescontoTotal
                -- 113 Valor Outras Despesas
                WHEN 113 THEN b.valorOutrasDespesasTotal
                -- 114 Valor Adicional Frete Marinha Mercantil
                WHEN 114 THEN b.valorAdicFreteMarinhaMerTotal
                -- 115 Valor Despesas Aduaneiras
                WHEN 115 THEN b.valorDespesasAduaneirasTotal
                -- 116 Valor Outros Descontos Custo
                WHEN 116 THEN b.valorDescontoCustoOpTotal
                -- 117 Valor Outros Acréscimos Custo
                WHEN 117 THEN b.valorAcrescimoCustoOpTotal
                -- 118 Valor Acréscimo Extemporâneo
                WHEN 118 THEN b.valorAcrescimoExtempTotal
                -- 130 Valor ISSQN
                WHEN 130 THEN
                  CASE
                    WHEN b.retidoISSQN = 1
                    THEN 0
                    ELSE b.valorISSQN
                  END
                -- 131 Valor ISSQN Retido
                WHEN 131 THEN
                  CASE
                    WHEN b.retidoISSQN = 1
                    THEN b.valorISSQN
                    ELSE 0
                  END
                -- 132 Valor Retenção IRRF
                WHEN 132 THEN b.valorRetIRRF
                -- 133 Valor Retenção INSS
                WHEN 133 THEN b.valorRetINSS
                -- 134 Valor Retenção PIS
                WHEN 134 THEN b.valorRetPIS
                -- 135 Valor Retenção COFINS
                WHEN 135 THEN b.valorRetCOFINS
                -- 136 Valor Retenção CSLL
                WHEN 136 THEN b.valorRetCSLL
                -- 137 Valor Retenção Outros
                WHEN 137 THEN b.valorRetOutros
                -- 140 Valor Imposto Importação
                WHEN 140 THEN b.valorII
                -- 141 Valor IOF
                WHEN 141 THEN b.valorIOF
                -- 142 Valor IPI
                WHEN 142 THEN b.valorIPI
                -- 143 Valor IPI Devolução
                WHEN 143 THEN b.valorIPIDevolucao
                -- 144 Valor PIS
                WHEN 144 THEN b.valorPIS
                -- 145 Valor PIS ST
                WHEN 145 THEN b.valorPISST
                -- 146 Valor COFINS
                WHEN 146 THEN b.valorCOFINS
                -- 147 Valor COFINS ST
                WHEN 147 THEN b.valorCOFINSST
                -- 148 Valor Crédito Simples Nacional
                WHEN 148 THEN b.valorCreditoSimplesNacional
                -- 160 Valor ICMS Operação
                WHEN 160 THEN b.valorICMSOperacao
                -- 161 Valor ICMS Diferido
                WHEN 161 THEN b.valorICMSDiferido
                -- 162 Valor ICMS
                WHEN 162 THEN b.valorICMS
                -- 163 Valor ICMS Desoneração
                WHEN 163 THEN b.valorICMSDesoneracao
                -- 164 Valor ICMS ST
                WHEN 164 THEN b.valorICMSST
                -- 165 Valor ICMS ST Anteriormente
                WHEN 165 THEN b.valorICMSSTAnteriormente
                -- 166 Valor ICMS Próprio Substituto
                WHEN 166 THEN b.valorICMSProprioSubstituto
                -- 167 Valor ICMS Efetivo
                WHEN 167 THEN b.valorICMSEfetivo
                -- 168 Valor ICMS UF Destinatario
                WHEN 168 THEN b.valorICMSUFDestinatario
                -- 169 Valor ICMS UF Remetente
                WHEN 169 THEN b.valorICMSUFRemetente
                -- 180 Valor FCP
                WHEN 180 THEN b.valorFCP
                -- 181 Valor FCP ST
                WHEN 181 THEN b.valorFCPST
                -- 182 Valor FCP ST Anteriormente
                WHEN 182 THEN b.valorFCPSTAnteriormente
                -- 183 Valor FCP UF Destinatario
                WHEN 183 THEN b.valorFCPUFDestinatario
                -- 187 Valor Estimado Impostos Federais
                WHEN 187 THEN b.valorEstimadoImpFederais
                -- 188 Valor Estimado Impostos Estaduais
                WHEN 188 THEN b.valorEstimadoImpEstaduais
                -- 189 Valor Estimado Impostos Municipais
                WHEN 189 THEN b.valorEstimadoImpMunicipais
                -- 190 Valor Custo Operação
                WHEN 190 THEN b.valorCustoOperacao
                -- 191 Valor CMV
                WHEN 191 THEN b.valorCMV
                -- 301 Valor Variação Indexador Redução
                WHEN 301 THEN
                  CASE
                    WHEN b.baixa_valorVariacaoIndexador < 0
                    THEN - b.baixa_valorVariacaoIndexador
                    ELSE 0
                  END
                -- 302 Valor Variação Indexador Acréscimo
                WHEN 302 THEN
                  CASE
                    WHEN b.baixa_valorVariacaoIndexador > 0
                    THEN b.baixa_valorVariacaoIndexador
                    ELSE 0
                  END
                -- 303 Valor Juros de Mora
                WHEN 303 THEN b.baixa_valorJurosDeMora
                -- 304 Valor Multa
                WHEN 304 THEN b.baixa_valorMulta
                -- 305 Valor Tarifa Cartão
                WHEN 305 THEN b.baixa_valorTarifaCartao
                -- 306 Valor Descontos
                WHEN 306 THEN b.baixa_valorDescontos
                -- 307 Valor Outros Acréscimos
                WHEN 307 THEN b.baixa_valorOutrosAcrescimos
                -- 100 Valor Contábil
                -- 200 Valor Contábil
                -- 300 Valor Contábil
                ELSE b.valorContabil + COALESCE ((
                  SELECT SUM (
                    CASE d.linhaContabil
                      -- 110 Valor Frete
                      WHEN 110 THEN b.valorFreteTotal
                      -- 111 Valor Seguro
                      WHEN 111 THEN b.valorSeguroTotal
                      -- 112 Valor Desconto
                      WHEN 112 THEN b.valorDescontoTotal
                      -- 113 Valor Outras Despesas
                      WHEN 113 THEN b.valorOutrasDespesasTotal
                      -- 114 Valor Adicional Frete Marinha Mercantil
                      WHEN 114 THEN b.valorAdicFreteMarinhaMerTotal
                      -- 115 Valor Despesas Aduaneiras
                      WHEN 115 THEN b.valorDespesasAduaneirasTotal
                      -- 116 Valor Outros Descontos Custo
                      WHEN 116 THEN b.valorDescontoCustoOpTotal
                      -- 117 Valor Outros Acréscimos Custo
                      WHEN 117 THEN b.valorAcrescimoCustoOpTotal
                      -- 118 Valor Acréscimo Extemporâneo
                      WHEN 118 THEN b.valorAcrescimoExtempTotal
                      -- 130 Valor ISSQN
                      WHEN 130 THEN
                        CASE
                          WHEN b.retidoISSQN = 1
                          THEN 0
                          ELSE b.valorISSQN
                        END
                      -- 131 Valor ISSQN Retido
                      WHEN 131 THEN
                        CASE
                          WHEN b.retidoISSQN = 1
                          THEN b.valorISSQN
                          ELSE 0
                        END
                      -- 132 Valor Retenção IRRF
                      WHEN 132 THEN b.valorRetIRRF
                      -- 133 Valor Retenção INSS
                      WHEN 133 THEN b.valorRetINSS
                      -- 134 Valor Retenção PIS
                      WHEN 134 THEN b.valorRetPIS
                      -- 135 Valor Retenção COFINS
                      WHEN 135 THEN b.valorRetCOFINS
                      -- 136 Valor Retenção CSLL
                      WHEN 136 THEN b.valorRetCSLL
                      -- 137 Valor Retenção Outros
                      WHEN 137 THEN b.valorRetOutros
                      -- 140 Valor Imposto Importação
                      WHEN 140 THEN b.valorII
                      -- 141 Valor IOF
                      WHEN 141 THEN b.valorIOF
                      -- 142 Valor IPI
                      WHEN 142 THEN b.valorIPI
                      -- 143 Valor IPI Devolução
                      WHEN 143 THEN b.valorIPIDevolucao
                      -- 144 Valor PIS
                      WHEN 144 THEN b.valorPIS
                      -- 145 Valor PIS ST
                      WHEN 145 THEN b.valorPISST
                      -- 146 Valor COFINS
                      WHEN 146 THEN b.valorCOFINS
                      -- 147 Valor COFINS ST
                      WHEN 147 THEN b.valorCOFINSST
                      -- 148 Valor Crédito Simples Nacional
                      WHEN 148 THEN b.valorCreditoSimplesNacional
                      -- 160 Valor ICMS Operação
                      WHEN 160 THEN b.valorICMSOperacao
                      -- 161 Valor ICMS Diferido
                      WHEN 161 THEN b.valorICMSDiferido
                      -- 162 Valor ICMS
                      WHEN 162 THEN b.valorICMS
                      -- 163 Valor ICMS Desoneração
                      WHEN 163 THEN b.valorICMSDesoneracao
                      -- 164 Valor ICMS ST
                      WHEN 164 THEN b.valorICMSST
                      -- 165 Valor ICMS ST Anteriormente
                      WHEN 165 THEN b.valorICMSSTAnteriormente
                      -- 166 Valor ICMS Próprio Substituto
                      WHEN 166 THEN b.valorICMSProprioSubstituto
                      -- 167 Valor ICMS Efetivo
                      WHEN 167 THEN b.valorICMSEfetivo
                      -- 168 Valor ICMS UF Destinatario
                      WHEN 168 THEN b.valorICMSUFDestinatario
                      -- 169 Valor ICMS UF Remetente
                      WHEN 169 THEN b.valorICMSUFRemetente
                      -- 180 Valor FCP
                      WHEN 180 THEN b.valorFCP
                      -- 181 Valor FCP ST
                      WHEN 181 THEN b.valorFCPST
                      -- 182 Valor FCP ST Anteriormente
                      WHEN 182 THEN b.valorFCPSTAnteriormente
                      -- 183 Valor FCP UF Destinatario
                      WHEN 183 THEN b.valorFCPUFDestinatario
                      -- 187 Valor Estimado Impostos Federais
                      WHEN 187 THEN b.valorEstimadoImpFederais
                      -- 188 Valor Estimado Impostos Estaduais
                      WHEN 188 THEN b.valorEstimadoImpEstaduais
                      -- 189 Valor Estimado Impostos Municipais
                      WHEN 189 THEN b.valorEstimadoImpMunicipais
                      -- 190 Valor Custo Operação
                      WHEN 190 THEN b.valorCustoOperacao
                      -- 191 Valor CMV
                      WHEN 191 THEN b.valorCMV
                      -- 301 Valor Variação Indexador Redução
                      WHEN 301 THEN
                        CASE
                          WHEN b.baixa_valorVariacaoIndexador < 0
                          THEN - b.baixa_valorVariacaoIndexador
                          ELSE 0
                        END
                      -- 302 Valor Variação Indexador Acréscimo
                      WHEN 302 THEN
                        CASE
                          WHEN b.baixa_valorVariacaoIndexador > 0
                          THEN b.baixa_valorVariacaoIndexador
                          ELSE 0
                        END
                      -- 303 Valor Juros de Mora
                      WHEN 303 THEN b.baixa_valorJurosDeMora
                      -- 304 Valor Multa
                      WHEN 304 THEN b.baixa_valorMulta
                      -- 305 Valor Tarifa Cartão
                      WHEN 305 THEN b.baixa_valorTarifaCartao
                      -- 306 Valor Descontos
                      WHEN 306 THEN b.baixa_valorDescontos
                      -- 307 Valor Outros Acréscimos
                      WHEN 307 THEN b.baixa_valorOutrosAcrescimos
                      -- 100 Valor Contábil
                      -- 200 Valor Contábil
                      -- 300 Valor Contábil
                      ELSE b.valorContabil
                    END
                    * CASE
                        WHEN c.debitoCredito = 'D'
                          AND d.tipoContabilizacaoDebito = '90'
                          OR c.debitoCredito = 'C'
                          AND d.tipoContabilizacaoCredito = '90'
                        THEN -1
                        ELSE 1
                      END)
                  FROM PAREGRACONTABXLINHAS d
                  WHERE d.idRegraContabilizacao = v_idRegraContabilizacao
                  AND (c.debitoCredito = 'D'
                    AND d.tipoContabilizacaoDebito IN (90,91)
                    OR c.debitoCredito = 'C'
                    AND d.tipoContabilizacaoCredito IN (90,91))), 0)
              END valor,
              c.historicoContabil 
            FROM (
              SELECT
                c.linhaContabil,
                'D' debitoCredito,
                c.tipoContabilizacaoDebito tipoContabilizacao,
                c.idContaContabilDebito idContaContabil,
                c.categoriaContabilDebito categoriaContabil,
                c.historicoContabil
                FROM PAREGRACONTABXLINHAS c
                WHERE c.idRegraContabilizacao = v_idRegraContabilizacao
                AND c.tipoContabilizacaoDebito IN (1,10,20,40,50)
              UNION ALL
              SELECT
                c.linhaContabil,
                'C' debitoCredito,
                c.tipoContabilizacaoCredito tipoContabilizacao,
                c.idContaContabilCredito idContaContabil,
                c.categoriaContabilCredito categoriaContabil,
                c.historicoContabil
                FROM PAREGRACONTABXLINHAS c
                WHERE c.idRegraContabilizacao = v_idRegraContabilizacao
                AND c.tipoContabilizacaoCredito IN (1,10,20,40,50)) c) c
          WHERE c.valor <> 0)
        LOOP
          IF b.origemContabil = 100
            AND c.tipoContabilizacao IN (40,50)
            AND b.valorContabil <> 0
          THEN
            v_valor   := 0;
            v_residuo := 0;
            v_saldo   := c.valor;
            FOR d IN (
              SELECT
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END contaFinanceira,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END carteiraFinanceira,
                SUM (financ.valor *
                  CASE
                    WHEN pag.pagamentoTroco = 'T'
                    THEN -1
                    ELSE 1
                  END) valor
              FROM MODOCFISCALXPAGAMENTOS pag
              JOIN MOFINANCEIROS financ
              ON financ.idPagamentoDocFiscal = pag.idPagamentoDocFiscal
              WHERE pag.idDocumentoFiscal = b.idDocumento
              GROUP BY
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END)
            LOOP
              v_valor   := ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_residuo := ((c.valor * d.valor / b.valorContabil) + v_residuo)
                  - ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_saldo   := v_saldo - v_valor;
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = d.contaFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACONTAFINANCEIRAXCONTAB conta
                      WHERE conta.contaFinanceira = d.contaFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                  -- 50 Carteira Financeira
                  ELSE COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACARTFINANCXCONTASCONTAB conta
                      WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                END, -- idContaContabil
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_valor);
            END LOOP;
            IF v_saldo <> 0 THEN
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                c.idContaContabil,
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_saldo);
            END IF;
          ELSIF b.origemContabil = 101
            AND c.tipoContabilizacao IN (40,50)
          THEN
            v_valor   := 0;
            v_residuo := 0;
            v_saldo   := c.valor;
            FOR d IN (
              SELECT
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END contaFinanceira,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END carteiraFinanceira,
                SUM (financ.valor *
                  CASE
                    WHEN pag.pagamentoTroco = 'T'
                    THEN -1
                    ELSE 1
                  END) valor
              FROM MOPREDOCUMXPAGAMENTOS pag
              JOIN MOFINANCEIROS financ
              ON financ.idPagamentoPreDocumento = pag.idPagamentoPreDocumento
              WHERE pag.preDocumento = b.idDocumento
              GROUP BY
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END)
            LOOP
              v_valor   := ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_residuo := ((c.valor * d.valor / b.valorContabil) + v_residuo)
                  - ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_saldo   := v_saldo - v_valor;
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = d.contaFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACONTAFINANCEIRAXCONTAB conta
                      WHERE conta.contaFinanceira = d.contaFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                  -- 50 Carteira Financeira
                  ELSE COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACARTFINANCXCONTASCONTAB conta
                      WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                END, -- idContaContabil
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_valor);
            END LOOP;
            IF v_saldo <> 0 THEN
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                c.idContaContabil,
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_saldo);
            END IF;
          ELSE
            v_idCriar := v_idCriar + 1;
            INSERT INTO TEMPCONTABILANALITICO (
              sessaoClient,
              contadorSessao,
              id,
              debitoCredito,
              idContaContabil,
              historicoContabil,
              linhaContabil,
              quebra,
              origemContabil,
              idDocumento,
              data,
              fatoContabil,
              estabelecimento,
              pessoa,
              documento,
              complemento,
              documentoAberto,
              valor)
            VALUES (
              p_sessaoClient,
              p_contadorSessao,
              v_idCriar,
              c.debitoCredito,
              CASE c.tipoContabilizacao
                -- 1 Conta Contábil
                WHEN 1 THEN c.idContaContabil
                -- 10 Pessoa
                WHEN 10 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM CAPESSOAXCONTASCONTABEIS conta
                  WHERE conta.pessoa = b.pessoa
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM CAPESSOAXCONTASCONTABEIS conta
                    WHERE conta.pessoa = b.pessoa
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 20 Produto
                WHEN 20 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM CAPRODUTOXCONTASCONTABEIS conta
                  WHERE conta.produto = b.produto
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM CAPRODUTOXCONTASCONTABEIS conta
                    WHERE conta.produto = b.produto
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 40 Conta Financeira
                WHEN 40 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM PACONTAFINANCEIRAXCONTAB conta
                  WHERE conta.contaFinanceira = b.contaFinanceira
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = b.contaFinanceira
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 50 Carteira Financeira
                WHEN 50 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM PACARTFINANCXCONTASCONTAB conta
                  WHERE conta.carteiraFinanceira = b.carteiraFinanceira
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = b.carteiraFinanceira
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 90 Diminuir Valor Contábil
                -- 91 Somar Valor Contábil
                ELSE 0
              END, -- idContaContabil
              c.historicoContabil,
              c.linhaContabil,
              CASE v_tipoAglutinacaoContabil
                -- 2	Dia
                WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                -- 3	Mês
                WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                -- 1	Fato Contábil
                ELSE '1' || LPAD (b.fatoContabil, 14, '0')
              END, -- quebra
              b.origemContabil,
              b.idDocumento,
              b.data,
              b.fatoContabil,
              b.estabelecimento,
              b.pessoa,
              b.documento,
              b.complemento,
              b.documentoAberto,
              c.valor);
          END IF;
        END LOOP;
      END LOOP;
    END LOOP;
    -- Fim Gera TEMPCONTABILANALITICO
    -- Início Gera TEMPCONTABILSINTETICO
    v_idCriar := 0;
    FOR a IN (
      SELECT
        a.quebra,
        a.debitoCredito,
        a.idContaContabil,
        a.historicoContabil,
        a.linhaContabil,
        a.origemContabil,
        a.idDocumento,
        a.data,
        a.fatoContabil,
        a.estabelecimento,
        a.pessoa,
        a.documento,
        a.complemento,
        a.documentoAberto,
        a.valor,
        pess.nomeRazaoSocial,
        hist.descricaoMontada
      FROM (
        SELECT
          quebra,
          origemContabil,
          debitoCredito,
          idContaContabil,
          historicoContabil,
          MIN (linhaContabil) linhaContabil,
          MIN (idDocumento) idDocumento,
          MIN (data) data,
          MIN (fatoContabil) fatoContabil,
          MIN (estabelecimento) estabelecimento,
          MIN (pessoa) pessoa,
          MIN (documento) documento,
          MIN (complemento) complemento,
          MAX (documentoAberto) documentoAberto,
          SUM (valor) valor
        FROM TEMPCONTABILANALITICO
        WHERE sessaoClient = p_sessaoClient
        AND contadorSessao = p_contadorSessao
        GROUP BY
          quebra,
          origemContabil,
          debitoCredito,
          idContaContabil,
          historicoContabil) a
      JOIN CAPESSOAS pess
      ON pess.pessoa = a.pessoa
      JOIN PAHISTORICOSCONTABEIS hist
      ON hist.historicoContabil = a.historicoContabil
      ORDER BY
        a.quebra,
        a.linhaContabil,
        a.valor,
        a.debitoCredito DESC,
        a.idContaContabil,
        a.historicoContabil)
    LOOP
      IF a.debitoCredito = 'D' THEN
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = a.quebra
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.debitar = 0;
      ELSE
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = a.quebra
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.creditar = 0;
      END IF;
      IF v_idAtualizar = 0 THEN
        v_idCriar := v_idCriar + 1;
        INSERT INTO TEMPCONTABILSINTETICO (
          sessaoClient,
          contadorSessao,
          id,
          quebra,
          fato,
          sequencia,
          selecionado,
          estabelecimento,
          estabelecimentoCodigoDescricao,
          idPlanoContaContabil,
          data,
          pessoa,
          pessoaCodigoDescricao,
          documento,
          fatoContabil,
          debitar,
          debitoIdContabil,
          debitoIdContaContabil,
          debitoReduzido,
          debitoCodigoDescricao,
          creditar,
          creditoIdContabil,
          creditoIdContaContabil,
          creditoReduzido,
          creditoCodigoDescricao,
          valor,
          historicoContabil,
          complemento,
          historicoMontado,
          origemContabil,
          idDocumento,
          documentoAberto,
          erroDebito,
          erroCredito,
          erroHistorico,
          erroValor,
          erroGeral)
        VALUES (
          p_sessaoClient,
          p_contadorSessao,
          v_idCriar, -- id
          a.quebra,
          0, -- fato
          0, -- sequencia
          1, -- selecionado
          a.estabelecimento,
          ' ', -- estabelecimentoCodigoDescricao
          0, -- idPlanoContaContabil
          a.data,
          a.pessoa,
          ' ', -- pessoaCodigoDescricao
          a.documento,
          a.fatoContabil,
          CASE
            WHEN a.debitoCredito = 'D'
            THEN 1
            ELSE 0
          END, -- debitar
          0, -- debitoIdContabil
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContaContabil
            ELSE 0
          END, -- debitoIdContaContabil
          0, -- debitoReduzido
          ' ', -- debitoCodigoDescricao
          CASE
            WHEN a.debitoCredito = 'C'
            THEN 1
            ELSE 0
          END, -- creditar
          0, -- creditoIdContabil
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContaContabil
            ELSE 0
          END, -- creditoIdContaContabil
          0, -- creditoReduzido
          ' ', -- creditoCodigoDescricao
          a.valor,
          a.historicoContabil,
          a.complemento,
          REPLACE (
            REPLACE (
              REPLACE (
                REPLACE (
                  a.descricaoMontada,
                  '@DATA', COALESCE (TO_CHAR (a.data, 'DD/MM/YYYY'), '00/00/0000')),
                '@PESSOA',
                  CASE
                    WHEN a.pessoa = 0
                    THEN 'CONSUMIDOR FINAL'
                    ELSE a.nomeRazaoSocial
                  END),
              '@DOCUMENTO', a.documento),
            '@COMPLEMENTO', a.complemento), -- descricaoHistorico
          a.origemContabil,
          a.idDocumento,
          a.documentoAberto,
          ' ',
          ' ',
          ' ',
          ' ',
          ' ');
      ELSIF a.debitoCredito = 'D' THEN
        UPDATE TEMPCONTABILSINTETICO b SET
          b.debitar = 1,
          b.debitoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      ELSE
        UPDATE TEMPCONTABILSINTETICO b SET
          b.creditar = 1,
          b.creditoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      END IF;
    END LOOP;
  END IF;
  v_quebra    := ' ';
  v_fato      := 0;
  v_sequencia := 0;
  FOR a IN (
    SELECT
      a.id,
      a.quebra,
      CASE
        WHEN a.estabelecimento = 0
        THEN ' '
        ELSE COALESCE (estab.descricao, ' ')
      END estabelecimentoCodigoDescricao,
      estab.idPlanoContaContabil,
      CASE
        WHEN a.pessoa = 0
        THEN ' '
        ELSE COALESCE (pess.nomeRazaoSocial, ' ')
      END pessoaCodigoDescricao,
      CASE
        WHEN a.debitar = 0
          OR a.debitoIdContaContabil = 0
        THEN 0
        ELSE COALESCE (contDeb.reduzido, 0)
      END debitoReduzido,
      CASE
        WHEN a.debitar = 0
          OR a.debitoIdContaContabil = 0
        THEN ' '
        ELSE COALESCE (contDeb.contaEstruturada, ' ')
          || ' - '
          || COALESCE (contDeb.descricao, ' ')
      END debitoCodigoDescricao,
      CASE
        WHEN a.creditar = 0
          OR a.creditoIdContaContabil = 0
          THEN 0
          ELSE COALESCE (contCred.reduzido, 0)
      END creditoReduzido,
      CASE
        WHEN a.creditar = 0
          OR a.creditoIdContaContabil = 0
        THEN ' '
        ELSE COALESCE (contCred.contaEstruturada, ' ')
          || ' - '
          || COALESCE (contCred.descricao, ' ')
      END creditoCodigoDescricao
    FROM TEMPCONTABILSINTETICO a
    JOIN PAESTABELECIMENTOS estab
    ON estab.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    JOIN PACONTASCONTABEIS contDeb
    ON contDeb.idContaContabil = a.debitoIdContaContabil
    JOIN PACONTASCONTABEIS contCred
    ON contCred.idContaContabil = a.creditoIdContaContabil
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    ORDER BY
      a.quebra,
      a.id)
  LOOP
    IF v_quebra <> a.quebra THEN
      v_fato      := v_fato + 1;
      v_sequencia := 0;
      v_quebra    := a.quebra;
    END IF;
    v_sequencia := v_sequencia + 1;
    UPDATE TEMPCONTABILSINTETICO b SET
      b.fato = v_fato,
      b.sequencia = v_sequencia,
      b.estabelecimentoCodigoDescricao = a.estabelecimentoCodigoDescricao,
      b.idPlanoContaContabil = a.idPlanoContaContabil,
      b.pessoaCodigoDescricao = a.pessoaCodigoDescricao,
      b.debitoReduzido = a.debitoReduzido,
      b.debitoCodigoDescricao = a.debitoCodigoDescricao,
      b.creditoReduzido = a.creditoReduzido,
      b.creditoCodigoDescricao = a.creditoCodigoDescricao
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.id = a.id;
  END LOOP;
  IF p_situacaoContabilizacao <> 'C' THEN
    -- Fim Gera TEMPCONTABILSINTETICO
    ADD_TEMPCONTABIL_VERIFICA_ERRO (
      p_sessaoClient,
      p_contadorSessao,
      0); -- p_fato
  END IF;
END ADD_TEMPCONTABIL_GERA_TEMP;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_ITEM (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemDocTransferencia    IN NUMBER,
  /* Retornos */
  p_bufferIdReservaEstoque    IN VARCHAR2,
  r_bufferIdReservaEstoque    OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
    p_idItemDocTransferencia,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimentoSaida,
      cab.estabelecimentoEntrada,
      cab.dataEmissao,
      cab.tipoDocumentoSaida,
      cab.tipoDocumentoEntrada,
      cab.situacaoDocTransferencia,
      modDoc.movimentaEstoque,
      item.idItemDocTransferencia,
      item.cancelado,
      item.validoSaida,
      item.validoEntrada,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidadeSaldo,
      item.observacoes,
      gradProd.produto,
      prod.controleEstoque,
      prod.controlaNumeroSerie,
      locEstSaida.indicadorPropriedadePosseItem locEstSaida_indicProprPosseI,
      locEstEntrada.indicadorPropriedadePosseItem locEstEntr_indicProprPosseI
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstSaida
    ON locEstSaida.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstEntrada
    ON locEstEntrada.localEstoque = item.localEstoqueEntrada
    WHERE item.idItemDocTransferencia = p_idItemDocTransferencia
    AND item.cancelado = 0
    AND item.quantidadeSaldo <> 0
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1)
  LOOP
    IF a.tipoDocumentoSaida > 100
      AND a.validoSaida = 1
    THEN 
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'S', -- p_cab_entradaSaida,
          a.estabelecimentoSaida,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.idFormulaTinta,
          a.localEstoqueSaida,
          a.pessoaParticipanteSaida,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstSaida_indicProprPosseI,
          r_bufferIdReservaEstoque,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_RESERVA_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'S', -- p_cab_entradaSaida,
          a.estabelecimentoSaida,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.gradeProduto,
          a.localEstoqueSaida,
          a.pessoaParticipanteSaida,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstSaida_indicProprPosseI,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_RESERVA_ESTOQUE_TRA_N_SER (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.modeloDocumento,
            'S', -- p_cab_entradaSaida,
            a.estabelecimentoSaida,
            a.dataEmissao,
            p_idItemDocTransferencia,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoqueSaida,
            a.pessoaParticipanteSaida,
            a.observacoes,
            a.produto,
            a.locEstSaida_indicProprPosseI,
            r_bufferIdReservaEstoque, 
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
           END IF;
        IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idReservaEstoque
            a.estabelecimentoSaida,
            a.dataEmissao, -- p_dataEntrega
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            'S', -- p_cab_entradaSaida,
            a.locEstSaida_indicProprPosseI,
            a.pessoaParticipanteSaida,
            a.localEstoqueSaida,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeNumerosSerie,
            a.observacoes,
            0, -- p_item_idItemOrcamento
            0, -- p_item_idFichaProdutoPrevOrcam
            p_idItemDocTransferencia,
            r_bufferIdReservaEstoque, 
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
    IF a.tipoDocumentoEntrada > 100
      AND a.validoEntrada = 1
    THEN 
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'E', -- p_cab_entradaSaida,
          a.estabelecimentoEntrada,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.idFormulaTinta,
          a.localEstoqueEntrada,
          a.pessoaParticipanteEntrada,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstEntr_indicProprPosseI,
          r_bufferIdReservaEstoque,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_RESERVA_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'E', -- p_cab_entradaSaida,
          a.estabelecimentoEntrada,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.gradeProduto,
          a.localEstoqueEntrada,
          a.pessoaParticipanteEntrada,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstEntr_indicProprPosseI,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_RESERVA_ESTOQUE_TRA_N_SER (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.modeloDocumento,
            'E', -- p_cab_entradaSaida,
            a.estabelecimentoEntrada,
            a.dataEmissao,
            p_idItemDocTransferencia,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoqueEntrada,
            a.pessoaParticipanteEntrada,
            a.observacoes,
            a.produto,
            a.locEstEntr_indicProprPosseI,
            r_bufferIdReservaEstoque, 
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
           END IF;
        IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idReservaEstoque
            a.estabelecimentoEntrada,
            a.dataEmissao, -- p_dataEntrega
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            'E', -- p_cab_entradaSaida,
            a.locEstEntr_indicProprPosseI,
            a.pessoaParticipanteEntrada,
            a.localEstoqueEntrada,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeNumerosSerie,
            a.observacoes,
            0, -- p_item_idItemOrcamento
            0, -- p_item_idFichaProdutoPrevOrcam
            p_idItemDocTransferencia,
            r_bufferIdReservaEstoque, 
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;  
END ADD_RESERVA_ESTOQUE_TRA_ITEM;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_CAB (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_documentoTransferencia    IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT item.idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    WHERE item.documentoTransferencia = p_documentoTransferencia
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1
    AND item.cancelado = 0
    AND item.quantidadeSaldo <> 0)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque, 
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_CAB;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_ITEM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ADD_ESTOQUE_PRE_DOC_EXCLUI (
    p_idItemPreDocumento,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  ADD_ESTOQUE_PRE_DOC_FIL_EXCL (
    p_idItemPreDocumento,
    r_bufferIdProdutoFilho,
    r_bufferIdProdutoFilho);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      prod.tipoProduto,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.idFormulaTinta,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        a.idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque, 
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.gradeProduto,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        a.idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_PRE_DOC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemPreDocumento,
          a.modeloDocumento,
          a.gradeProduto,
          a.personalizacao,
          a.idLoteEstoque,
          a.localEstoque,
          a.pessoaParticipante,
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
          END, -- a.precoCustoOperacao
          a.precoCMV,
          a.observacoes,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.produto,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.produto,
          a.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_idNumeroSerie
          a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
          END, -- p_precoCustoOperacao
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          a.precoCMV,
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
            CASE
              WHEN a.valorCustoOperacao = 0
                OR a.valorAcrescimoExtempTotal = 0
                OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
              THEN a.precoCustoOperacao
              ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
            END, -- p_precoCustoOperacao
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            a.precoCMV,
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;
      END IF;
    ELSIF a.controleEstoque IN (2,21,99)
      AND a.tipoProduto = '09'
    THEN
      FOR b IN (
        SELECT
          itemOrc.gradeProduto,
          itemOrc.idFormulaTinta,
          itemOrc.personalizacao,
          itemOrc.idLoteEstoque,
          gradProd.produto,
          prod.controleEstoque,
          prod.controlaNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXDoc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXDoc.idItemOrcamento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemOrc.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE docXDoc.idItemPreDocumento = a.idItemPreDocumento
        AND docXDoc.quantidade <> 0
        AND itemOrc.cancelado = 0)
      LOOP
        IF b.controleEstoque = 12 AND b.idFormulaTinta > 0 THEN
          ADD_ESTOQUE_FORMULA_TINTA (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.idFormulaTinta,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque, 
            r_bufferIdEstoque);
        ELSIF b.controleEstoque IN (3,4) THEN
          ADD_ESTOQUE_KIT (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque,
            r_bufferIdEstoque);
        ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
          v_quantidadeNumerosSerie := 0;
          IF b.controlaNumeroSerie > 0 THEN
            ADD_ESTOQUE_PRE_DOC_N_SERIE (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              a.idItemPreDocumento,
              a.modeloDocumento,
              b.gradeProduto,
              b.personalizacao,
              b.idLoteEstoque,
              a.localEstoque,
              a.pessoaParticipante,
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
              END, -- a.precoCustoOperacao
              a.precoCMV,
              a.observacoes,
              a.geraTransferencia,
              a.geraOperacaoEmTransito,
              a.transitoLocalEstoque,
              a.locEstTransito_indicProprPos,
              b.produto,
              a.locEst_indicProprPosseItem,
              a.docTransf_estabelecEntrada,
              a.docTransf_estabelecSaida,
              r_bufferIdEstoque,
              r_bufferIdEstoque,
              v_quantidadeNumerosSerie);
          END IF;
          IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
            ADD_ESTOQUE_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idEstoque
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              b.produto,
              b.gradeProduto,
              a.modeloDocumento,
              0, -- p_item_motivoEstoque
              100, -- p_operacaoInternaEstoque
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.locEst_indicProprPosseItem,
              a.pessoaParticipante,
              a.localEstoque,
              b.personalizacao,
              b.idLoteEstoque,
              0, -- p_idNumeroSerie
              a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
              END, -- p_precoCustoOperacao
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
              a.precoCMV,
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
              a.observacoes,
              0, -- p_idFichaProdutoRealOrcamento
              a.idItemPreDocumento,
              0, -- p_idItemDocFiscal
              0, -- p_divergenciaBalanco
              0, -- p_idItemDocTransferencia
              r_bufferIdEstoque,
              v_auxNumber,
              r_bufferIdEstoque);
            IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
              ADD_ESTOQUE_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idEstoque
                a.docTransf_estabelecSaida,
                CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
                b.produto,
                b.gradeProduto,
                a.modeloDocumento,
                0, -- p_item_motivoEstoque
                900, -- p_operacaoInternaEstoque
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
                a.locEstTransito_indicProprPos,
                a.pessoaParticipante,
                a.transitoLocalEstoque,
                b.personalizacao,
                b.idLoteEstoque,
                0, -- p_idNumeroSerie
                a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
                CASE
                  WHEN a.valorCustoOperacao = 0
                    OR a.valorAcrescimoExtempTotal = 0
                    OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                  THEN a.precoCustoOperacao
                  ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
                END, -- p_precoCustoOperacao
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
                a.precoCMV,
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
                a.observacoes,
                0, -- p_idFichaProdutoRealOrcamento
                a.idItemPreDocumento,
                0, -- p_idItemDocFiscal
                0, -- p_divergenciaBalanco
                0, -- p_idItemDocTransferencia
                r_bufferIdEstoque, 
                v_auxNumber,
                r_bufferIdEstoque);
            END IF;
          END IF;
        END IF;
      END LOOP;
    END IF;
    FOR b IN (
      SELECT
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MOPREDOCUMXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemPreDocumento = a.idItemPreDocumento
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          b.quantidade,
          0,
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque);
      ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          b.produto,
          b.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1
          AND a.geraOperacaoEmTransito = 1
          AND a.transitoLocalEstoque > 0
          AND a.docTransf_estabelecEntrada > 0
          AND a.docTransf_estabelecSaida > 0
        THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            b.produto,
            b.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN a.entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            0, -- p_idNumeroSerie
            b.quantidade,
            0, -- p_precoCustoOperacao
            0, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            b.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;    
      END IF;
    END LOOP;
  END LOOP;
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_idItemPreDocumento
    ORDER BY id)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (r_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE a.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    IF a.controleEstoque = 12
      AND a.idFormulaTinta > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_FORM (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemPreDocumento,
        a.idFormulaTinta,
        a.pessoaParticipante,
        a.quantidade,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho, 
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_PRE_DOC_FIL_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemPreDocumento,
        a.gradeProduto,
        a.pessoaParticipante,
        a.quantidade,
        a.valorCustoOperacao,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    FOR b IN (
      SELECT 
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MOPREDOCUMXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemPreDocumento = a.idItemPreDocumento
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_PRE_DOC_FIL_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.atualizaCustoMedio,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemPreDocumento,
          b.gradeProduto,
          a.pessoaParticipante,
          b.quantidade,
          0, -- a.valorCustoOperacao
          b.observacoes,
          a.locEst_indicProprPosseItem,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho);
      ELSIF b.controleEstoque IN (1,5,6,11,12) THEN
        ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          a.idItemPreDocumento,
          b.produto,
          b.gradeProduto,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          b.observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END LOOP;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_ITEM;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_CABECALHO (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_preDocumento            IN NUMBER)
IS
  v_bufferIdEstoque      VARCHAR2 (32000);
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT idItemPreDocumento
    FROM MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento)
  LOOP
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ESTOQUE_PRE_DOC_FIL_EXCL (
      a.idItemPreDocumento,
      v_bufferIdProdutoFilho,
      v_bufferIdProdutoFilho);
  END LOOP;
  FOR a IN (
    SELECT item.idItemPreDocumento
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_ESTOQUE_PRE_DOC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_CABECALHO;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_ITEM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ADD_ESTOQUE_DOC_FISC_EXCLUI (
    p_idItemDocFiscal,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  ADD_ESTOQUE_DOC_FISC_FIL_EXCL (
    p_idItemDocFiscal,
    r_bufferIdProdutoFilho,
    r_bufferIdProdutoFilho);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      prod.tipoProduto,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.idFormulaTinta,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        a.idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque, 
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.gradeProduto,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        a.idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_DOC_FISC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemDocFiscal,
          a.modeloDocumento,
          a.gradeProduto,
          a.personalizacao,
          a.idLoteEstoque,
          a.localEstoque,
          a.pessoaParticipante,
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
          END, -- a.precoCustoOperacao
          a.precoCMV,
          a.observacoes,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.produto,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.produto,
          a.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_idNumeroSerie
          a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
          END, -- p_precoCustoOperacao
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          a.precoCMV,
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
            CASE
              WHEN a.valorCustoOperacao = 0
                OR a.valorAcrescimoExtempTotal = 0
                OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
              THEN a.precoCustoOperacao
              ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
            END, -- p_precoCustoOperacao
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            a.precoCMV,
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;
      END IF;
    ELSIF a.controleEstoque IN (2,21,99)
      AND a.tipoProduto = '09'
    THEN
      FOR b IN (
        SELECT
          itemOrc.gradeProduto,
          itemOrc.idFormulaTinta,
          itemOrc.personalizacao,
          itemOrc.idLoteEstoque,
          gradProd.produto,
          prod.controleEstoque,
          prod.controlaNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXDoc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXDoc.idItemOrcamento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemOrc.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE docXDoc.idItemDocFiscal = a.idItemDocFiscal
        AND docXDoc.quantidade <> 0
        AND itemOrc.cancelado = 0)
      LOOP
        IF b.controleEstoque = 12 AND b.idFormulaTinta > 0 THEN
          ADD_ESTOQUE_FORMULA_TINTA (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.idFormulaTinta,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque, 
            r_bufferIdEstoque);
        ELSIF b.controleEstoque IN (3,4) THEN
          ADD_ESTOQUE_KIT (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque,
            r_bufferIdEstoque);
        ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
          v_quantidadeNumerosSerie := 0;
          IF b.controlaNumeroSerie > 0 THEN
            ADD_ESTOQUE_DOC_FISC_N_SERIE (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              a.idItemDocFiscal,
              a.modeloDocumento,
              b.gradeProduto,
              b.personalizacao,
              b.idLoteEstoque,
              a.localEstoque,
              a.pessoaParticipante,
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
              END, -- a.precoCustoOperacao
              a.precoCMV,
              a.observacoes,
              a.geraTransferencia,
              a.geraOperacaoEmTransito,
              a.transitoLocalEstoque,
              a.locEstTransito_indicProprPos,
              b.produto,
              a.locEst_indicProprPosseItem,
              a.docTransf_estabelecEntrada,
              a.docTransf_estabelecSaida,
              r_bufferIdEstoque,
              r_bufferIdEstoque,
              v_quantidadeNumerosSerie);
          END IF;
          IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
            ADD_ESTOQUE_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idEstoque
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              b.produto,
              b.gradeProduto,
              a.modeloDocumento,
              0, -- p_item_motivoEstoque
              100, -- p_operacaoInternaEstoque
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.locEst_indicProprPosseItem,
              a.pessoaParticipante,
              a.localEstoque,
              b.personalizacao,
              b.idLoteEstoque,
              0, -- p_idNumeroSerie
              a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
              END, -- p_precoCustoOperacao
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
              a.precoCMV,
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
              a.observacoes,
              0, -- p_idFichaProdutoRealOrcamento
              0, -- p_idItemPreDocumento
              a.idItemDocFiscal,
              0, -- p_divergenciaBalanco
              0, -- p_idItemDocTransferencia
              r_bufferIdEstoque,
              v_auxNumber,
              r_bufferIdEstoque);
            IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
              ADD_ESTOQUE_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idEstoque
                a.docTransf_estabelecSaida,
                CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
                b.produto,
                b.gradeProduto,
                a.modeloDocumento,
                0, -- p_item_motivoEstoque
                900, -- p_operacaoInternaEstoque
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
                a.locEstTransito_indicProprPos,
                a.pessoaParticipante,
                a.transitoLocalEstoque,
                b.personalizacao,
                b.idLoteEstoque,
                0, -- p_idNumeroSerie
                a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
                CASE
                  WHEN a.valorCustoOperacao = 0
                    OR a.valorAcrescimoExtempTotal = 0
                    OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                  THEN a.precoCustoOperacao
                  ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
                END, -- p_precoCustoOperacao
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
                a.precoCMV,
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
                a.observacoes,
                0, -- p_idFichaProdutoRealOrcamento
                0, -- p_idItemPreDocumento
                a.idItemDocFiscal,
                0, -- p_divergenciaBalanco
                0, -- p_idItemDocTransferencia
                r_bufferIdEstoque, 
                v_auxNumber,
                r_bufferIdEstoque);
            END IF;
          END IF;
        END IF;
      END LOOP;
    END IF;
    FOR b IN (
      SELECT
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MODOCFISCALXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemDocFiscal = a.idItemDocFiscal
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          b.quantidade,
          0,
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_item_idItemPreDocumento,
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque);
      ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          b.produto,
          b.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_item_idItemPreDocumento,
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1
          AND a.geraOperacaoEmTransito = 1
          AND a.transitoLocalEstoque > 0
          AND a.docTransf_estabelecEntrada > 0
          AND a.docTransf_estabelecSaida > 0
        THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            b.produto,
            b.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN a.entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            0, -- p_idNumeroSerie
            b.quantidade,
            0, -- p_precoCustoOperacao
            0, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            b.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_item_idItemPreDocumento,
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;    
      END IF;
    END LOOP;
  END LOOP;
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_idItemDocFiscal
    ORDER BY id)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (r_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE a.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    IF a.controleEstoque = 12
      AND a.idFormulaTinta > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_FORM (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemDocFiscal,
        a.idFormulaTinta,
        a.pessoaParticipante,
        a.quantidade,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho, 
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_DOC_FISC_FIL_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemDocFiscal,
        a.gradeProduto,
        a.pessoaParticipante,
        a.quantidade,
        a.valorCustoOperacao,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    FOR b IN (
      SELECT 
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MODOCFISCALXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemDocFiscal = a.idItemDocFiscal
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_DOC_FISC_FIL_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.atualizaCustoMedio,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemDocFiscal,
          b.gradeProduto,
          a.pessoaParticipante,
          b.quantidade,
          0, -- a.valorCustoOperacao
          b.observacoes,
          a.locEst_indicProprPosseItem,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho);
      ELSIF b.controleEstoque IN (1,5,6,11,12) THEN
        ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          a.idItemDocFiscal,
          b.produto,
          b.gradeProduto,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          b.observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END LOOP;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_ITEM;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_CABECALHO (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER)
IS
  v_bufferIdEstoque      VARCHAR2 (32000);
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT idItemDocFiscal
    FROM MODOCFISCALXITENS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal)
  LOOP
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ESTOQUE_DOC_FISC_FIL_EXCL (
      a.idItemDocFiscal,
      v_bufferIdProdutoFilho,
      v_bufferIdProdutoFilho);
  END LOOP;
  FOR a IN (
    SELECT item.idItemDocFiscal
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_ESTOQUE_DOC_FISC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_CABECALHO;

/

create or replace PROCEDURE ADD_GERA_TEMP_CMV (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessao               IN NUMBER,
  p_produto                      IN NUMBER)
IS
  v_ultimoAgrupador   VARCHAR2 (100);
  v_agrupador         NUMBER;
  v_quebra            CHAR(9);
  v_quantidadeEstoque NUMBER;
  v_precoCustoMedio   NUMBER;
  v_totalCustoMedio   NUMBER;
BEGIN
  -- FISCAL
  v_ultimoAgrupador   := ' ';
  v_agrupador         := 0;
  v_quebra            := '000000000';
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  FOR a IN (
    SELECT
      p_sessaoClient sessaoClient,
      p_contadorSessao contadorSessao,
      p_produto produto,
      a.agrupador,
      a.tabelaSistema,
      a.id,
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao
    FROM (
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || itemInv.indicadorPropriedadePosseItem || '|'
          || LPAD (itemInv.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (invEst.estabelecimento, 14, '0') || '|'
             END agrupador,
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
        itemInv.id,
        gradProd.cor,
        gradProd.tamanho,
        0 personalizacao,
        invEst.estabelecimento,
        itemInv.indicadorPropriedadePosseItem,
        itemInv.pessoaParticipante,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) totalCustoOperacao
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || mov.indicadorPropriedadePosseItem || '|'
          || LPAD (mov.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (mov.estabelecimento, 14, '0') || '|'
             END agrupador,
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        mov.personalizacao,
        mov.estabelecimento,
        mov.indicadorPropriedadePosseItem,
        mov.pessoaParticipante,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao totalCustoOperacao
      FROM MOESTOQUES mov
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = mov.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      WHERE mov.operacaoInternaEstoque IN (102,900)
      AND mov.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || locEst.indicadorPropriedadePosseItem || '|'
          || LPAD (itemDoc.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (cabDoc.estabelecimento, 14, '0') || '|'
             END agrupador,
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXITENS' tabelaSistema,
        itemDoc.idItemDocFiscal id,
        gradProd.cor,
        gradProd.tamanho,
        itemDoc.personalizacao,
        cabDoc.estabelecimento,
        locEst.indicadorPropriedadePosseItem,
        itemDoc.pessoaParticipante,
        cabDoc.entradaSaida,
        itemDoc.quantidade,
        itemDoc.valorCustoOperacao totalCustoOperacao
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = cabDoc.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND gradProd.produto = p_produto
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal)
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || locEst.indicadorPropriedadePosseItem || '|'
          || LPAD (itemDoc.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (cabDoc.estabelecimento, 14, '0') || '|'
             END agrupador,
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
        filhoDoc.id,
        gradProd.cor,
        gradProd.tamanho,
        filhoDoc.personalizacao,
        cabDoc.estabelecimento,
        locEst.indicadorPropriedadePosseItem,
        itemDoc.pessoaParticipante,
        cabDoc.entradaSaida,
        filhoDoc.quantidade,
        filhoDoc.totalCustoOperacao totalCustoOperacao
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = cabDoc.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND filhoDoc.produto = p_produto) a
    ORDER BY
      agrupador,
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_ultimoAgrupador < a.agrupador THEN
      v_ultimoAgrupador := a.agrupador;
      v_agrupador := v_agrupador + 1;
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    ELSIF v_quebra < TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidadeEstoque := 0;
        v_precoCustoMedio := 0;
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSIF v_quantidadeEstoque > a.quantidade THEN
          IF v_totalCustoMedio + a.totalCustoOperacao > 9999999999999.99 THEN
             v_totalCustoMedio := 9999999999999.99;
          ELSE
             v_totalCustoMedio := v_totalCustoMedio + a.totalCustoOperacao;
          END IF;
        ELSIF a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - a.totalCustoOperacao;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSIF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
        v_precoCustoMedio := ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
      IF v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      ELSIF v_quantidadeEstoque > a.quantidade THEN
        IF v_totalCustoMedio + a.quantidade * v_precoCustoMedio > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := v_totalCustoMedio + a.quantidade * v_precoCustoMedio;
        END IF;
      ELSIF v_quantidadeEstoque * v_precoCustoMedio > 9999999999999.99 THEN
         v_totalCustoMedio := 9999999999999.99;
      ELSE
         v_totalCustoMedio := v_quantidadeEstoque * v_precoCustoMedio;
      END IF;
    ELSE
      v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
      v_totalCustoMedio := v_totalCustoMedio - a.quantidade * v_precoCustoMedio;
      IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    INSERT INTO TEMPCMV (
      sessaoClient,
      contadorSessao,
      produto,
      fiscalGerencial,
      tabelaSistema,
      id,
      agrupador,
      data,
      operacao,
      hora,
      cor,
      tamanho,
      personalizacao,
      estabelecimento,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      entradaSaida,
      quantidade,
      totalCustoOperacao,
      quantidadeEstoque,
      precoCustoMedio,
      totalCustoMedio)
    VALUES (
      a.sessaoClient,
      a.contadorSessao,
      a.produto,
      'F',
      a.tabelaSistema,
      a.id,
      v_agrupador,
      a.data,
      a.operacao,
      a.hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao,
      v_quantidadeEstoque,
      v_precoCustoMedio,
      v_totalCustoMedio);
  END LOOP;
  -- GERENCIAL
  v_ultimoAgrupador   := ' ';
  v_agrupador         := 0;
  v_quebra            := '000000000';
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  FOR a IN (
    SELECT
      p_sessaoClient sessaoClient,
      p_contadorSessao contadorSessao,
      p_produto produto,
      a.agrupador,
      a.tabelaSistema,
      a.id,
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao
    FROM (
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (itemInv.personalizacao, 7, '0') || LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || itemInv.indicadorPropriedadePosseItem || '|'
          || LPAD (itemInv.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (invEst.estabelecimento, 14, '0') || '|'
             END agrupador,
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
        itemInv.idItemInventarioEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        itemInv.personalizacao,
        invEst.estabelecimento,
        itemInv.indicadorPropriedadePosseItem,
        itemInv.pessoaParticipante,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) totalCustoOperacao
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (mov.personalizacao, 7, '0') || LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || mov.indicadorPropriedadePosseItem || '|'
          || LPAD (mov.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (mov.estabelecimento, 14, '0') || '|'
             END agrupador,
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        mov.personalizacao,
        mov.estabelecimento,
        mov.indicadorPropriedadePosseItem,
        mov.pessoaParticipante,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao totalCustoOperacao
      FROM MOESTOQUES mov
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = mov.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      WHERE mov.produto = p_produto) a
    ORDER BY
      agrupador,
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_ultimoAgrupador < a.agrupador THEN
      v_ultimoAgrupador := a.agrupador;
      v_agrupador := v_agrupador + 1;
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    ELSIF v_quebra < TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidadeEstoque := 0;
        v_precoCustoMedio := 0;
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSIF v_quantidadeEstoque > a.quantidade THEN
          IF v_totalCustoMedio + a.totalCustoOperacao > 9999999999999.99 THEN
             v_totalCustoMedio := 9999999999999.99;
          ELSE
             v_totalCustoMedio := v_totalCustoMedio + a.totalCustoOperacao;
          END IF;
        ELSIF a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - a.totalCustoOperacao;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSIF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
        v_precoCustoMedio := ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
      IF v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      ELSIF v_quantidadeEstoque > a.quantidade THEN
        IF v_totalCustoMedio + a.quantidade * v_precoCustoMedio > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := v_totalCustoMedio + a.quantidade * v_precoCustoMedio;
        END IF;
      ELSIF v_quantidadeEstoque * v_precoCustoMedio > 9999999999999.99 THEN
         v_totalCustoMedio := 9999999999999.99;
      ELSE
         v_totalCustoMedio := v_quantidadeEstoque * v_precoCustoMedio;
      END IF;
    ELSE
      v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
      v_totalCustoMedio := v_totalCustoMedio - a.quantidade * v_precoCustoMedio;
      IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    INSERT INTO TEMPCMV (
      sessaoClient,
      contadorSessao,
      produto,
      fiscalGerencial,
      tabelaSistema,
      id,
      agrupador,
      data,
      operacao,
      hora,
      cor,
      tamanho,
      personalizacao,
      estabelecimento,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      entradaSaida,
      quantidade,
      totalCustoOperacao,
      quantidadeEstoque,
      precoCustoMedio,
      totalCustoMedio)
    VALUES (
      a.sessaoClient,
      a.contadorSessao,
      a.produto,
      'G',
      a.tabelaSistema,
      a.id,
      v_agrupador,
      a.data,
      a.operacao,
      a.hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao,
      v_quantidadeEstoque,
      v_precoCustoMedio,
      v_totalCustoMedio);
  END LOOP;
END ADD_GERA_TEMP_CMV;

/

create or replace PROCEDURE ADD_DOC_FISC_CALCULA_IMPOSTOS (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemDocFiscalUltimoItem    NUMBER;
  v_idItemDocFiscalRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idDocumentoFiscal,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_residuoDescCustoOpGeral      := 0;
    v_residuoAcrescCustoOpGeral    := 0;
    v_residuoAcrescExtempGeral     := 0;
    v_idItemDocFiscalUltimoItem    := 0;
    v_idItemDocFiscalRateioFrete   := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
    
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
    
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = b.idItemDocFiscal
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MODOCFISCALXPROMOCOES promo
            ON promo.idItemDocFiscal = b.idItemDocFiscal
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MODOCFISCALXPROMOCOES promo
                  WHERE promo.idItemDocFiscal = b.idItemDocFiscal))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
    
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MODOCFISCALXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemDocFiscal,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        prod.tipoProduto,
        CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MODOCFISCALXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MODOCFISCALXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemDocFiscalUltimoItem    := b.idItemDocFiscal;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.valorProdutoServico;
      v_valorDescontoGeral           := v_residuoDescontoGeral;
      v_valorFreteGeral              := v_residuoFreteGeral;
      v_valorSeguroGeral             := v_residuoSeguroGeral;
      v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
      v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
      v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
      v_valorBasePagamento           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral        > 0
        AND v_valorDescontoPromocaoGeral > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
        v_valorDescontoGeral   := v_saldoRatDescontoGeral;
        v_residuoDescontoGeral := 0;
      ELSE
        v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
        v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
      END IF;
      v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
  
      -- v_valorFreteGeral
      -- v_valorSeguroGeral
      IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
        v_valorFreteGeral := v_saldoRatFreteGeral;
        v_residuoFreteGeral := 0;
      ELSE
        v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
        v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
      END IF;
      v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
      IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
        v_valorSeguroGeral   := v_saldoRatSeguroGeral;
        v_residuoSeguroGeral := 0;
      ELSE
        v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
        v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
      END IF;
      v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
  
      -- v_valorAdicFreteMarinMerGeral
      -- v_valorDespesasAduaneirasGeral
      -- v_valorDescontoCustoOpGeral
      -- v_valorAcrescimoCustoOpGeral
      -- v_valorAcrescimoExtempGeral
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
        v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
        v_residuoAdicFreteMarinGeral  := 0;
      ELSE
        v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
        v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
      END IF;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
        v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
        v_residuoDespesasAduanGeral    := 0;
      ELSE
        v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
        v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
      END IF;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
        v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
        v_residuoDescCustoOpGeral   := 0;
      ELSE
        v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
        v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
      END IF;
      v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
        v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
        v_residuoAcrescCustoOpGeral  := 0;
      ELSE
        v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
        v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
      END IF;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
        v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
        v_residuoAcrescExtempGeral  := 0;
      ELSE
        v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
        v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
      END IF;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
      END IF;
      IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
        v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
        v_residuoOutrasDespesasGeral := 0;
      ELSE
        v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
        v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
      END IF;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
  
      -- v_valorDescontoPagamento
      IF a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento            > 0
        AND v_valorDescontoPromocaoPagamen   > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
        v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
        v_residuoDescontoPagamento := 0;
      ELSE
        v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
        v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
      END IF;
      v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
  
      -- v_valorOutrasDespesasPagamento
      -- v_valorJurosPagamento
      IF v_valorBaseRateioPagamFinanc > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      END IF;
      IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
        v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
        v_residuoOutrasDespPagamento   := 0;
      ELSE
        v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
        v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
      END IF;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
        v_valorJurosPagamento   := v_saldoRatJurosPagamento;
        v_residuoJurosPagamento := 0;
      ELSE
        v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
        v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
      END IF;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
  
      -- Recalcula Valores
      ADD_CALCULA_TOTAIS_ITEM (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST);
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.valorAcrescimoCustoOpItem,
        v_valorAcrescimoCustoOpGeral,
        v_valorAcrescimoExtempTotal,
        /* Retornos */
        v_valorDescontoCustoOpTotal,
        v_valorAcrescimoCustoOpTotal,
        v_precoCustoOperacao,
        v_valorCustoOperacao,
        v_precoCMV,
        v_valorCMV);
  
      -- Atualiza Item
      UPDATE MODOCFISCALXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem,
        valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
        valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
        valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
        precoCustoOperacao            = v_precoCustoOperacao,
        valorCustoOperacao            = v_valorCustoOperacao,
        precoCMV                      = v_precoCMV,
        valorCMV                      = v_valorCMV,
        valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
        valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
      WHERE idItemDocFiscal           = b.idItemDocFiscal;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
    END LOOP;
    IF v_idItemDocFiscalUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MODOCFISCALXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemDocFiscal = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;    
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST);
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          a.nfFornecedor,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MODOCFISCALXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemDocFiscal           = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemDocFiscal,
          b.modeloDocumento,
          b.gradeProduto,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.stICMSEscrituracao,
          b.reducaoBaseICMSEscrituracao,
          b.aliquotaICMSEscrituracao,
          b.diferimentoICMSEscrituracao,
          b.margemValorAdicSTEscrituracao,
          b.reducaoBaseSTEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          b.somarICMSST,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSEscrituracao,
          b.valorICMSEscrituracao,
          b.valorICMSDesonEscrituracao,
          b.baseICMSSTEscrituracao,
          b.valorICMSSTEscrituracao,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MODOCFISCALXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSEscrituracao         := b.baseICMSEscrituracao;
        v_valorICMSEscrituracao        := b.valorICMSEscrituracao;
        v_valorICMSDesonEscrituracao   := b.valorICMSDesonEscrituracao;
        v_baseICMSSTEscrituracao       := b.baseICMSSTEscrituracao;
        v_valorICMSSTEscrituracao      := b.valorICMSSTEscrituracao;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          a.devolucaoAnulacaoRetorno,
          a.estabelecimento,
          a.nfFornecedor,
          a.dataEntradaSaida,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.gradeProduto,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          b.valorIPIDevolucao,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          1,
          b.stICMSEscrituracao,
          b.reducaoBaseICMSEscrituracao,
          b.aliquotaICMSEscrituracao,
          b.diferimentoICMSEscrituracao,
          v_baseICMSEscrituracao,
          v_valorICMSEscrituracao,
          v_valorICMSDesonEscrituracao,
          1,
          b.margemValorAdicSTEscrituracao,
          b.reducaoBaseSTEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          v_baseICMSSTEscrituracao,
          v_valorICMSSTEscrituracao,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_baseICMSEscrituracao,
          v_valorICMSEscrituracao,
          v_valorICMSDesonEscrituracao,
          v_baseICMSSTEscrituracao,
          v_valorICMSSTEscrituracao,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);    
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          b.somarICMSST,
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          b.somarICMSST);
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          a.nfFornecedor,
          b.modeloDocumento,
          b.quantidade,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          b.valorIPIDevolucao,
          v_valorPIS,
          v_valorPISST,
          v_valorCOFINS,
          v_valorCOFINSST,
          v_valorCreditoSimplesNacional,
          v_valorICMS,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MODOCFISCALXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSEscrituracao          = v_baseICMSEscrituracao,
          valorICMSEscrituracao         = v_valorICMSEscrituracao,
          valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
          baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
          valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemDocFiscal           = b.idItemDocFiscal;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALCULA_IMPOSTOS (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemPreDocUltimoItem       NUMBER;
  v_idItemPreDocRateioFrete      NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.preDocumento,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_residuoDescCustoOpGeral      := 0;
    v_residuoAcrescCustoOpGeral    := 0;
    v_residuoAcrescExtempGeral     := 0;
    v_idItemPreDocUltimoItem       := 0;
    v_idItemPreDocRateioFrete      := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = b.idItemPreDocumento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > ( CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOPREDOCUMXPROMOCOES promo
            ON promo.idItemPreDocumento = b.idItemPreDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento)))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOPREDOCUMXPROMOCOES promo
                  WHERE promo.idItemPreDocumento = b.idItemPreDocumento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MOPREDOCUMXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.preDocumento = a.preDocumento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemPreDocumento,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        prod.tipoProduto,
        CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MOPREDOCUMXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MOPREDOCUMXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemPreDocUltimoItem       := b.idItemPreDocumento;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.valorProdutoServico;
      v_valorDescontoGeral           := v_residuoDescontoGeral;
      v_valorFreteGeral              := v_residuoFreteGeral;
      v_valorSeguroGeral             := v_residuoSeguroGeral;
      v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
      v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
      v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
      v_valorBasePagamento           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral           > 0
        AND v_valorDescontoPromocaoGeral    > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
        v_valorDescontoGeral   := v_saldoRatDescontoGeral;
        v_residuoDescontoGeral := 0;
      ELSE
        v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
        v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
      END IF;
      v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
  
      -- v_valorFreteGeral
      -- v_valorSeguroGeral
      IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
        v_valorFreteGeral := v_saldoRatFreteGeral;
        v_residuoFreteGeral := 0;
      ELSE
        v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
        v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
      END IF;
      v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
      IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
        v_valorSeguroGeral   := v_saldoRatSeguroGeral;
        v_residuoSeguroGeral := 0;
      ELSE
        v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
        v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
      END IF;
      v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
  
      -- v_valorAdicFreteMarinMerGeral
      -- v_valorDespesasAduaneirasGeral
      -- v_valorDescontoCustoOpGeral
      -- v_valorAcrescimoCustoOpGeral
      -- v_valorAcrescimoExtempGeral
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
        v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
        v_residuoAdicFreteMarinGeral  := 0;
      ELSE
        v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
        v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
      END IF;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
        v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
        v_residuoDespesasAduanGeral    := 0;
      ELSE
        v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
        v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
      END IF;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
        v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
        v_residuoDescCustoOpGeral   := 0;
      ELSE
        v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
        v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
      END IF;
      v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
        v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
        v_residuoAcrescCustoOpGeral  := 0;
      ELSE
        v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
        v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
      END IF;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
        v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
        v_residuoAcrescExtempGeral  := 0;
      ELSE
        v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
        v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
      END IF;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
      END IF;
      IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
        v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
        v_residuoOutrasDespesasGeral := 0;
      ELSE
        v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
        v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
      END IF;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
  
      -- v_valorDescontoPagamento
      IF a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento           > 0
        AND v_valorDescontoPromocaoPagamen      > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
        v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
        v_residuoDescontoPagamento := 0;
      ELSE
        v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
        v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
      END IF;
      v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
  
      -- v_valorOutrasDespesasPagamento
      -- v_valorJurosPagamento
      IF v_valorBaseRateioPagamFinanc > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      END IF;
      IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
        v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
        v_residuoOutrasDespPagamento   := 0;
      ELSE
        v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
        v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
      END IF;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
        v_valorJurosPagamento   := v_saldoRatJurosPagamento;
        v_residuoJurosPagamento := 0;
      ELSE
        v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
        v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
      END IF;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
  
      -- Recalcula Valores
      ADD_CALCULA_TOTAIS_ITEM (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0, -- p_item_somarICMSST
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0 -- p_item_somarICMSST
        );
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        0,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        0,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.valorAcrescimoCustoOpItem,
        v_valorAcrescimoCustoOpGeral,
        v_valorAcrescimoExtempTotal,
        /* Retornos */
        v_valorDescontoCustoOpTotal,
        v_valorAcrescimoCustoOpTotal,
        v_precoCustoOperacao,
        v_valorCustoOperacao,
        v_precoCMV,
        v_valorCMV);
  
      -- Atualiza Item
      UPDATE MOPREDOCUMXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem,
        valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
        valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
        valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
        precoCustoOperacao            = v_precoCustoOperacao,
        valorCustoOperacao            = v_valorCustoOperacao,
        precoCMV                      = v_precoCMV,
        valorCMV                      = v_valorCMV,
        valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
        valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
      WHERE idItemPreDocumento        = b.idItemPreDocumento;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
    END LOOP;
    IF v_idItemPreDocUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemPreDocumento = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MOPREDOCUMXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;  
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemPreDocumento,
          b.modeloDocumento,
          b.gradeProduto,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.preDocumento = a.preDocumento
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        ADD_CALCULA_TOTAIS_ITEM(
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          a.devolucaoAnulacaoRetorno,
          a.estabelecimento,
          0,
          a.dataEntradaSaida,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.gradeProduto,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          b.valorIPIDevolucao,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          0,
          '  ',
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          b.valorIPIDevolucao,
          v_valorPIS,
          v_valorPISST,
          v_valorCOFINS,
          v_valorCOFINSST,
          v_valorCreditoSimplesNacional,
          v_valorICMS,
          v_valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MOPREDOCUMXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = b.idItemPreDocumento;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALCULA_IMPOSTOS (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_idItemOrcamentoUltimoItem    NUMBER;
  v_idItemOrcamentoRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.orcamento,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_idItemOrcamentoUltimoItem    := 0;
    v_idItemOrcamentoRateioFrete   := 0;
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS(
            SELECT 1
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = b.idItemOrcamento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOORCAMENTOXPROMOCOES promo
            ON promo.idItemOrcamento = b.idItemOrcamento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOORCAMENTOXPROMOCOES promo
                  WHERE promo.idItemOrcamento = b.idItemOrcamento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      COALESCE (MAX (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MOORCAMENTOXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    JOIN PACONTROLESENTREGA contr
    ON contr.controleEntrega = b.controleEntrega
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
