CREATE TABLE MOORCAMENTOXPEDIDOCOMPRA_2303 AS SELECT * FROM MOORCAMENTOXPEDIDOCOMPRA;
CREATE TABLE MOORCAMENTOXAMBIENTES_2303 AS SELECT * FROM MOORCAMENTOXAMBIENTES;
CREATE TABLE MOORCAMENTOXITENS_2303 AS SELECT * FROM MOORCAMENTOXITENS;

DROP TABLE MOORCAMENTOXPEDIDOCOMPRA;
DROP TABLE MOORCAMENTOXAMBIENTES;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOORCAMENTOXAMBIENTES'; 
DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOORCAMENTOXPEDIDOCOMPRA'; 

COMMIT;

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 MOLISTAEVENTOXORC DROP CONSTRAINT MOLISTAEVENTOXORC_FK2;
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;

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,
    pedidoCompraFornecedor        VARCHAR (15) DEFAULT ' ' NOT NULL,
    sequenciaPedidoCompraFornec   NUMERIC (6,0) DEFAULT 0 NOT NULL,
    ambiente                      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ambienteObservacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL,
    vinculoItemDocumento          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    atividadeServico              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    statusAtividadeServico        CHAR (1) DEFAULT ' ' NOT NULL,
    controleEntrega               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntrega                   DATE,
    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,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,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,
    quantidadeSaldo               NUMERIC (15,6) 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,
    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,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' 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,
    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,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,0) 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,
    retidoISSQN                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tributadoForaMunicipio        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    incentivoFiscal               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    listaServicos                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cnae                          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idServicoMunicipio            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroProcessoAdministrativo  VARCHAR (30) DEFAULT ' ' NOT NULL,
    retencaoIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoOutros                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) 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,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) 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,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) 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,
    idBeneficio                   NUMERIC (8,0) 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,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) 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,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) 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,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetIRRF                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetIRRF                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetINSS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetINSS                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetOutros                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetOutros                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 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,
    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,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) 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,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) 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,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              NUMERIC (15,2) DEFAULT 0 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);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK1 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK2 FOREIGN KEY (ambiente) REFERENCES PAAMBIENTES (ambiente);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK3 FOREIGN KEY (vinculoItemDocumento) REFERENCES SIVINCULOSITEMDOCUMENTO (vinculoItemDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK4 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK5 FOREIGN KEY (statusAtividadeServico) REFERENCES SISTATUSATIVIDADESERVICO (statusAtividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK6 FOREIGN KEY (controleEntrega) REFERENCES PACONTROLESENTREGA (controleEntrega);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK7 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK8 FOREIGN KEY (estabelecimentoOriginal) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK9 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK10 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK11 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK12 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK13 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK14 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK15 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK16 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK17 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK18 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK19 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK20 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
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 (listaServicos) REFERENCES SILISTASERVICOS (listaServicos);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK24 FOREIGN KEY (cnae) REFERENCES SICNAES (cnae);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK25 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK26 FOREIGN KEY (codigoEnquadramentoIPI) REFERENCES SICODIGOSENQUADRAMENTOIPI (codigoEnquadramentoIPI);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK27 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK28 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK29 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK30 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK31 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK32 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK33 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK34 FOREIGN KEY (idBeneficio) REFERENCES SIBENEFICIOSFISCAIS (idBeneficio);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK35 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);

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

COMMIT;

DELETE MOORCAMENTOXCOMPOSICOESPR a WHERE NOT EXISTS (SELECT 1 FROM MOORCAMENTOXITENS b WHERE b.idItemOrcamento = a.idItemOrcamento);

COMMIT;

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 MOLISTAEVENTOXORC ADD CONSTRAINT MOLISTAEVENTOXORC_FK2 FOREIGN KEY (idItemOrcamento) 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);

CREATE TABLE MOPREDOCUMXITENS_2303 AS SELECT * FROM MOPREDOCUMXITENS;
CREATE TABLE MOPREDOCUMXPEDIDOCOMPRA_2303 AS SELECT * FROM MOPREDOCUMXPEDIDOCOMPRA;

DROP TABLE MOPREDOCUMXPEDIDOCOMPRA;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOPREDOCUMXPEDIDOCOMPRA'; 

COMMIT;

ALTER TABLE MOPREDOCUMXPRODUTOFILHO DROP CONSTRAINT MOPREDOCUMXPRODUTOFILHO_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,
    pedidoCompraFornecedor        VARCHAR (15) DEFAULT ' ' NOT NULL,
    sequenciaPedidoCompraFornec   NUMERIC (6,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,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,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,
    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,
    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,
    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,
    valorDescontoCustoOpItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpItem     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' 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,
    valorAcrescimoExtempGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpGeral    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,
    valorAcrescimoExtempTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpTotal    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualDevolucao           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorIPIDevolucao             NUMERIC (15,2) 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,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retidoISSQN                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tributadoForaMunicipio        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    incentivoFiscal               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    listaServicos                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cnae                          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idServicoMunicipio            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroProcessoAdministrativo  VARCHAR (30) DEFAULT ' ' NOT NULL,
    retencaoIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoOutros                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) 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,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) 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,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) 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,
    idBeneficio                   NUMERIC (8,0) 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,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) 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,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) 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,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetIRRF                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetIRRF                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetINSS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetINSS                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetOutros                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetOutros                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 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,
    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,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) 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,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) 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,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              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
  );
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);
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 (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK10 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK11 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK12 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK13 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK14 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK15 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
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 (listaServicos) REFERENCES SILISTASERVICOS (listaServicos);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK19 FOREIGN KEY (cnae) REFERENCES SICNAES (cnae);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK20 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK21 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK22 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK23 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK24 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK25 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK26 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK27 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK28 FOREIGN KEY (idBeneficio) REFERENCES SIBENEFICIOSFISCAIS (idBeneficio);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK29 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);

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

COMMIT;

ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_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_2303 AS SELECT * FROM MODOCFISCALXITENS;

CREATE TABLE MODOCFISCALXPEDIDOCOMPRA_2303 AS SELECT * FROM MODOCFISCALXPEDIDOCOMPRA;

DROP TABLE MODOCFISCALXPEDIDOCOMPRA;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MODOCFISCALXPEDIDOCOMPRA'; 

COMMIT;

ALTER TABLE MODOCFISCALXPRODUTOFILHO DROP CONSTRAINT MODOCFISCALXPRODUTOFILHO_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,
    pedidoCompraFornecedor        VARCHAR (15) DEFAULT ' ' NOT NULL,
    sequenciaPedidoCompraFornec   NUMERIC (6,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,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,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,
    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,
    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,
    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,
    valorDescontoCustoOpItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpItem     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' 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,
    valorAcrescimoExtempGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpGeral    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,
    valorAcrescimoExtempTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpTotal    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualDevolucao           NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorIPIDevolucao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    movimentaEstoqueFiscal        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,0) 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,
    retidoISSQN                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tributadoForaMunicipio        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    incentivoFiscal               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    listaServicos                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cnae                          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idServicoMunicipio            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroProcessoAdministrativo  VARCHAR (30) DEFAULT ' ' NOT NULL,
    retencaoIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    retencaoOutros                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) 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,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) 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,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) 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,
    idBeneficio                   NUMERIC (8,0) 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,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) 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,
    diferimentoICMSEscrituracao   NUMERIC (7,4) 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,
    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,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) 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,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetIRRF                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetIRRF                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetINSS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetINSS                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseRetOutros                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetOutros                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 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,
    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,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) 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,
    baseICMSSTEscrituracao        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTEscrituracao       NUMERIC (15,2) 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,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) 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,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              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
  );
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 (gradeProduto);
CREATE INDEX MODOCFISCALXITENS_K4 ON MODOCFISCALXITENS (idDocumentoFiscal);
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 (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK10 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK11 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK12 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK13 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK14 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK15 FOREIGN KEY (cfop) REFERENCES SICFOPS (cfop);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK16 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK17 FOREIGN KEY (indicadorISSQN) REFERENCES SIINDICISSQN (indicadorISSQN);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK18 FOREIGN KEY (listaServicos) REFERENCES SILISTASERVICOS (listaServicos);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK19 FOREIGN KEY (cnae) REFERENCES SICNAES (cnae);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK20 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK21 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK22 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK23 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK24 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK25 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK26 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK27 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK28 FOREIGN KEY (idBeneficio) REFERENCES SIBENEFICIOSFISCAIS (idBeneficio);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK29 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK30 FOREIGN KEY (stICMSEscrituracao) REFERENCES SISITTRIBUTICMS (stICMS);

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

COMMIT;

ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_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);
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 PAESTABELECIMENTOXCAIXAS_2303 AS SELECT * FROM PAESTABELECIMENTOXCAIXAS;

ALTER TABLE MOSESSOESCAIXA DROP CONSTRAINT MOSESSOESCAIXA_FK1;

DROP TABLE PAESTABELECIMENTOXCAIXAS;

-- PAESTABELECIMENTOXCAIXAS
CREATE TABLE PAESTABELECIMENTOXCAIXAS
  (
    idEstabelecimentoXCaixa  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    caixa                    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ativo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idSerieFiscalNFe         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idSerieFiscalNFCe        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idSerieFiscalCupomFiscal NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idSerieFiscalNFSe        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_PK1 PRIMARY KEY (idEstabelecimentoXCaixa);
CREATE UNIQUE INDEX PAESTABELECIMENTOXCAIXAS_K2 ON PAESTABELECIMENTOXCAIXAS (estabelecimento, caixa);
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_FK2 FOREIGN KEY (idSerieFiscalNFe) REFERENCES PASERIESFISCAIS (idSerieFiscal);
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_FK3 FOREIGN KEY (idSerieFiscalNFCe) REFERENCES PASERIESFISCAIS (idSerieFiscal);
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_FK4 FOREIGN KEY (idSerieFiscalCupomFiscal) REFERENCES PASERIESFISCAIS (idSerieFiscal);
ALTER TABLE PAESTABELECIMENTOXCAIXAS ADD CONSTRAINT PAESTABELECIMENTOXCAIXAS_FK5 FOREIGN KEY (idSerieFiscalNFSe) REFERENCES PASERIESFISCAIS (idSerieFiscal);

INSERT INTO PAESTABELECIMENTOXCAIXAS (idEstabelecimentoXCaixa, estabelecimento, caixa, ativo, idSerieFiscalNFe, idSerieFiscalNFCe, idSerieFiscalCupomFiscal, idSerieFiscalNFSe, observacoes) VALUES (0, 0, 0 ,1, 0, 0, 0, 0, ' ');
INSERT INTO PAESTABELECIMENTOXCAIXAS (idEstabelecimentoXCaixa, estabelecimento, caixa, ativo, idSerieFiscalNFe, idSerieFiscalNFCe, idSerieFiscalCupomFiscal, idSerieFiscalNFSe, observacoes) SELECT idEstabelecimentoXCaixa, estabelecimento, caixa, ativo, idSerieFiscalNFe, idSerieFiscalNFCe, idSerieFiscalCupomFiscal, 0, observacoes FROM PAESTABELECIMENTOXCAIXAS_2303 WHERE idEstabelecimentoXCaixa > 0;

COMMIT;

-- PAOBRAS
CREATE TABLE PAOBRAS
  (
    idObra      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao   VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    codigoObra  VARCHAR (30) DEFAULT ' ' NOT NULL,
    art         VARCHAR (30) DEFAULT ' ' NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAOBRAS ADD CONSTRAINT PAOBRAS_PK1 PRIMARY KEY (idObra);
CREATE INDEX PAOBRAS_K2 ON PAOBRAS (descricao);

INSERT INTO PAOBRAS (idObra, descricao, ativo, codigoObra, art, observacoes) VALUES (0, 'SELECIONE', 1, ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAOBRAS', 'Obras', 1, 30474, 'PA', 'idObra', 'N', 14, 'descricao', 1, ' ', 0, 200004, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqObras', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (902, 'Obras', 1, 90001738, 'PA', 200004, 902, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqObras', 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (237, 30001019, 'Intermediário', 1, 30001, 'N', '14', 'P', 0, 0, 0, 0, 1, 0, 'Intermediário', ' ', 'CAPESSOAS', 'Válido para NFS-e (Nota de Serviços Eeletrônica).');
INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (238, 30001020, 'Obra', 1, 30001, 'N', '14', 'P', 0, 0, 0, 0, 1, 0, 'Obra', ' ', 'PAOBRAS', 'Válido para NFS-e (Nota de Serviços Eeletrônica).');

COMMIT;

-- MODOCFISCALXSERVICO
CREATE TABLE MODOCFISCALXSERVICO
  (
    idDocumentoFiscal     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataCompetencia       DATE,
    intermediario         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idObra                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroRPS             VARCHAR (50) DEFAULT ' ' NOT NULL,
    numeroNFSe            VARCHAR (50) DEFAULT ' ' NOT NULL,
    codigoVerificacaoNFSe VARCHAR (50) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXSERVICO ADD CONSTRAINT MODOCFISCALXSERVICO_PK1 PRIMARY KEY (idDocumentoFiscal);
CREATE INDEX MODOCFISCALXSERVICO_K2 ON MODOCFISCALXSERVICO (intermediario);
ALTER TABLE MODOCFISCALXSERVICO ADD CONSTRAINT MODOCFISCALXSERVICO_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXSERVICO ADD CONSTRAINT MODOCFISCALXSERVICO_FK2 FOREIGN KEY (intermediario) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXSERVICO ADD CONSTRAINT MODOCFISCALXSERVICO_FK3 FOREIGN KEY (idObra) REFERENCES PAOBRAS (idObra);

INSERT INTO MODOCFISCALXSERVICO (idDocumentoFiscal, dataCompetencia, intermediario, idObra, numeroRPS, numeroNFSe, codigoVerificacaoNFSe) VALUES (0, NULL, 0, 0, ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MODOCFISCALXSERVICO', 'Documento Fiscal X Serviço', 1, 50251, 'MO', 'idDocumentoFiscal', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (406, 'Série Fiscal sugestão NFS-e', 1, 30001, 'N', '14', 'E', 0, '0', 'PASERIESFISCAIS', ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (407, 'Controlar etapa "Separação" no logística', 1, 30001, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) values (54, 'DANFSE', 1, 303, 1, 0, 0, 1, '%SYS_DIR_ARQ_MODELOS%DANFSE.rtf', 1, 'Tipo Documento = "D"', 0, ' ');

COMMIT;

INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, observacoes) values (506, 'NFS-e', 'NFSe Saída', 1, 'S', 0, 0, ' ');

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (903, 'NFS-e', 1, 10001982, 'MO', 100001, 904, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'NFSe', 3, 3, 0, 1, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (904, 'Pesquisa NFS-e´s', 1, 10001983, 'MO', 100001, 903, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqNFSes', 3, 3, 0, 0, ' ');

COMMIT;

ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK8;
ALTER TABLE MOENTREGAXSITUACOES DROP CONSTRAINT MOENTREGAXSITUACOES_FK4;

DELETE SISITUACOESENTREGAS;

INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (0, 'SELECIONE', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (1, 'Pendente', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (2, 'Aguardando', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (3, 'Programado', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (4, 'Separação', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (5, 'Em Entrega', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (6, 'Entregue', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (7, 'Devolvido', 1, ' ');
INSERT INTO SISITUACOESENTREGAS (situacaoEntrega, descricao, ativo, observacoes) VALUES (8, 'Cancelado', 1, ' ');

COMMIT;

BEGIN
  FOR a IN (
    SELECT entrega
    FROM MOENTREGAS
    WHERE entrega > 0
    AND situacaoEntrega < 2)
  LOOP
    DELETE MOENTREGAXSITUACOES b WHERE b.entrega = a.entrega;
    DELETE MOENTREGAS b WHERE  b.entrega = a.entrega;
  END LOOP;
  COMMIT;
END;

/

UPDATE MOENTREGAS SET situacaoEntrega = 
  CASE situacaoEntrega
    WHEN 2 THEN 1
    WHEN 4 THEN 5
    WHEN 5 THEN 6
    WHEN 6 THEN 7
    WHEN 7 THEN 8
    WHEN 8 THEN 2
    ELSE situacaoEntrega
  END
WHERE situacaoEntrega IN (2,4,5,6,7,8);

COMMIT;

UPDATE MOENTREGAXSITUACOES SET situacaoEntrega = 
  CASE situacaoEntrega
    WHEN 2 THEN 1
    WHEN 4 THEN 5
    WHEN 5 THEN 6
    WHEN 6 THEN 7
    WHEN 7 THEN 8
    WHEN 8 THEN 2
    ELSE situacaoEntrega
  END
WHERE situacaoEntrega IN (2,4,5,6,7,8);

COMMIT;

ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK8 FOREIGN KEY (situacaoEntrega) REFERENCES SISITUACOESENTREGAS (situacaoEntrega);
ALTER TABLE MOENTREGAXSITUACOES ADD CONSTRAINT MOENTREGAXSITUACOES_FK4 FOREIGN KEY (situacaoEntrega) REFERENCES SISITUACOESENTREGAS (situacaoEntrega);

INSERT INTO MOENTREGAS (
  entrega,
  modeloDocumento,
  controlaSeparacaoConferencia,
  estabelecimento,
  dataEntrega,
  horaEntregaFinal,
  motorista,
  placa,
  rota,
  idItemOrcamento,
  idItemPreDocumentoRemessa,
  idItemDocFiscalRemessa,
  quantidade,
  situacaoEntrega,
  observacoes)
SELECT
  FUNC_ADD_BUSCA_PROXIMO_ID('MOENTREGAS', 'entrega', 14, 1, NULL),
  contr.modeloDocumentoEntrega,
  0,
  orc.estabelecimento,
  COALESCE(item.dataEntrega, orc.dataEntrega),
  TO_CHAR(COALESCE(item.dataEntrega, orc.dataEntrega),'HH24MISS'),
  orc.motorista,
  orc.placa,
  0,
  item.idItemOrcamento,
  0,
  0,
  ( item.quantidadeConvertida - COALESCE ((
    SELECT SUM(entr.quantidade)
    FROM MOENTREGAS entr
    WHERE entr.idItemOrcamento = item.idItemOrcamento
    AND entr.situacaoEntrega <> 7), 0)),
  CASE item.situacaoEntrega WHEN 8 THEN 2 ELSE 1 END,
  'CONVERSAO'
FROM MOORCAMENTOXITENS_2303 item
JOIN PACONTROLESENTREGA contr
ON contr.controleEntrega = item.controleEntrega
JOIN MOORCAMENTOS orc
ON orc.orcamento = item.orcamento
JOIN PAETAPASORCAMENTO etOrc
ON etOrc.etapaOrcamento = orc.etapaOrcamento
WHERE item.idItemOrcamento > 0
AND item.cancelado = 0
AND item.controleEntrega > 0
AND item.situacaoEntrega BETWEEN 2 AND 8
AND (etOrc.situacaoOrcamento <= 63
  OR etOrc.situacaoOrcamento BETWEEN 64 AND 89
  AND (EXISTS(
    SELECT 1
    FROM MOPREDOCUMXORCAMENTOITEM preXOrc
    WHERE preXOrc.idItemOrcamento = item.idItemOrcamento)
  OR EXISTS(
    SELECT 1
    FROM MODOCFISCALXORCAMENTOITEM docXOrc
    WHERE docXOrc.idItemOrcamento = item.idItemOrcamento)))
AND (item.quantidadeConvertida - COALESCE ((
  SELECT SUM (entr2.quantidade)
  FROM MOENTREGAS entr2
  WHERE entr2.idItemOrcamento = item.idItemOrcamento
  AND entr2.situacaoEntrega <> 7), 0)) > 0
AND NOT (EXISTS (
  SELECT 1
  FROM MOENTREGAS entr2
  WHERE entr2.idItemOrcamento = item.idItemOrcamento
  AND entr2.situacaoEntrega = 7));

COMMIT;

CREATE TABLE MOENTREGAS_2303 AS SELECT * FROM MOENTREGAS;

ALTER TABLE MOENTREGAXSITUACOES DROP CONSTRAINT MOENTREGAXSITUACOES_FK2;

DROP TABLE MOENTREGAS;

-- MOENTREGAS
CREATE TABLE MOENTREGAS
  (
    entrega                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntrega               DATE,
    horaEntregaFinal          CHAR(6),
    motorista                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    placa                     VARCHAR (7) DEFAULT ' ' NOT NULL,
    rota                      NUMERIC (11,0) DEFAULT 0 NOT NULL,
    idItemOrcamento           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumentoRemessa NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscalRemessa    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoEntrega           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes               VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_PK1 PRIMARY KEY (entrega);
CREATE INDEX MOENTREGAS_K2 ON MOENTREGAS (estabelecimento, dataEntrega, motorista, placa, rota, idItemOrcamento);
CREATE INDEX MOENTREGAS_K3 ON MOENTREGAS (idItemOrcamento);
CREATE INDEX MOENTREGAS_K4 ON MOENTREGAS (idItemPreDocumentoRemessa);
CREATE INDEX MOENTREGAS_K5 ON MOENTREGAS (idItemDocFiscalRemessa);
CREATE INDEX MOENTREGAS_K6 ON MOENTREGAS (situacaoEntrega);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK3 FOREIGN KEY (motorista) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK4 FOREIGN KEY (placa) REFERENCES CAPLACAS (placa);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK5 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK6 FOREIGN KEY (idItemPreDocumentoRemessa) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK7 FOREIGN KEY (idItemDocFiscalRemessa) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK8 FOREIGN KEY (situacaoEntrega) REFERENCES SISITUACOESENTREGAS (situacaoEntrega);

INSERT INTO MOENTREGAS (entrega, modeloDocumento, estabelecimento, dataEntrega, horaEntregaFinal, motorista, placa, rota, idItemOrcamento, idItemPreDocumentoRemessa, idItemDocFiscalRemessa, quantidade, situacaoEntrega, observacoes) VALUES (0, 0, 0, NULL, NULL, 0, ' ', 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOENTREGAS (entrega, modeloDocumento, estabelecimento, dataEntrega, horaEntregaFinal, motorista, placa, rota, idItemOrcamento, idItemPreDocumentoRemessa, idItemDocFiscalRemessa, quantidade, situacaoEntrega, observacoes) SELECT entrega, modeloDocumento, estabelecimento, dataEntrega, horaEntregaFinal, motorista, placa, rota, idItemOrcamento, idItemPreDocumentoRemessa, idItemDocFiscalRemessa, quantidade, situacaoEntrega, observacoes FROM MOENTREGAS_2303 WHERE entrega > 0;

COMMIT;

ALTER TABLE MOENTREGAXSITUACOES ADD CONSTRAINT MOENTREGAXSITUACOES_FK2 FOREIGN KEY (entrega) REFERENCES MOENTREGAS (entrega);

DROP INDEX MODOCFISCALXLOTESNFE_K3;
CREATE INDEX MODOCFISCALXLOTESNFE_K3 ON MODOCFISCALXLOTESNFE (idDocumentoFiscal, situacaoDocumentoFiscal, data DESC);

DROP INDEX MODOCFISCALXNFREF_K3;
CREATE INDEX MODOCFISCALXNFREF_K3 ON MODOCFISCALXNFREF (idDocumentoFiscal, chaveNfe);

DROP TABLE TEMPLOGISTICA;

-- TEMPLOGISTICA
CREATE GLOBAL TEMPORARY TABLE TEMPLOGISTICA
  (
    uniqueMachineID      VARCHAR (18) DEFAULT ' ' NOT NULL,
    idSessao             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    orcamento            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao            NUMERIC (11,0) DEFAULT 0 NOT NULL,
    selecionado          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    dataFaturamento      DATE,
    dataEntrega          DATE,
    habilitarProgramar   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitarEntregar    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPendente       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirAguardando     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirProgramado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirSeparacao      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirEmEntrega      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirEntregue       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDevolvido      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirCancelado      NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPLOGISTICA_PK1 ON TEMPLOGISTICA (uniqueMachineID, idSessao, orcamento);
CREATE INDEX TEMPLOGISTICA_K2 ON TEMPLOGISTICA (uniqueMachineID, idSessao, ordenacao);

CREATE TABLE PAREGRASDISTRIBXESTABELEC_2303 AS SELECT * FROM PAREGRASDISTRIBXESTABELEC;

DROP TABLE PAREGRASDISTRIBXESTABELEC;

-- PAREGRASDISTRIBXESTABELEC
CREATE TABLE PAREGRASDISTRIBXESTABELEC
  (
    id                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idRegraDistribuicao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataValidadeInicial  DATE,
    dataValidadeFinal    DATE,
    percentualDistribuir NUMERIC (15,8) DEFAULT 0 NOT NULL,
    coberturaIdeal       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    estoqueMinimo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAREGRASDISTRIBXESTABELEC ADD CONSTRAINT PAREGRASDISTRIBXESTABELEC_PK1 PRIMARY KEY (id);
CREATE INDEX PAREGRASDISTRIBXESTABELEC_K2 ON PAREGRASDISTRIBXESTABELEC (idRegraDistribuicao, estabelecimento);
ALTER TABLE PAREGRASDISTRIBXESTABELEC ADD CONSTRAINT PAREGRASDISTRIBXESTABELEC_FK1 FOREIGN KEY (idRegraDistribuicao) REFERENCES PAREGRASDISTRIBUICOES (idRegraDistribuicao);
ALTER TABLE PAREGRASDISTRIBXESTABELEC ADD CONSTRAINT PAREGRASDISTRIBXESTABELEC_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);

INSERT INTO PAREGRASDISTRIBXESTABELEC (id, idRegraDistribuicao, estabelecimento, dataValidadeInicial, dataValidadeFinal, percentualDistribuir, coberturaIdeal, estoqueMinimo, observacoes) VALUES (0, 0, 0, NULL, NULL, 0, 0, 0, ' ');
INSERT INTO PAREGRASDISTRIBXESTABELEC (id, idRegraDistribuicao, estabelecimento, dataValidadeInicial, dataValidadeFinal, percentualDistribuir, coberturaIdeal, estoqueMinimo, observacoes) SELECT id, idRegraDistribuicao, estabelecimento, dataValidadeInicial, dataValidadeFinal, percentualDistribuir, coberturaIdeal, 0, observacoes from PAREGRASDISTRIBXESTABELEC_2303 where ID > 0;

COMMIT;

create or replace FUNCTION FUNC_ADD_BUSCA_OPERACAO_FISCAL (
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_pessoa                   IN NUMBER,
    p_cab_vendaConsumidor          IN NUMBER,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_est_grupoFiscal              IN NUMBER,
    p_pessEst_regimeTributario     IN CHAR,
    p_endPessEstMun_uf             IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_endPessMun_uf                IN CHAR,
    p_produto                      IN NUMBER)
  RETURN NUMBER
IS
  v_operacaoFiscal NUMBER;
BEGIN
  SELECT COALESCE((
    SELECT a.operacaoFiscal
    FROM (
      SELECT a.operacaoFiscal,
        ROW_NUMBER() OVER (
          ORDER BY
            a.filtrarPessoas DESC,
            a.ufDestino      DESC,
            a.ufOrigem       DESC,
            CASE
              WHEN a.agrupadorFiscal = 0
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM PAAGRUPFISCXPRODUTOS opX
                WHERE opX.agrupadorFiscal = a.agrupadorFiscal
                AND opX.produto           = p_produto
                AND opX.ativo             = 1)
              THEN 2
              ELSE 1
            END DESC,
            CASE
              WHEN filtrProd.filtroProduto = 0
              THEN 0
              WHEN filtrProd.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
                WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
                AND filtrProdX.produto = p_produto
                AND filtrProdX.ativo = 1)
              THEN 2
              ELSE 1
            END DESC,
            a.regimeTributario DESC,
            a.indicadorInscricaoEstadual DESC,
            a.indicadorConsumidorFinal DESC,
            a.grupoFiscal DESC,
            a.origemMercadoria DESC,
            a.tipoProduto DESC,
            a.operacaoFiscal DESC) ordenacao
      FROM PAOPERACOESFISCAIS a
      JOIN CAPRODUTOS prod
      ON prod.produto = p_produto
      JOIN PASUBCATEGORIASPRODUTO subCat
      ON subCat.subcategoriaProduto = prod.subcategoriaProduto
      JOIN SICFOPS cfop
      ON cfop.cfop = a.cfop
      JOIN SINATUREZASOPERACAO natOp
      ON natOp.naturezaOperacao = cfop.naturezaOperacao
      JOIN SICAPITULOSNATUREZAOPERAC capNatFisc
      ON capNatFisc.capituloNaturezaOperacao = natOp.capituloNaturezaOperacao
      JOIN PAFILTROSPRODUTO filtrProd
      ON filtrProd.filtroProduto = a.filtroProduto
      WHERE a.operacaoFiscal > 0
      AND a.ativo = 1
      AND a.cfop BETWEEN
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3000 ELSE 7000 END
          WHEN p_endPessMun_uf       = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1000 ELSE 5000 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2000 ELSE 6000 END
        END
        AND
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3999 ELSE 7999 END
          WHEN p_endPessMun_uf       = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1999 ELSE 5999 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2999 ELSE 6999 END
        END
      AND TRUNC(a.dataValidadeInicial) <= TRUNC(SYSDATE)
      AND TRUNC(a.dataValidadeFinal)   >= TRUNC(SYSDATE)
      AND capNatFisc.entradaSaida       = p_cab_entradaSaida
      AND (a.regimeTributario           = ' '
        OR a.regimeTributario           = p_pessEst_regimeTributario)
      AND (a.tipoProduto                = '  '
        OR a.tipoProduto                = prod.tipoProduto)
      AND (a.origemMercadoria           = ' '
        OR a.origemMercadoria           = prod.origemMercadoria)
      AND (a.grupoFiscal                = 0
        OR a.grupoFiscal                = p_est_grupoFiscal)
      AND (a.ufOrigem                   = '  '
        OR a.ufOrigem                   =
          CASE
            WHEN p_cab_entradaSaida     = 'S'
            OR p_endPessMun_uf          = '  '
            OR p_cab_vendaConsumidor    = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.ufDestino                  = '  '
        OR a.ufDestino                  =
          CASE
            WHEN p_cab_entradaSaida     = 'E'
            OR p_endPessMun_uf          = '  '
            OR p_cab_vendaConsumidor    = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.indicadorConsumidorFinal   = ' '
        OR a.indicadorConsumidorFinal   = p_cab_indicadorConsumidorFinal)
      AND (a.indicadorInscricaoEstadual = ' '
        OR a.indicadorInscricaoEstadual =
          CASE
            WHEN p_pess_indicadorInscricaoEstad <> ' '
            THEN p_pess_indicadorInscricaoEstad
            WHEN p_cab_indicadorConsumidorFinal = '0'
            THEN '1'
            ELSE '9'
          END)
      AND (p_cab_modeloDocumento = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXMODELOSDOCUM opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.modeloDocumento  = p_cab_modeloDocumento
          AND opX.ativo            = 1))
      AND (a.filtrarPessoas      = 0
        OR p_cab_vendaConsumidor = 0 
        AND EXISTS (
          SELECT 1
          FROM PAOPERFISCALXPESSOAS opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.pessoa           = p_cab_pessoa
          AND opX.ativo            = 1))
      AND (a.agrupadorFiscal = 0
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXPRODUTOS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.produto           = p_produto
          AND opX.ativo             = 1)
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXNCMS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.idNcm             = prod.idNcm
          AND opX.ativo             = 1))
      AND (filtrProd.filtrarProdutos               = 0
        AND filtrProd.filtrarCategoriasProdutos    = 0
        AND filtrProd.filtrarSubcategoriasProdutos = 0
        AND filtrProd.filtrarMarcas                = 0
        AND filtrProd.filtrarCaracteristicasA      = 0
        AND filtrProd.filtrarCaracteristicasB      = 0
        AND filtrProd.filtrarCaracteristicasC      = 0
        AND filtrProd.filtrarCaracteristicasD      = 0
        AND filtrProd.filtrarCaracteristicasE      = 0
        AND filtrProd.filtrarCores                 = 0
        AND filtrProd.filtrarTamanhos              = 0
        AND filtrProd.filtrarNCMs                  = 0
        AND filtrProd.filtrarListasServicos        = 0
        OR filtrProd.filtrarProdutos               = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.produto         = p_produto
          AND filtrProdX.ativo           = 1)
        OR (filtrProd.filtrarCategoriasProdutos     = 1
          OR filtrProd.filtrarSubcategoriasProdutos = 1
          OR filtrProd.filtrarMarcas                = 1
          OR filtrProd.filtrarCaracteristicasA      = 1
          OR filtrProd.filtrarCaracteristicasB      = 1
          OR filtrProd.filtrarCaracteristicasC      = 1
          OR filtrProd.filtrarCaracteristicasD      = 1
          OR filtrProd.filtrarCaracteristicasE      = 1
          OR filtrProd.filtrarCores                 = 1
          OR filtrProd.filtrarTamanhos              = 1
          OR filtrProd.filtrarNCMs                  = 1
          OR filtrProd.filtrarListasServicos        = 1)
        AND (filtrProd.filtrarCategoriasProdutos    = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
            WHERE filtrProdX.filtroProduto  = filtrProd.filtroProduto
            AND filtrProdX.categoriaProduto = subCat.categoriaProduto
            AND filtrProdX.ativo            = 1))
        AND (filtrProd.filtrarSubcategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
            WHERE filtrProdX.filtroProduto     = filtrProd.filtroProduto
            AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
            AND filtrProdX.ativo               = 1))
        AND (filtrProd.filtrarMarcas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXMARCAS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.marca           = prod.marca
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasA = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERA filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaA = prod.caracteristicaA
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasB = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERB filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaB = prod.caracteristicaB
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasC = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERC filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaC = prod.caracteristicaC
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasD = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaD = prod.caracteristicaD
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasE = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaE = prod.caracteristicaE
            AND filtrProdX.ativo           = 1))
        AND filtrProd.filtrarCores    = 0
        AND filtrProd.filtrarTamanhos = 0
        AND (filtrProd.filtrarNCMs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXNCMS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.idNcm           = prod.idNcm
            AND filtrProdX.ativo           = 1))
        AND (filtrProd.filtrarListasServicos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXLISTASSE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.listaServicos   = prod.listaServicos
            AND filtrProdX.ativo           = 1)))) a
    WHERE a.ordenacao = 1), 0)
  INTO v_operacaoFiscal
  FROM DUAL;
  RETURN v_operacaoFiscal;
END;

/

create or replace PROCEDURE ADD_ITEM_OPERACAO_FISCAL_BUSCA (
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_finalidadeNota           IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_vendaConsumidor          IN NUMBER,
  p_cab_enderecoEntregaPessoa    IN NUMBER,
  p_cab_municipioFatoGerador     IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_modDoc_movimentaEstoque      IN NUMBER,
  p_modDoc_geraFinanceiro        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_endPess_enderecoPessoa       IN NUMBER,
  p_munEndPess_uf                IN CHAR,
  p_munEndEntr_uf                IN CHAR,
  p_item_operacaoFiscal          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_prod_tipoProduto             IN CHAR,
  p_prod_origemMercadoria        IN CHAR,
  p_prod_idNcm                   IN NUMBER,
  p_prod_listaServicos           IN NUMBER,
  p_movimentaEstoque             IN NUMBER,
  p_movimentaEstoqueFiscal       IN NUMBER,
  p_geraFinanceiro               IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_atualizarISSQN               IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR,
  p_atualizarRetencaoIRRF        IN NUMBER,
  p_item_retencaoIRRF            IN NUMBER,
  p_atualizarRetencaoINSS        IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_atualizarRetencaoPIS         IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_atualizarRetencaoCOFINS      IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_atualizarRetencaoCSLL        IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_atualizarRetencaoOutros      IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_atualizarII                  IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_atualizarIOF                 IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_atualizarIPI                 IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_atualizarPIS                 IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_atualizarPISST               IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_atualizarCOFINS              IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_atualizarCOFINSST            IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_atualizarSimplesNacional     IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_atualizarICMS                IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalidadeBaseCalcICMS  IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_atualizarICMSST              IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicST       IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_atualizarICMSSTAnteriorEfet  IN NUMBER,
  p_item_aliquotaSTSuportConsF   IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_atualizarICMSEscrituracao    IN NUMBER,
  p_item_stICMSEscrit            IN CHAR,
  p_item_reducaoBaseICMSEscrit   IN NUMBER,
  p_item_aliquotaICMSEscrit      IN NUMBER,
  p_atualizarICMSSTEscrituracao  IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscrit     IN NUMBER,
  p_item_aliquotaICMSSTEscrit    IN NUMBER,
  p_item_diferimentoICMSEscrit   IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_atualizarDIFAL               IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_atualizarFCP                 IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_atualizarImpostosEstimados   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  /* Retornos */
  r_encontrouRegistro            OUT NUMBER,
  r_movimentaEstoque             OUT NUMBER,
  r_movimentaEstoqueFiscal       OUT NUMBER,
  r_geraFinanceiro               OUT NUMBER,
  r_item_cfop                    OUT NUMBER,
  r_item_indicadorISSQN          OUT CHAR,
  r_item_aliquotaISSQN           OUT NUMBER,
  r_item_retidoISSQN             OUT NUMBER,
  r_item_tributadoForaMunicipio  OUT NUMBER,
  r_item_incentivoFiscal         OUT NUMBER,
  r_item_listaServicos           OUT NUMBER,
  r_item_cnae                    OUT NUMBER,
  r_item_idServicoMunicipio      OUT NUMBER,
  r_item_numeroProcessoAdministr OUT VARCHAR,
  r_item_retencaoIRRF            OUT NUMBER,
  r_item_retencaoINSS            OUT NUMBER,
  r_item_retencaoPIS             OUT NUMBER,
  r_item_retencaoCOFINS          OUT NUMBER,
  r_item_retencaoCSLL            OUT NUMBER,
  r_item_retencaoOutros          OUT NUMBER,
  r_item_aliquotaII              OUT NUMBER,
  r_item_aliquotaIOF             OUT NUMBER,
  r_item_codigoEnquadramentoIPI  OUT NUMBER,
  r_item_stIPI                   OUT CHAR,
  r_item_aliquotaIPI             OUT NUMBER,
  r_item_valorAliquotaIPI        OUT NUMBER,
  r_item_stPIS                   OUT CHAR,
  r_item_aliquotaPIS             OUT NUMBER,
  r_item_valorAliquotaPIS        OUT NUMBER,
  r_item_aliquotaPISST           OUT NUMBER,
  r_item_valorAliquotaPISST      OUT NUMBER,
  r_item_stCOFINS                OUT CHAR,
  r_item_aliquotaCOFINS          OUT NUMBER,
  r_item_valorAliquotaCOFINS     OUT NUMBER,
  r_item_aliquotaCOFINSST        OUT NUMBER,
  r_item_valorAliquotaCOFINSST   OUT NUMBER,
  r_item_stSimplesNacional       OUT CHAR,
  r_item_creditoSimplesNacional  OUT NUMBER,
  r_item_stICMS                  OUT CHAR,
  r_item_modalidadeBaseCalcICMS  OUT CHAR,
  r_item_reducaoBaseICMS         OUT NUMBER,
  r_item_aliquotaICMS            OUT NUMBER,
  r_item_diferimentoICMS         OUT NUMBER,
  r_item_motivoDesoneracaoICMS   OUT CHAR,
  r_item_idBeneficio             OUT NUMBER,
  r_item_modalBaseCalcICMSST     OUT CHAR,
  r_item_margemValorAdicST       OUT NUMBER,
  r_item_reducaoBaseST           OUT NUMBER,
  r_item_aliquotaICMSST          OUT NUMBER,
  r_item_aliquotaSTSuportConsF   OUT NUMBER,
  r_item_reducaoBaseICMSEfetivo  OUT NUMBER,
  r_item_aliquotaICMSEfetivo     OUT NUMBER,
  r_item_stICMSEscrit            OUT CHAR,
  r_item_reducaoBaseICMSEscrit   OUT NUMBER,
  r_item_aliquotaICMSEscrit      OUT NUMBER,
  r_item_margemValorAdicSTEscrit OUT NUMBER,
  r_item_reducaoBaseSTEscrit     OUT NUMBER,
  r_item_aliquotaICMSSTEscrit    OUT NUMBER,
  r_item_diferimentoICMSEscrit   OUT NUMBER,
  r_item_somarICMSST             OUT NUMBER,
  r_item_aliquotaICMSUFDestinat  OUT NUMBER,
  r_item_aliquotaICMSInterestad  OUT NUMBER,
  r_item_partilhaICMSInterestad  OUT NUMBER,
  r_item_aliquotaFCP             OUT NUMBER,
  r_item_aliquotaFCPST           OUT NUMBER,
  r_item_aliquotaFCPSTAnteriorm  OUT NUMBER,
  r_item_aliquotaFCPUFDestinat   OUT NUMBER,
  r_item_aliquotaEstImpFederais  OUT NUMBER,
  r_item_aliquotaEstImpEstaduais OUT NUMBER,
  r_item_aliquotaEstImpMunicipai OUT NUMBER)    
IS    
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(60);  
  v_encontouDesoneracao          NUMBER;
BEGIN
  r_movimentaEstoque             := p_movimentaEstoque;
  r_movimentaEstoqueFiscal       := p_movimentaEstoqueFiscal;
  r_geraFinanceiro               := p_geraFinanceiro;
  r_item_cfop                    := p_item_cfop;
  r_item_indicadorISSQN          := p_item_indicadorISSQN;
  r_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  r_item_retidoISSQN             := p_item_retidoISSQN;
  r_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  r_item_incentivoFiscal         := p_item_incentivoFiscal;
  r_item_listaServicos           := p_item_listaServicos;
  r_item_cnae                    := p_item_cnae;
  r_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  r_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  r_item_retencaoIRRF            := p_item_retencaoIRRF;
  r_item_retencaoINSS            := p_item_retencaoINSS;
  r_item_retencaoPIS             := p_item_retencaoPIS;
  r_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  r_item_retencaoCSLL            := p_item_retencaoCSLL;
  r_item_retencaoOutros          := p_item_retencaoOutros;
  r_item_aliquotaII              := p_item_aliquotaII;
  r_item_aliquotaIOF             := p_item_aliquotaIOF;
  r_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  r_item_stIPI                   := p_item_stIPI;
  r_item_aliquotaIPI             := p_item_aliquotaIPI;
  r_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  r_item_stPIS                   := p_item_stPIS;
  r_item_aliquotaPIS             := p_item_aliquotaPIS;
  r_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  r_item_aliquotaPISST           := p_item_aliquotaPISST;
  r_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  r_item_stCOFINS                := p_item_stCOFINS;
  r_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  r_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  r_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  r_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  r_item_stSimplesNacional       := p_item_stSimplesNacional;
  r_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  r_item_stICMS                  := p_item_stICMS;
  r_item_modalidadeBaseCalcICMS  := p_item_modalidadeBaseCalcICMS;
  r_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  r_item_aliquotaICMS            := p_item_aliquotaICMS;
  r_item_diferimentoICMS         := p_item_diferimentoICMS;
  r_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  r_item_idBeneficio             := p_item_idBeneficio;
  r_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  r_item_margemValorAdicST       := p_item_margemValorAdicST;
  r_item_reducaoBaseST           := p_item_reducaoBaseST;
  r_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  r_item_aliquotaSTSuportConsF   := p_item_aliquotaSTSuportConsF;
  r_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  r_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  r_item_stICMSEscrit            := p_item_stICMSEscrit;
  r_item_reducaoBaseICMSEscrit   := p_item_reducaoBaseICMSEscrit;
  r_item_aliquotaICMSEscrit      := p_item_aliquotaICMSEscrit;
  r_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  r_item_reducaoBaseSTEscrit     := p_item_reducaoBaseSTEscrit;
  r_item_aliquotaICMSSTEscrit    := p_item_aliquotaICMSSTEscrit;
  r_item_diferimentoICMSEscrit   := p_item_diferimentoICMSEscrit;
  r_item_somarICMSST             := p_item_somarICMSST;
  r_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  r_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  r_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  r_item_aliquotaFCP             := p_item_aliquotaFCP;
  r_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  r_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  r_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  r_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  r_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  r_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  r_encontrouRegistro := 0;
  FOR opFisc IN (
    SELECT
      opFisc.contaContabilDebito,
      opFisc.contaContabilCredito,
      opFisc.historicoContabil,
      opFisc.cfop,
      cfop.geraFinanceiro,
      COALESCE (opXMun.indicadorISSQN, '2') indicadorISSQN,
      COALESCE (opXMun.aliquotaISSQN, 0) aliquotaISSQN,
      COALESCE (opXMun.retidoISSQN, 0) retidoISSQN,
      COALESCE (opXMun.tributadoForaMunicipio, 0) tributadoForaMunicipio,
      COALESCE (opXMun.incentivoFiscal, 0) incentivoFiscal,
      COALESCE (opXMun.listaServicos, 0) listaServicos,
      COALESCE (opXMun.cnae, 0) cnae,
      COALESCE (opXMun.idServicoMunicipio, 0) idServicoMunicipio,
      COALESCE (opXMun.numeroProcessoAdministrativo, ' ') numeroProcessoAdministrativo,
      opFisc.retencaoIRRF,
      opFisc.retencaoINSS,
      opFisc.retencaoPIS,
      opFisc.retencaoCOFINS,
      opFisc.retencaoCSLL,
      opFisc.retencaoOutros,
      opFisc.aliquotaII,
      opFisc.aliquotaIOF,
      opFisc.codigoEnquadramentoIPI,
      opFisc.stIPI,
      opFisc.aliquotaIPI,
      opFisc.valorAliquotaIPI,
      opFisc.stPIS,
      opFisc.aliquotaPIS,
      opFisc.valorAliquotaPIS,
      opFisc.aliquotaPISST,
      opFisc.valorAliquotaPISST,
      opFisc.stCOFINS,
      opFisc.aliquotaCOFINS,
      opFisc.valorAliquotaCOFINS,
      opFisc.aliquotaCOFINSST,
      opFisc.valorAliquotaCOFINSST,
      opFisc.stSimplesNacional,
      opFisc.creditoSimplesNacional,
      opFisc.stICMS,
      opFisc.modalidadeBaseCalcICMS,
      opFisc.reducaoBaseICMS,
      opFisc.aliquotaICMS,
      opFisc.diferimentoICMS,
      opFisc.motivoDesoneracaoICMS,
      opFisc.idBeneficio,
      opFisc.modalidadeBaseCalcICMSST,
      opFisc.margemValorAdicionadoST,
      opFisc.reducaoBaseST,
      opFisc.aliquotaICMSST,
      opFisc.aliquotaSTSuportConsFinal,
      opFisc.reducaoBaseICMSEfetivo,
      opFisc.aliquotaICMSEfetivo,
      opFisc.aliquotaICMSUFDestinatario,
      opFisc.aliquotaICMSInterestadual,
      opFisc.partilhaICMSInterestadual,
      opFisc.aliquotaFCP,
      opFisc.aliquotaFCPST,
      opFisc.aliquotaFCPSTAnteriormente,
      opFisc.aliquotaFCPUFDestinatario
    FROM PAOPERACOESFISCAIS opFisc
    JOIN SICFOPS cfop
    ON cfop.cfop = opFisc.cfop
    LEFT JOIN PAOPERFISCALXMUNICIPIOS opXMun
    ON opXMun.operacaoFiscal = opFisc.operacaoFiscal
    AND opXMun.municipio = p_cab_municipioFatoGerador
    AND opXMun.ativo = 1
    WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal)
  LOOP
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (4,6,9,10,11,12,13) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
    END IF;
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (4,6,9,13) THEN
      r_geraFinanceiro := CASE WHEN p_modDoc_geraFinanceiro = 1 AND opFisc.geraFinanceiro = 1 THEN 1 ELSE 0 END;
    END IF;
    r_item_cfop := opFisc.cfop;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := opFisc.indicadorISSQN;
      r_item_aliquotaISSQN           := opFisc.aliquotaISSQN;
      r_item_retidoISSQN             := opFisc.retidoISSQN;
      r_item_tributadoForaMunicipio  := opFisc.tributadoForaMunicipio;
      r_item_incentivoFiscal         := opFisc.incentivoFiscal;
      r_item_listaServicos           := opFisc.listaServicos;
      r_item_cnae                    := opFisc.cnae;
      r_item_idServicoMunicipio      := opFisc.idServicoMunicipio;
      r_item_numeroProcessoAdministr := opFisc.numeroProcessoAdministrativo;
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := opFisc.retencaoIRRF;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := opFisc.retencaoINSS;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := opFisc.retencaoPIS;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := opFisc.retencaoCOFINS;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := opFisc.retencaoCSLL;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := opFisc.retencaoOutros;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := opFisc.aliquotaII;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := opFisc.aliquotaIOF;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := opFisc.codigoEnquadramentoIPI;
      r_item_stIPI                  := opFisc.stIPI;
      r_item_aliquotaIPI            := opFisc.aliquotaIPI;
      r_item_valorAliquotaIPI       := opFisc.valorAliquotaIPI;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := opFisc.stPIS;
      r_item_aliquotaPIS      := opFisc.aliquotaPIS;
      r_item_valorAliquotaPIS := opFisc.valorAliquotaPIS;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := opFisc.aliquotaPISST;
      r_item_valorAliquotaPISST := opFisc.valorAliquotaPISST;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := opFisc.stCOFINS;
      r_item_aliquotaCOFINS      := opFisc.aliquotaCOFINS;
      r_item_valorAliquotaCOFINS := opFisc.valorAliquotaCOFINS;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := opFisc.aliquotaCOFINSST;
      r_item_valorAliquotaCOFINSST := opFisc.valorAliquotaCOFINSST;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := opFisc.stSimplesNacional;
      r_item_creditoSimplesNacional := opFisc.creditoSimplesNacional;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS := opFisc.stICMS;
      ADD_ITEM_DESON_FISCAL_BUSCA (
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_pessoa,
        p_cab_vendaConsumidor,
        p_munEndEst_uf,
        p_munEndPess_uf,
        r_item_stICMS,
        p_gradProd_produto,
        p_prod_origemMercadoria,
        p_prod_idNcm,
        /* Retornos */
        v_encontouDesoneracao,
        r_item_modalidadeBaseCalcICMS,
        r_item_reducaoBaseICMS,
        r_item_aliquotaICMS,
        r_item_diferimentoICMS,
        r_item_motivoDesoneracaoICMS,
        r_item_idBeneficio,
        v_auxNumber);
      IF v_encontouDesoneracao = 0 THEN
        r_item_modalidadeBaseCalcICMS := opFisc.modalidadeBaseCalcICMS;
        r_item_reducaoBaseICMS        := opFisc.reducaoBaseICMS;
        r_item_aliquotaICMS           := opFisc.aliquotaICMS;
        r_item_diferimentoICMS        := opFisc.diferimentoICMS;
        r_item_motivoDesoneracaoICMS  := opFisc.motivoDesoneracaoICMS;
        r_item_idBeneficio            := opFisc.idBeneficio;
      END IF;
      IF r_item_aliquotaICMS = 0 AND r_item_stICMS in ('00','10','20','70') THEN
        SELECT COALESCE(MAX(aliquotaIcms),0)
        INTO r_item_aliquotaICMS
        FROM PAUFORIGEMXUFDESTINO
        WHERE ufOrigem =
          CASE
            WHEN p_cab_entradaSaida  = 'S'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END
        AND ufDestino =
          CASE
            WHEN p_cab_entradaSaida  = 'E'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END;
      END IF;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := opFisc.modalidadeBaseCalcICMSST;
      r_item_margemValorAdicST   := opFisc.margemValorAdicionadoST;
      r_item_reducaoBaseST       := opFisc.reducaoBaseST;
      r_item_aliquotaICMSST      := opFisc.aliquotaICMSST;
      r_item_somarICMSST         := 1;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := opFisc.aliquotaSTSuportConsFinal;
      r_item_reducaoBaseICMSEfetivo := opFisc.reducaoBaseICMSEfetivo;
      r_item_aliquotaICMSEfetivo    := opFisc.aliquotaICMSEfetivo;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := CASE WHEN p_cab_nfFornecedor = 1 AND p_prod_tipoProduto IN('07','08') THEN '90' WHEN p_cab_nfFornecedor = 1 AND r_item_stICMS IN('10','30','70') OR p_cab_nfFornecedor = 1 AND r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN '60' WHEN r_item_stICMS <> ' ' THEN r_item_stICMS WHEN r_item_stSimplesNacional IN ('101','102') AND r_item_reducaoBaseICMS = 0 THEN '00' WHEN r_item_stSimplesNacional IN ('101','102') THEN '20' WHEN r_item_stSimplesNacional IN ('103','300') THEN '40' WHEN r_item_stSimplesNacional IN ('201','202','203') AND r_item_reducaoBaseICMS = 0 THEN '10' WHEN r_item_stSimplesNacional IN ('201','202','203') THEN '70' WHEN r_item_stSimplesNacional = '400' THEN '41' ELSE '90' END;
      r_item_reducaoBaseICMSEscrit := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_reducaoBaseICMS ELSE 0 END;
      r_item_aliquotaICMSEscrit    := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_aliquotaICMS WHEN r_item_stSimplesNacional IN ('101','201') THEN r_item_creditoSimplesNacional ELSE 0 END;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_margemValorAdicST END;
      r_item_reducaoBaseSTEscrit     := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_reducaoBaseST END;
      r_item_aliquotaICMSSTEscrit    := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_aliquotaICMSST END;
      r_item_diferimentoICMSEscrit   := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_diferimentoICMS END;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      IF p_cab_entradaSaida='S'
        AND NOT(p_cab_finalidadeNota IN('2','3'))
        AND p_cab_localDestinoOperacao = '2'
        AND p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9'
        AND (p_cab_pessoa = 0
          OR p_cab_vendaConsumidor = 1
          OR p_cab_enderecoEntregaPessoa = p_endPess_enderecoPessoa
          OR p_munEndEntr_uf <> p_munEndEst_uf)
        AND NOT (r_item_cfop IN(6552,6922,6929))
        AND (p_prod_tipoProduto <> '09'
          OR NOT (r_item_indicadorISSQN IN('1','2','3','4','5','6','7')))
        AND NOT(r_item_stSimplesNacional IN('103','300','400'))
        AND NOT(r_item_stICMS IN('10','40','41','90')) THEN
        r_item_aliquotaICMSUFDestinat := opFisc.aliquotaICMSUFDestinatario;
        r_item_aliquotaICMSInterestad := opFisc.aliquotaICMSInterestadual;
        r_item_partilhaICMSInterestad := opFisc.partilhaICMSInterestadual;
        IF r_item_aliquotaICMSUFDestinat = 0
          AND r_item_aliquotaICMSInterestad = 0
          AND r_item_partilhaICMSInterestad = 0
          AND (r_item_stSimplesNacional = ''
            OR r_item_stSimplesNacional = ' '
            OR r_item_stSimplesNacional = '  '
            OR r_item_stSimplesNacional = '   ')
        THEN
          SELECT COALESCE(MAX(aliquotaIcms),0)
          INTO r_item_aliquotaICMSUFDestinat
          FROM PAUFORIGEMXUFDESTINO
          WHERE ufOrigem = p_munEndPess_uf
          AND ufDestino = p_munEndPess_uf;
          IF p_prod_origemMercadoria = '0' THEN
            SELECT COALESCE(MAX(aliquotaIcms),0)
            INTO r_item_aliquotaICMSInterestad
            FROM PAUFORIGEMXUFDESTINO
            WHERE ufOrigem = p_munEndEst_uf
            AND ufDestino = p_munEndPess_uf;
          ELSE
            r_item_aliquotaICMSInterestad := 4;
          END IF;
          r_item_partilhaICMSInterestad := 100;
        END IF;
      ELSE
        r_item_aliquotaICMSUFDestinat := 0;
        r_item_aliquotaICMSInterestad := 0;
        r_item_partilhaICMSInterestad := 0;
      END IF;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := opFisc.aliquotaFCP;
      r_item_aliquotaFCPST          := opFisc.aliquotaFCPST;
      r_item_aliquotaFCPSTAnteriorm := opFisc.aliquotaFCPSTAnteriormente;
      r_item_aliquotaFCPUFDestinat  := opFisc.aliquotaFCPUFDestinatario;
    END IF;
    r_encontrouRegistro := 1;
  END LOOP;  
  IF r_encontrouRegistro = 1 THEN
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
      IF p_cab_entradaSaida = 'S' AND p_cab_devolucaoAnulacaoRetorno = 0 THEN
        ADD_BUSCA_IBPT (
          p_cab_dataEmissao,
          p_munEndEst_uf,
          p_prod_origemMercadoria,
          p_prod_idNcm,
          p_prod_listaServicos,
          /* Retornos */
          v_auxNumber,
          v_auxNumber,
          r_item_aliquotaEstImpFederais,
          r_item_aliquotaEstImpEstaduais,
          r_item_aliquotaEstImpMunicipai,
          v_auxVarchar,
          v_auxVarchar,
          v_auxVarchar
        );
      END IF;
    END IF;
  ELSE
    IF p_cab_origemDocumento NOT IN (4,6,9,10,11,12) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
      r_geraFinanceiro         := p_modDoc_geraFinanceiro;
    END IF;
    r_item_cfop := 0;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := ' ';
      r_item_aliquotaISSQN           := 0;
      r_item_retidoISSQN             := 0;
      r_item_tributadoForaMunicipio  := 0;
      r_item_incentivoFiscal         := 0;
      r_item_listaServicos           := 0;
      r_item_cnae                    := 0;
      r_item_idServicoMunicipio      := 0;
      r_item_numeroProcessoAdministr := ' ';
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := 0;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := 0;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := 0;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := 0;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := 0;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := 0;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := 0;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := 0;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := 0;
      r_item_stIPI            := '  ';
      r_item_aliquotaIPI      := 0;
      r_item_valorAliquotaIPI := 0;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := '  ';
      r_item_aliquotaPIS      := 0;
      r_item_valorAliquotaPIS := 0;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := 0;
      r_item_valorAliquotaPISST := 0;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := '  ';
      r_item_aliquotaCOFINS      := 0;
      r_item_valorAliquotaCOFINS := 0;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := 0;
      r_item_valorAliquotaCOFINSST := 0;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := '   ';
      r_item_creditoSimplesNacional := 0;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS                 := '  ';
      r_item_modalidadeBaseCalcICMS := ' ';
      r_item_reducaoBaseICMS        := 0;
      r_item_aliquotaICMS           := 0;
      r_item_diferimentoICMS        := 0;
      r_item_motivoDesoneracaoICMS  := '  ';
      r_item_idBeneficio            := 0;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := ' ';
      r_item_margemValorAdicST   := 0;
      r_item_reducaoBaseST       := 0;
      r_item_aliquotaICMSST      := 0;
      r_item_somarICMSST         := 0;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := 0;
      r_item_reducaoBaseICMSEfetivo := 0;
      r_item_aliquotaICMSEfetivo    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := '  ';
      r_item_reducaoBaseICMSEscrit := 0;
      r_item_aliquotaICMSEscrit    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := 0;
      r_item_reducaoBaseSTEscrit     := 0;
      r_item_aliquotaICMSSTEscrit    := 0;
      r_item_diferimentoICMSEscrit   := 0;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      r_item_aliquotaICMSUFDestinat := 0;
      r_item_aliquotaICMSInterestad := 0;
      r_item_partilhaICMSInterestad := 0;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := 0;
      r_item_aliquotaFCPST          := 0;
      r_item_aliquotaFCPSTAnteriorm := 0;
      r_item_aliquotaFCPUFDestinat  := 0;
    END IF;
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
    END IF;
  END IF;
END ADD_ITEM_OPERACAO_FISCAL_BUSCA;

/

DROP PROCEDURE ADD_CALCULA_VALOR_LIQUIDO;

create or replace FUNCTION FUNC_ADD_CALC_BASE_PAGAMENTO (
  p_cab_origemDocumento         IN NUMBER,
  p_cab_nfFornecedor            IN NUMBER,
  p_cab_tipoPagamentoFrete      IN CHAR,
  p_item_geraFinanceiro         IN NUMBER,
  p_item_valorProdutoServico    IN NUMBER,
  p_item_valorDescontoPagamento IN NUMBER,
  p_item_valorOutrasDespesasPag IN NUMBER,
  p_item_valorJurosPagamento    IN NUMBER,
  p_item_valorFreteTotal        IN NUMBER,
  p_item_valorSeguroTotal       IN NUMBER,
  p_item_valorDescontoTotal     IN NUMBER,
  p_item_valorOutrasDespesasTot IN NUMBER,
  p_item_valorIPIDevolucao      IN NUMBER,
  p_item_retidoISSQN            IN NUMBER,
  p_item_valorISSQN             IN NUMBER,
  p_item_valorRetIRRF           IN NUMBER,
  p_item_valorRetINSS           IN NUMBER,
  p_item_valorRetPIS            IN NUMBER,
  p_item_valorRetCOFINS         IN NUMBER,
  p_item_valorRetCSLL           IN NUMBER,
  p_item_valorRetOutros         IN NUMBER,
  p_item_valorII                IN NUMBER,
  p_item_valorIOF               IN NUMBER,
  p_item_valorIPI               IN NUMBER,
  p_item_valorICMSST            IN NUMBER,
  p_item_valorICMSSTEscrit      IN NUMBER,
  p_item_somarICMSST            IN NUMBER,
  p_item_valorAcrescExtempTotal IN NUMBER,
  p_modDoc_geraFinanceiro       IN NUMBER)
RETURN NUMBER
IS
BEGIN
  RETURN
    CASE
      WHEN p_item_geraFinanceiro = 1
      THEN
        p_item_valorProdutoServico
        - p_item_valorDescontoTotal
        + p_item_valorDescontoPagamento
        + p_item_valorOutrasDespesasTot
        - p_item_valorOutrasDespesasPag
        - p_item_valorJurosPagamento
        - CASE
            WHEN p_item_retidoISSQN = 1
            THEN p_item_valorISSQN
            ELSE 0
          END
        - p_item_valorRetIRRF
        - p_item_valorRetINSS
        - p_item_valorRetPIS
        - p_item_valorRetCOFINS
        - p_item_valorRetCSLL
        - p_item_valorRetOutros
        + p_item_valorII
        + p_item_valorIOF
        + p_item_valorIPI
        + p_item_valorIPIDevolucao
        + p_item_valorAcrescExtempTotal
      ELSE 0
    END
    + CASE
        WHEN p_cab_tipoPagamentoFrete <> 'V'
          AND (p_item_geraFinanceiro = 1
            OR p_modDoc_geraFinanceiro = 1
            AND NOT (p_cab_origemDocumento IN (6,9)))
        THEN p_item_valorFreteTotal + p_item_valorSeguroTotal
        ELSE 0
      END
    + CASE
        WHEN p_cab_nfFornecedor = 1
          AND (p_item_somarICMSST IN (0,1)
            AND p_item_geraFinanceiro = 1
            OR p_item_somarICMSST = 2)
        THEN
          CASE
            WHEN p_item_valorICMSSTEscrit = 0
            THEN p_item_valorICMSST
            ELSE p_item_valorICMSSTEscrit
          END
        WHEN p_cab_nfFornecedor = 1
          OR p_item_geraFinanceiro = 0
        THEN 0
        ELSE p_item_valorICMSST
      END;
END;

/

create or replace FUNCTION FUNC_ADD_CALC_VALOR_LIQUIDO (
  p_cab_nfFornecedor          IN NUMBER,
  p_cab_tipoPagamentoFrete    IN CHAR,
  p_item_valorProdutoServico  IN NUMBER,
  p_item_valorFreteTotal      IN NUMBER,
  p_item_valorSeguroTotal     IN NUMBER,
  p_item_valorDescontoTotal   IN NUMBER,
  p_item_valorOutrasDespTotal IN NUMBER,
  p_item_valorIPIDevolucao    IN NUMBER,
  p_item_valorII              IN NUMBER,
  p_item_valorIOF             IN NUMBER,
  p_item_valorIPI             IN NUMBER,
  p_item_valorICMSST          IN NUMBER,
  p_item_valorICMSSTEscrit    IN NUMBER,
  p_item_somarICMSST          IN NUMBER)
RETURN NUMBER
IS
BEGIN
  RETURN
    p_item_valorProdutoServico
    + CASE
        WHEN p_cab_tipoPagamentoFrete = 'V'
        THEN 0
        ELSE p_item_valorFreteTotal + p_item_valorSeguroTotal
      END
    - p_item_valorDescontoTotal
    + p_item_valorOutrasDespTotal
    + p_item_valorII
    + p_item_valorIOF
    + p_item_valorIPI
    + p_item_valorIPIDevolucao
    + CASE
        WHEN p_cab_nfFornecedor = 1
          AND p_item_somarICMSST IN (0,1)
        THEN
          CASE
            WHEN p_item_valorICMSSTEscrit = 0
            THEN p_item_valorICMSST
            ELSE p_item_valorICMSSTEscrit
          END
        WHEN p_cab_nfFornecedor = 1
        THEN 0
        ELSE p_item_valorICMSST
      END;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_MUNICIPIO(
    p_descricao IN VARCHAR,
    p_uf        IN CHAR)
  RETURN NUMBER
IS
  v_municipio NUMBER;
BEGIN
  SELECT COALESCE(MIN(a.municipio),0)
  INTO v_municipio
  FROM SIMUNICIPIOS a
  WHERE municipio <> 0
  AND ativo = 1
  AND (p_uf = ''
    OR p_uf = ' '
    OR p_uf = '  '
    OR uf = p_uf)
  AND TRANSLATE(UPPER(a.descricao),'ÁÀÂÃÄÅÉÈÊËÍÌÎÏÓÒÔÕÖÚÙÛÜÝÑÇ','AAAAAAEEEEIIIIOOOOOUUUUYNC') LIKE '%' || TRANSLATE(UPPER(TRIM(p_descricao)),' ÁÀÂÃÄÅÉÈÊËÍÌÎÏÓÒÔÕÖÚÙÛÜÝÑÇ','%AAAAAAEEEEIIIIOOOOOUUUUYNC') || '%';
  RETURN v_municipio;
END;

/

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_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataPrimeiraCompra DATE;
BEGIN
  v_dataPrimeiraCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MIN(TRUNC(a.dataEntradaSaida))
    INTO v_dataPrimeiraCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto)
    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 GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  END IF;
  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_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaCompra   DATE;
BEGIN
  v_dataUltimaCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    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 GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  END IF;
  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_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaVenda    DATE;
BEGIN
  v_dataUltimaVenda := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaVenda
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    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 GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) 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));
  END IF;
  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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
            AND 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)
            AND (p_documentoDesconsiderar <> 'T'
              OR p_idDocumentoDesconsiderar > 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCTRANSFXRESERVAESTOQ b
                WHERE b.idReservaEstoque = a.idReservaEstoque))),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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                  AND 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)
                  AND (p_documentoDesconsiderar <> 'T'
                    OR p_idDocumentoDesconsiderar > 0
                    OR NOT EXISTS (
                      SELECT 1
                      FROM MODOCTRANSFXRESERVAESTOQ b
                      WHERE b.idReservaEstoque = a.idReservaEstoque))) 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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND 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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND 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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
              AND 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 a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND 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_documentoDesconsiderar <> 'T'
      OR p_idDocumentoDesconsiderar > 0)
    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 locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND 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 locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND 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);
BEGIN
  v_quantidadeReservas := FUNC_ADD_BUSCA_RESERVAS_PROD(
    p_config_82_considLenteDispon,
    p_config_83_considLenteEstoqu,
    p_config_160_permiteTransfSem,
    p_produto,
    p_cor,
    p_tamanho,
    p_gradeProduto,
    p_idLoteEstoque,
    p_estabelecimento,
    CASE
      WHEN p_indicadorPropriedadePosseIt IS NULL
        OR p_indicadorPropriedadePosseIt = ' '
      THEN '0'
      ELSE p_indicadorPropriedadePosseIt
    END,
    p_pessoaParticipante,
    p_localEstoque,
    0, -- p_personalizacao
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN 'O'
      WHEN p_transferenciaDesconsiderar > 0
      THEN 'T'
      ELSE ''
    END, -- p_documentoDesconsiderar
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN p_orcamentoDesconsiderar
      WHEN p_transferenciaDesconsiderar > 0
      THEN p_transferenciaDesconsiderar
      ELSE 0
    END, -- p_idDocumentoDesconsiderar,
    p_entradaSaida);
  RETURN v_quantidadeReservas;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_FISCAL (
    p_dataPosicaoEstoque          IN DATE,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_gradeProduto                IN NUMBER,
    p_inventarioEstoqueDesconsid  IN NUMBER)
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeFiscal          NUMBER;
  v_quantidadeFiscalFilho     NUMBER;
BEGIN
  v_quantidadeInventario  := 0;
  v_quantidadeEstoque     := 0;
  v_quantidadeFiscal      := 0;
  v_quantidadeFiscalFilho := 0;
  -- 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 inv.inventarioEstoque <> p_inventarioEstoqueDesconsid
    AND inv.data < TRUNC(p_dataPosicaoEstoque)
      + CASE
          WHEN p_inventarioEstoqueDesconsid = 0
            AND inv.motivoInventarioEstoque = '01'
          THEN 1
          ELSE 0
        END
    AND (inv.motivoInventarioEstoque = '01'
      OR EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        JOIN CAGRADESPRODUTO gradProd2
        ON gradProd2.produto = gradProd.produto
        WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
        AND gradProd2.gradeProduto = p_gradeProduto))) a;
  -- v_dataPosicaoEstoqueInicial
  SELECT COALESCE((
    SELECT MAX (est.data)
      FROM MOESTOQUES est
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = est.gradeProduto
      JOIN CAGRADESPRODUTO gradProd2
      ON gradProd2.produto = gradProd.produto
      WHERE gradProd2.gradeProduto = p_gradeProduto
      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 (est.quantidade)
      FROM MOINVENTARIOESTOQUEXFISC est
      WHERE est.inventarioEstoque = v_idInventarioEstoque
      AND est.gradeProduto = p_gradeProduto
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante),0)
    INTO v_quantidadeInventario
    FROM DUAL;
  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
      WHERE est.gradeProduto = p_gradeProduto
      AND est.estabelecimento = p_estabelecimento
      AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante
      AND est.operacaoInternaEstoque IN (1,102,900)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
    SELECT COALESCE((
      SELECT SUM (itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE itemDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante
      AND NOT(EXISTS(
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))),0)
    INTO v_quantidadeFiscal
    FROM DUAL;
    SELECT COALESCE((
      SELECT SUM (filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE filhoDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante),0)
    INTO v_quantidadeFiscalFilho
    FROM DUAL;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    + v_quantidadeFiscal
    + v_quantidadeFiscalFilho;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_GERENC (
    p_dataPosicaoEstoque          IN DATE,   -- Obrigatório
    p_estabelecimento             IN NUMBER, -- Obrigatório
    p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
    p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
    p_localEstoque                IN NUMBER, -- Enviar -1 para todos
    p_gradeProduto                IN NUMBER, -- Obrigatório
    p_personalizacao              IN NUMBER, -- Enviar -1 para todos
    p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
    p_idEnderecoEstoque           IN NUMBER, -- Enviar -1 para todos
    p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
    p_gradProd_produto            IN NUMBER, -- Obrigatório
    p_prod_controleEstoque        IN NUMBER, -- Obrigatório
    p_documentoDesconsiderar      IN CHAR,   -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
    p_idDocumentoDesconsiderar    IN NUMBER) -- D = idDocumentoFiscal, I = inventarioEstoque, P = preDocumento
  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_GERENC(
        p_dataPosicaoEstoque,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        kit.gradeProdutoFilho,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar) / 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 p_documentoDesconsiderar <> 'I' AND inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      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 (est.quantidade)
        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 est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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 = p_idNumeroSerie)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    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 est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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 = p_idNumeroSerie)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    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 est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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 = p_idNumeroSerie)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    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 est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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 = p_idNumeroSerie)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    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_GERENC(
      p_dataPosicaoEstoque,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idEnderecoEstoque = 0
        THEN -1
        ELSE p_idEnderecoEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      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))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)),0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX(a.data),
    COALESCE(MAX(a.novoPrecoCusto),0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'F');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  END IF;
  IF v_preco = 0 THEN
    v_preco := 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, --p_retornarPrecoBruto
      p_gerandoInventario);
  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_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           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,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  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);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          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 MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
        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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          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 MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
        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 IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          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
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
        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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        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)
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          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
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
        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 IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        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)
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'U');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'U');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  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);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(itemEst.quantidade) = 0
            THEN MAX(itemEst.precoCustoOperacao)
            ELSE ROUND((SUM (itemEst.totalCustoOperacao) / SUM(itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        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
        WHERE itemEst.gradeProduto = v_gradeProduto
        AND itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND itemEst.data < TRUNC(p_cab_dataPrecoFinal) + 1
        GROUP BY
          itemEst.data,
          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) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(itemEst.quantidade) = 0
            THEN MAX(itemEst.precoCustoOperacao)
            ELSE ROUND((SUM (itemEst.totalCustoOperacao) / SUM(itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = itemEst.gradeProduto
        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
        WHERE itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND itemEst.data < TRUNC(p_cab_dataPrecoFinal) + 1
        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)
        GROUP BY
          itemEst.data,
          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) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'P');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_quebra             CHAR(9);
  v_quantidade         NUMBER;
  v_preco              NUMBER;
  v_total              NUMBER;
  v_dataInventario     DATE;
  v_dataEstoqueInicial DATE;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  SELECT
    COALESCE (MAX(gradProd.gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAPRODUTOS prod
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.produto = prod.produto
  WHERE prod.produto = p_gradProd_produto
  AND prod.controleEstoque NOT IN (2,3,4,21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
  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);
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
      AND EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        WHERE itemInv.gradeProduto = v_gradeProduto
        AND itemInv.inventarioEstoque = invEst.inventarioEstoque));
    SELECT MAX(TRUNC(mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    WHERE mov.gradeProduto = v_gradeProduto
    AND mov.operacaoInternaEstoque = 1
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
    AND (mov.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento));
    FOR a IN (
      SELECT
        TRUNC(a.data) data,
        a.operacao,
        TO_CHAR (a.data,'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
          itemInv.id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        WHERE v_dataEstoqueInicial IS NULL
        AND itemInv.gradeProduto = v_gradeProduto
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND invEst.inventarioEstoque = (
          SELECT MAX(invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
            AND EXISTS(
              SELECT 1
              FROM MOINVENTARIOESTOQUEXFISC itemInv2
              WHERE itemInv2.gradeProduto = v_gradeProduto
              AND itemInv2.inventarioEstoque = invEst2.inventarioEstoque)))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        WHERE mov.gradeProduto = v_gradeProduto
        AND mov.operacaoInternaEstoque IN (102,900)
        AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND mov.data >=
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        UNION ALL
        SELECT
          cabDoc.dataEntradaSaida data,
          CASE
            WHEN modDoc.operacaoInternaEstoque = 1
            THEN 1
            WHEN cabDoc.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MODOCFISCALXITENS' tabelaSistema,
          itemDoc.idItemDocFiscal id,
          cabDoc.entradaSaida,
          itemDoc.quantidade,
          itemDoc.valorCustoOperacao total
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = itemDoc.modeloDocumento
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = itemDoc.localEstoque
        WHERE itemDoc.gradeProduto = v_gradeProduto
        AND itemDoc.cancelado = 0
        AND itemDoc.movimentaEstoqueFiscal = 1
        AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
        AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
        AND cabDoc.dataEntradaSaida >= 
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (cabDoc.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND NOT (EXISTS(
          SELECT 1
          FROM MODOCFISCALXPRODUTOFILHO filhoDoc
          WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))
        UNION ALL
        SELECT
          cabDoc.dataEntradaSaida data,
          CASE
            WHEN modDoc.operacaoInternaEstoque = 1
            THEN 1
            WHEN cabDoc.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
          filhoDoc.id,
          cabDoc.entradaSaida,
          filhoDoc.quantidade,
          filhoDoc.totalCustoOperacao total
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = itemDoc.modeloDocumento
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = itemDoc.localEstoque
        WHERE filhoDoc.gradeProduto = v_gradeProduto
        AND itemDoc.cancelado = 0
        AND itemDoc.movimentaEstoqueFiscal = 1
        AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
        AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
        AND cabDoc.dataEntradaSaida >= 
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (cabDoc.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt) a
      ORDER BY
        TRUNC(a.data),
        a.operacao,
        TO_CHAR (a.data,'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
        v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND((v_quantidade * v_preco),2);
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  ELSIF v_contaGradesProduto > 1 THEN
    SELECT MAX(TRUNC(invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
      AND EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)));
    SELECT MAX(TRUNC(mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
    AND (mov.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND (p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' ')
      OR gradProd.tamanho = p_gradProd_tamanho);
    FOR a IN (
      SELECT
        TRUNC(a.data) data,
        a.operacao,
        TO_CHAR (a.data,'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
          itemInv.id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE v_dataEstoqueInicial IS NULL
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)
        AND invEst.inventarioEstoque = (
          SELECT MAX(invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
            AND EXISTS(
              SELECT 1
              FROM MOINVENTARIOESTOQUEXFISC itemInv2
              JOIN CAGRADESPRODUTO gradProd2
              ON gradProd2.gradeProduto = itemInv2.gradeProduto
              WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
              AND gradProd2.produto = p_gradProd_produto
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_gradProd_cor = 0
                OR gradProd2.cor = p_gradProd_cor)
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND (p_gradProd_tamanho = ''
                  OR p_gradProd_tamanho = ' ')
                OR gradProd2.tamanho = p_gradProd_tamanho))))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = mov.gradeProduto
        WHERE mov.operacaoInternaEstoque IN (102,900)
        AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND mov.data >=
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)
        UNION ALL
        SELECT
          cabDoc.dataEntradaSaida data,
          CASE
            WHEN modDoc.operacaoInternaEstoque = 1
            THEN 1
            WHEN cabDoc.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MODOCFISCALXITENS' tabelaSistema,
          itemDoc.idItemDocFiscal id,
          cabDoc.entradaSaida,
          itemDoc.quantidade,
          itemDoc.valorCustoOperacao total
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = itemDoc.modeloDocumento
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = itemDoc.localEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemDoc.gradeProduto
        WHERE itemDoc.cancelado = 0
        AND itemDoc.movimentaEstoqueFiscal = 1
        AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
        AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
        AND cabDoc.dataEntradaSaida >= 
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (cabDoc.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)
        AND NOT(EXISTS(
          SELECT 1
          FROM MODOCFISCALXPRODUTOFILHO filhoDoc
          WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))
        UNION ALL
        SELECT
          cabDoc.dataEntradaSaida data,
          CASE
            WHEN modDoc.operacaoInternaEstoque = 1
            THEN 1
            WHEN cabDoc.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
          filhoDoc.id,
          cabDoc.entradaSaida,
          filhoDoc.quantidade,
          filhoDoc.totalCustoOperacao total
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = itemDoc.modeloDocumento
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = itemDoc.localEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = filhoDoc.gradeProduto
        WHERE itemDoc.cancelado = 0
        AND itemDoc.movimentaEstoqueFiscal = 1
        AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
        AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
        AND cabDoc.dataEntradaSaida >= 
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (cabDoc.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = cabDoc.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)) a
      ORDER BY
        TRUNC(a.data),
        a.operacao,
        TO_CHAR (a.data,'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
        v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND((v_quantidade * v_preco),2);
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  END IF;
  RETURN v_preco;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_quebra             CHAR(9);
  v_quantidade         NUMBER;
  v_preco              NUMBER;
  v_total              NUMBER;
  v_dataInventario     DATE;
  v_dataEstoqueInicial DATE;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  SELECT
    COALESCE (MAX(gradProd.gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAPRODUTOS prod
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.produto = prod.produto
  WHERE prod.produto = p_gradProd_produto
  AND prod.controleEstoque NOT IN (2,3,4,21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
  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);
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
      AND EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        WHERE itemInv.gradeProduto = v_gradeProduto
        AND itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)));
    SELECT MAX(TRUNC(mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    WHERE mov.gradeProduto = v_gradeProduto
    AND mov.operacaoInternaEstoque = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_item_personalizacao = 0
      OR mov.personalizacao = p_item_personalizacao)
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
  AND (mov.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR 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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento));
    FOR a IN (
      SELECT
        TRUNC(a.data) data,
        a.operacao,
        TO_CHAR (a.data,'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
          itemInv.idItemInventarioEstoque id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        WHERE v_dataEstoqueInicial IS NULL
        AND itemInv.gradeProduto = v_gradeProduto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND invEst.inventarioEstoque = (
          SELECT MAX(invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
            AND EXISTS(
              SELECT 1
              FROM MOINVENTARIOESTOQUEXITENS itemInv2
              WHERE itemInv2.gradeProduto = v_gradeProduto
              AND itemInv2.inventarioEstoque = invEst2.inventarioEstoque
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_item_personalizacao = 0
                OR itemInv2.personalizacao = p_item_personalizacao))))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        WHERE mov.gradeProduto = v_gradeProduto
        AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR mov.personalizacao = p_item_personalizacao)
        AND mov.data >=
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))) a
      ORDER BY
        TRUNC(a.data),
        a.operacao,
        TO_CHAR (a.data,'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
        v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND((v_quantidade * v_preco),2);
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  ELSIF v_contaGradesProduto > 1 THEN
    SELECT MAX(TRUNC(invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
      AND EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)));
    SELECT MAX(TRUNC(mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto
    WHERE mov.operacaoInternaEstoque = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_item_personalizacao = 0
      OR mov.personalizacao = p_item_personalizacao)
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
  AND (mov.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR 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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento))
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND (p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' ')
      OR gradProd.tamanho = p_gradProd_tamanho);
    FOR a IN (
      SELECT
        TRUNC(a.data) data,
        a.operacao,
        TO_CHAR (a.data,'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
          itemInv.idItemInventarioEstoque id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE v_dataEstoqueInicial IS NULL
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)
        AND invEst.inventarioEstoque = (
          SELECT MAX(invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
            AND EXISTS(
              SELECT 1
              FROM MOINVENTARIOESTOQUEXITENS itemInv2
              JOIN CAGRADESPRODUTO gradProd2
              ON gradProd2.gradeProduto = itemInv2.gradeProduto
              WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_item_personalizacao = 0
                OR itemInv2.personalizacao = p_item_personalizacao)
              AND gradProd2.produto = p_gradProd_produto
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_gradProd_cor = 0
                OR gradProd2.cor = p_gradProd_cor)
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND (p_gradProd_tamanho = ''
                  OR p_gradProd_tamanho = ' ')
                OR gradProd2.tamanho = p_gradProd_tamanho))))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = mov.gradeProduto
        WHERE mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR mov.personalizacao = p_item_personalizacao)
        AND mov.data >=
          CASE
            WHEN NOT(v_dataEstoqueInicial IS NULL)
            THEN v_dataEstoqueInicial
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND gradProd.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)) a
      ORDER BY
        TRUNC(a.data),
        a.operacao,
        TO_CHAR (a.data,'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
        v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND((v_quantidade * v_preco),2);
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  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;
BEGIN
  v_preco := 0;
  FOR kit IN (
    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)
  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_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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,
        0); --p_gerandoInventario
    -- 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_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 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, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    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;
BEGIN
  v_preco := p_ini_preco;
  FOR a IN (
    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)
  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,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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,
        a.produto,
        a.cor,
        a.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
        a.produto,
        a.cor,
        a.tamanho,
        0, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        1, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoTinta = 0 AND a.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,
        a.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;
BEGIN
  v_preco := 0;
  FOR a IN (
    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)
  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,
      a.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.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,
        a.gradeProdutoA,
        a.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.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,
        a.gradeProdutoB,
        a.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.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,
        a.gradeProdutoC,
        a.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.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,
        a.gradeProdutoD,
        a.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.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,
        a.gradeProdutoE,
        a.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.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,
        a.gradeProdutoF,
        a.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.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,
        a.gradeProdutoG,
        a.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.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,
        a.gradeProdutoH,
        a.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.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,
        a.gradeProdutoI,
        a.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.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,
        a.gradeProdutoJ,
        a.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.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,
        a.gradeProdutoK,
        a.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.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,
        a.gradeProdutoL,
        a.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.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,
        a.gradeProdutoM,
        a.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.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,
        a.gradeProdutoN,
        a.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.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,
        a.gradeProdutoO,
        a.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_dataPrecoFinal           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_dataPrecoFinalInicial
        p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
        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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          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_FIS(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- 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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0, --p_retornarPrecoBruto
          0); --p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1, --p_retornarPrecoBruto
          0); --p_gerandoInventario
      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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          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_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;
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'), --p_cab_dataPrecoInicial
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          gradProdFilho.cor,
          gradProdFilho.tamanho,
          p_locEst_indicProprPosseItem,
          0) --p_gerandoInventario
          ),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 a IN (
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      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)
  LOOP
    IF p_cab_atualizaCustoMedio = 1 AND a.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'), --p_cab_dataPrecoInicial
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          a.produto,
          a.cor,
          a.tamanho,
          p_locEst_indicProprPosseItem,
          0); --p_gerandoInventario
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.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 / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.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,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.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 a.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
        a.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
        a.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
          a.gradeProdutoFilho,
          p_cab_modeloDocumento,
          900, --p__operacaoInternaEstoque
          0, --p_atualizaCustoMedio
          0, --p_atualizaUltimaCompra
          CASE
            WHEN p_cab_entradaSaida = 'S'
            THEN 'E'
            ELSE 'S'
          END, --p_entradaSaida
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.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
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    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)
  LOOP
    IF a.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,
        a.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 a.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
        a.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, --p_operacaoInternaEstoque
          0, --p_atualizaCustoMedio
          0, --p_atualizaUltimaCompra
          CASE
            WHEN p_cab_entradaSaida = 'S'
            THEN 'E'
            ELSE 'S'
          END, --p_entradaSaida
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.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
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  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,
      a.gradeProduto,
      900, -- p_quantidade,
      r_bufferIdEstoque);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 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,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 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,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 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,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 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,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 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,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 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,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 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,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 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,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 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,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 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,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 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,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 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,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 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,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 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,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 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,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ESTOQUE_FORMULA_TINTA;

/

