SET DEFINE OFF;

DROP TABLE PACONDICOESPAGAMENTO_2204;
DROP TABLE MONEGOCIACOESDIVIDAS_2204;
DROP TABLE MOPREDOCUMXPROMOCOES_0402;
DROP TABLE MODOCFISCALXPROMOCOES_0402;
DROP TABLE MOORCAMENTOXPROMOCOES_0402;

CREATE TABLE MOORCAMENTOXITENS_2204 AS SELECT * FROM MOORCAMENTOXITENS;

ALTER TABLE MOORCAMENTOXAMBIENTES DROP CONSTRAINT MOORCAMENTOXAMBIENTES_FK1;
ALTER TABLE MOORCAMENTOXPEDIDOCOMPRA DROP CONSTRAINT MOORCAMENTOXPEDIDOCOMPRA_FK1;
ALTER TABLE MOORCAMENTOXCOMPOSICOESPR DROP CONSTRAINT MOORCAMENTOXCOMPOSICOESPR_FK1;
ALTER TABLE MOORCAMENTOXENDERECOESTOQ DROP CONSTRAINT MOORCAMENTOXENDERECOESTOQ_FK1;
ALTER TABLE MOORCAMENTOXEMBALAGENSTIN DROP CONSTRAINT MOORCAMENTOXEMBALAGENSTIN_FK1;
ALTER TABLE MOORCAMENTOXNUMEROSSERIE DROP CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK1;
ALTER TABLE MOORCAMENTOXCENTROSCUSTOS DROP CONSTRAINT MOORCAMENTOXCENTROSCUSTOS_FK1;
ALTER TABLE MOORCAMENTOXORCAMENTO DROP CONSTRAINT MOORCAMENTOXORCAMENTO_FK1;
ALTER TABLE MOORCAMENTOXORCAMENTO DROP CONSTRAINT MOORCAMENTOXORCAMENTO_FK2;
ALTER TABLE MOORCAMENTOXATIVIDADEPREV DROP CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK1;
ALTER TABLE MOORCAMENTOXRECEITASOCUL DROP CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK3;
ALTER TABLE MOORCAMENTOXRECEITASOCUL DROP CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK4;
ALTER TABLE MOORCAMENTOXRECEITASOCUL DROP CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK6;
ALTER TABLE MOPREDOCUMXORCAMENTOITEM DROP CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK2;
ALTER TABLE MODOCFISCALXORCAMENTOITEM DROP CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK2;
ALTER TABLE MODISTRIBUICAODFEXORCAM DROP CONSTRAINT MODISTRIBUICAODFEXORCAM_FK2;
ALTER TABLE MOORCAMENTOXPROMOCOES DROP CONSTRAINT MOORCAMENTOXPROMOCOES_FK3;
ALTER TABLE MOSEPARACAOXITENS DROP CONSTRAINT MOSEPARACAOXITENS_FK2;
ALTER TABLE MODOCTRANSFXORCAMENTOITEM DROP CONSTRAINT MODOCTRANSFXORCAMENTOITEM_FK3;
ALTER TABLE MOORCAMENTOXRESERVAESTOQ DROP CONSTRAINT MOORCAMENTOXRESERVAESTOQ_FK1;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK5;
ALTER TABLE MOENTREGAXSITUACOES DROP CONSTRAINT MOENTREGAXSITUACOES_FK1;
ALTER TABLE MOPAINELCOMPRAXGRADE DROP CONSTRAINT MOPAINELCOMPRAXGRADE_FK3;
ALTER TABLE MOMOTBLOQXORCAMENTOITENS DROP CONSTRAINT MOMOTBLOQXORCAMENTOITENS_FK2;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK3;
ALTER TABLE MOLISTAEVENTOXORC DROP CONSTRAINT MOLISTAEVENTOXORC_FK2;

DROP TABLE MOORCAMENTOXITENS;

-- MOORCAMENTOXITENS
CREATE TABLE MOORCAMENTOXITENS
  (
    idItemOrcamento               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    orcamento                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoOriginal       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    servico                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atividadeServico              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    statusAtividadeServico        CHAR (1) DEFAULT ' ' NOT NULL,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vinculoItemDocumento          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataEntrega                   DATE,
    controleQuantidade            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaConversao        VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidade           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                        NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                       NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                   NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldo               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConferida           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    controleEntrega               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    situacaoEntrega               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    pesoLiquido                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoSugestaoAPrazo           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoSugestaoAVista           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoDesconto                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoMinimo                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    usarPrecoAVista               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioBruto            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    acrescimoUnitarioComposicao   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitario                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioConvertido       NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServicoBruto      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoServico           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percDescontoItem              NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDescontoItem             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percAcrescimoItem             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorAcrescimoItem            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteItem                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroItem               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerItem  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasItem   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteGeral               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroGeral              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoGeral            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasGeral      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerGeral NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasGeral  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoPagamento        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasPagamento  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosPagamento           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteTotal               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoTotal            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasTotal      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerTotal NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasTotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIRRF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIRRF                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseINSS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorINSS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT ' ' NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSProprioSubstituto    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpFederais   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpEstaduais  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpMunicipais NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseEstimadaImpostos          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpFederais      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpEstaduais     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpMunicipais    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_PK1 PRIMARY KEY (idItemOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXITENS_K2 ON MOORCAMENTOXITENS (orcamento, sequencia);
CREATE INDEX MOORCAMENTOXITENS_K3 ON MOORCAMENTOXITENS (gradeProduto);
CREATE INDEX MOORCAMENTOXITENS_K4 ON MOORCAMENTOXITENS (orcamento);
CREATE INDEX MOORCAMENTOXITENS_K5 ON MOORCAMENTOXITENS (dataEntrega);
CREATE INDEX MOORCAMENTOXITENS_K6 ON MOORCAMENTOXITENS (orcamento, cancelado);
CREATE INDEX MOORCAMENTOXITENS_K7 ON MOORCAMENTOXITENS (gradeProduto, cancelado);
CREATE INDEX MOORCAMENTOXITENS_K8 ON MOORCAMENTOXITENS (controleEntrega);
CREATE INDEX MOORCAMENTOXITENS_K9 ON MOORCAMENTOXITENS (situacaoEntrega);
CREATE INDEX MOORCAMENTOXITENS_K10 ON MOORCAMENTOXITENS (controleEntrega, situacaoEntrega, cancelado);
CREATE INDEX MOORCAMENTOXITENS_K11 ON MOORCAMENTOXITENS (orcamento, cancelado, controleEntrega);
CREATE INDEX MOORCAMENTOXITENS_K50 ON MOORCAMENTOXITENS (TRUNC(dataEntrega));

INSERT INTO MOORCAMENTOXITENS (idItemOrcamento, orcamento, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, atividadeServico, statusAtividadeServico, idFormulaTinta, personalizacao, idLoteEstoque, vinculoItemDocumento, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, dataEntrega, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeSaldo, quantidadeConferida, controleEntrega, situacaoEntrega, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, observacoesDigitadas, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '   ', 0, 0, 0, '  ', ' ', 0, 0, 0, '  ', 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ');
INSERT INTO MOORCAMENTOXITENS (idItemOrcamento, orcamento, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, atividadeServico, statusAtividadeServico, idFormulaTinta, personalizacao, idLoteEstoque, vinculoItemDocumento, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, dataEntrega, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeSaldo, quantidadeConferida, controleEntrega, situacaoEntrega, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, observacoesDigitadas, observacoes) SELECT a.idItemOrcamento, a.orcamento, a.sequencia, a.cancelado, b.modeloDocumento, b.estabelecimentoOriginal, a.vendedor, a.gradeProduto, a.servico, a.atividadeServico, a.statusAtividadeServico, a.idFormulaTinta, a.personalizacao, a.idLoteEstoque, a.vinculoItemDocumento, a.operacaoFiscal, a.movimentaEstoque, a.geraFinanceiro, a.localEstoque, a.pessoaParticipante, a.dataEntrega, a.controleQuantidade, a.unidadeMedidaConversao, a.conversorQuantidade, a.loteMinimo, a.loteMultiplo, a.altura, a.largura, a.comprimento, a.pecas, a.quantidade, a.quantidadeConvertida, a.quantidadeSaldo, a.quantidadeConferida, a.controleEntrega, a.situacaoEntrega, a.pesoLiquido, a.pesoBruto, a.tipoPreco, a.tabelaPreco, a.precoSugestaoAPrazo, a.precoSugestaoAVista, a.precoDesconto, a.precoMinimo, a.usarPrecoAVista, a.precoPautaTabelado, a.precoUnitarioBruto, a.acrescimoUnitarioComposicao, a.precoUnitario, a.precoUnitarioConvertido, a.valorProdutoServicoBruto, a.valorProdutoServico, a.percDescontoItem, a.valorDescontoItem, a.percAcrescimoItem, a.valorAcrescimoItem, a.valorFreteItem, a.valorSeguroItem, a.valorAdicFreteMarinhaMerItem, a.valorDespesasAduaneirasItem, a.valorFreteGeral, a.valorSeguroGeral, a.valorDescontoGeral, a.valorOutrasDespesasGeral, a.valorAdicFreteMarinhaMerGeral, a.valorDespesasAduaneirasGeral, a.valorBasePagamento, a.valorDescontoPagamento, a.valorOutrasDespesasPagamento, a.valorJurosPagamento, a.valorFreteTotal, a.valorSeguroTotal, a.valorDescontoTotal, a.valorOutrasDespesasTotal, a.valorAdicFreteMarinhaMerTotal, a.valorDespesasAduaneirasTotal, a.cfop, a.indicadorISSQN, a.aliquotaISSQN, a.baseISSQN, a.valorISSQN, a.aliquotaIRRF, a.baseIRRF, a.valorIRRF, a.aliquotaINSS, a.baseINSS, a.valorINSS, a.retencaoPIS, a.baseRetPIS, a.valorRetPIS, a.retencaoCOFINS, a.baseRetCOFINS, a.valorRetCOFINS, a.retencaoCSLL, a.baseRetCSLL, a.valorRetCSLL, a.aliquotaII, a.baseII, a.valorII, a.aliquotaIOF, a.baseIOF, a.valorIOF, a.codigoEnquadramentoIPI, a.stIPI, a.aliquotaIPI, a.valorAliquotaIPI, a.baseIPI, a.valorIPI, a.stPIS, a.aliquotaPIS, a.valorAliquotaPIS, a.basePIS, a.valorPIS, a.aliquotaPISST, a.valorAliquotaPISST, a.basePISST, a.valorPISST, a.stCOFINS, a.aliquotaCOFINS, a.valorAliquotaCOFINS, a.baseCOFINS, a.valorCOFINS, a.aliquotaCOFINSST, a.valorAliquotaCOFINSST, a.baseCOFINSST, a.valorCOFINSST, a.stSimplesNacional, a.creditoSimplesNacional, a.baseCreditoSimplesNacional, a.valorCreditoSimplesNacional, a.stICMS, a.modalidadeBaseCalcICMS, a.reducaoBaseICMS, a.aliquotaICMS, a.diferimentoICMS, a.motivoDesoneracaoICMS, a.baseICMS, a.valorICMSOperacao, a.valorICMSDiferido, a.valorICMS, a.valorICMSDesoneracao, a.modalidadeBaseCalcICMSST, a.margemValorAdicionadoST, a.reducaoBaseST, a.aliquotaICMSST, a.aliquotaSTSuportConsFinal, a.baseICMSST, a.valorICMSST, a.baseICMSSTAnteriormente, a.valorICMSSTAnteriormente, a.valorICMSProprioSubstituto, a.reducaoBaseICMSEfetivo, a.aliquotaICMSEfetivo, a.baseICMSEfetivo, a.valorICMSEfetivo, a.aliquotaICMSUFDestinatario, a.aliquotaICMSInterestadual, a.partilhaICMSInterestadual, a.baseICMSUFDestinatario, a.valorICMSUFDestinatario, a.baseICMSUFRemetente, a.valorICMSUFRemetente, a.aliquotaFCP, a.baseFCP, a.valorFCP, a.aliquotaFCPST, a.baseFCPST, a.valorFCPST, a.aliquotaFCPSTAnteriormente, a.baseFCPSTAnteriormente, a.valorFCPSTAnteriormente, a.aliquotaFCPUFDestinatario, a.baseFCPUFDestinatario, a.valorFCPUFDestinatario, a.aliquotaEstimadaImpFederais, a.aliquotaEstimadaImpEstaduais, a.aliquotaEstimadaImpMunicipais, a.baseEstimadaImpostos, a.valorEstimadoImpFederais, a.valorEstimadoImpEstaduais, a.valorEstimadoImpMunicipais, a.valorImpostosSomaPagamento, a.valorImpostosDiminuiPagamento, a.valorLiquidoItem, a.observacoesDigitadas, a.observacoes FROM MOORCAMENTOXITENS_2204 a JOIN MOORCAMENTOS b ON b.orcamento = a.orcamento WHERE a.idItemOrcamento > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK1 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK3 FOREIGN KEY (estabelecimentoOriginal) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK4 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK6 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK7 FOREIGN KEY (statusAtividadeServico) REFERENCES SISTATUSATIVIDADESERVICO (statusAtividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK8 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK9 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK10 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK11 FOREIGN KEY (vinculoItemDocumento) REFERENCES SIVINCULOSITEMDOCUMENTO (vinculoItemDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK12 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK13 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK14 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK15 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK16 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK17 FOREIGN KEY (controleEntrega) REFERENCES PACONTROLESENTREGA (controleEntrega);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK18 FOREIGN KEY (situacaoEntrega) REFERENCES SISITUACOESENTREGAS (situacaoEntrega);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK19 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK20 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK21 FOREIGN KEY (cfop) REFERENCES SICFOPS (cfop);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK22 FOREIGN KEY (indicadorISSQN) REFERENCES SIINDICISSQN (indicadorISSQN);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK23 FOREIGN KEY (codigoEnquadramentoIPI) REFERENCES SICODIGOSENQUADRAMENTOIPI (codigoEnquadramentoIPI);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK24 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK25 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK26 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK27 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK28 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK29 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK30 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK31 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);

ALTER TABLE MOORCAMENTOXAMBIENTES ADD CONSTRAINT MOORCAMENTOXAMBIENTES_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXPEDIDOCOMPRA ADD CONSTRAINT MOORCAMENTOXPEDIDOCOMPRA_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXCOMPOSICOESPR ADD CONSTRAINT MOORCAMENTOXCOMPOSICOESPR_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXENDERECOESTOQ ADD CONSTRAINT MOORCAMENTOXENDERECOESTOQ_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXEMBALAGENSTIN ADD CONSTRAINT MOORCAMENTOXEMBALAGENSTIN_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXCENTROSCUSTOS ADD CONSTRAINT MOORCAMENTOXCENTROSCUSTOS_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXORCAMENTO ADD CONSTRAINT MOORCAMENTOXORCAMENTO_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXORCAMENTO ADD CONSTRAINT MOORCAMENTOXORCAMENTO_FK2 FOREIGN KEY (idItemOrcamentoReferenc) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXRECEITASOCUL ADD CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK3 FOREIGN KEY (olhoDirIdItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXRECEITASOCUL ADD CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK4 FOREIGN KEY (olhoEsqIdItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXRECEITASOCUL ADD CONSTRAINT MOORCAMENTOXRECEITASOCUL_FK6 FOREIGN KEY (armacaoIdItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOPREDOCUMXORCAMENTOITEM ADD CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MODISTRIBUICAODFEXORCAM ADD CONSTRAINT MODISTRIBUICAODFEXORCAM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXPROMOCOES ADD CONSTRAINT MOORCAMENTOXPROMOCOES_FK3 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOSEPARACAOXITENS ADD CONSTRAINT MOSEPARACAOXITENS_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MODOCTRANSFXORCAMENTOITEM ADD CONSTRAINT MODOCTRANSFXORCAMENTOITEM_FK3 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXRESERVAESTOQ ADD CONSTRAINT MOORCAMENTOXRESERVAESTOQ_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK5 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOENTREGAXSITUACOES ADD CONSTRAINT MOENTREGAXSITUACOES_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOPAINELCOMPRAXGRADE ADD CONSTRAINT MOPAINELCOMPRAXGRADE_FK3 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOMOTBLOQXORCAMENTOITENS ADD CONSTRAINT MOMOTBLOQXORCAMENTOITENS_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK3 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOLISTAEVENTOXORC ADD CONSTRAINT MOLISTAEVENTOXORC_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

CREATE TABLE MOPREDOCUMXITENS_2204 AS SELECT * FROM MOPREDOCUMXITENS;

ALTER TABLE MOPREDOCUMXPEDIDOCOMPRA DROP CONSTRAINT MOPREDOCUMXPEDIDOCOMPRA_FK1;
ALTER TABLE MOPREDOCUMXCOMPOSICOESPR DROP CONSTRAINT MOPREDOCUMXCOMPOSICOESPR_FK1;
ALTER TABLE MOPREDOCUMXENDERECOESTOQ DROP CONSTRAINT MOPREDOCUMXENDERECOESTOQ_FK1;
ALTER TABLE MOPREDOCUMXEMBALAGENSTIN DROP CONSTRAINT MOPREDOCUMXEMBALAGENSTIN_FK1;
ALTER TABLE MOPREDOCUMXNUMEROSSERIE DROP CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK1;
ALTER TABLE MOPREDOCUMXCENTROSCUSTOS DROP CONSTRAINT MOPREDOCUMXCENTROSCUSTOS_FK1;
ALTER TABLE MOPREDOCUMXORCAMENTOITEM DROP CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK1;
ALTER TABLE MOPREDOCUMXPREDOCUM DROP CONSTRAINT MOPREDOCUMXPREDOCUM_FK1;
ALTER TABLE MOPREDOCUMXPREDOCUM DROP CONSTRAINT MOPREDOCUMXPREDOCUM_FK2;
ALTER TABLE MOPREDOCUMXPROJETOS DROP CONSTRAINT MOPREDOCUMXPROJETOS_FK1;
ALTER TABLE MOPREDOCUMXPROMOCOES DROP CONSTRAINT MOPREDOCUMXPROMOCOES_FK3;
ALTER TABLE MODOCFISCALXPREDOCUM DROP CONSTRAINT MODOCFISCALXPREDOCUM_FK2;
ALTER TABLE MOPREDOCUMXDOCFISCAL DROP CONSTRAINT MOPREDOCUMXDOCFISCAL_FK1;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK4;
ALTER TABLE MOVALEDESCXITEMPREDOCUM DROP CONSTRAINT MOVALEDESCXITEMPREDOCUM_FK2;
ALTER TABLE MOSEPARACAOXITENS DROP CONSTRAINT MOSEPARACAOXITENS_FK3;
ALTER TABLE MOPREDOCUMXESTOQUE DROP CONSTRAINT MOPREDOCUMXESTOQUE_FK1;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK14;
ALTER TABLE MODOCTRANSFXPREDOCUM DROP CONSTRAINT MODOCTRANSFXPREDOCUM_FK3;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK12;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK17;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK6;
ALTER TABLE MOMOTBLOQXPREDOCUMITENS DROP CONSTRAINT MOMOTBLOQXPREDOCUMITENS_FK2;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK4;

DROP TABLE MOPREDOCUMXITENS;

-- MOPREDOCUMXITENS
CREATE TABLE MOPREDOCUMXITENS
  (
    idItemPreDocumento            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    preDocumento                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoOriginal       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    servico                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    controleQuantidade            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaConversao        VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidade           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                        NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                       NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                   NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeDevolvidaRetornada  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConferida           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    percentualDevolucao           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    pesoLiquido                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoSugestaoAPrazo           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoSugestaoAVista           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoDesconto                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoMinimo                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    usarPrecoAVista               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioBruto            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    acrescimoUnitarioComposicao   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitario                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioConvertido       NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServicoBruto      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoServico           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percDescontoItem              NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDescontoItem             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percAcrescimoItem             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorAcrescimoItem            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteItem                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroItem               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerItem  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasItem   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteGeral               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroGeral              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoGeral            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasGeral      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerGeral NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasGeral  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoPagamento        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasPagamento  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosPagamento           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteTotal               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoTotal            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasTotal      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerTotal NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasTotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIRRF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIRRF                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseINSS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorINSS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT ' ' NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPIDevolucao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSProprioSubstituto    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpFederais   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpEstaduais  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpMunicipais NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseEstimadaImpostos          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpFederais      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpEstaduais     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpMunicipais    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpItem     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpGeral    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpTotal    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCustoOperacao            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCustoOperacao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeExtemporanea        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    acrescimoUnitarioExtemporaneo NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempSubtotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_PK1 PRIMARY KEY (idItemPreDocumento);
CREATE UNIQUE INDEX MOPREDOCUMXITENS_K2 ON MOPREDOCUMXITENS (preDocumento, sequencia);
CREATE INDEX MOPREDOCUMXITENS_K3 ON MOPREDOCUMXITENS (gradeProduto);
CREATE INDEX MOPREDOCUMXITENS_K4 ON MOPREDOCUMXITENS (preDocumento);
CREATE INDEX MOPREDOCUMXITENS_K5 ON MOPREDOCUMXITENS (preDocumento, cancelado);
CREATE INDEX MOPREDOCUMXITENS_K6 ON MOPREDOCUMXITENS (gradeProduto, cancelado);

INSERT INTO MOPREDOCUMXITENS (idItemPreDocumento, preDocumento, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '   ', 0, 0, 0, '  ', ' ', 0, 0, 0, '  ', 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ');
INSERT INTO MOPREDOCUMXITENS (idItemPreDocumento, preDocumento, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) SELECT a.idItemPreDocumento, a.preDocumento, a.sequencia, a.cancelado, b.modeloDocumento, b.estabelecimentoOriginal, a.vendedor, a.gradeProduto, a.servico, a.idFormulaTinta, a.personalizacao, a.idLoteEstoque, a.operacaoFiscal, a.movimentaEstoque, a.geraFinanceiro, a.localEstoque, a.pessoaParticipante, a.controleQuantidade, a.unidadeMedidaConversao, a.conversorQuantidade, a.loteMinimo, a.loteMultiplo, a.altura, a.largura, a.comprimento, a.pecas, a.quantidade, a.quantidadeConvertida, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.percentualDevolucao, a.pesoLiquido, a.pesoBruto, a.tipoPreco, a.tabelaPreco, a.precoSugestaoAPrazo, a.precoSugestaoAVista, a.precoDesconto, a.precoMinimo, a.usarPrecoAVista, a.precoPautaTabelado, a.precoUnitarioBruto, a.acrescimoUnitarioComposicao, a.precoUnitario, a.precoUnitarioConvertido, a.valorProdutoServicoBruto, a.valorProdutoServico, a.percDescontoItem, a.valorDescontoItem, a.percAcrescimoItem, a.valorAcrescimoItem, a.valorFreteItem, a.valorSeguroItem, a.valorAdicFreteMarinhaMerItem, a.valorDespesasAduaneirasItem, a.valorFreteGeral, a.valorSeguroGeral, a.valorDescontoGeral, a.valorOutrasDespesasGeral, a.valorAdicFreteMarinhaMerGeral, a.valorDespesasAduaneirasGeral, a.valorBasePagamento, a.valorDescontoPagamento, a.valorOutrasDespesasPagamento, a.valorJurosPagamento, a.valorFreteTotal, a.valorSeguroTotal, a.valorDescontoTotal, a.valorOutrasDespesasTotal, a.valorAdicFreteMarinhaMerTotal, a.valorDespesasAduaneirasTotal, a.cfop, a.indicadorISSQN, a.aliquotaISSQN, a.baseISSQN, a.valorISSQN, a.aliquotaIRRF, a.baseIRRF, a.valorIRRF, a.aliquotaINSS, a.baseINSS, a.valorINSS, a.retencaoPIS, a.baseRetPIS, a.valorRetPIS, a.retencaoCOFINS, a.baseRetCOFINS, a.valorRetCOFINS, a.retencaoCSLL, a.baseRetCSLL, a.valorRetCSLL, a.aliquotaII, a.baseII, a.valorII, a.aliquotaIOF, a.baseIOF, a.valorIOF, a.codigoEnquadramentoIPI, a.stIPI, a.aliquotaIPI, a.valorAliquotaIPI, a.baseIPI, a.valorIPI, a.valorIPIDevolucao, a.stPIS, a.aliquotaPIS, a.valorAliquotaPIS, a.basePIS, a.valorPIS, a.aliquotaPISST, a.valorAliquotaPISST, a.basePISST, a.valorPISST, a.stCOFINS, a.aliquotaCOFINS, a.valorAliquotaCOFINS, a.baseCOFINS, a.valorCOFINS, a.aliquotaCOFINSST, a.valorAliquotaCOFINSST, a.baseCOFINSST, a.valorCOFINSST, a.stSimplesNacional, a.creditoSimplesNacional, a.baseCreditoSimplesNacional, a.valorCreditoSimplesNacional, a.stICMS, a.modalidadeBaseCalcICMS, a.reducaoBaseICMS, a.aliquotaICMS, a.diferimentoICMS, a.motivoDesoneracaoICMS, a.baseICMS, a.valorICMSOperacao, a.valorICMSDiferido, a.valorICMS, a.valorICMSDesoneracao, a.modalidadeBaseCalcICMSST, a.margemValorAdicionadoST, a.reducaoBaseST, a.aliquotaICMSST, a.aliquotaSTSuportConsFinal, a.baseICMSST, a.valorICMSST, a.baseICMSSTAnteriormente, a.valorICMSSTAnteriormente, a.valorICMSProprioSubstituto, a.reducaoBaseICMSEfetivo, a.aliquotaICMSEfetivo, a.baseICMSEfetivo, a.valorICMSEfetivo, a.aliquotaICMSUFDestinatario, a.aliquotaICMSInterestadual, a.partilhaICMSInterestadual, a.baseICMSUFDestinatario, a.valorICMSUFDestinatario, a.baseICMSUFRemetente, a.valorICMSUFRemetente, a.aliquotaFCP, a.baseFCP, a.valorFCP, a.aliquotaFCPST, a.baseFCPST, a.valorFCPST, a.aliquotaFCPSTAnteriormente, a.baseFCPSTAnteriormente, a.valorFCPSTAnteriormente, a.aliquotaFCPUFDestinatario, a.baseFCPUFDestinatario, a.valorFCPUFDestinatario, a.aliquotaEstimadaImpFederais, a.aliquotaEstimadaImpEstaduais, a.aliquotaEstimadaImpMunicipais, a.baseEstimadaImpostos, a.valorEstimadoImpFederais, a.valorEstimadoImpEstaduais, a.valorEstimadoImpMunicipais, a.valorImpostosSomaPagamento, a.valorImpostosDiminuiPagamento, a.valorLiquidoItem, a.valorDescontoCustoOpItem, a.valorDescontoCustoOpGeral, a.valorDescontoCustoOpTotal, a.valorAcrescimoCustoOpItem, a.valorAcrescimoCustoOpGeral, a.valorAcrescimoCustoOpTotal, a.precoCustoOperacao, a.valorCustoOperacao, a.precoCMV, a.valorCMV, a.quantidadeExtemporanea, a.acrescimoUnitarioExtemporaneo, a.valorAcrescimoExtempSubtotal, a.valorAcrescimoExtempItem, a.valorAcrescimoExtempGeral, a.valorAcrescimoExtempTotal, a.observacoesDigitadas, a.observacoes FROM MOPREDOCUMXITENS_2204 a JOIN MOPREDOCUMENTOS b ON b.preDocumento = a.preDocumento WHERE a.idItemPreDocumento > 0;

COMMIT;

ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK1 FOREIGN KEY (preDocumento) REFERENCES MOPREDOCUMENTOS (preDocumento);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK3 FOREIGN KEY (estabelecimentoOriginal) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK4 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK6 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK7 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK8 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK9 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK10 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK11 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK12 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK13 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK14 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK15 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK16 FOREIGN KEY (cfop) REFERENCES SICFOPS (cfop);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK17 FOREIGN KEY (indicadorISSQN) REFERENCES SIINDICISSQN (indicadorISSQN);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK18 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK19 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK20 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK21 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK22 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK23 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK24 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK25 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);

ALTER TABLE MOPREDOCUMXPEDIDOCOMPRA ADD CONSTRAINT MOPREDOCUMXPEDIDOCOMPRA_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXCOMPOSICOESPR ADD CONSTRAINT MOPREDOCUMXCOMPOSICOESPR_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXENDERECOESTOQ ADD CONSTRAINT MOPREDOCUMXENDERECOESTOQ_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXEMBALAGENSTIN ADD CONSTRAINT MOPREDOCUMXEMBALAGENSTIN_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXCENTROSCUSTOS ADD CONSTRAINT MOPREDOCUMXCENTROSCUSTOS_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXORCAMENTOITEM ADD CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPREDOCUM ADD CONSTRAINT MOPREDOCUMXPREDOCUM_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPREDOCUM ADD CONSTRAINT MOPREDOCUMXPREDOCUM_FK2 FOREIGN KEY (idItemPreDocReferenciado) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPROJETOS ADD CONSTRAINT MOPREDOCUMXPROJETOS_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPROMOCOES ADD CONSTRAINT MOPREDOCUMXPROMOCOES_FK3 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MODOCFISCALXPREDOCUM ADD CONSTRAINT MODOCFISCALXPREDOCUM_FK2 FOREIGN KEY (idItemPreDocReferenciado) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXDOCFISCAL ADD CONSTRAINT MOPREDOCUMXDOCFISCAL_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK4 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOVALEDESCXITEMPREDOCUM ADD CONSTRAINT MOVALEDESCXITEMPREDOCUM_FK2 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOSEPARACAOXITENS ADD CONSTRAINT MOSEPARACAOXITENS_FK3 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXESTOQUE ADD CONSTRAINT MOPREDOCUMXESTOQUE_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK14 FOREIGN KEY (idItemPreDocumentoSaida) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MODOCTRANSFXPREDOCUM ADD CONSTRAINT MODOCTRANSFXPREDOCUM_FK3 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK12 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK17 FOREIGN KEY (idItemPreDocumentoDevolucao) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK6 FOREIGN KEY (idItemPreDocumentoRemessa) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOMOTBLOQXPREDOCUMITENS ADD CONSTRAINT MOMOTBLOQXPREDOCUMITENS_FK2 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK4 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);

CREATE TABLE MODOCFISCALXITENS_2204 AS SELECT * FROM MODOCFISCALXITENS;

ALTER TABLE MODOCFISCALXPEDIDOCOMPRA DROP CONSTRAINT MODOCFISCALXPEDIDOCOMPRA_FK1;
ALTER TABLE MODOCFISCALXCOMPOSICOESPR DROP CONSTRAINT MODOCFISCALXCOMPOSICOESPR_FK1;
ALTER TABLE MODOCFISCALXENDERECOESTOQ DROP CONSTRAINT MODOCFISCALXENDERECOESTOQ_FK1;
ALTER TABLE MODOCFISCALXEMBALAGENSTIN DROP CONSTRAINT MODOCFISCALXEMBALAGENSTIN_FK1;
ALTER TABLE MODOCFISCALXNUMEROSSERIE DROP CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK1;
ALTER TABLE MODOCFISCALXCENTROSCUSTOS DROP CONSTRAINT MODOCFISCALXCENTROSCUSTOS_FK1;
ALTER TABLE MODOCFISCALXORCAMENTOITEM DROP CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK1;
ALTER TABLE MODOCFISCALXPREDOCUM DROP CONSTRAINT MODOCFISCALXPREDOCUM_FK1;
ALTER TABLE MODOCFISCALXDOCFISCAL DROP CONSTRAINT MODOCFISCALXDOCFISCAL_FK1;
ALTER TABLE MODOCFISCALXDOCFISCAL DROP CONSTRAINT MODOCFISCALXDOCFISCAL_FK2;
ALTER TABLE MOPREDOCUMXDOCFISCAL DROP CONSTRAINT MOPREDOCUMXDOCFISCAL_FK2;
ALTER TABLE MODOCFISCALXPROJETOS DROP CONSTRAINT MODOCFISCALXPROJETOS_FK1;
ALTER TABLE MODOCFISCALXPROMOCOES DROP CONSTRAINT MODOCFISCALXPROMOCOES_FK3;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK5;
ALTER TABLE MODISTRIBUICAODFEXGRADE DROP CONSTRAINT MODISTRIBUICAODFEXGRADE_FK3;
ALTER TABLE MOVALEDESCXITEMDOCFISCAL DROP CONSTRAINT MOVALEDESCXITEMDOCFISCAL_FK2;
ALTER TABLE MOSEPARACAOXITENS DROP CONSTRAINT MOSEPARACAOXITENS_FK4;
ALTER TABLE MODOCFISCALXESTOQUE DROP CONSTRAINT MODOCFISCALXESTOQUE_FK1;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK15;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK17;
ALTER TABLE MOBALANCOXDOCFISCAL DROP CONSTRAINT MOBALANCOXDOCFISCAL_FK2;
ALTER TABLE MODOCTRANSFXDOCFISCAL DROP CONSTRAINT MODOCTRANSFXDOCFISCAL_FK3;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK13;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK18;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK7;
ALTER TABLE MOMOTBLOQXDOCFISCALITENS DROP CONSTRAINT MOMOTBLOQXDOCFISCALITENS_FK2;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK5;

DROP TABLE MODOCFISCALXITENS;

-- MODOCFISCALXITENS
CREATE TABLE MODOCFISCALXITENS
  (
    idItemDocFiscal               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoOriginal       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    servico                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    controleQuantidade            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaConversao        VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidade           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                        NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                       NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                   NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeDevolvidaRetornada  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConferida           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    percentualDevolucao           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    pesoLiquido                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoSugestaoAPrazo           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoSugestaoAVista           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoDesconto                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoMinimo                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    usarPrecoAVista               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioBruto            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    acrescimoUnitarioComposicao   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitario                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioConvertido       NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServicoBruto      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoServico           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percDescontoItem              NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDescontoItem             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percAcrescimoItem             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorAcrescimoItem            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteItem                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroItem               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerItem  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasItem   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteGeral               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroGeral              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoGeral            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasGeral      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerGeral NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasGeral  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoPagamento        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasPagamento  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosPagamento           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteTotal               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoTotal            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasTotal      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerTotal NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasTotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIRRF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIRRF                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseINSS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorINSS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT ' ' NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPIDevolucao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSProprioSubstituto    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMSEscrituracao            CHAR (2) DEFAULT '  ' NOT NULL,
    reducaoBaseICMSEscrituracao   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEscrituracao      NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEscrituracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEscrituracao         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesonEscrituracao    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    margemValorAdicSTEscrituracao NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseSTEscrituracao     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSSTEscrituracao    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSSTEscrituracao        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTEscrituracao       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    somarICMSST                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpFederais   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpEstaduais  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpMunicipais NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseEstimadaImpostos          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpFederais      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpEstaduais     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpMunicipais    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpItem     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpGeral    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpTotal    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCustoOperacao            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCustoOperacao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeExtemporanea        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    acrescimoUnitarioExtemporaneo NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempSubtotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_PK1 PRIMARY KEY (idItemDocFiscal);
CREATE UNIQUE INDEX MODOCFISCALXITENS_K2 ON MODOCFISCALXITENS (idDocumentoFiscal, sequencia);
CREATE INDEX MODOCFISCALXITENS_K3 ON MODOCFISCALXITENS (idDocumentoFiscal, cancelado, stICMS, cfop, aliquotaICMS, sequencia);
CREATE INDEX MODOCFISCALXITENS_K4 ON MODOCFISCALXITENS (gradeProduto);
CREATE INDEX MODOCFISCALXITENS_K5 ON MODOCFISCALXITENS (idDocumentoFiscal);
CREATE INDEX MODOCFISCALXITENS_K6 ON MODOCFISCALXITENS (idDocumentoFiscal, cancelado);
CREATE INDEX MODOCFISCALXITENS_K7 ON MODOCFISCALXITENS (gradeProduto, cancelado);

INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, '   ', 0, 0, 0, '  ', ' ', 0, 0, 0, '  ', 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ');
INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) SELECT a.idItemDocFiscal, a.idDocumentoFiscal, a.sequencia, a.cancelado, b.modeloDocumento, b.estabelecimentoOriginal, a.vendedor, a.gradeProduto, a.servico, a.idFormulaTinta, a.personalizacao, a.idLoteEstoque, a.operacaoFiscal, a.movimentaEstoque, a.geraFinanceiro, a.localEstoque, a.pessoaParticipante, a.controleQuantidade, a.unidadeMedidaConversao, a.conversorQuantidade, a.loteMinimo, a.loteMultiplo, a.altura, a.largura, a.comprimento, a.pecas, a.quantidade, a.quantidadeConvertida, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.percentualDevolucao, a.pesoLiquido, a.pesoBruto, a.tipoPreco, a.tabelaPreco, a.precoSugestaoAPrazo, a.precoSugestaoAVista, a.precoDesconto, a.precoMinimo, a.usarPrecoAVista, a.precoPautaTabelado, a.precoUnitarioBruto, a.acrescimoUnitarioComposicao, a.precoUnitario, a.precoUnitarioConvertido, a.valorProdutoServicoBruto, a.valorProdutoServico, a.percDescontoItem, a.valorDescontoItem, a.percAcrescimoItem, a.valorAcrescimoItem, a.valorFreteItem, a.valorSeguroItem, a.valorAdicFreteMarinhaMerItem, a.valorDespesasAduaneirasItem, a.valorFreteGeral, a.valorSeguroGeral, a.valorDescontoGeral, a.valorOutrasDespesasGeral, a.valorAdicFreteMarinhaMerGeral, a.valorDespesasAduaneirasGeral, a.valorBasePagamento, a.valorDescontoPagamento, a.valorOutrasDespesasPagamento, a.valorJurosPagamento, a.valorFreteTotal, a.valorSeguroTotal, a.valorDescontoTotal, a.valorOutrasDespesasTotal, a.valorAdicFreteMarinhaMerTotal, a.valorDespesasAduaneirasTotal, a.cfop, a.indicadorISSQN, a.aliquotaISSQN, a.baseISSQN, a.valorISSQN, a.aliquotaIRRF, a.baseIRRF, a.valorIRRF, a.aliquotaINSS, a.baseINSS, a.valorINSS, a.retencaoPIS, a.baseRetPIS, a.valorRetPIS, a.retencaoCOFINS, a.baseRetCOFINS, a.valorRetCOFINS, a.retencaoCSLL, a.baseRetCSLL, a.valorRetCSLL, a.aliquotaII, a.baseII, a.valorII, a.aliquotaIOF, a.baseIOF, a.valorIOF, a.codigoEnquadramentoIPI, a.stIPI, a.aliquotaIPI, a.valorAliquotaIPI, a.baseIPI, a.valorIPI, a.valorIPIDevolucao, a.stPIS, a.aliquotaPIS, a.valorAliquotaPIS, a.basePIS, a.valorPIS, a.aliquotaPISST, a.valorAliquotaPISST, a.basePISST, a.valorPISST, a.stCOFINS, a.aliquotaCOFINS, a.valorAliquotaCOFINS, a.baseCOFINS, a.valorCOFINS, a.aliquotaCOFINSST, a.valorAliquotaCOFINSST, a.baseCOFINSST, a.valorCOFINSST, a.stSimplesNacional, a.creditoSimplesNacional, a.baseCreditoSimplesNacional, a.valorCreditoSimplesNacional, a.stICMS, a.modalidadeBaseCalcICMS, a.reducaoBaseICMS, a.aliquotaICMS, a.diferimentoICMS, a.motivoDesoneracaoICMS, a.baseICMS, a.valorICMSOperacao, a.valorICMSDiferido, a.valorICMS, a.valorICMSDesoneracao, a.modalidadeBaseCalcICMSST, a.margemValorAdicionadoST, a.reducaoBaseST, a.aliquotaICMSST, a.aliquotaSTSuportConsFinal, a.baseICMSST, a.valorICMSST, a.baseICMSSTAnteriormente, a.valorICMSSTAnteriormente, a.valorICMSProprioSubstituto, a.reducaoBaseICMSEfetivo, a.aliquotaICMSEfetivo, a.baseICMSEfetivo, a.valorICMSEfetivo, a.stICMSEscrituracao, a.reducaoBaseICMSEscrituracao, a.aliquotaICMSEscrituracao, a.baseICMSEscrituracao, a.valorICMSEscrituracao, a.valorICMSDesonEscrituracao, a.margemValorAdicSTEscrituracao, a.reducaoBaseSTEscrituracao, a.aliquotaICMSSTEscrituracao, a.baseICMSSTEscrituracao, a.valorICMSSTEscrituracao, a.somarICMSST, a.aliquotaICMSUFDestinatario, a.aliquotaICMSInterestadual, a.partilhaICMSInterestadual, a.baseICMSUFDestinatario, a.valorICMSUFDestinatario, a.baseICMSUFRemetente, a.valorICMSUFRemetente, a.aliquotaFCP, a.baseFCP, a.valorFCP, a.aliquotaFCPST, a.baseFCPST, a.valorFCPST, a.aliquotaFCPSTAnteriormente, a.baseFCPSTAnteriormente, a.valorFCPSTAnteriormente, a.aliquotaFCPUFDestinatario, a.baseFCPUFDestinatario, a.valorFCPUFDestinatario, a.aliquotaEstimadaImpFederais, a.aliquotaEstimadaImpEstaduais, a.aliquotaEstimadaImpMunicipais, a.baseEstimadaImpostos, a.valorEstimadoImpFederais, a.valorEstimadoImpEstaduais, a.valorEstimadoImpMunicipais, a.valorImpostosSomaPagamento, a.valorImpostosDiminuiPagamento, a.valorLiquidoItem, a.valorDescontoCustoOpItem, a.valorDescontoCustoOpGeral, a.valorDescontoCustoOpTotal, a.valorAcrescimoCustoOpItem, a.valorAcrescimoCustoOpGeral, a.valorAcrescimoCustoOpTotal, a.precoCustoOperacao, a.valorCustoOperacao, a.precoCMV, a.valorCMV, a.quantidadeExtemporanea, a.acrescimoUnitarioExtemporaneo, a.valorAcrescimoExtempSubtotal, a.valorAcrescimoExtempItem, a.valorAcrescimoExtempGeral, a.valorAcrescimoExtempTotal, a.observacoesDigitadas, a.observacoes FROM MODOCFISCALXITENS_2204 a JOIN MODOCUMENTOSFISCAIS b ON b.idDocumentoFiscal = a.idDocumentoFiscal WHERE a.idItemDocFiscal > 0;

COMMIT;

ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK3 FOREIGN KEY (estabelecimentoOriginal) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK4 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK6 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK7 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK8 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK9 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK10 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK11 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK12 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK13 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK14 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK15 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK16 FOREIGN KEY (cfop) REFERENCES SICFOPS (cfop);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK17 FOREIGN KEY (indicadorISSQN) REFERENCES SIINDICISSQN (indicadorISSQN);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK18 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK19 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK20 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK21 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK22 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK23 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK24 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK25 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK26 FOREIGN KEY (stICMSEscrituracao) REFERENCES SISITTRIBUTICMS (stICMS);

ALTER TABLE MODOCFISCALXPEDIDOCOMPRA ADD CONSTRAINT MODOCFISCALXPEDIDOCOMPRA_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXCOMPOSICOESPR ADD CONSTRAINT MODOCFISCALXCOMPOSICOESPR_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXENDERECOESTOQ ADD CONSTRAINT MODOCFISCALXENDERECOESTOQ_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXEMBALAGENSTIN ADD CONSTRAINT MODOCFISCALXEMBALAGENSTIN_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXCENTROSCUSTOS ADD CONSTRAINT MODOCFISCALXCENTROSCUSTOS_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
DELETE MODOCFISCALXORCAMENTOITEM a WHERE NOT(EXISTS(SELECT 1 FROM MODOCFISCALXITENS b WHERE b.idItemDocFiscal = a.idItemDocFiscal));
COMMIT;
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPREDOCUM ADD CONSTRAINT MODOCFISCALXPREDOCUM_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXDOCFISCAL ADD CONSTRAINT MODOCFISCALXDOCFISCAL_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXDOCFISCAL ADD CONSTRAINT MODOCFISCALXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscalReferenciado) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOPREDOCUMXDOCFISCAL ADD CONSTRAINT MOPREDOCUMXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscalReferenciado) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPROJETOS ADD CONSTRAINT MODOCFISCALXPROJETOS_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPROMOCOES ADD CONSTRAINT MODOCFISCALXPROMOCOES_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK5 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODISTRIBUICAODFEXGRADE ADD CONSTRAINT MODISTRIBUICAODFEXGRADE_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOVALEDESCXITEMDOCFISCAL ADD CONSTRAINT MOVALEDESCXITEMDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOSEPARACAOXITENS ADD CONSTRAINT MOSEPARACAOXITENS_FK4 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXESTOQUE ADD CONSTRAINT MODOCFISCALXESTOQUE_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK15 FOREIGN KEY (idItemDocFiscalSaida) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK17 FOREIGN KEY (idItemDocFiscalEntrada) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOBALANCOXDOCFISCAL ADD CONSTRAINT MOBALANCOXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTRANSFXDOCFISCAL ADD CONSTRAINT MODOCTRANSFXDOCFISCAL_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK13 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK18 FOREIGN KEY (idItemDocFiscalDevolucao) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK7 FOREIGN KEY (idItemDocFiscalRemessa) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOMOTBLOQXDOCFISCALITENS ADD CONSTRAINT MOMOTBLOQXDOCFISCALITENS_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK5 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

CREATE TABLE MOPREDOCUMXORCAMENTOITEM_2204 AS SELECT * FROM MOPREDOCUMXORCAMENTOITEM;

DROP TABLE MOPREDOCUMXORCAMENTOITEM;

-- MOPREDOCUMXORCAMENTOITEM
CREATE TABLE MOPREDOCUMXORCAMENTOITEM
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    efetivacao         NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOPREDOCUMXORCAMENTOITEM ADD CONSTRAINT MOPREDOCUMXORCAMENTOITEM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOPREDOCUMXORCAMENTOITEM_K2 ON MOPREDOCUMXORCAMENTOITEM (idItemPreDocumento, idItemOrcamento);
CREATE INDEX MOPREDOCUMXORCAMENTOITEM_K3 ON MOPREDOCUMXORCAMENTOITEM (idItemPreDocumento);
CREATE INDEX MOPREDOCUMXORCAMENTOITEM_K4 ON MOPREDOCUMXORCAMENTOITEM (idItemOrcamento);

INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade, efetivacao) VALUES (0, 0, 0, 0, 0);
INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade, efetivacao) SELECT id, idItemPreDocumento, idItemOrcamento, quantidade, CASE WHEN quantidade = 0 THEN 0 ELSE 1 END FROM MOPREDOCUMXORCAMENTOITEM_2204 WHERE id > 0;

COMMIT;

DELETE MOPREDOCUMXORCAMENTOITEM a WHERE NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXITENS b WHERE b.idItemPreDocumento = a.idItemPreDocumento));
COMMIT;
ALTER TABLE MOPREDOCUMXORCAMENTOITEM ADD CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);

DELETE MOPREDOCUMXORCAMENTOITEM a WHERE NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXITENS b WHERE b.idItemOrcamento = a.idItemOrcamento));
COMMIT;
ALTER TABLE MOPREDOCUMXORCAMENTOITEM ADD CONSTRAINT MOPREDOCUMXORCAMENTOITEM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

CREATE TABLE MODOCFISCALXORCAMENTOITEM_2204 AS SELECT * FROM MODOCFISCALXORCAMENTOITEM;

DROP TABLE MODOCFISCALXORCAMENTOITEM;

-- MODOCFISCALXORCAMENTOITEM
CREATE TABLE MODOCFISCALXORCAMENTOITEM
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    efetivacao      NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MODOCFISCALXORCAMENTOITEM_K2 ON MODOCFISCALXORCAMENTOITEM (idItemDocFiscal, idItemOrcamento);
CREATE INDEX MODOCFISCALXORCAMENTOITEM_K3 ON MODOCFISCALXORCAMENTOITEM (idItemDocFiscal);
CREATE INDEX MODOCFISCALXORCAMENTOITEM_K4 ON MODOCFISCALXORCAMENTOITEM (idItemOrcamento);

INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade, efetivacao) VALUES (0, 0, 0, 0, 0);
INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade, efetivacao) SELECT id, idItemDocFiscal, idItemOrcamento, quantidade, CASE WHEN quantidade = 0 THEN 0 ELSE 1 END FROM MODOCFISCALXORCAMENTOITEM_2204 WHERE id > 0;

COMMIT;

DELETE MODOCFISCALXORCAMENTOITEM a WHERE NOT(EXISTS(SELECT 1 FROM MODOCFISCALXITENS b WHERE b.idItemDocFiscal = a.idItemDocFiscal));
COMMIT;
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

DELETE MODOCFISCALXORCAMENTOITEM a WHERE NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXITENS b WHERE b.idItemOrcamento = a.idItemOrcamento));
COMMIT;
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

create or replace FUNCTION FUNC_ADD_DATA_PRIMEIRA_COMPRA(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_produto                     IN NUMBER,
    p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_dataPrimeiraCompra DATE;
BEGIN
  SELECT MIN(TRUNC(a.dataEntradaSaida))
  INTO v_dataPrimeiraCompra
  FROM (
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) a
  WHERE p_estabelecimento = 0
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 0
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento))
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 1
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
    JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento));
  RETURN v_dataPrimeiraCompra;
END;

/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_COMPRA(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_produto                     IN NUMBER,
    p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_dataUltimaCompra DATE;
BEGIN
  SELECT MAX(TRUNC(a.dataEntradaSaida))
  INTO v_dataUltimaCompra
  FROM (
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) a
  WHERE p_estabelecimento = 0
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 0
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento))
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 1
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
    JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento));
  RETURN v_dataUltimaCompra;
END;

/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_VENDA(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_produto                     IN NUMBER,
    p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_dataUltimaVenda DATE;
BEGIN
  SELECT MAX(TRUNC(a.dataEntradaSaida))
  INTO v_dataUltimaVenda
  FROM (
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND kit.ativo = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND kit.ativo = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) a
  WHERE p_estabelecimento = 0
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 0
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento))
  OR p_estabelecimento <> 0
  AND p_config_209_filtrarGrupoEcon = 1
  AND EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
    JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
    JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
    WHERE est.estabelecimento = a.estabelecimento
    AND (est.estabelecimento = p_estabelecimento
      OR est2.estabelecimento = p_estabelecimento));
  RETURN v_dataUltimaVenda;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_RESERVAS_PROD(
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- O = Orçamento, T = Transferencia
    p_idDocumentoDesconsiderar    IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER

IS
  v_quantidadeReservas           NUMBER(15,6);
  v_quantidadeOrcamento          NUMBER(15,6);
  v_quantidadeTransferencia      NUMBER(15,6);
  v_quantidadeTransfDigitacao    NUMBER(15,6);

BEGIN
  v_quantidadeReservas           := 0;
  v_quantidadeOrcamento          := 0;
  v_quantidadeTransferencia      := 0;
  v_quantidadeTransfDigitacao    := 0;
  
  SELECT COALESCE((
    SELECT SUM(a.quantidadeSaldo)
    FROM (
      SELECT
        CASE
          WHEN prod.controleEstoque IN (1,5,11)
          THEN
            COALESCE((
              SELECT SUM(a.quantidadeSaldo)
              FROM MORESERVASESTOQUE a
              JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
              WHERE a.entradaSaida = '' || p_entradaSaida || ''
              AND a.gradeProduto = gradProd.gradeProduto
              AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
              AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
              AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
              AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
              AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
              AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
              AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
              AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
            ),0)
          WHEN prod.controleEstoque IN (3,4)
          THEN 
            TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MORESERVASESTOQUE a
                    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                    WHERE a.entradaSaida = '' || p_entradaSaida || ''
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                    AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                    AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                    AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                    AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                    AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                  ) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
              ) a
              WHERE a.gradeProduto = gradProd.gradeProduto
            ), uniMed.casasDecimaisUnidadeMedida)
          ELSE 0
        END quantidadeSaldo
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto
    ) a
  ),0) INTO v_quantidadeReservas FROM DUAL;

  IF p_documentoDesconsiderar = 'O' AND p_idDocumentoDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = b.idItemOrcamento
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MORESERVASESTOQUE a
                      JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                      JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = b.idItemOrcamento
                      WHERE a.entradaSaida = '' || p_entradaSaida || ''
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeOrcamento FROM DUAL;
  END IF;

  IF p_documentoDesconsiderar = 'T' AND p_idDocumentoDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MORESERVASESTOQUE a
                      JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                      JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                      WHERE a.entradaSaida = '' || p_entradaSaida || ''
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeTransferencia FROM DUAL;
  END IF;

  IF p_config_160_permiteTransfSem IN ('A','B') AND p_entradaSaida = 'S' AND p_idEnderecoEstoque = 0 AND p_idNumeroSerie = 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MODOCUMENTOTRANSFXITENS a
                JOIN MODOCUMENTOSTRANSFERENCIA docTransf ON docTransf.documentoTransferencia = a.documentoTransferencia
                JOIN PAMODELOSDOCUMENTO modDoc on modDoc.modeloDocumento = docTransf.modeloDocumento
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoqueSaida
                WHERE a.validoSaida = 1
                AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                AND a.gradeProduto = gradProd.gradeProduto
                AND docTransf.tipoDocumentoSaida > 100
                AND docTransf.situacaoDocTransferencia = 'E'
                AND modDoc.movimentaEstoque = 1
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR docTransf.estabelecimentoSaida = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                AND (prod.controleEstoque IN (1,5) OR prod.controleEstoque = 11 AND CASE WHEN docTransf.tipoDocumentoSaida = 101 THEN p_config_82_considLenteDispon ELSE p_config_83_considLenteEstoqu END = 1)
              ),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MODOCUMENTOTRANSFXITENS a
                      JOIN MODOCUMENTOSTRANSFERENCIA docTransf ON docTransf.documentoTransferencia = a.documentoTransferencia
                      JOIN PAMODELOSDOCUMENTO modDoc on modDoc.modeloDocumento = docTransf.modeloDocumento
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoqueSaida
                      WHERE a.validoSaida = 1
                      AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND docTransf.tipoDocumentoSaida > 100
                      AND docTransf.situacaoDocTransferencia = 'E'
                      AND modDoc.movimentaEstoque = 1
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR docTransf.estabelecimentoSaida = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                      AND (p_personalizacao = 0 OR a.personalizacao = p_personalizacao)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeTransfDigitacao FROM DUAL;
  END IF;

  RETURN v_quantidadeReservas - v_quantidadeOrcamento - v_quantidadeTransferencia + v_quantidadeTransfDigitacao;

END;

/

create or replace FUNCTION BUSCA_RESERVAS_ESTOQUE(
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_orcamentoDesconsiderar      IN NUMBER,
    p_transferenciaDesconsiderar  IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas           NUMBER(15,6);
  v_quantidadeOrcamento          NUMBER(15,6);
  v_quantidadeTransferencia      NUMBER(15,6);
  v_quantidadeTransfDigitacao    NUMBER(15,6);
BEGIN
  v_quantidadeReservas           := 0;
  v_quantidadeOrcamento          := 0;
  v_quantidadeTransferencia      := 0;
  v_quantidadeTransfDigitacao    := 0;
  SELECT COALESCE((
    SELECT SUM(a.quantidadeSaldo)
    FROM (
      SELECT
        CASE
          WHEN prod.controleEstoque IN (3,4)
          THEN 
            TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  BUSCA_RESERVAS_ESTOQUE(
                    p_config_82_considLenteDispon,
                    p_config_83_considLenteEstoqu,
                    p_config_160_permiteTransfSem,
                    0, -- p_produto,
                    0, -- p_cor,
                    ' ', -- p_tamanho,
                    kit.gradeProdutoFilho,
                    0, -- p_idLoteEstoque,
                    p_estabelecimento,
                    p_indicadorPropriedadePosseIt,
                    p_pessoaParticipante,
                    p_localEstoque,
                    p_idEnderecoEstoque,
                    0, -- p_idNumeroSerie
                    p_orcamentoDesconsiderar,
                    p_transferenciaDesconsiderar,
                    p_entradaSaida) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                AND prodFilho.controleEstoque IN (1,3,4,5,11,12)
                GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
              ) a
              WHERE a.gradeProduto = gradProd.gradeProduto
            ), uniMed.casasDecimaisUnidadeMedida)
          WHEN prod.controleEstoque IN (1,5,11,12)
          THEN
            COALESCE((
              SELECT SUM(a.quantidadeSaldo)
              FROM MORESERVASESTOQUE a
              JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
              WHERE a.entradaSaida = '' || p_entradaSaida || ''
              AND a.gradeProduto = gradProd.gradeProduto
              AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
              AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
              AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
              AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
              AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
              AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
              AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
            ),0)
          ELSE 0
        END quantidadeSaldo
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto
    ) a
  ),0) INTO v_quantidadeReservas FROM DUAL;
  IF p_orcamentoDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MORESERVASESTOQUE a
                      JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                      JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = b.idItemOrcamento
                      WHERE a.entradaSaida = '' || p_entradaSaida || ''
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND itemOrc.orcamento = p_orcamentoDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                  JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  AND prodFilho.controleEstoque IN (1,5,11,12)
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            WHEN prod.controleEstoque IN (1,5,11,12)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = b.idItemOrcamento
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemOrc.orcamento = p_orcamentoDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeOrcamento FROM DUAL;
  END IF;
  IF p_transferenciaDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MORESERVASESTOQUE a
                      JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                      JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                      WHERE a.entradaSaida = '' || p_entradaSaida || ''
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND itemTransf.documentoTransferencia = p_transferenciaDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                  JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  AND prodFilho.controleEstoque IN (1,5,11,12)
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            WHEN prod.controleEstoque IN (1,5,11,12)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
                JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemTransf.documentoTransferencia = p_transferenciaDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeTransferencia FROM DUAL;
  END IF;
  IF p_config_160_permiteTransfSem IN ('A','B') AND p_entradaSaida = 'S' AND p_idEnderecoEstoque = 0 AND p_idNumeroSerie = 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11,12)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MODOCUMENTOTRANSFXITENS a
                JOIN MODOCUMENTOSTRANSFERENCIA docTransf ON docTransf.documentoTransferencia = a.documentoTransferencia
                JOIN PAMODELOSDOCUMENTO modDoc on modDoc.modeloDocumento = docTransf.modeloDocumento
                JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoqueSaida
                WHERE a.validoSaida = 1
                AND a.documentoTransferencia <> p_transferenciaDesconsiderar
                AND a.gradeProduto = gradProd.gradeProduto
                AND docTransf.tipoDocumentoSaida > 100
                AND docTransf.situacaoDocTransferencia = 'E'
                AND modDoc.movimentaEstoque = 1
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR docTransf.estabelecimentoSaida = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                AND (prod.controleEstoque IN (1,12) OR prod.controleEstoque = 11 AND CASE WHEN docTransf.tipoDocumentoSaida = 101 THEN p_config_82_considLenteDispon ELSE p_config_83_considLenteEstoqu END = 1)
              ),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN 
              TRUNC ((
                SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
                FROM (
                  SELECT kit.gradeProduto,
                    kit.gradeProdutoFilho,
                    kit.quantidade quantidadeKit,
                    ( SELECT SUM (a.quantidadeSaldo)
                      FROM MODOCUMENTOTRANSFXITENS a
                      JOIN MODOCUMENTOSTRANSFERENCIA docTransf ON docTransf.documentoTransferencia = a.documentoTransferencia
                      JOIN PAMODELOSDOCUMENTO modDoc on modDoc.modeloDocumento = docTransf.modeloDocumento
                      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoqueSaida
                      WHERE a.validoSaida = 1
                      AND a.documentoTransferencia <> p_transferenciaDesconsiderar
                      AND a.gradeProduto = kit.gradeProdutoFilho
                      AND docTransf.tipoDocumentoSaida > 100
                      AND docTransf.situacaoDocTransferencia = 'E'
                      AND modDoc.movimentaEstoque = 1
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR docTransf.estabelecimentoSaida = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0 OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL OR p_tamanho = ' ' OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto
      ) a
    ),0) INTO v_quantidadeTransfDigitacao FROM DUAL;
  END IF;
  RETURN v_quantidadeReservas - v_quantidadeOrcamento - v_quantidadeTransferencia + v_quantidadeTransfDigitacao;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
    p_dataPosicaoEstoque          IN DATE,
    p_gradeProduto                IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_prod_controleEstoque        IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
    p_idDocumentoDesconsiderar    IN NUMBER,
    p_estoqueFiscal               IN NUMBER)
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  -- KIT / COMBO
  IF p_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC((FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
        p_dataPosicaoEstoque,
        kit.gradeProdutoFilho,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar,
        p_estoqueFiscal) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_documentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque) + CASE WHEN inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
--      AND inv.motivoInventarioEstoque = '01') a;
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS(
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND gradProd.produto = p_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE gradProd.produto = p_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (v_idInventarioEstoque <= 0
		  OR est.data >= TRUNC(v_dataInventario)+1)),
      CASE
        WHEN v_idInventarioEstoque > 0 AND NOT (v_dataInventario IS NULL)
        THEN TRUNC (v_dataInventario) + 1
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END)
    INTO v_dataPosicaoEstoqueInicial
    FROM DUAL;
    -- v_quantidadeInventario
    IF v_idInventarioEstoque > 0 THEN
      SELECT COALESCE((
        SELECT SUM (CASE WHEN p_estoqueFiscal = 1 THEN est.quantidadeFiscal ELSE est.quantidadeGerencial END)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    ELSE
      v_quantidadeInventario := 0;
    END IF;
    -- v_quantidadeEstoque
    IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOESTOQUES est
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_indicadorPropriedadePosseIt IS NULL
		  OR p_indicadorPropriedadePosseIt = ' '
		  OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_pessoaParticipante = 0
		  OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_localEstoque = 0
		  AND locEst.validoEstoqueTotal = 1
		  OR est.localEstoque = p_localEstoque)
         AND (p_personalizacao = 0
		  OR est.personalizacao = p_personalizacao)
       AND (p_idLoteEstoque = 0
		  OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque = 0
		  OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		  OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		  OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    ELSE
      v_quantidadeEstoque := 0;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_documentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		      OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    ELSE
      v_quantidadeDocumentoFiscal := 0;
    END IF;
    -- v_quantidadePreDocumento
    IF p_documentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		      OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    ELSE
      v_quantidadePreDocumento := 0;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
END;

/

create or replace FUNCTION BUSCA_QUANTIDADE_ESTOQUE(
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_preDocumentoDesconsiderar   IN NUMBER,
    p_idDocumentoFiscalDesconsid  IN NUMBER,
    p_dataPosicaoEstoque          IN DATE)
  RETURN NUMBER
IS
  v_quantidadeEstoque NUMBER (15,6);
BEGIN
  SELECT COALESCE((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
      p_dataPosicaoEstoque,
      gradprod.gradeProduto,
      est.estabelecimento,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_localEstoque,
      p_personalizacao,
      p_idLoteEstoque,
      p_idEnderecoEstoque,
      p_idNumeroSerie,
      gradprod.produto,
      prod.controleEstoque,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN 'D'
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN 'P'
	      ELSE ' '
      END,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN p_idDocumentoFiscalDesconsid
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN p_preDocumentoDesconsiderar
	      ELSE 0
      END,
	    0))
    FROM PAESTABELECIMENTOS est
	  JOIN CAGRADESPRODUTO gradprod ON 1=1
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto    
    WHERE (p_estabelecimento = 0
      OR est.estabelecimento = p_estabelecimento)
    AND (p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0
	      OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
	      OR p_tamanho = ' '
	      OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto)),0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaCompra <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX((COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000')
      || LPAD((CASE WHEN COUNT (1) = 1 OR SUM(itemEst.quantidade) = 0 THEN MAX(itemEst.precoCustoOperacao) ELSE ROUND((SUM (itemEst.totalCustoOperacao)/SUM(itemEst.quantidade)),7) END * 10000000),15,'0'))),9,15)) / 10000000
    FROM MOESTOQUES itemEst
    LEFT JOIN MOPREDOCUMXESTOQUE preXEst ON preXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MOPREDOCUMXITENS itemPre ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
    LEFT JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = itemEst.gradeProduto AND grad.produto = p_gradProd_produto
    WHERE itemEst.entradaSaida = 'E'
    AND itemEst.atualizaUltimaCompra = 1
    AND itemEst.precoCustoOperacao > 0
    AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
    AND itemEst.data >= CASE
        WHEN NOT(v_dataInventario IS NULL)
        THEN v_dataInventario + 1
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND itemEst.data < TRUNC(p_dataFinal) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))    
    GROUP BY COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000'),
      CASE
        WHEN NOT (docXEst.id IS NULL)
        THEN 'D' || LPAD(itemDoc.idDocumentoFiscal,14,'0')
        WHEN NOT (preXEst.id IS NULL)
        THEN 'P' || LPAD(itemPre.preDocumento,14,'0')
        ELSE 'M' || LPAD(itemEst.idEstoque,14,'0')
      END
    ),0) preco
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_retornarPrecoBruto           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoUnitarioUltimaCompra <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
    FROM (
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.situacaoDocumentoFiscal IN (21,22,23)
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal)+1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.idDocumentoFiscal
      UNION ALL
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MOPREDOCUMXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.statusPreDocumento = 'A'
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.preDocumento
    ) a
    WHERE a.preco > 0
  ),0)
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER, -- 1 = Gerando Inventário, 2 = Valorizando Estoque
    p_dataInventarioEstoque        IN DATE)
  RETURN NUMBER
IS
  v_dataAtual          DATE;
  v_quantidadeEstoque  NUMBER;
  v_precoCustoMedio    NUMBER;
  v_totalCustoMedio    NUMBER;
CURSOR c_estoque IS
  SELECT itemEst.data,
    itemEst.idEstoque,
    itemEst.entradaSaida,
    itemEst.atualizaCustoMedio,
    itemEst.operacaoInternaEstoque,
    itemEst.quantidade,
    itemEst.totalCustoOperacao,
    CASE
      WHEN itemEst.atualizaCustoMedio = 0
      THEN 0
      ELSE COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MODOCFISCALXESTOQUE estXDoc
        JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = estXDoc.idItemDocFiscal
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MOPREDOCUMXESTOQUE estXDoc
        JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = estXDoc.idItemPreDocumento
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),0))
    END valorAcrescimoExtempTotal
  FROM MOESTOQUES itemEst
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND (p_buscarPrecoGerencial = 1 OR itemEst.operacaoInternaEstoque <> 101)
  AND itemEst.data >= CASE WHEN NOT(p_dataInventarioEstoque IS NULL) THEN p_dataInventarioEstoque + 1 ELSE TO_DATE('01/01/1900','DD/MM/YYYY') END
  AND itemEst.data < TRUNC(p_dataPosicaoEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)))
  ORDER BY TRUNC(itemEst.data),
    itemEst.operacaoInternaEstoque DESC,
    itemEst.atualizaCustoMedio DESC,
    itemEst.data,
    itemEst.idEstoque;
BEGIN
  v_dataAtual         := COALESCE(TRUNC(p_dataInventarioEstoque)+1,TO_DATE('01/01/1900','DD/MM/YYYY'));
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  -- Saldo Inicial Inventário Estoque Gerencial
  IF NOT(p_dataInventarioEstoque IS NULL) AND p_buscarPrecoGerencial = 1 THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeGerencial),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeGerencial) = 0
          OR SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)) = 0
          OR SUM(itemEst.quantidadeGerencial) =  MAX(itemEst.quantidadeGerencial)
          AND SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
           =  MAX(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
        THEN MAX(itemEst.precoUnitarioCMVGerencial)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
          / SUM(itemEst.quantidadeGerencial),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND invEst.data >= TRUNC(p_dataInventarioEstoque)
  AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  -- Saldo Inicial Inventário Estoque Fiscal
  ELSIF NOT(p_dataInventarioEstoque IS NULL) THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeFiscal),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeFiscal) = 0
          OR SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)) = 0
          OR SUM(itemEst.quantidadeFiscal) =  MAX(itemEst.quantidadeFiscal)
          AND SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
           =  MAX(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
        THEN MAX(itemEst.precoUnitarioCMVFiscal)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
          / SUM(itemEst.quantidadeFiscal),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND invEst.data >= TRUNC(p_dataInventarioEstoque)
  AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  END IF;
  FOR dados IN c_estoque
  LOOP
    IF dados.operacaoInternaEstoque = 1 AND dados.data > v_dataAtual
    THEN
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    END IF;
    v_dataAtual := dados.data;
    -- Se atualiza custo médio
    IF dados.atualizaCustoMedio = 1 THEN
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2);
            END IF;
          END IF;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.totalCustoOperacao - dados.valorAcrescimoExtempTotal;
        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;
      ELSE
        IF 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;
      END IF;
    -- Se não atualiza custo médio
    ELSE
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + ROUND((dados.quantidade * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND((v_quantidadeEstoque * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND((v_quantidadeEstoque * v_precoCustoMedio),2);
            END IF;
          END IF;
        END IF;
      ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.quantidade * v_precoCustoMedio;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
    END IF;
    -- Se é registro de movimento, atualiza ele
    IF p_especial = 2 THEN
      IF dados.atualizaCustoMedio = 1 THEN
        UPDATE MOESTOQUES a SET
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      ELSE
        UPDATE MOESTOQUES a SET
          a.precoCustoOperacao = v_precoCustoMedio,
          a.totalCustoOperacao = ROUND(a.quantidade * v_precoCustoMedio,2),
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      END IF;
    END IF;
  END LOOP;
  IF p_especial <> 2 AND v_precoCustoMedio = 0 THEN
    SELECT COALESCE(MAX(preco.precoMedioInicial),0)
    INTO v_precoCustoMedio      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_precoCustoMedio;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário, 2 = Valorizando Estoque
  )
  RETURN NUMBER
IS 
  v_dataInventarioEstoque DATE;
  v_precoCustoMedio       NUMBER;
BEGIN
  -- v_dataInventarioEstoque
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventarioEstoque
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.inventarioEstoque <> 0
  AND invEst.data < TRUNC(p_dataPosicaoEstoque) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
  AND (invEst.motivoInventarioEstoque = '01'
    OR EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND gradProd.produto = p_gradProd_produto))
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  v_precoCustoMedio :=
    FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_estabelecimento,
      p_dataPosicaoEstoque,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_buscarPrecoGerencial,
      p_especial,
      v_dataInventarioEstoque);
  RETURN v_precoCustoMedio;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_item_personalizacao         IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_gradProd_cor                IN NUMBER,
    p_gradProd_tamanho            IN VARCHAR)
  RETURN NUMBER
IS
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaFormacao * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaFormacao <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO v_preco
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(data,'YYYYMMDD'),'19000101')
      || LPAD((novoPrecoCusto * 10000000),15,'0'))) ordenacao
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
    AND data < TRUNC(p_dataFinal) + 1
    AND ativo = 1) a;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preco.estabelecimento
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAESTABELECIMENTOS est2 ON est2.estabelecimento = p_estabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.pessoa = est2.pessoaEstabelecimento
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_config_209_filtrarGrupoEcon = 0 AND est.pessoaEstabelecimento = est2.pessoaEstabelecimento
        OR p_config_209_filtrarGrupoEcon = 1 AND pessEst.grupoEconomico = pessEst2.grupoEconomico);
    END IF;  
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  IF v_preco = 0 THEN
    SELECT
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
      COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
    INTO
      v_dataInventario,
      v_precoInventario
    FROM (
      SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
        || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE itemEst.precoUnitarioUltimaCompra <> 0
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND invEst.data >= CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
    SELECT COALESCE ((
      SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
      FROM (
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))
        UNION ALL
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento = 'A'
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))) a),0)
    INTO v_preco
    FROM DUAL;    
    IF v_preco = 0 THEN
      v_preco := v_precoInventario;
    END IF;
    IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = p_estabelecimento
      AND preco.ativo = 1;  
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.ativo = 1
        AND (p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)));
      END IF;
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.estabelecimento = 0
        AND preco.ativo = 1;
      END IF;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco      NUMBER;
  v_precoFilho NUMBER;

  CURSOR c_kit
  IS 
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;

BEGIN
  v_preco := 0;
  FOR kit IN c_kit LOOP
    v_precoFilho := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1);
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoFilho = 0 AND kit.controleEstoque IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    IF v_precoFilho <> 0 THEN
      v_preco := v_preco + kit.quantidade * v_precoFilho;
    ELSE
      v_preco := 0;
    END IF;        
    EXIT WHEN v_preco = 0;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_preco                    IN NUMBER
  )
  RETURN NUMBER
IS
  v_preco      NUMBER;
  v_precoTinta NUMBER;

  CURSOR c_prod
  IS 
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto;

BEGIN
  v_preco := p_ini_preco;

  FOR prod IN c_prod LOOP
    v_precoTinta := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        1);
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoTinta = 0 AND prod.controleEstoque IN (3,4) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    v_preco := v_preco + p_tinta_quantidade * v_precoTinta;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS
  v_preco NUMBER;

  CURSOR c_formula
  IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;

BEGIN
  v_preco := 0;

  FOR formula IN c_formula LOOP
    v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco NUMBER;

BEGIN
  v_preco := 0;
  IF p_gradProd_produto > 0 AND p_tipoPreco <> 'I' THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        'S', --p_cab_entradaSaida
        0, --p_cab_devolucaoAnulacaoRetorno
        p_cab_estabelecimento,
        TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
        p_cab_dataPreco, --p_cab_dataPrecoFinal
        p_cab_pessoa,
        1, --p_modDoc_capituloNaturezaFisc
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_idFormulaTinta,
        0, --p_item_personalizacao
        0, --p_item_localEstoque
        0, --p_item_pessoaParticipante
        1, --p_quantidade
        '0', --p_locEst_indicadorPropPosseiT
        CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
        p_tipoPreco,
        p_tabelaPreco);
    ELSE
      -- A Tabela de Preço Anterior
      IF p_tipoPreco = 'A' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- C Custo Médio da Venda (CMV)
      ELSIF p_tipoPreco = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0, --p_item_pessoaParticipante
          1, --p_buscarPrecoGerencial
          0); --p_especial
      -- F Formação Preço (Custo)
      ELSIF p_tipoPreco = 'F' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_FORMACAO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho);
      -- M Custo Médio da Venda Contábil (CMV)
      ELSIF p_tipoPreco = 'M' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0, --p_item_pessoaParticipante
          0, --p_buscarPrecoGerencial
          0); --p_especial
      -- P Preço de Custo (Último Custo)
      ELSIF p_tipoPreco = 'P' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_item_pessoaParticipante
      -- T Tabela de Preço
      ELSIF p_tipoPreco = 'T' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_TABELA(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- U Última Compra
      ELSIF p_tipoPreco = 'U' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0);
      -- 2 Última Compra Bruto
      ELSIF p_tipoPreco = '2' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1);
      END IF;
      -- 3 = Combo / 4 = Kit
      IF v_preco = 0 AND p_prod_controleEstoque IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_KIT(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          0, --p_item_pessoaParticipante
          1, --p_quantidade
          p_gradProd_produto,
          '0', --p_locEst_indicadorPropPosseiT
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tipoPreco,
          p_tabelaPreco);
      END IF;
    END IF;
    -- Efetua arredondamento de preço
    v_preco := ROUND (v_preco, TO_NUMBER(p_config_64_casasDecSaidas));
  END IF;
  RETURN v_preco;
END;

/

create or replace PROCEDURE ADD_BUSCA_ICMS_ST_ANTERIOR (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_calcularICMSSTAnterEfetivo   IN NUMBER,
    p_calcularFCP                  IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    /* Retornos */
    r_item_baseICMSSTAnteriormente OUT NUMBER,
    r_item_valorICMSSTAnteriorment OUT NUMBER,
    r_item_valorICMSProprioSubstit OUT NUMBER,
    r_item_baseFCPSTAnteriormente  OUT NUMBER,
    r_item_valorFCPSTAnteriormente OUT NUMBER)
IS
  v_ufOrigDest_aliquotaIcms NUMBER;
  CURSOR c_item IS 
    SELECT a.ordenacao,
      a.quantidade,
      a.baseICMSST,
      a.valorICMSST,
      a.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao,
      a.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente,
      a.valorICMS,
      a.baseFCPST,
      a.valorFCPST,
      a.nfFornecedor
    FROM (
      SELECT ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida desc, item.iditemDocFiscal desc) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST,
        cab.nfFornecedor
      FROM CAGRADESPRODUTO gradProd
      JOIN MODOCFISCALXITENS item ON item.gradeProduto = gradProd.gradeProduto
      JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE gradProd.produto = p_gradProd_produto
      AND item.cancelado = 0
      AND item.quantidade > 0
      AND (cab.nfFornecedor = 1
        AND item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND TRUNC (cab.dataEntradaSaida) <= CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END
      AND (p_cab_estabelecimento = 0
        OR p_cab_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento))
        OR p_cab_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento)))    
    ) a
    WHERE a.ordenacao = 1;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente := 0;
  r_item_valorFCPSTAnteriormente := 0;
  FOR item IN c_item LOOP
    IF p_calcularICMSSTAnterEfetivo = 1 THEN
      IF item.nfFornecedor = 1 AND item.baseICMSSTEscrituracao > 0 AND item.valorICMSSTEscrituracao > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSSTEscrituracao * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSSTEscrituracao * p_item_quantidade / item.quantidade), 2);
      ELSIF item.baseICMSST > 0 AND item.valorICMSST > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSST * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSST * p_item_quantidade / item.quantidade), 2);
      ELSE
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSSTAnteriormente * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSSTAnteriormente * p_item_quantidade / item.quantidade), 2);
      END IF;
      r_item_valorICMSProprioSubstit := ROUND ((item.valorICMS * p_item_quantidade / item.quantidade), 2);
    END IF;
    IF p_calcularFCP = 1 THEN
      r_item_baseFCPSTAnteriormente := ROUND ((item.baseFCPST * p_item_quantidade / item.quantidade), 2);
      r_item_valorFCPSTAnteriormente := ROUND ((item.valorFCPST * p_item_quantidade / item.quantidade), 2);
    END IF;
    IF p_calcularICMSSTAnterEfetivo = 1 AND r_item_baseICMSSTAnteriormente = 0 AND r_item_valorICMSSTAnteriorment = 0 AND r_item_valorICMSProprioSubstit = 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((p_item_quantidade *
        FUNC_ADD_BUSCA_PRECO(
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          0,
          0,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END,
          0,
          ' ',
          ' ',
          0,
          0,
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          'U',
          ' '
        )), 2);
      SELECT
        COALESCE((
          SELECT ufOrigDest.aliquotaIcms
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEst ON munEst.municipio = endEst.municipio
          JOIN PAUFORIGEMXUFDESTINO ufOrigDest ON ufOrigDest.ufOrigem = munEst.uf AND ufOrigDest.ufDestino = munEst.uf
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),0)
      INTO v_ufOrigDest_aliquotaIcms
      FROM DUAL;
      r_item_valorICMSSTAnteriorment := ROUND (r_item_baseICMSSTAnteriormente * v_ufOrigDest_aliquotaIcms / 100, 2);
    END IF;
  END LOOP;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)

IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;

  CURSOR c_kit
  IS 
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;

BEGIN
  r_tabelaPreco := ' ';
  r_precoSugestaoAPrazo := 0;
  r_precoSugestaoAVista := 0;
  r_precoDesconto := 0;
  r_precoMinimo := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo := 0;
  r_precoAVista := 0;
  r_promocao := 0;
  r_precoPromocaoAPrazo := 0;
  r_precoPromocaoAVista := 0;
  r_precoIndexadoAPrazo := 0;
  r_precoIndexadoAVista := 0;

  FOR kit IN c_kit LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1);
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND kit.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_precoSugestaoAPrazo <> 0 THEN
      r_tabelaPreco         := v_tabelaPreco;
      r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + kit.quantidade * v_precoSugestaoAPrazo;
      r_precoSugestaoAVista := r_precoSugestaoAVista + kit.quantidade * v_precoSugestaoAVista;
      r_precoDesconto       := r_precoDesconto       + kit.quantidade * v_precoDesconto;
      r_precoMinimo         := r_precoMinimo         + kit.quantidade * v_precoMinimo;
      r_precoAPrazo         := r_precoAPrazo         + kit.quantidade * v_precoAPrazo;
      r_precoAVista         := r_precoAVista         + kit.quantidade * v_precoAVista;
      IF v_promocao = 1 THEN
        r_promocao          := 1;
      END IF;  
      r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + kit.quantidade * v_precoPromocaoAPrazo;
      r_precoPromocaoAVista := r_precoPromocaoAVista + kit.quantidade * v_precoPromocaoAVista;
      r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + kit.quantidade * v_precoIndexadoAPrazo;
      r_precoIndexadoAVista := r_precoIndexadoAVista + kit.quantidade * v_precoIndexadoAVista;
    ELSE
      r_tabelaPreco         := ' ';
      r_precoSugestaoAPrazo := 0;
      r_precoSugestaoAVista := 0;
      r_precoDesconto       := 0;
      r_precoMinimo         := 0;
      r_precoAPrazo         := 0;
      r_precoAVista         := 0;
      r_promocao            := 0;
      r_precoPromocaoAPrazo := 0;
      r_precoPromocaoAVista := 0;
      r_precoIndexadoAPrazo := 0;
      r_precoIndexadoAVista := 0;
    END IF;        
    EXIT WHEN r_precoSugestaoAPrazo = 0;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_KIT;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_tabelaPreco              IN VARCHAR,
    p_ini_precoSugestaoAPrazo      IN NUMBER,
    p_ini_precoSugestaoAVista      IN NUMBER,
    p_ini_precoDesconto            IN NUMBER,
    p_ini_precoMinimo              IN NUMBER,
    p_ini_informarPrecoManualmente IN NUMBER,
    p_ini_precoAPrazo              IN NUMBER,
    p_ini_precoAVista              IN NUMBER,
    p_ini_promocao                 IN NUMBER,
    p_ini_precoPromocaoAPrazo      IN NUMBER,
    p_ini_precoPromocaoAVista      IN NUMBER,
    p_ini_precoIndexadoAPrazo      IN NUMBER,
    p_ini_precoIndexadoAVista      IN NUMBER,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)

IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;

  CURSOR c_prod
  IS 
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto;

BEGIN
  r_tabelaPreco              := p_ini_tabelaPreco;
  r_precoSugestaoAPrazo      := p_ini_precoSugestaoAPrazo;
  r_precoSugestaoAVista      := p_ini_precoSugestaoAVista;
  r_precoDesconto            := p_ini_precoDesconto;
  r_precoMinimo              := p_ini_precoMinimo;
  r_informarPrecoManualmente := p_ini_informarPrecoManualmente;
  r_precoAPrazo              := p_ini_precoAPrazo;
  r_precoAVista              := p_ini_precoAVista;
  r_promocao                 := p_ini_promocao;
  r_precoPromocaoAPrazo      := p_ini_precoPromocaoAPrazo;
  r_precoPromocaoAVista      := p_ini_precoPromocaoAVista;
  r_precoIndexadoAPrazo      := p_ini_precoIndexadoAPrazo;
  r_precoIndexadoAVista      := p_ini_precoIndexadoAVista;

  FOR prod IN c_prod LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        1);
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND prod.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_tabelaPreco <> ' ' THEN
      r_tabelaPreco       := v_tabelaPreco;
    END IF;
    r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + p_tinta_quantidade * v_precoSugestaoAPrazo;
    r_precoSugestaoAVista := r_precoSugestaoAVista + p_tinta_quantidade * v_precoSugestaoAVista;
    r_precoDesconto       := r_precoDesconto       + p_tinta_quantidade * v_precoDesconto;
    r_precoMinimo         := r_precoMinimo         + p_tinta_quantidade * v_precoMinimo;
    r_precoAPrazo         := r_precoAPrazo         + p_tinta_quantidade * v_precoAPrazo;
    r_precoAVista         := r_precoAVista         + p_tinta_quantidade * v_precoAVista;
    IF v_promocao = 1 THEN
      r_promocao          := 1;
    END IF;
    r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + p_tinta_quantidade * v_precoPromocaoAPrazo;
    r_precoPromocaoAVista := r_precoPromocaoAVista + p_tinta_quantidade * v_precoPromocaoAVista;
    r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + p_tinta_quantidade * v_precoIndexadoAPrazo;
    r_precoIndexadoAVista := r_precoIndexadoAVista + p_tinta_quantidade * v_precoIndexadoAVista;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_PROTIN;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)

IS

  CURSOR c_formula
  IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;

BEGIN
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;

  FOR formula IN c_formula LOOP
    ADD_BUSCA_PRECO_INTERNO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista,
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_TINTA;

/

create or replace PROCEDURE ADD_BUSCA_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR,
    p_modDoc_fatorMultiplicador    IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR,
    p_modDoc_fatorMultiplicadorB   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_precoSugestaoAPrazoOriginal  IN NUMBER,
    p_precoSugestaoAVistaOriginal  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tipoPreco                    OUT CHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)

IS

BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;

  IF p_gradProd_produto > 0 THEN
    IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
      r_tipoPreco := 'I';
    ELSE
      IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
        ADD_BUSCA_PRECO_INTERNO_TINTA(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_locEst_indicadorPropPosseIt,
          p_manterPreco,
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END, --p_tipoPreco
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END, --p_tabelaPreco
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
      ELSE
        -- A Tabela de Preço Anterior
        IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'A' THEN
          ADD_BUSCA_PRECO_INTERNO_ANTER(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- C Custo Médio da Venda (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante,
            1,
            0);
        -- F Formação Preço (Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'F' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho);
        -- M Custo Médio da Venda Contábil (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'M' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante,
            0,
            0);
        -- P Preço de Custo (Último Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'P' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante);
        -- T Tabela de Preço
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'T' THEN
          ADD_BUSCA_PRECO_INTERNO_TABELA(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- U Última Compra
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'U' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            0);
        -- 2 Última Compra Bruto
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = '2' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            1);
        END IF;
        IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END IN ('A','T')) THEN
          r_tabelaPreco              := ' ';
          r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
          r_precoDesconto            := 0;
          r_precoMinimo              := 0;
          r_informarPrecoManualmente := 0;
          r_precoAPrazo              := r_precoSugestaoAPrazo;
          r_precoAVista              := r_precoSugestaoAPrazo;
          r_promocao                 := 0;
          r_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
          r_precoPromocaoAVista      := r_precoSugestaoAPrazo;
          r_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
          r_precoIndexadoAVista      := r_precoSugestaoAPrazo;
        END IF;
        -- 3 = Combo / 4 = Kit
        IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND p_prod_controleEstoque IN (3,4) THEN
          ADD_BUSCA_PRECO_INTERNO_KIT(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            p_gradProd_produto,
            p_locEst_indicadorPropPosseIt,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        END IF;
      END IF;
      -- Se encontrou preço
      IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR r_precoAPrazo <> 0 OR r_precoAVista <> 0 OR r_precoPromocaoAPrazo <> 0 OR r_precoPromocaoAVista <> 0 OR r_precoIndexadoAPrazo <> 0 OR r_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
        r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END;
        IF NOT (p_modDoc_fatorMultiplicador IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = p_modDoc_tipoPreco AND p_tabelaPreco = p_modDoc_tabelaPreco) THEN
          r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoSugestaoAVista := r_precoSugestaoAVista * p_modDoc_fatorMultiplicador;
          r_precoDesconto       := r_precoDesconto       * p_modDoc_fatorMultiplicador;
          r_precoMinimo         := r_precoMinimo         * p_modDoc_fatorMultiplicador;
          r_precoAPrazo         := r_precoAPrazo         * p_modDoc_fatorMultiplicador;
          r_precoAVista         := r_precoAVista         * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAPrazo := r_precoPromocaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAVista := r_precoPromocaoAVista * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAPrazo := r_precoIndexadoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAVista := r_precoIndexadoAVista * p_modDoc_fatorMultiplicador;
        END IF;
      -- Se não encontrou preço, não mantém o atual e existe regra de preço B
      ELSIF p_manterPreco = 0 AND p_modDoc_tipoPrecoB <> ' ' THEN
        ADD_BUSCA_PRECO(
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          p_modDoc_fatorMultiplicadorB,
          ' ',
          ' ',
          0,
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          p_locEst_indicadorPropPosseIt,
          0,
          p_precoSugestaoAPrazoOriginal,
          p_precoSugestaoAVistaOriginal,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          r_tipoPreco,
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
        -- Se não encontrou preço B, devolve tipo preço e tabela atual
        IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND r_precoAPrazo = 0 AND r_precoAVista = 0 AND r_precoPromocaoAPrazo = 0 AND r_precoPromocaoAVista = 0 AND r_precoIndexadoAPrazo = 0 AND r_precoIndexadoAVista = 0 AND p_modDoc_tipoPrecoB <> 'I' THEN
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
        END IF;
      -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
      ELSE
        r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
        r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
      END IF;
      -- Efetua arredondamento de preço
      r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAPrazo         := ROUND (r_precoAPrazo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAVista         := ROUND (r_precoAVista        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAPrazo := ROUND (r_precoPromocaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAVista := ROUND (r_precoPromocaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAPrazo := ROUND (r_precoIndexadoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAVista := ROUND (r_precoIndexadoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
    END IF;
  END IF;
END ADD_BUSCA_PRECO;

/

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_valorIPIDevolucao       IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_valorICMSOperacao       IN NUMBER,
    p_item_valorICMSDiferido       IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSDesoneracao    IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_valorICMSSTAnteriorment IN NUMBER,
    p_item_valorICMSUFDestinatario IN NUMBER,
    p_item_valorICMSUFRemetente    IN NUMBER,
    p_item_valorFCP                IN NUMBER,
    p_item_valorFCPST              IN NUMBER,
    p_item_valorFCPSTAnteriormente IN NUMBER,
    p_item_valorFCPUFDestinatario  IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    /* Retornos */
    r_valorLiquidoSemFreteSeguro   OUT NUMBER,
    r_valorCaptacao                OUT NUMBER,
    r_valorTarifaCartao            OUT NUMBER,
    r_valorImpostos                OUT NUMBER,
    r_precoCusto                   OUT NUMBER,
    r_valorCusto                   OUT NUMBER,
    r_valorMargem                  OUT NUMBER,
    r_percentualMargem             OUT NUMBER)
IS
    v_auxNumber NUMBER;
    v_auxVarchar VARCHAR2(256);    
BEGIN
  r_valorLiquidoSemFreteSeguro := p_item_valorLiquidoItem - p_item_valorFreteTotal - p_item_valorSeguroTotal - p_item_valorAdicFreteMarTotal - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO(p_cab_prazoMedioPonderado,p_regMarg_taxaCapitacaoCustoFi,r_valorLiquidoSemFreteSeguro);
  IF (p_regMarg_reduzirTarifaCartao = 1 AND p_cab_valorLiquidoItem <> 0) THEN
    r_valorTarifaCartao := CASE WHEN p_cab_valorLiquidoItem = 0 THEN 0 ELSE ROUND ((p_cab_valorTarifaCartao * p_item_valorLiquidoItem / p_cab_valorLiquidoItem), 2) END;
  ELSE
    r_valorTarifaCartao := 0;
  END IF;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos :=
      p_item_valorII
      + p_item_valorIOF
      + p_item_valorIPI
      + p_item_valorIPIDevolucao
      + p_item_valorPIS
      + p_item_valorPISST
      + p_item_valorCOFINS
      + p_item_valorCOFINSST
      + p_item_valorCreditoSimplesNac
      + p_item_valorICMSOperacao
      + p_item_valorICMSDiferido
      + p_item_valorICMS
      + p_item_valorICMSDesoneracao
      + p_item_valorICMSST
      + p_item_valorICMSSTAnteriorment
      + p_item_valorICMSUFDestinatario
      + p_item_valorICMSUFRemetente
      + p_item_valorFCP
      + p_item_valorFCPST
      + p_item_valorFCPSTAnteriormente
      + p_item_valorFCPUFDestinatario;
  ELSE
    r_valorImpostos := 0;
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada,
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0,
    0,
    'E',
    0,
    p_cab_estabelecimento,
    NULL,
    p_cab_dataPreco,
    0,
    0,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf,
    p_munEndEst_uf,
    0,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    0,
    0,
    0,
    ' ',
    ' ',
    /* Retornos */
    v_auxVarchar,
    v_auxVarchar,
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  -- CUSTOMIZAÇÃO CENTERLUZ
  -- r_valorImpostos      := ROUND ((r_valorLiquidoSemFreteSeguro * 0.3),2);
  -- r_valorTarifaCartao  := ROUND ((p_cab_valorLiquidoItem * 0.005),2);
  r_valorCusto         := ROUND ((p_item_quantidade * r_precoCusto),2);
  r_valorMargem        := r_valorLiquidoSemFreteSeguro - r_valorCaptacao - r_valorImpostos - r_valorTarifaCartao - r_valorCusto;
  r_percentualMargem   := CASE WHEN r_valorLiquidoSemFreteSeguro = 0 THEN 0 ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8) END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace FUNCTION FUNC_ADD_BUSCA_STRING_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_grade_produto                IN NUMBER,
    p_grade_cor                    IN NUMBER,
    p_grade_tamanho                IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN CHAR
IS
  v_tipoPreco                  CHAR(1);
  v_tabelaPreco                CHAR(10);
  v_precoSugestaoAPrazo        CHAR(20);
  v_precoSugestaoAVista        CHAR(20);
  v_precoDesconto              CHAR(20);
  v_precoMinimo                CHAR(20);
  v_informarPrecoManualmente   CHAR(1);
  v_precoAPrazo                CHAR(20);
  v_precoAVista                CHAR(20);
  v_promocao                   CHAR(1);
  v_precoPromocaoAPrazo        CHAR(20);
  v_precoPromocaoAVista        CHAR(20);
  v_precoIndexadoAPrazo        CHAR(20);
  v_precoIndexadoAVista        CHAR(20);
BEGIN
  ADD_BUSCA_PRECO (
    p_config_64_casasDecSaidas,
    p_config_64_casasDecSaidas,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_perfilUsuarioLogado,
    p_usuarioLogado,
    'S',
    0,
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900','DD/MM/YYYY'),
    p_cab_dataPreco,
    p_cab_pessoa,
    1,
    p_tipoPreco,
    p_tabelaPreco,
    1,
    ' ',
    ' ',
    0,
    p_endPessEst_uf,
    p_endPess_uf,
    p_item_vendedor,
    p_item_idFormulaTinta,
    0,
    0,
    0,
    1,
    p_grade_produto,
    p_grade_cor,
    p_grade_tamanho,
    p_prod_controleEstoque,
    '0',
    CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
    0,
    0,
    p_tipoPreco,
    p_tabelaPreco,
    v_tipoPreco,
    v_tabelaPreco,
    v_precoSugestaoAPrazo,
    v_precoSugestaoAVista,
    v_precoDesconto,
    v_precoMinimo,
    v_informarPrecoManualmente,
    v_precoAPrazo,
    v_precoAVista,
    v_promocao,
    v_precoPromocaoAPrazo,
    v_precoPromocaoAVista,
    v_precoIndexadoAPrazo,
    v_precoIndexadoAVista
  );
  RETURN COALESCE(v_tipoPreco,' ')
    || '|' || v_tabelaPreco
    || '|' || v_precoSugestaoAPrazo
    || '|' || v_precoSugestaoAVista
    || '|' || v_precoDesconto
    || '|' || v_precoMinimo
    || '|' || v_informarPrecoManualmente
    || '|' || v_precoAVista
    || '|' || v_precoAPrazo
    || '|' || v_promocao
    || '|' || v_precoPromocaoAVista
    || '|' || v_precoPromocaoAPrazo;
END;

/

create or replace FUNCTION FUNC_ADD_CALC_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            CHAR,
    p_regMarg_tabelaPreco          VARCHAR2,
    p_regMarg_fatorMultiplicador   NUMBER,
    p_regMarg_tipoPrecoB           CHAR,
    p_regMarg_tabelaPrecoB         VARCHAR2,
    p_regMarg_fatorMultiplicadorB  NUMBER,
    p_regMarg_reduzirImpostos      NUMBER,
    p_regMarg_reduzirTarifaCartao  NUMBER,
    p_regMarg_taxaCapitacaoCustoFi NUMBER,
    p_regMarg_exibImagemMargemItem NUMBER,
    p_regMarg_regraImagemItem      NUMBER,
    p_cab_estabelecimento          NUMBER,
    p_cab_dataPreco                DATE,
    p_cab_prazoMedioPonderado      NUMBER,
    p_cab_valorLiquidoItem         NUMBER,
    p_cab_valorTarifaCartao        NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_idFormulaTinta          NUMBER,
    p_item_personalizacao          NUMBER,
    p_item_localEstoque            NUMBER,
    p_item_pessoaParticipante      NUMBER,
    p_item_quantidade              NUMBER,
    p_item_valorFreteTotal         NUMBER,
    p_item_valorSeguroTotal        NUMBER,
    p_item_valorAdicFreteMarTotal  NUMBER,
    p_item_valorDespesasAduanTotal NUMBER,
    p_item_valorII                 NUMBER,
    p_item_valorIOF                NUMBER,
    p_item_valorIPI                NUMBER,
    p_item_valorIPIDevolucao       NUMBER,
    p_item_valorPIS                NUMBER,
    p_item_valorPISST              NUMBER,
    p_item_valorCOFINS             NUMBER,
    p_item_valorCOFINSST           NUMBER,
    p_item_valorCreditoSimplesNac  NUMBER,
    p_item_valorICMSOperacao       NUMBER,
    p_item_valorICMSDiferido       NUMBER,
    p_item_valorICMS               NUMBER,
    p_item_valorICMSDesoneracao    NUMBER,
    p_item_valorICMSST             NUMBER,
    p_item_valorICMSSTAnteriorment NUMBER,
    p_item_valorICMSUFDestinatario NUMBER,
    p_item_valorICMSUFRemetente    NUMBER,
    p_item_valorFCP                NUMBER,
    p_item_valorFCPST              NUMBER,
    p_item_valorFCPSTAnteriormente NUMBER,
    p_item_valorFCPUFDestinatario  NUMBER,
    p_item_valorLiquidoItem        NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR)
  RETURN VARCHAR2
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
BEGIN
  ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_reduzirTarifaCartao,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataPreco,
    p_cab_prazoMedioPonderado,
    p_cab_valorLiquidoItem,
    p_cab_valorTarifaCartao,
    p_munEndEst_uf,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_item_valorFreteTotal,
    p_item_valorSeguroTotal,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSSTAnteriorment,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    /* Retornos */
    v_valorLiquidoSemFreteSeguro,
    v_valorCaptacao,
    v_valorTarifaCartao,
    v_valorImpostos,
    v_precoCusto,
    v_valorCusto,
    v_valorMargem,
    v_percentualMargem);
  RETURN (
    v_valorLiquidoSemFreteSeguro || '|' || 
    v_valorCaptacao || '|' || 
    v_valorTarifaCartao || '|' || 
    v_valorImpostos || '|' || 
    v_precoCusto || '|' || 
    v_valorCusto || '|' || 
    v_valorMargem || '|' || 
    v_percentualMargem);
END;

/

create or replace PROCEDURE ADD_TEMP_MARGEM_ITEM_GRAVA (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_DocFiscal_PreDoc_Orcamento   IN CHAR,
    p_cab_id                       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarTotal   IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_sequencia               IN NUMBER,
    p_item_ini_cancelado           IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_valorIPIDevolucao       IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_valorICMSOperacao       IN NUMBER,
    p_item_valorICMSDiferido       IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSDesoneracao    IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_valorICMSSTAnteriorm    IN NUMBER,
    p_item_valorICMSUFDestinatario IN NUMBER,
    p_item_valorICMSUFRemetente    IN NUMBER,
    p_item_valorFCP                IN NUMBER,
    p_item_valorFCPST              IN NUMBER,
    p_item_valorFCPSTAnteriormente IN NUMBER,
    p_item_valorFCPUFDestinatario  IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    /* Retornos */
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_item_valorLiquidoSemFreteSeg OUT NUMBER,
    r_item_valorCaptacao           OUT NUMBER,
    r_item_valorTarifaCartao       OUT NUMBER,
    r_item_valorImpostos           OUT NUMBER,
    r_item_precoCusto              OUT NUMBER,
    r_item_valorCusto              OUT NUMBER,
    r_item_valorMargem             OUT NUMBER,
    r_item_percentualMargem        OUT NUMBER,
    r_item_imagemMargem            OUT VARCHAR2)
IS
BEGIN
  SELECT COALESCE (MAX (temp.valorMargem), 0)
  INTO r_item_valorMargem
  FROM TEMPMARGEMCONTRIBUICAO temp
  WHERE temp.uniqueMachineID = p_uniqueMachineID
  AND temp.orcamentoPredocumentoDocumento = p_DocFiscal_PreDoc_Orcamento
  AND temp.idCabecalho = p_cab_id
  AND temp.sequencia = p_item_sequencia;
  r_cab_valorMargem := p_cab_valorMargem;
  IF p_item_ini_cancelado = 0 THEN
    r_cab_valorMargem := r_cab_valorMargem - r_item_valorMargem;
  END IF;
  ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_reduzirTarifaCartao,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataPreco,
    p_cab_prazoMedioPonderado,
    p_cab_valorLiquidoItem,
    p_cab_valorTarifaCartao,
    p_munEndEst_uf,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_item_valorFreteTotal,
    p_item_valorSeguroTotal,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSSTAnteriorm,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    /* Retornos */
    r_item_valorLiquidoSemFreteSeg,
    r_item_valorCaptacao,
    r_item_valorTarifaCartao,
    r_item_valorImpostos,
    r_item_precoCusto,
    r_item_valorCusto,
    r_item_valorMargem,
    r_item_percentualMargem);
  IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
    r_item_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, r_item_percentualMargem);
  ELSE
    r_item_imagemMargem := ' ';
  END IF;
  IF p_item_cancelado = 0 THEN
    r_cab_valorMargem := r_cab_valorMargem + r_item_valorMargem;
  END IF;
  r_cab_percentualMargem := 
    CASE
      WHEN p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarTotal - p_cab_valorDespesasAduanTotal <= 0
      THEN 0
      ELSE ROUND ((100 * r_cab_valorMargem / (p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarTotal - p_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1 AND p_regMarg_regraImagemCab <> 0 THEN
    r_cab_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemCab, r_cab_valorMargem);
  ELSE
    r_cab_imagemMargem := ' ';
  END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a 
  USING (
    SELECT
      p_uniqueMachineID              uniqueMachineID,
      p_DocFiscal_PreDoc_Orcamento   orcamentoPredocumentoDocumento,
      p_cab_id                       idCabecalho,
      p_item_sequencia               sequencia,
      r_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      r_item_valorCaptacao           valorCaptacao,
      r_item_valorTarifaCartao       valorTarifaCartao,
      r_item_valorImpostos           valorImpostos,
      r_item_precoCusto              precoCusto,
      r_item_valorCusto              valorCusto,
      r_item_valorMargem             valorMargem,
      r_item_percentualMargem        percentualMargem,
      r_item_imagemMargem            imagemMargem
    FROM DUAL
  ) b ON (
    a.uniqueMachineID = b.uniqueMachineID 
    AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
    AND a.idCabecalho = b.idCabecalho
    AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro     = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao                  = b.valorCaptacao,
    a.valorTarifaCartao              = b.valorTarifaCartao,
    a.valorImpostos                  = b.valorImpostos,
    a.precoCusto                     = b.precoCusto,
    a.valorCusto                     = b.valorCusto,
    a.valorMargem                    = b.valorMargem,
    a.percentualMargem               = b.percentualMargem,
    a.imagemMargem                   = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    uniqueMachineID,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem
  ) VALUES (
    b.uniqueMachineID,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
END ADD_TEMP_MARGEM_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_gradeProduto            IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeRateioTotal NUMBER;
  v_quantSaldoRateioTotal NUMBER;
  v_valorSaldoRateioTotal NUMBER;
  v_valorCustoManter      NUMBER;
  v_precoCustoKit         NUMBER;
  v_valorCustoKit         NUMBER;
  CURSOR c_kit IS 
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho
    AND ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END,
          0,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR kit IN c_kit
  LOOP
    IF p_cab_atualizaCustoMedio = 1 AND kit.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END,
          0,
          kit.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante);
      v_valorCustoKit := ROUND (kit.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > kit.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * kit.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / kit.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - kit.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / kit.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF kit.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        kit.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF kit.controleEstoque IN(1,5,11,12) THEN
      ADD_ESTOQUE_INSERE(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
        kit.gradeProdutoFilho,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        kit.quantidade,
        v_precoCustoKit, -- p_precoCustoOperacao
        v_valorCustoKit, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        p_item_observacoes,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          kit.gradeProdutoFilho,
          p_cab_modeloDocumento,
          900,
          0,
          0,
          CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          kit.quantidade,
          v_precoCustoKit, -- p_precoCustoOperacao
          v_valorCustoKit, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_idItemSeparacao,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;    
    END IF;
  END LOOP;
END ADD_ESTOQUE_KIT;

/

create or replace PROCEDURE ADD_ESTOQUE_PRODUTO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS  
  CURSOR c_grade IS 
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR grade IN c_grade
  LOOP
    IF grade.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        grade.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF grade.controleEstoque IN(1,5,11,12) THEN
      ADD_ESTOQUE_INSERE(
        r_bufferIdEstoque,
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
        p_tinta_gradeProduto,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        grade.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          p_tinta_gradeProduto,
          p_cab_modeloDocumento,
          900,
          0,
          0,
          CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          grade.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          p_item_observacoes,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_idItemSeparacao,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;
    END IF;    
  END LOOP;
END ADD_ESTOQUE_PRODUTO_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_FORMULA_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  CURSOR c_formTinta IS 
    SELECT 
      formTinta.idBaseTinta,
      baseTinta.gradeProduto,
      formTinta.idColoranteTintaA,
      formTinta.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      formTinta.idColoranteTintaB,
      formTinta.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      formTinta.idColoranteTintaC,
      formTinta.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      formTinta.idColoranteTintaD,
      formTinta.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      formTinta.idColoranteTintaE,
      formTinta.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      formTinta.idColoranteTintaF,
      formTinta.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      formTinta.idColoranteTintaG,
      formTinta.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      formTinta.idColoranteTintaH,
      formTinta.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      formTinta.idColoranteTintaI,
      formTinta.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      formTinta.idColoranteTintaJ,
      formTinta.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      formTinta.idColoranteTintaK,
      formTinta.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      formTinta.idColoranteTintaL,
      formTinta.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      formTinta.idColoranteTintaM,
      formTinta.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      formTinta.idColoranteTintaN,
      formTinta.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      formTinta.idColoranteTintaO,
      formTinta.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS formTinta 
    JOIN CABASESTINTAS baseTinta ON baseTinta.idBaseTinta = formTinta.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA ON colTintaA.idColoranteTinta = formTinta.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB ON colTintaB.idColoranteTinta = formTinta.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC ON colTintaC.idColoranteTinta = formTinta.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD ON colTintaD.idColoranteTinta = formTinta.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE ON colTintaE.idColoranteTinta = formTinta.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF ON colTintaF.idColoranteTinta = formTinta.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG ON colTintaG.idColoranteTinta = formTinta.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH ON colTintaH.idColoranteTinta = formTinta.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI ON colTintaI.idColoranteTinta = formTinta.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ ON colTintaJ.idColoranteTinta = formTinta.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK ON colTintaK.idColoranteTinta = formTinta.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL ON colTintaL.idColoranteTinta = formTinta.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM ON colTintaM.idColoranteTinta = formTinta.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN ON colTintaN.idColoranteTinta = formTinta.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO ON colTintaO.idColoranteTinta = formTinta.idColoranteTintaO
    WHERE formTinta.idFormulaTinta = p_item_idFormulaTinta
    AND formTinta.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR formTinta IN c_formTinta
  LOOP
    ADD_ESTOQUE_PRODUTO_TINTA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_operacaoInternaEstoque,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_idItemSeparacao,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      formTinta.gradeProduto,
      900, -- p_quantidade,
      r_bufferIdEstoque);    
    IF formTinta.idColoranteTintaA > 0 AND formTinta.quantidadeA > 0 AND formTinta.gradeProdutoA > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoA,
        formTinta.quantidadeA,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaB > 0 AND formTinta.quantidadeB > 0 AND formTinta.gradeProdutoB > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoB,
        formTinta.quantidadeB,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaC > 0 AND formTinta.quantidadeC > 0 AND formTinta.gradeProdutoC > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoC,
        formTinta.quantidadeC,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaD > 0 AND formTinta.quantidadeD > 0 AND formTinta.gradeProdutoD > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoD,
        formTinta.quantidadeD,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaE > 0 AND formTinta.quantidadeE > 0 AND formTinta.gradeProdutoE > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoE,
        formTinta.quantidadeE,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaF > 0 AND formTinta.quantidadeF > 0 AND formTinta.gradeProdutoF > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoF,
        formTinta.quantidadeF,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaG > 0 AND formTinta.quantidadeG > 0 AND formTinta.gradeProdutoG > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoG,
        formTinta.quantidadeG,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaH > 0 AND formTinta.quantidadeH > 0 AND formTinta.gradeProdutoH > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoH,
        formTinta.quantidadeH,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaI > 0 AND formTinta.quantidadeI > 0 AND formTinta.gradeProdutoI > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoI,
        formTinta.quantidadeI,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaJ > 0 AND formTinta.quantidadeJ > 0 AND formTinta.gradeProdutoJ > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoJ,
        formTinta.quantidadeJ,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaK > 0 AND formTinta.quantidadeK > 0 AND formTinta.gradeProdutoK > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoK,
        formTinta.quantidadeK,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaL > 0 AND formTinta.quantidadeL > 0 AND formTinta.gradeProdutoL > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoL,
        formTinta.quantidadeL,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaM > 0 AND formTinta.quantidadeM > 0 AND formTinta.gradeProdutoM > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoM,
        formTinta.quantidadeM,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaN > 0 AND formTinta.quantidadeN > 0 AND formTinta.gradeProdutoN > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoN,
        formTinta.quantidadeN,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaO > 0 AND formTinta.quantidadeO > 0 AND formTinta.gradeProdutoO > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoO,
        formTinta.quantidadeO,
        r_bufferIdEstoque);
    END IF;    
  END LOOP;
END ADD_ESTOQUE_FORMULA_TINTA;

/

