SET DEFINE OFF;

UPDATE SITIPOSCTE SET descricao = '0 - CT-e Normal' where tipoCTe = '0';
UPDATE SITIPOSCTE SET descricao = '1 - CT-e de Complemento de Valores' where tipoCTe = '1';
UPDATE SITIPOSCTE SET descricao = '3 - CT-e de Substituição' where tipoCTe = '3';

INSERT INTO SITIPOSCTE (tipoCTe, descricao, ativo, observacoes) values ('4', '4 - GTV-e', 1, ' ');
INSERT INTO SITIPOSCTE (tipoCTe, descricao, ativo, observacoes) values ('5', '5 - CTe Simplificado', 1, ' ');
INSERT INTO SITIPOSCTE (tipoCTe, descricao, ativo, observacoes) values ('6', '6 - Substituição CTe Simplificado', 1, ' ');

COMMIT;

DELETE SITIPOSCTE  WHERE tipoCTe = '2';

COMMIT;

-- SITOMADORESCTE
CREATE TABLE SITOMADORESCTE
  (
    tomadorCTe  CHAR (1) DEFAULT ' ' NOT NULL,
    descricao   VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SITOMADORESCTE ADD CONSTRAINT SITOMADORESCTE_PK1 PRIMARY KEY (tomadorCTe);
CREATE INDEX SITOMADORESCTE_K2 ON SITOMADORESCTE (descricao);

INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values (' ', 'SELECIONE', 1, ' ');
INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values ('0', '0 - Remetente', 1, ' ');
INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values ('1', '1 - Expedidor', 1, ' ');
INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values ('2', '2 - Recebedor', 1, ' ');
INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values ('3', '3 - Destinatário', 1, ' ');
INSERT INTO SITOMADORESCTE (tomadorCTe, descricao, ativo, observacoes) values ('4', '4 - Terceiro', 1, ' ');

COMMIT;

-- SIMODALIDADESTRANSPORTE
CREATE TABLE SIMODALIDADESTRANSPORTE
  (
    modalidadeTransporte CHAR (2) DEFAULT ' ' NOT NULL,
    descricao            VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIMODALIDADESTRANSPORTE ADD CONSTRAINT SIMODALIDADESTRANSPORTE_PK1 PRIMARY KEY (modalidadeTransporte);
CREATE INDEX SIMODALIDADESTRANSPORTE_K2 ON SIMODALIDADESTRANSPORTE (descricao);

INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('  ', 'SELECIONE', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('01', '01 - Rodoviário', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('02', '02 - Aéreo', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('03', '03 - Aquaviário', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('04', '04 - Ferroviário', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('05', '05 - Dutoviário', 1, ' ');
INSERT INTO SIMODALIDADESTRANSPORTE (modalidadeTransporte, descricao, ativo, observacoes) values ('06', '06 - Multimodal', 1, ' ');

COMMIT;

-- SITIPOSSERVICOCTE
CREATE TABLE SITIPOSSERVICOCTE
  (
    tipoServicoCTe CHAR (1) DEFAULT ' ' NOT NULL,
    descricao      VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SITIPOSSERVICOCTE ADD CONSTRAINT SITIPOSSERVICOCTE_PK1 PRIMARY KEY (tipoServicoCTe);
CREATE INDEX SITIPOSSERVICOCTE_K2 ON SITIPOSSERVICOCTE (descricao);

INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values (' ', 'SELECIONE', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('0', '0 - Normal', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('1', '1 - Subcontratação', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('2', '2 - Redespacho', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('3', '3 - Redespacho Intermediário', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('4', '4 - Serviço Vinculado a Multimodal', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('6', '6 - Transporte de Pessoas', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('7', '7 - Transporte de Valores', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('8', '8 - Excesso de Bagagem', 1, ' ');
INSERT INTO SITIPOSSERVICOCTE (tipoServicoCTe, descricao, ativo, observacoes) values ('9', '9 - GTV', 1, ' ');

COMMIT;

-- SIUNIDADESMEDIDACTE
CREATE TABLE SIUNIDADESMEDIDACTE
  (
    unidadeMedidaCTe CHAR (2) DEFAULT ' ' NOT NULL,
    descricao        VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIUNIDADESMEDIDACTE ADD CONSTRAINT SIUNIDADESMEDIDACTE_PK1 PRIMARY KEY (unidadeMedidaCTe);
CREATE INDEX SIUNIDADESMEDIDACTE_K2 ON SIUNIDADESMEDIDACTE (descricao);

INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('  ', 'SELECIONE', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('00', '00 - M3', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('01', '01 - KG', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('02', '02 - TON', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('03', '03 - UNIDADE', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('04', '04 - LITROS', 1, ' ');
INSERT INTO SIUNIDADESMEDIDACTE (unidadeMedidaCTe, descricao, ativo, observacoes) values ('05', '05 - MMBTU', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SITOMADORESCTE', 'Tomadores CT-e', 1, 562, 'SI', 'tomadorCTe', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTomadoresCTe', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIMODALIDADESTRANSPORTE', 'Modalidades Transporte', 1, 563, 'SI', 'modalidadeTransporte', 'A', 2, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModalidadesTransporte', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SITIPOSSERVICOCTE', 'Tipos Serviço CT-e', 1, 564, 'SI', 'tipoServicoCTe', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposServicoCTe', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIUNIDADESMEDIDACTE', 'Unidades Medida CT-e', 1, 565, 'SI', 'unidadeMedidaCTe', 'A', 2, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqUnidadesMedidaCTe', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (980, 'Tomadores CT-e', 1, 9090009800, 90, 'SIS', 0, 980, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTomadoresCTe', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (981, 'Modalidades Transporte', 1, 9090009810, 90, 'SIS', 0, 981, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModalidadesTransporte', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (982, 'Tipos Serviço CT-e', 1, 9090009820, 90, 'SIS', 0, 982, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposServicoCTe', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (983, 'Unidades Medida CT-e', 1, 9090009830, 90, 'SIS', 0, 983, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqUnidadesMedidaCTe', ' ', 0, 0, NULL, ' ');

COMMIT;

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ESCRIT (
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_valorProdutoServico          IN NUMBER,
    p_valorFreteTotal              IN NUMBER,
    p_valorSeguroTotal             IN NUMBER,
    p_valorDescontoTotal           IN NUMBER,
    p_valorOutrasDespesasTotal     IN NUMBER,
    p_valorAdicFreteMarinMerTotal  IN NUMBER,
    p_valorDespesasAduaneirasTotal IN NUMBER,
    p_valorIPIDevolucao            IN NUMBER,
    p_valorII                      IN NUMBER,
    p_valorIOF                     IN NUMBER,
    p_valorIPI                     IN NUMBER,
    p_stICMS                       IN CHAR,
    p_reducaoBaseICMS              IN NUMBER,
    p_aliquotaICMS                 IN NUMBER,
    p_baseICMS                     IN NUMBER,
    p_valorICMS                    IN NUMBER,
    p_valorICMSDesoneracao         IN NUMBER,
    p_margemValorAdicionadoST      IN NUMBER,
    p_reducaoBaseST                IN NUMBER,
    p_aliquotaICMSST               IN NUMBER,
    p_baseICMSST                   IN NUMBER,
    p_valorICMSST                  IN NUMBER,
    p_stICMSEscrituracao           IN CHAR,
    p_reducaoBaseICMSEscrituracao  IN NUMBER,
    p_aliquotaICMSEscrituracao     IN NUMBER,
    p_diferimentoICMSEscrituracao  IN NUMBER,
    p_margemValorAdicSTEscriturac  IN NUMBER,
    p_reducaoBaseSTEscrituracao    IN NUMBER,
    p_aliquotaICMSSTEscrituracao   IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    /* Retornos */
    r_baseICMSEscrituracao         OUT NUMBER,
    r_valorICMSEscrituracao        OUT NUMBER,
    r_valorICMSDesonEscrituracao   OUT NUMBER,
    r_baseICMSSTEscrituracao       OUT NUMBER,
    r_valorICMSSTEscrituracao      OUT NUMBER)
IS      
BEGIN
  IF p_stICMSEscrituracao = p_stICMS
    AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
    AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
  THEN
    IF p_cab_nfFornecedor = 1
      AND p_stICMSEscrituracao = '51'
      AND p_diferimentoICMSEscrituracao <> 0
      AND p_diferimentoICMSEscrituracao <> p_reducaoBaseICMSEscrituracao
      AND p_stICMS <> '51'
    THEN
      r_baseICMSEscrituracao := ROUND ((p_baseICMS * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
    ELSE
      r_baseICMSEscrituracao := p_baseICMS;
    END IF;
    r_valorICMSEscrituracao := p_valorICMS;
    r_valorICMSDesonEscrituracao := 0;
  ELSE
    r_baseICMSEscrituracao := 0;
    r_valorICMSEscrituracao := 0;
    r_valorICMSDesonEscrituracao := 0;
    IF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('40','41','50') THEN
      r_valorICMSDesonEscrituracao := ROUND (((
        p_valorProdutoServico
        + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + p_valorII
        + p_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * p_aliquotaICMSEscrituracao / 100), 2);
    ELSIF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('00','10','20','51','70','90') THEN
      r_baseICMSEscrituracao := (
        p_valorProdutoServico
        + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + p_valorII
        + p_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
      );
      r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
      IF p_stICMSEscrituracao IN ('20','70','90') AND p_reducaoBaseICMSEscrituracao > 0 THEN
        r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
      ELSE
        IF p_stICMSEscrituracao = '51' AND p_reducaoBaseICMSEscrituracao > 0 AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMSEscrituracao THEN
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        END IF;
        r_valorICMSDesonEscrituracao := 0;
      END IF;
      IF p_stICMSEscrituracao = '51' THEN
        r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMSEscrituracao / 100), 2);
        IF p_cab_nfFornecedor = 1 THEN
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
        END IF;
        IF r_valorICMSEscrituracao <= 0 THEN
          r_baseICMSEscrituracao := 0;
          r_valorICMSEscrituracao := 0;
        END IF;
      END IF;
    END IF;
  END IF;
  IF p_stICMSEscrituracao = p_stICMS
    AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
    AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
    AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
    AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
  THEN
    r_baseICMSSTEscrituracao := p_baseICMSST;
    r_valorICMSSTEscrituracao := p_valorICMSST;
  ELSIF p_stICMSEscrituracao IN ('10','30','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSSTEscrituracao > 0 THEN
    r_baseICMSSTEscrituracao := ROUND ((ROUND (((
      p_valorProdutoServico
      + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
      - p_valorDescontoTotal
      + p_valorOutrasDespesasTotal
      + p_valorAdicFreteMarinMerTotal
      + p_valorDespesasAduaneirasTotal
      + p_valorII
      + p_valorIOF
      + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
    ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
    r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
    IF r_valorICMSSTEscrituracao <= 0 THEN
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  ELSE
    r_baseICMSSTEscrituracao := 0;
    r_valorICMSSTEscrituracao := 0;
  END IF;
END ADD_CALCULA_IMPOSTOS_ESCRIT;

/

-- SICAMPOSLINKPAGAMENTO
CREATE TABLE SICAMPOSLINKPAGAMENTO
  (
    campoLinkPagamento NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao          VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoCampo          CHAR (1) DEFAULT ' ' NOT NULL,
    mascara            VARCHAR (30) DEFAULT ' ' NOT NULL,
    permiteMultiplos   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    itemList           VARCHAR (4000) DEFAULT ' ' NOT NULL,
    displayList        VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SICAMPOSLINKPAGAMENTO ADD CONSTRAINT SICAMPOSLINKPAGAMENTO_PK1 PRIMARY KEY (campoLinkPagamento);
CREATE INDEX SICAMPOSLINKPAGAMENTO_K2 ON SICAMPOSLINKPAGAMENTO (descricao);
ALTER TABLE SICAMPOSLINKPAGAMENTO ADD CONSTRAINT SICAMPOSLINKPAGAMENTO_FK1 FOREIGN KEY (tipoCampo) REFERENCES SITIPOSCAMPO (tipoCampo);

INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (0, 'SELECIONE', 1, ' ', ' ', 0, ' ', ' ', ' ');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (10, 'authenticate', 1, 'A', '1', 0, '0,1,2,3,4', '0,1,2,3,4', 'Parâmetro que deve ser enviado caso seja necessária a autenticação dos dados de pagamento do cliente.
Valores permitidos:
0, 1, 2, 3 e 4.
Valor default - 0
Observação: Transações de débito habilitarão a autenticação por padrão caso a loja esteja configurada com dados de 3DS, sobrescrevendo assim quaisquer outras opções que possam desabilitar esse método de autenticação.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (20, 'authorizer_id', 1, 'A', '10', 0, ' ', ' ', 'Código da Autorizadora (no Carat)');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (30, 'installments', 1, 'N', '2', 0, ' ', ' ', 'Número de parcelas do pagamento. As seguintes autorizadoras não permitem a definição prévia do número de parcelas, logo nesses casos este parâmetro não deve ser enviado:
- PayPal
- Mercado Pago
- PagSeguro
Enviar o valor 1 para pagamentos à vista.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (40, 'installment_type', 1, 'N', '1', 0, '3,4', '3 - parcelado administradora (com juros),4 - parcelado loja (sem juros)', 'Tipo do financiamento escolhido pelo cliente.
Valores permitidos:
3 - parcelado administradora (com juros)
4 - parcelado loja (sem juros)
Valor default = 4');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (50, 'recharge_included', 1, 'A', '5', 0, 'true,false', 'true - caso se deseje fazer uma recarga,false - caso não se deseje fazer uma recarga', 'Informa se uma recarga será feita.
Valores permitidos:
true - caso se deseje fazer uma recarga
false - caso não se deseje fazer uma recarga
Valor default - false');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (60, 'redirect', 1, 'A', '1', 0, 'A,M', 'Automático,Manual', 'Tipo de redirecionamento que será realizado ao finalizar o fluxo de transação no Carat.
Valores permitidos:
A - (Automático) redirecionamento automático: não mostra a tela final do pagamento (incluindo o comprovante) e redireciona o cliente automaticamente para uma das URL´s do parâmetro back_url. O parâmetro nit também é enviado na requisição via HTTP GET.
M - (Manual) redirecionamento manual: Mostra a tela final do pagamento incluindo o comprovante e apresenta um link para o cliente clicar caso deseje ser redirecionado para a loja. O parâmetro nit também é enviado na requisição via HTTP POST.
Valor default - M (Manual)');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (70, 'store_card', 1, 'A', '5', 0, 'true,false', 'true - indica que o cartão utilizado será armazenado,false - indica que o cartão utilizado não será armazenado', 'Indicador de armazenamento de cartão utilizado no pagamento.
Valores permitidos:
true - indica que o cartão utilizado será armazenado.
false - indica que o cartão utilizado não será armazenado.
Valor default - false (não será realizado o armazenamento).');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (80, 'style', 1, 'A', '1', 0, 'N,P', 'N - Redirecionamento no mesmo frame,P - Um pop-up será aberto', 'Campo informativo para o estilo de redirecionamento para o Carat.
Valores permitidos:
N - Redirecionamento no mesmo frame.
P - Um pop-up será aberto.
Valor default - N
A loja deve informar o valor correspondente à forma de redirecionamento escolhida na integração, para que o Carat faça um tratamento adequado das janelas ao final da transação de pagamento.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (90, 'transaction_type', 1, 'A', '32', 0, 'payment,preauthorization', 'payment - Caso seja realizado um Pagamento,preauthorization - Caso seja realizada uma Pré Autorização', 'Tipo de transação que será realizada.
Valores permitidos:
payment - Caso seja realizado um Pagamento
preauthorization - Caso seja realizada uma Pré Autorização
Valor default - payment');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (100, 'payment_link', 1, 'A', '5', 0, 'true,false', 'true,false', 'Este campo deve receber o valor true para ativar a funcionalidade de pagamento com link.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (110, 'additional_data \ currency', 1, 'A', '3', 0, ' ', ' ', 'Moeda utilizada padrão para todos itens da compra.
Código da moeda segundo a ISO 4217.
Alguns valores permitidos:
BRL - Real
VEF - Venezuelan bolívar fuerte
USD - Dólar Americano
GBP - Libra Esterlina
Entre outros.
Caso esse parâmetro não seja enviado, o Carat utilizará a configuração da loja, e se a loja não estiver configurada, será utilizado como padrão o valor BRL.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (120, 'additional_data \ method', 1, 'A', '1024', 0, ' ', ' ', 'Usado para realizar uma transação diferenciada.
Valores permitidos:
split - Caso se deseje fazer uma transação SPLIT.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (130, 'additional_data \ postpone_confirmation', 1, 'A', '5', 0, 'true,false', 'true,false', 'Campo que permite que loja mantenha a transação como Pendente de Confirmação, e posteriormente, confirmá-la ou desfazê-la.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (140, 'additional_data \ financing_plan', 1, 'A', '4', 0, ' ', ' ', 'Código de plano de financiamento. Necessário apenas para pagamentos com parcelamento com juros efetuados com roteamento Via Certa Financiadora via SiTef. Deve ser enviado se e somente se forem definidos, nesta etapa, a autorizadora (campo authorizer_id) com roteamento Via Certa Financiadora, as parcelas e o parcelamento com juros.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (150, 'additional_data \ max_installments', 1, 'N', '3', 0, ' ', ' ', 'Máximo de parcelas sem juros que será apresentado para o comprador no momento do checkout. Caso informado, sobrescreverá o valor configurado na loja do Carat. Caso a adquirente também retorne um valor máximo de parcelas, o valor a ser utilizado será sempre o menor.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (160, 'additional_data \ max_installments_with_interest', 1, 'N', '2', 0, ' ', ' ', 'Máximo de parcelas com juros que será apresentado para o comprador no momento do checkout. Caso informado, sobrescreverá o valor configurado na loja do Carat. Caso a adquirente também retorne um valor máximo de parcelas, o valor a ser utilizado será sempre o menor.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (170, 'additional_data \ allowed_payment_methods \ id', 1, 'A', '3', 1, ' ', ' ', 'Objeto do tipo ALLOWED_PAYMENT_METHODS
Consiste em um array contendo todos os métodos de pagamento que serão exibidos na tela de seleção de autorizadora do fluxo de pagamento.
Código identificador do método de pagamento a ser exibido na tela do comprador. São aceitos os seguintes valores: CRD - Crédito, DBT - Débito, BLT - Boleto, PIX - Pix, WLT - Wallet, GFT - Pré-pago ou voucher. Caso nenhum valor seja enviado, são exibidos todos os campos permitidos pela configuração da loja.
Nota 1: A especificação dos parâmetros do objeto additional_data pode variar conforme autorizadora. Consulte a documentação específica para este detalhamento.

Nota 2: No caso de parcelamento pré-fixado pelos campos installments e installment_type, sem a definição do campo authorizer_id, as seguintes regras serão aplicadas em relação à apresentação de opções de autorizadoras para o comprador:
As opções de wallets (Visa Checkout, Masterpass, GooglePay), PayPal, PagSeguro e MercadoPago serão omitidas, pois as opções de parcelamento podem ser escolhidas pelo comprador no ambiente do próprio meio de pagamento.
No caso de pagamentos parcelados (installments > 1), serão apresentadas apenas as opções de crédito e, dentro destas, somente serão mostradas as que as configurações de parcelamento feitas no cadastro da loja no Carat correspondam ao valor fixado.

Sugestão: Ajuste estas configurações no Carat conforme o acordado com as adquirentes / meios de pagamento. Para mais detalhes, entre em contato com a equipe de atendimento Carat ou acesse o Portal do Lojista.

Atenção: No caso de pagamentos roteados por iCards via SiTef, os campos authorizer_id, installments e installment_type devem ser pré-fixados na criação da transação, não sendo possível para o usuário comprador efetuar esta escolha (autorizadora, parcelas e tipo de parcelamento) durante a navegação.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (180, 'additional_data \ transaction_initiated_by', 1, 'A', '8', 0, 'customer,merchant', 'customer - Transação iniciada pelo Comprador,merchant - Transação iniciada pelo Lojista', 'Indica se a transação foi iniciada pelo Lojista ou pelo Comprador. Valores permitidos:
customer - Transação iniciada pelo Comprador.
merchant - Transação iniciada pelo Lojista.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (190, 'additional_data \ multiple_payment_methods', 1, 'A', '5', 0, 'true,false', 'true,false', 'Indica se o lojista deseja permitir que o comprador visualize a opção de pagar usando dois meios de pagamento. Não enviar este campo com valor true quando prefixar autorizadora.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (200, 'back_url \ url_success', 1, 'A', '200', 0, ' ', ' ', 'URL de redirecionamento do cliente em caso de sucesso. Deve possuir apenas o caminho relativo ao domínio.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (210, 'back_url \ url_failure', 1, 'A', '200', 0, ' ', ' ', 'URL de redirecionamento do cliente em caso de fracasso. Deve possuir apenas o caminho relativo ao domínio.');
INSERT INTO SICAMPOSLINKPAGAMENTO (campoLinkPagamento, descricao, ativo, tipoCampo, mascara, permiteMultiplos, itemList, displayList, observacoes) VALUES (220, 'back_url \ url_cancel', 1, 'A', '200', 0, ' ', ' ', 'URL de redirecionamento do cliente em caso de cancelamento. Deve possuir apenas o caminho relativo ao domínio.');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SICAMPOSLINKPAGAMENTO', 'Campos Link Pagamento', 1, 811, 'SI', 'campoLinkPagamento', 'N', 3, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqCamposLinkPagamento', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (984, 'Campos Link Pagamento', 1, 9090009840, 90, 'SIS', 0, 984, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqCamposLinkPagamento', ' ', 0, 0, NULL, ' ');

COMMIT;

UPDATE SITABELASSISTEMA SET nomePublicoZoom = 'PesqRegrasFaixasAtraso' WHERE tabelaSistema = 'PAREGRASFAIXASATRASO';
UPDATE SIMENUS SET nomePublico = 'PesqRegrasFaixasAtraso' WHERE menu = 820;

COMMIT;

-- PAREGRASLINKPAGAMENTO
CREATE TABLE PAREGRASLINKPAGAMENTO
  (
    idRegraLinkPagamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao            VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao            NUMERIC (11,0) DEFAULT 0 NOT NULL,
    estabelecimento      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    perfilUsuario        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    usuario              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    condicaoPagamento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    validoVenda          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoRecebimento    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atrasoDe             NUMERIC (6,0) DEFAULT 0 NOT NULL,
    atrasoAte            NUMERIC (6,0) DEFAULT 0 NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAREGRASLINKPAGAMENTO ADD CONSTRAINT PAREGRASLINKPAGAMENTO_PK1 PRIMARY KEY (idRegraLinkPagamento);
CREATE INDEX PAREGRASLINKPAGAMENTO_K2 ON PAREGRASLINKPAGAMENTO (descricao);
CREATE INDEX PAREGRASLINKPAGAMENTO_K3 ON PAREGRASLINKPAGAMENTO (ordenacao, condicaoPagamento, usuario DESC, perfilUsuario DESC, estabelecimento DESC, atrasoDe, atrasoAte, idRegraLinkPagamento);
ALTER TABLE PAREGRASLINKPAGAMENTO ADD CONSTRAINT PAREGRASLINKPAGAMENTO_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAREGRASLINKPAGAMENTO ADD CONSTRAINT PAREGRASLINKPAGAMENTO_FK2 FOREIGN KEY (perfilUsuario) REFERENCES PAPERFISUSUARIO (perfilUsuario);
ALTER TABLE PAREGRASLINKPAGAMENTO ADD CONSTRAINT PAREGRASLINKPAGAMENTO_FK3 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE PAREGRASLINKPAGAMENTO ADD CONSTRAINT PAREGRASLINKPAGAMENTO_FK4 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);

INSERT INTO PAREGRASLINKPAGAMENTO (idRegraLinkPagamento, descricao, ativo, ordenacao, estabelecimento, perfilUsuario, usuario, condicaoPagamento, validoVenda, validoRecebimento, atrasoDe, atrasoAte, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, 0, 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 ('PAREGRASLINKPAGAMENTO', 'Regras Link Pagamento', 1, 31710, 'PA', 'idRegraLinkPagamento', 'N', 14, 'Descricao', 1, ' ', 0, 800001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'RegrasLinkPagamento', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (985, 'Regras Link Pagamento', 1, 5060009850, 50, 'PAR', 0, 985, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'RegrasLinkPagamento', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAREGRALINKPAGAMXCAMPOS
CREATE TABLE PAREGRALINKPAGAMXCAMPOS
  (
    id                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idRegraLinkPagamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    campoLinkPagamento   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    conteudo             VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAREGRALINKPAGAMXCAMPOS ADD CONSTRAINT PAREGRALINKPAGAMXCAMPOS_PK1 PRIMARY KEY (id);
CREATE INDEX PAREGRALINKPAGAMXCAMPOS_K2 ON PAREGRALINKPAGAMXCAMPOS (idRegraLinkPagamento, campoLinkPagamento, conteudo, id);
ALTER TABLE PAREGRALINKPAGAMXCAMPOS ADD CONSTRAINT PAREGRALINKPAGAMXCAMPOS_FK1 FOREIGN KEY (idRegraLinkPagamento) REFERENCES PAREGRASLINKPAGAMENTO (idRegraLinkPagamento);
ALTER TABLE PAREGRALINKPAGAMXCAMPOS ADD CONSTRAINT PAREGRALINKPAGAMXCAMPOS_FK2 FOREIGN KEY (campoLinkPagamento) REFERENCES SICAMPOSLINKPAGAMENTO (campoLinkPagamento);

INSERT INTO PAREGRALINKPAGAMXCAMPOS (id, idRegraLinkPagamento, campoLinkPagamento, conteudo, observacoes) VALUES (0, 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 ('PAREGRALINKPAGAMXCAMPOS', 'Regra Link Pagamento X Campos', 1, 31711, 'PA', 'id', 'N', 14, 'conteudo', 1, ' ', 0, 800001, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SISITUACOESPONTUACAO', 'Situações Pontuação', 1, 534, 'SI', 'situacaoPontuacao', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesPontuacao', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (986, 'Situações Pontuação', 1, 9090009860, 90, 'SIS', 0, 986, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesPontuacao', ' ', 0, 0, NULL, ' ');

COMMIT;

-- SISITUACOESLINKPAGAMENTO
CREATE TABLE SISITUACOESLINKPAGAMENTO
  (
    situacaoLinkPagamento CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao             NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao             VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SISITUACOESLINKPAGAMENTO ADD CONSTRAINT SISITUACOESLINKPAGAMENTO_PK1 PRIMARY KEY (situacaoLinkPagamento);
CREATE INDEX SISITUACOESLINKPAGAMENTO_K2 ON SISITUACOESLINKPAGAMENTO (descricao);
CREATE INDEX SISITUACOESLINKPAGAMENTO_K3 ON SISITUACOESLINKPAGAMENTO (ordenacao, situacaoLinkPagamento);

INSERT INTO SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento, ordenacao, descricao, ativo, observacoes) values ('A', 1, 'Aguardando Pagamento', 1, ' ');
INSERT INTO SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento, ordenacao, descricao, ativo, observacoes) values ('S', 2, 'Sucesso', 1, ' ');
INSERT INTO SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento, ordenacao, descricao, ativo, observacoes) values ('F', 3, 'Falha', 1, ' ');
INSERT INTO SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento, ordenacao, descricao, ativo, observacoes) values ('C', 4, 'Cancelado', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SISITUACOESLINKPAGAMENTO', 'Situações Link Pagamento', 1, 535, 'SI', 'situacaoLinkPagamento', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesLinkPagamento', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (987, 'Situações Link Pagamento', 1, 9090009870, 90, 'SIS', 0, 987, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesLinkPagamento', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAESTABELECIMENTOXCTE
CREATE TABLE PAESTABELECIMENTOXCTE
  (
    estabelecimento      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorAmbienteCTe CHAR (1) DEFAULT ' ' NOT NULL,
    rntrc                VARCHAR (20) DEFAULT ' ' NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAESTABELECIMENTOXCTE ADD CONSTRAINT PAESTABELECIMENTOXCTE_PK1 PRIMARY KEY (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXCTE ADD CONSTRAINT PAESTABELECIMENTOXCTE_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXCTE ADD CONSTRAINT PAESTABELECIMENTOXCTE_FK2 FOREIGN KEY (indicadorAmbienteCTe) REFERENCES SIINDICAMBIENTENFE (indicadorAmbienteNfe);

INSERT INTO PAESTABELECIMENTOXCTE (estabelecimento, indicadorAmbienteCTe, rntrc, observacoes) VALUES (0, ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAESTABELECIMENTOXCTE', 'Estabelecimento X CT-e', 1, 30433, 'PA', 'estabelecimento', 'N', 4, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- PAESTABELECIMENTOXCTE
CREATE TABLE PAESTABELECIMENTOXLINKPAG
  (
    estabelecimento           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorAmbienteLinkPag  CHAR (1) DEFAULT ' ' NOT NULL,
    chaveEstabLinkPag         VARCHAR (80) DEFAULT ' ' NOT NULL,
    codigoEstabLinkPag        VARCHAR (15) DEFAULT ' ' NOT NULL,
    nomeEstabLinkPag          VARCHAR (30) DEFAULT ' ' NOT NULL,
    mccEstabLinkPag           VARCHAR (4) DEFAULT ' ' NOT NULL,
    subadquirenteEstabLinkPag VARCHAR (22) DEFAULT ' ' NOT NULL,
    observacoes               VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAESTABELECIMENTOXLINKPAG ADD CONSTRAINT PAESTABELECIMENTOXLINKPAG_PK1 PRIMARY KEY (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXLINKPAG ADD CONSTRAINT PAESTABELECIMENTOXLINKPAG_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXLINKPAG ADD CONSTRAINT PAESTABELECIMENTOXLINKPAG_FK2 FOREIGN KEY (indicadorAmbienteLinkPag) REFERENCES SIINDICAMBIENTENFE (indicadorAmbienteNfe);

INSERT INTO PAESTABELECIMENTOXLINKPAG (estabelecimento, indicadorAmbienteLinkPag, chaveEstabLinkPag, codigoEstabLinkPag, nomeEstabLinkPag, mccEstabLinkPag, subadquirenteEstabLinkPag, observacoes) VALUES (0, ' ', ' ', ' ', ' ', ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAESTABELECIMENTOXLINKPAG', 'Estabelecimento X Link Pagamento', 1, 30434, 'PA', 'estabelecimento', 'N', 4, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' '); 

COMMIT;

CREATE TABLE PAMODELOSDOCUMENTO_2501B AS SELECT * FROM PAMODELOSDOCUMENTO;

ALTER TABLE PAMOTIVOSESTOQUEPERMITID DROP CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK1;
ALTER TABLE PAOPERFISCALXMODELOSDOCUM DROP CONSTRAINT PAOPERFISCALXMODELOSDOCUM_FK2;
ALTER TABLE PAMODELOSCONTRATO DROP CONSTRAINT PAMODELOSCONTRATO_FK1;
ALTER TABLE PACENARIOSCALCULOPRECO DROP CONSTRAINT PACENARIOSCALCULOPRECO_FK2;
ALTER TABLE PAREGRASREMANEJO DROP CONSTRAINT PAREGRASREMANEJO_FK2;
ALTER TABLE PAMODELOSDOCUMPERMITIDOS DROP CONSTRAINT PAMODELOSDOCUMPERMITIDOS_FK1;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK7;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK8;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK10;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK4;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK7;
ALTER TABLE MOORCAMENTOXATIVIDADEREAL DROP CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK5;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK4;
ALTER TABLE MOPREDOCUMXITENS DROP CONSTRAINT MOPREDOCUMXITENS_FK2;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK4;
ALTER TABLE MODOCFISCALXITENS DROP CONSTRAINT MODOCFISCALXITENS_FK2;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK9;
ALTER TABLE MOESTOQUES DROP CONSTRAINT MOESTOQUES_FK4;
ALTER TABLE MOBALANCOS DROP CONSTRAINT MOBALANCOS_FK1;
ALTER TABLE MODOCUMENTOSTRANSFERENCIA DROP CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK1;
ALTER TABLE MORESERVASESTOQUE DROP CONSTRAINT MORESERVASESTOQUE_FK4;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK1;
ALTER TABLE MOPAINEISCOMPRA DROP CONSTRAINT MOPAINEISCOMPRA_FK1;

DROP TABLE PAMODELOSDOCUMENTO;

-- PAMODELOSDOCUMENTO
CREATE TABLE PAMODELOSDOCUMENTO
  (
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                      VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    entradaSaida                   CHAR (1) DEFAULT ' ' NOT NULL,
    tipoPessoa                     CHAR (2) DEFAULT '  ' NOT NULL,
    finalidadeNota                 CHAR (1) DEFAULT ' ' NOT NULL,
    capituloNaturezaFiscal         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    operacaoInternaEstoque         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    movimentaEstoque               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaCustoMedio             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaUltimaCompra           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    regraFormacaoPreco             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    nfFornecedor                   CHAR (1) DEFAULT ' ' NOT NULL,
    ordemServico                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exigeOrcamento                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    alteraEstabelecimento          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    localEstoque                   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    alteraLocalEstoque             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    indicadorPresencaComprador     CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorConsumidorFinal       CHAR (1) DEFAULT ' ' NOT NULL,
    geraFinanceiro                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoFaturamento              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitaProjeto                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exigeProjeto                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    situacaoContabilizacao         CHAR (1) DEFAULT ' ' NOT NULL,
    solicitaAtendimento            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitaMotivoEstoque          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    controlaSeparacaoConferencia   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoReceitaOculos     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoTintas            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoListaEventos      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaAmbiente               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoPreco                      CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                    VARCHAR (10) DEFAULT ' ' NOT NULL,
    fatorMultiplicadorPreco        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPrecoB                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPrecoB                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    fatorMultiplicadorPrecoB       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    diminuiDescontoPrUnit          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    somaAcrescimosPrUnit           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    somaFreteSeguroPrUnit          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaControleEntrega        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraTransferencia              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfTipoDocumentoSaida       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    transfEtapaOrcamentoSaida      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAbrirDocumentoSaida      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfTipoDocumentoEntrada     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    transfEtapaOrcamentoEntrada    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAbrirDocumentoEntrada    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfEstabelecimento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAlteraEstabelecimento    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeEstabelecDiferente  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeRaizCnpjEstabDif    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeRaizCnpjEstabIgual  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfInformaPessoa            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfLocalEstoque             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAlteraLocalEstoque       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfControlaSeparacaoConf    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfControlaSepConfEntrada   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarVendedor        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarRespRetirada    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarRespRecebimento NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraOperacaoEmTransito         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transitoLocalEstoque           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    geraDocumentoFiscalTriangular  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    utilizarConversorQuantidade    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoCTe                        CHAR (1) DEFAULT ' ' NOT NULL,
    tomadorCTe                     CHAR (1) DEFAULT ' ' NOT NULL,
    modalidadeTransporte           CHAR (2) DEFAULT '  ' NOT NULL,
    tipoServicoCTe                 CHAR (1) DEFAULT ' ' NOT NULL,
    unidadeMedidaCTe               CHAR (2) DEFAULT '  ' NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_PK1 PRIMARY KEY (modeloDocumento);
CREATE INDEX PAMODELOSDOCUMENTO_K2 ON PAMODELOSDOCUMENTO (descricao);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK1 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK2 FOREIGN KEY (tipoPessoa) REFERENCES SITIPOSPESSOA (tipoPessoa);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK3 FOREIGN KEY (finalidadeNota) REFERENCES SIFINALIDADESNOTA (finalidadeNota);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK4 FOREIGN KEY (capituloNaturezaFiscal) REFERENCES SICAPITULOSNATUREZAFISCAL (capituloNaturezaFiscal);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK5 FOREIGN KEY (operacaoInternaEstoque) REFERENCES SIOPERACOESINTERNASESTOQUE (operacaoInternaEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK6 FOREIGN KEY (regraFormacaoPreco) REFERENCES PAREGRASFORMACAOPRECO (regraFormacaoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK7 FOREIGN KEY (nfFornecedor) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK8 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK9 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK10 FOREIGN KEY (indicadorPresencaComprador) REFERENCES SIINDICPRESENCACOMPRADOR (indicadorPresencaComprador);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK11 FOREIGN KEY (indicadorConsumidorFinal) REFERENCES SIINDICCONSUMIDORFINAL (indicadorConsumidorFinal);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK12 FOREIGN KEY (situacaoContabilizacao) REFERENCES SISITUACOESCONTABILIZACAO (situacaoContabilizacao);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK13 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK14 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK15 FOREIGN KEY (tipoPrecoB) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK16 FOREIGN KEY (tabelaPrecoB) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK17 FOREIGN KEY (transfTipoDocumentoSaida) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK18 FOREIGN KEY (transfEtapaOrcamentoSaida) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK19 FOREIGN KEY (transfTipoDocumentoEntrada) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK20 FOREIGN KEY (transfEtapaOrcamentoEntrada) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK21 FOREIGN KEY (transfEstabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK22 FOREIGN KEY (transfLocalEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK23 FOREIGN KEY (transitoLocalEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK24 FOREIGN KEY (tipoCTe) REFERENCES SITIPOSCTE (tipoCTe);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK25 FOREIGN KEY (tomadorCTe) REFERENCES SITOMADORESCTE (tomadorCTe);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK26 FOREIGN KEY (modalidadeTransporte) REFERENCES SIMODALIDADESTRANSPORTE (modalidadeTransporte);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK27 FOREIGN KEY (tipoServicoCTe) REFERENCES SITIPOSSERVICOCTE (tipoServicoCTe);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK28 FOREIGN KEY (unidadeMedidaCTe) REFERENCES SIUNIDADESMEDIDACTE (unidadeMedidaCTe);

INSERT INTO PAMODELOSDOCUMENTO (modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, solicitaMotivoEstoque, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, tipoCTe, tomadorCTe, modalidadeTransporte, tipoServicoCTe, unidadeMedidaCTe, observacoes) VALUES (0, 'SELECIONE', 1, ' ', '  ', ' ', 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, ' ', ' ', 0, ' ', ' ', 0, 0, 0, 0, 0, 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 PAMODELOSDOCUMENTO (modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, solicitaMotivoEstoque, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, tipoCTe, tomadorCTe, modalidadeTransporte, tipoServicoCTe, unidadeMedidaCTe, observacoes) SELECT modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, solicitaMotivoEstoque, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, ' ', ' ', '  ', ' ', '  ', observacoes FROM PAMODELOSDOCUMENTO_2501B WHERE modeloDocumento > 0;

COMMIT;

ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAOPERFISCALXMODELOSDOCUM ADD CONSTRAINT PAOPERFISCALXMODELOSDOCUM_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACENARIOSCALCULOPRECO ADD CONSTRAINT PACENARIOSCALCULOPRECO_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAREGRASREMANEJO ADD CONSTRAINT PAREGRASREMANEJO_FK2 FOREIGN KEY (modeloDocumentoTransferencia) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMODELOSDOCUMPERMITIDOS ADD CONSTRAINT PAMODELOSDOCUMPERMITIDOS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK7 FOREIGN KEY (modeloDocumentoVenda) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK8 FOREIGN KEY (modeloDocumentoEntrega) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK10 FOREIGN KEY (modeloDocumentoTransferencia) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK7 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK5 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK9 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOBALANCOS ADD CONSTRAINT MOBALANCOS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPAINEISCOMPRA ADD CONSTRAINT MOPAINEISCOMPRA_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);

-- MODOCFISCALXCTE
CREATE TABLE MODOCFISCALXCTE
  (
    idDocumentoFiscal            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tomadorCTe                   CHAR (1) DEFAULT ' ' NOT NULL,
    remetente                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    expedidor                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    recebedor                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    destinatario                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modalidadeTransporte         CHAR (2) DEFAULT '  ' NOT NULL,
    tipoServicoCTe               CHAR (1) DEFAULT ' ' NOT NULL,
    municipioOrigem              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    retira                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    detalhesRetiradaCTe          VARCHAR (160) DEFAULT ' ' NOT NULL,
    produtoPredominanteCTe       VARCHAR (60) DEFAULT ' ' NOT NULL,
    outrasCaracteristicasProdCTe VARCHAR (30) DEFAULT ' ' NOT NULL,
    unidadeMedidaCTe             CHAR (2) DEFAULT '  ' NOT NULL,
    quantidadeCarga              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorCarga                   NUMERIC (15,2) DEFAULT 0 NOT NULL
  );
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_PK1 PRIMARY KEY (idDocumentoFiscal);
CREATE INDEX MODOCFISCALXCTE_K2 ON MODOCFISCALXCTE (remetente);
CREATE INDEX MODOCFISCALXCTE_K3 ON MODOCFISCALXCTE (expedidor);
CREATE INDEX MODOCFISCALXCTE_K4 ON MODOCFISCALXCTE (recebedor);
CREATE INDEX MODOCFISCALXCTE_K5 ON MODOCFISCALXCTE (destinatario);
CREATE INDEX MODOCFISCALXCTE_K6 ON MODOCFISCALXCTE (modalidadeTransporte);
CREATE INDEX MODOCFISCALXCTE_K7 ON MODOCFISCALXCTE (tipoServicoCTe);
CREATE INDEX MODOCFISCALXCTE_K8 ON MODOCFISCALXCTE (municipioOrigem);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK2 FOREIGN KEY (remetente) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK3 FOREIGN KEY (expedidor) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK4 FOREIGN KEY (recebedor) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK5 FOREIGN KEY (destinatario) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK6 FOREIGN KEY (modalidadeTransporte) REFERENCES SIMODALIDADESTRANSPORTE (modalidadeTransporte);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK7 FOREIGN KEY (tipoServicoCTe) REFERENCES SITIPOSSERVICOCTE (tipoServicoCTe);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK8 FOREIGN KEY (municipioOrigem) REFERENCES SIMUNICIPIOS (municipio);
ALTER TABLE MODOCFISCALXCTE ADD CONSTRAINT MODOCFISCALXCTE_FK9 FOREIGN KEY (unidadeMedidaCTe) REFERENCES SIUNIDADESMEDIDACTE (unidadeMedidaCTe);

INSERT INTO MODOCFISCALXCTE (idDocumentoFiscal, tomadorCTe, remetente, expedidor, recebedor, destinatario, modalidadeTransporte, tipoServicoCTe, municipioOrigem, retira, detalhesRetiradaCTe, produtoPredominanteCTe, outrasCaracteristicasProdCTe, unidadeMedidaCTe, quantidadeCarga, valorCarga) VALUES (0, ' ', 0, 0, 0, 0, '  ', ' ', 0, 0, ' ', ' ', ' ', '  ', 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 ('MODOCFISCALXCTE', 'Documento Fiscal X CT-e', 1, 50251, 'MO', 'idDocumentoFiscal', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MOLINKSPAGAMENTO
CREATE TABLE MOLINKSPAGAMENTO
  (
    idLinkPagamento              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                         DATE,
    usuario                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    validade                     DATE,
    transacaoLinkPagamento       VARCHAR (12) DEFAULT ' ' NOT NULL,
    pedidoLinkPagamento          VARCHAR (40) DEFAULT ' ' NOT NULL,
    condicaoPagamento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    complemento                  VARCHAR (500) DEFAULT ' ' NOT NULL,
    cobranca                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    valor                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    situacaoLinkPagamento        CHAR (1) DEFAULT ' ' NOT NULL,
    url                          VARCHAR (256) DEFAULT ' ' NOT NULL,
    nsuLinkPagamento             VARCHAR (15) DEFAULT ' ' NOT NULL,
    nitLinkPagamento             VARCHAR (64) DEFAULT ' ' NOT NULL,
    nsuaLinkPagamento            VARCHAR (15) DEFAULT ' ' NOT NULL,
    nitaLinkPagamento            VARCHAR (65) DEFAULT ' ' NOT NULL,
    nitTransacaoAssLinkPagamento VARCHAR (64) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_PK1 PRIMARY KEY (idLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K2 ON MOLINKSPAGAMENTO (transacaoLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K3 ON MOLINKSPAGAMENTO (pedidoLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K4 ON MOLINKSPAGAMENTO (estabelecimento);
CREATE INDEX MOLINKSPAGAMENTO_K5 ON MOLINKSPAGAMENTO (data);
CREATE INDEX MOLINKSPAGAMENTO_K6 ON MOLINKSPAGAMENTO (usuario);
CREATE INDEX MOLINKSPAGAMENTO_K7 ON MOLINKSPAGAMENTO (condicaoPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K8 ON MOLINKSPAGAMENTO (cobranca);
CREATE INDEX MOLINKSPAGAMENTO_K9 ON MOLINKSPAGAMENTO (situacaoLinkPagamento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK3 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK4 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK5 FOREIGN KEY (situacaoLinkPagamento) REFERENCES SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento);

INSERT INTO MOLINKSPAGAMENTO (idLinkPagamento, estabelecimento, data, usuario, validade, transacaoLinkPagamento, pedidoLinkPagamento, condicaoPagamento, complemento, cobranca, valor, situacaoLinkPagamento, url, nsuLinkPagamento, nitLinkPagamento, nsuaLinkPagamento, nitaLinkPagamento, nitTransacaoAssLinkPagamento, observacoes) VALUES (0, 0, NULL, 0, NULL, ' ', ' ', 0, ' ',0, 0, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');

COMMIT;

-- MOLINKPAGAMENTOXBAIXAS
CREATE TABLE MOLINKPAGAMENTOXBAIXAS
  (
    id                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLinkPagamento        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cotacao                NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valor                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoIndexado          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorVariacaoIndexador NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosDeMora       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMulta             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontos         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrosAcrescimos  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    idBaixaFinanceiro      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOLINKPAGAMENTOXBAIXAS ADD CONSTRAINT MOLINKPAGAMENTOXBAIXAS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLINKPAGAMENTOXBAIXAS_K2 ON MOLINKPAGAMENTOXBAIXAS (idLinkPagamento, idFinanceiro);
CREATE INDEX MOLINKPAGAMENTOXBAIXAS_K3 ON MOLINKPAGAMENTOXBAIXAS (idLinkPagamento);
CREATE INDEX MOLINKPAGAMENTOXBAIXAS_K4 ON MOLINKPAGAMENTOXBAIXAS (idFinanceiro);
CREATE INDEX MOLINKPAGAMENTOXBAIXAS_K5 ON MOLINKPAGAMENTOXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOLINKPAGAMENTOXBAIXAS ADD CONSTRAINT MOLINKPAGAMENTOXBAIXAS_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXBAIXAS ADD CONSTRAINT MOLINKPAGAMENTOXBAIXAS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOLINKPAGAMENTOXBAIXAS ADD CONSTRAINT MOLINKPAGAMENTOXBAIXAS_FK3 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);

INSERT INTO MOLINKPAGAMENTOXBAIXAS (id, idLinkPagamento, idFinanceiro, cotacao, valor, saldo, saldoIndexado, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido, idBaixaFinanceiro, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');

COMMIT;

-- MOLINKPAGAMENTOXORCAMENTO
CREATE TABLE MOLINKPAGAMENTOXORCAMENTO
  (
    id                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLinkPagamento      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOLINKPAGAMENTOXORCAMENTO ADD CONSTRAINT MOLINKPAGAMENTOXORCAMENTO_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLINKPAGAMENTOXORCAMENTO_K2 ON MOLINKPAGAMENTOXORCAMENTO (idLinkPagamento, idPagamentoOrcamento);
CREATE INDEX MOLINKPAGAMENTOXORCAMENTO_K3 ON MOLINKPAGAMENTOXORCAMENTO (idLinkPagamento);
CREATE INDEX MOLINKPAGAMENTOXORCAMENTO_K4 ON MOLINKPAGAMENTOXORCAMENTO (idPagamentoOrcamento);
ALTER TABLE MOLINKPAGAMENTOXORCAMENTO ADD CONSTRAINT MOLINKPAGAMENTOXORCAMENTO_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXORCAMENTO ADD CONSTRAINT MOLINKPAGAMENTOXORCAMENTO_FK2 FOREIGN KEY (idPagamentoOrcamento) REFERENCES MOORCAMENTOXPAGAMENTOS (idPagamentoOrcamento);

INSERT INTO MOLINKPAGAMENTOXBAIXAS (id, idLinkPagamento, idFinanceiro, cotacao, valor, saldo, saldoIndexado, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido, idBaixaFinanceiro, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO MOLINKPAGAMENTOXORCAMENTO (id, idLinkPagamento, idPagamentoOrcamento) VALUES (0, 0, 0);

COMMIT;

-- MOLINKPAGAMENTOXPREDOCUM
CREATE TABLE MOLINKPAGAMENTOXPREDOCUM
  (
    id                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLinkPagamento         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoPreDocumento NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOLINKPAGAMENTOXPREDOCUM ADD CONSTRAINT MOLINKPAGAMENTOXPREDOCUM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLINKPAGAMENTOXPREDOCUM_K2 ON MOLINKPAGAMENTOXPREDOCUM (idLinkPagamento, idPagamentoPreDocumento);
CREATE INDEX MOLINKPAGAMENTOXPREDOCUM_K3 ON MOLINKPAGAMENTOXPREDOCUM (idLinkPagamento);
CREATE INDEX MOLINKPAGAMENTOXPREDOCUM_K4 ON MOLINKPAGAMENTOXPREDOCUM (idPagamentoPreDocumento);
ALTER TABLE MOLINKPAGAMENTOXPREDOCUM ADD CONSTRAINT MOLINKPAGAMENTOXPREDOCUM_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXPREDOCUM ADD CONSTRAINT MOLINKPAGAMENTOXPREDOCUM_FK2 FOREIGN KEY (idPagamentoPreDocumento) REFERENCES MOPREDOCUMXPAGAMENTOS (idPagamentoPreDocumento);

INSERT INTO MOLINKPAGAMENTOXPREDOCUM (id, idLinkPagamento, idPagamentoPreDocumento) VALUES (0, 0, 0);

COMMIT;

-- MOLINKPAGAMENTOXDOCFISCAL
CREATE TABLE MOLINKPAGAMENTOXDOCFISCAL
  (
    id                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLinkPagamento      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoDocFiscal NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOLINKPAGAMENTOXDOCFISCAL ADD CONSTRAINT MOLINKPAGAMENTOXDOCFISCAL_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLINKPAGAMENTOXDOCFISCAL_K2 ON MOLINKPAGAMENTOXDOCFISCAL (idLinkPagamento, idPagamentoDocFiscal);
CREATE INDEX MOLINKPAGAMENTOXDOCFISCAL_K3 ON MOLINKPAGAMENTOXDOCFISCAL (idLinkPagamento);
CREATE INDEX MOLINKPAGAMENTOXDOCFISCAL_K4 ON MOLINKPAGAMENTOXDOCFISCAL (idPagamentoDocFiscal);
ALTER TABLE MOLINKPAGAMENTOXDOCFISCAL ADD CONSTRAINT MOLINKPAGAMENTOXDOCFISCAL_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXDOCFISCAL ADD CONSTRAINT MOLINKPAGAMENTOXDOCFISCAL_FK2 FOREIGN KEY (idPagamentoDocFiscal) REFERENCES MODOCFISCALXPAGAMENTOS (idPagamentoDocFiscal);

INSERT INTO MOLINKPAGAMENTOXDOCFISCAL (id, idLinkPagamento, idPagamentoDocFiscal) VALUES (0, 0, 0);

COMMIT;

-- MOLINKPAGAMENTOXFINANC
CREATE TABLE MOLINKPAGAMENTOXFINANC
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLinkPagamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro    NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOLINKPAGAMENTOXFINANC ADD CONSTRAINT MOLINKPAGAMENTOXFINANC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLINKPAGAMENTOXFINANC_K2 ON MOLINKPAGAMENTOXFINANC (idLinkPagamento, idFinanceiro);
CREATE INDEX MOLINKPAGAMENTOXFINANC_K3 ON MOLINKPAGAMENTOXFINANC (idLinkPagamento);
CREATE INDEX MOLINKPAGAMENTOXFINANC_K4 ON MOLINKPAGAMENTOXFINANC (idFinanceiro);
ALTER TABLE MOLINKPAGAMENTOXFINANC ADD CONSTRAINT MOLINKPAGAMENTOXFINANC_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXFINANC ADD CONSTRAINT MOLINKPAGAMENTOXFINANC_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);

INSERT INTO MOLINKPAGAMENTOXFINANC (id, idLinkPagamento, idFinanceiro) VALUES (0, 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 ('MOLINKSPAGAMENTO', 'Link´s Pagamento', 1, 50509, 'MO', 'idLinkPagamento', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLINKPAGAMENTOXBAIXAS', 'Link Pagamento X Baixas Financeiras', 1, 50510, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLINKPAGAMENTOXORCAMENTO', 'Link Pagamento X Orçamentos', 1, 50511, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLINKPAGAMENTOXPREDOCUM', 'Link Pagamento X Pré-Documentos', 1, 50512, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLINKPAGAMENTOXDOCFISCAL', 'Link Pagamento X Documentos Fiscais', 1, 50513, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLINKPAGAMENTOXFINANC', 'Link Pagamento X Financeiros', 1, 50514, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

COMMIT;

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FGR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER,
  p_dataInventario               IN DATE,
  p_dataMovimentoEstSaldoInicial IN DATE)
  RETURN NUMBER
IS
  v_quebra     CHAR(9);
  v_quantidade NUMBER;
  v_preco      NUMBER;
  v_total      NUMBER;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  FOR a IN (
    SELECT
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data, 'HH24MISS') hora,
      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 p_dataMovimentoEstSaldoInicial IS NULL
      AND itemInv.gradeProduto = p_item_gradeProduto
      AND invEst.data >= p_dataInventario
      AND invEst.data < p_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 >= p_dataInventario
        AND invEst2.data < p_dataInventario + 1
        AND (invEst2.motivoInventarioEstoque = '01'
          OR invEst2.data < TRUNC (p_cab_dataPrecoFinal)
          AND EXISTS(
            SELECT 1
            FROM MOINVENTARIOESTOQUEXFISC itemInv2
            WHERE itemInv2.gradeProduto = p_item_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 = p_item_gradeProduto
      AND mov.operacaoInternaEstoque IN (102,900)
      AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND mov.pessoaParticipante = p_item_pessoaParticipante
      AND mov.data >=
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 = p_item_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 p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 = p_item_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 p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := a.total * v_quantidade / a.quantidade;
        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 + a.quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.quantidade * v_preco;
        END IF;
      ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := v_quantidade * v_preco;
      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;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
  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,
  p_dataInventario               IN DATE,
  p_dataMovimentoEstSaldoInicial IN DATE)
  RETURN NUMBER
IS
  v_quebra     CHAR(9);
  v_quantidade NUMBER;
  v_preco      NUMBER;
  v_total      NUMBER;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  FOR a IN (
    SELECT
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      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 p_dataMovimentoEstSaldoInicial IS NULL
      AND invEst.data >= p_dataInventario
      AND invEst.data < p_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 itemInv.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 >= p_dataInventario
        AND invEst2.data < p_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 itemInv2.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 p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 mov.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 p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_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 filhoDoc.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 a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := a.total * v_quantidade / a.quantidade;
        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 + a.quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.quantidade * v_preco;
        END IF;
      ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := v_quantidade * v_preco;
      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;
  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_preco                        NUMBER;
  v_contaGradesProduto           NUMBER;
  v_item_gradeProduto            NUMBER;
  v_dataInventario               DATE;
  v_dataMovimentoEstSaldoInicial DATE;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradProd.gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_item_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_item_gradeProduto
        AND itemInv.inventarioEstoque = invEst.inventarioEstoque));
    SELECT MAX (TRUNC (mov.data))
    INTO v_dataMovimentoEstSaldoInicial
    FROM MOESTOQUES mov
    WHERE mov.gradeProduto = v_item_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));
    v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FGR (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_cab_dataPrecoFinal,
      p_item_pessoaParticipante,
      v_item_gradeProduto,
      p_locEst_indicadorPropPosseIt,
      p_gerandoInventario,
      v_dataInventario,
      v_dataMovimentoEstSaldoInicial);
  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 itemInv.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_dataMovimentoEstSaldoInicial
    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 mov.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);
    v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataPrecoFinal,
      p_item_pessoaParticipante,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_locEst_indicadorPropPosseIt,
      p_gerandoInventario,
      v_dataInventario,
      v_dataMovimentoEstSaldoInicial);
  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_cab_projeto                  IN VARCHAR,
  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_cab_projeto,
        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 kit.controleEstoque NOT 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,
        kit.controleEstoque,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND kit.controleEstoque NOT 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
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' 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,
        2, -- p_precoRetornar
        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_cab_projeto,
        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_precoRetornar
        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_precoRetornar
        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_cab_projeto,
        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_cab_projeto                  IN VARCHAR,
  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_cab_projeto,
        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 a.controleEstoque NOT 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,
        a.controleEstoque,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT a.controleEstoque NOT 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
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' 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,
        2, -- p_precoRetornar
        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_cab_projeto,
        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_precoRetornar
        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_precoRetornar
        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_cab_projeto,
        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_cab_projeto                  IN VARCHAR,
  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_cab_projeto,
      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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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_cab_projeto,
        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,
        ' ', -- p_cab_projeto
        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,
          ' ', -- p_cab_projeto
          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 p_prod_controleEstoque NOT 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,
          p_prod_controleEstoque,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND p_prod_controleEstoque NOT 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
      -- R Último Preço de Reposição
      ELSIF p_tipoPreco = 'R' 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,
          2, -- p_precoRetornar
          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,
          ' ', -- p_cab_projeto
          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_precoRetornar
          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_precoRetornar
          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,
          ' ', -- p_cab_projeto
          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 FUNCTION FUNC_ADD_BUSCA_PRECO2 (
  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,
  p_dataInventario               IN DATE)
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,
        ' ', -- p_cab_projeto
        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,
          ' ', -- p_cab_projeto
          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 p_prod_controleEstoque NOT IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
          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
          p_dataInventario,
          NULL); -- p_dataMovimentoEstSaldoInicial
      -- 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,
          p_prod_controleEstoque,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND p_prod_controleEstoque NOT 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
      -- R Último Preço de Reposição
      ELSIF p_tipoPreco = 'R' 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,
          2, -- p_precoRetornar
          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,
          ' ', -- p_cab_projeto
          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_precoRetornar
          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_precoRetornar
          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,
          ' ', -- p_cab_projeto
          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 FUNCTION FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
  p_config_82_considLenteDispon IN NUMBER,
  p_config_83_considLenteEstoqu IN NUMBER,
  p_config_160_permiteTransfSem IN CHAR,
  p_entradaSaida                IN CHAR,   -- 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_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
  p_tipoDocumentoDesconsiderar  IN CHAR,   -- O = Orçamento, T = Transferencia
  p_idDocumentoDesconsiderar    IN NUMBER) -- O = orcamento, T = documentoTransferencia
RETURN NUMBER
IS
  v_quantidadeReservas        NUMBER;
  v_quantidadeOrcamento       NUMBER;
  v_quantidadeTransferencia   NUMBER;
  v_quantidadeTransfDigitacao NUMBER;
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 a.estabelecimento = p_estabelecimento
            AND (p_indicadorPropriedadePosseIt = ' '
              OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
            AND (p_pessoaParticipante < 0
              OR a.pessoaParticipante = p_pessoaParticipante)
            AND (p_localEstoque < 0
              AND locEst.validoEstoqueTotal = 1
              OR a.localEstoque = p_localEstoque)
            AND (p_personalizacao < 0
              OR a.personalizacao = p_personalizacao)
            AND (p_idNumeroSerie < 0
              OR a.idNumeroSerie = p_idNumeroSerie)
            AND (p_tipoDocumentoDesconsiderar <> '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 a.estabelecimento = p_estabelecimento
                  AND (p_indicadorPropriedadePosseIt = ' '
                    OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                  AND (p_pessoaParticipante < 0
                    OR a.pessoaParticipante = p_pessoaParticipante)
                  AND (p_localEstoque < 0
                    AND locEst.validoEstoqueTotal = 1
                    OR a.localEstoque = p_localEstoque)
                  AND (p_personalizacao < 0
                    OR a.personalizacao = p_personalizacao)
                  AND (p_idNumeroSerie < 0
                    OR a.idNumeroSerie = p_idNumeroSerie)
                  AND (p_tipoDocumentoDesconsiderar <> '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 gradProd.gradeProduto = p_gradeProduto) a), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  IF p_tipoDocumentoDesconsiderar = '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 a.estabelecimento = p_estabelecimento
                AND (p_indicadorPropriedadePosseIt = ' '
                  OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                AND (p_pessoaParticipante < 0
                  OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque < 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoque = p_localEstoque)
                AND (p_personalizacao < 0
                  OR a.personalizacao = p_personalizacao)
                AND (p_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 a.estabelecimento = p_estabelecimento
                    AND (p_indicadorPropriedadePosseIt = ' '
                      OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                    AND (p_pessoaParticipante < 0
                      OR a.pessoaParticipante = p_pessoaParticipante)
                    AND (p_localEstoque < 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao < 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_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 gradProd.gradeProduto = p_gradeProduto) a), 0)
    INTO v_quantidadeOrcamento
    FROM DUAL;
  END IF;
  IF p_tipoDocumentoDesconsiderar = '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 a.estabelecimento = p_estabelecimento
              AND (p_indicadorPropriedadePosseIt = ' '
                OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
              AND (p_pessoaParticipante < 0
                OR a.pessoaParticipante = p_pessoaParticipante)
              AND (p_localEstoque < 0
                AND locEst.validoEstoqueTotal = 1
                OR a.localEstoque = p_localEstoque)
              AND (p_personalizacao < 0
                OR a.personalizacao = p_personalizacao)
              AND (p_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 a.estabelecimento = p_estabelecimento
                    AND (p_indicadorPropriedadePosseIt = ' '
                      OR a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                    AND (p_pessoaParticipante < 0
                      OR a.pessoaParticipante = p_pessoaParticipante)
                    AND (p_localEstoque < 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao < 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_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 gradProd.gradeProduto = p_gradeProduto) a), 0)
    INTO v_quantidadeTransferencia
    FROM DUAL;
  END IF;
  IF p_config_160_permiteTransfSem IN ('A','B')
    AND (p_tipoDocumentoDesconsiderar <> 'T'
      OR p_idDocumentoDesconsiderar > 0)
    AND p_entradaSaida = 'S'
    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 docTransf.estabelecimentoSaida = p_estabelecimento
                AND (p_indicadorPropriedadePosseIt = ' '
                  OR locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                AND (p_pessoaParticipante < 0
                  OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                AND (p_localEstoque < 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoqueSaida = p_localEstoque)
                AND (p_personalizacao < 0
                  OR a.personalizacao = p_personalizacao)
                AND (prod.controleEstoque IN (1,5)
                  OR prod.controleEstoque = 11
                  AND CASE
                        WHEN docTransf.tipoDocumentoSaida = 101
                        THEN p_config_82_considLenteDispon
                        ELSE p_config_83_considLenteEstoqu
                      END = 1)), 0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MODOCUMENTOTRANSFXITENS a
                    JOIN MODOCUMENTOSTRANSFERENCIA docTransf
                    ON docTransf.documentoTransferencia = a.documentoTransferencia
                    JOIN PAMODELOSDOCUMENTO modDoc
                    ON modDoc.modeloDocumento = docTransf.modeloDocumento
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoqueSaida
                    WHERE a.validoSaida = 1
                    AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND docTransf.tipoDocumentoSaida > 100
                    AND docTransf.situacaoDocTransferencia = 'E'
                    AND modDoc.movimentaEstoque = 1
                    AND (p_idLoteEstoque < 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND docTransf.estabelecimentoSaida = p_estabelecimento
                    AND (p_indicadorPropriedadePosseIt = ' '
                      OR locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt)
                    AND (p_pessoaParticipante < 0
                      OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                    AND (p_localEstoque < 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoqueSaida = p_localEstoque)
                    AND (p_personalizacao < 0
                      OR a.personalizacao = p_personalizacao)) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE gradProd.gradeProduto = p_gradeProduto) a), 0)
    INTO v_quantidadeTransfDigitacao
    FROM DUAL;
  END IF;
  RETURN v_quantidadeReservas - v_quantidadeOrcamento - v_quantidadeTransferencia + v_quantidadeTransfDigitacao;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_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_naoUsado                    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
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      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_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      p_documentoDesconsiderar,
      p_idDocumentoDesconsiderar))
    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_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
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_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_orcamentoDesconsiderar      IN NUMBER,
  p_transferenciaDesconsiderar  IN NUMBER,
  p_entradaSaida                IN CHAR)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      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,
      -1, --p_personalizacao
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      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
      ))
    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_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
END;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
BEGIN
  r_tabelaPreco := ' ';
  r_precoSugestaoAPrazo := 0;
  r_precoSugestaoAVista := 0;
  r_precoDesconto := 0;
  r_precoMinimo := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo := 0;
  r_precoAVista := 0;
  r_promocao := 0;
  r_precoPromocaoAPrazo := 0;
  r_precoPromocaoAVista := 0;
  r_precoIndexadoAPrazo := 0;
  r_precoIndexadoAVista := 0;
  FOR a IN (
    SELECT 
      a.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = a.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND a.gradeProdutoFilho > 0
    AND a.ativo = 1
    AND a.quantidade > 0
    AND a.gradeProduto <> a.gradeProdutoFilho)
  LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := 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_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := 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_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    END IF;
    IF NOT (p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade * p_item_quantidade,
        a.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_precoSugestaoAPrazo <> 0 THEN
      r_tabelaPreco         := v_tabelaPreco;
      r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + a.quantidade * v_precoSugestaoAPrazo;
      r_precoSugestaoAVista := r_precoSugestaoAVista + a.quantidade * v_precoSugestaoAVista;
      r_precoDesconto       := r_precoDesconto       + a.quantidade * v_precoDesconto;
      r_precoMinimo         := r_precoMinimo         + a.quantidade * v_precoMinimo;
      r_precoAPrazo         := r_precoAPrazo         + a.quantidade * v_precoAPrazo;
      r_precoAVista         := r_precoAVista         + a.quantidade * v_precoAVista;
      IF v_promocao = 1 THEN
        r_promocao          := 1;
      END IF;  
      r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + a.quantidade * v_precoPromocaoAPrazo;
      r_precoPromocaoAVista := r_precoPromocaoAVista + a.quantidade * v_precoPromocaoAVista;
      r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + a.quantidade * v_precoIndexadoAPrazo;
      r_precoIndexadoAVista := r_precoIndexadoAVista + a.quantidade * v_precoIndexadoAVista;
    ELSE
      r_tabelaPreco         := ' ';
      r_precoSugestaoAPrazo := 0;
      r_precoSugestaoAVista := 0;
      r_precoDesconto       := 0;
      r_precoMinimo         := 0;
      r_precoAPrazo         := 0;
      r_precoAVista         := 0;
      r_promocao            := 0;
      r_precoPromocaoAPrazo := 0;
      r_precoPromocaoAVista := 0;
      r_precoIndexadoAPrazo := 0;
      r_precoIndexadoAVista := 0;
    END IF;        
    EXIT WHEN r_precoSugestaoAPrazo = 0;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_KIT;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_PROTIN (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  p_ini_tabelaPreco              IN VARCHAR,
  p_ini_precoSugestaoAPrazo      IN NUMBER,
  p_ini_precoSugestaoAVista      IN NUMBER,
  p_ini_precoDesconto            IN NUMBER,
  p_ini_precoMinimo              IN NUMBER,
  p_ini_informarPrecoManualmente IN NUMBER,
  p_ini_precoAPrazo              IN NUMBER,
  p_ini_precoAVista              IN NUMBER,
  p_ini_promocao                 IN NUMBER,
  p_ini_precoPromocaoAPrazo      IN NUMBER,
  p_ini_precoPromocaoAVista      IN NUMBER,
  p_ini_precoIndexadoAPrazo      IN NUMBER,
  p_ini_precoIndexadoAVista      IN NUMBER,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
BEGIN
  r_tabelaPreco              := p_ini_tabelaPreco;
  r_precoSugestaoAPrazo      := p_ini_precoSugestaoAPrazo;
  r_precoSugestaoAVista      := p_ini_precoSugestaoAVista;
  r_precoDesconto            := p_ini_precoDesconto;
  r_precoMinimo              := p_ini_precoMinimo;
  r_informarPrecoManualmente := p_ini_informarPrecoManualmente;
  r_precoAPrazo              := p_ini_precoAPrazo;
  r_precoAVista              := p_ini_precoAVista;
  r_promocao                 := p_ini_promocao;
  r_precoPromocaoAPrazo      := p_ini_precoPromocaoAPrazo;
  r_precoPromocaoAVista      := p_ini_precoPromocaoAVista;
  r_precoIndexadoAPrazo      := p_ini_precoIndexadoAPrazo;
  r_precoIndexadoAVista      := p_ini_precoIndexadoAVista;
  FOR 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_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    END IF;
    IF NOT (p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_tabelaPreco <> ' ' THEN
      r_tabelaPreco       := v_tabelaPreco;
    END IF;
    r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + p_tinta_quantidade * v_precoSugestaoAPrazo;
    r_precoSugestaoAVista := r_precoSugestaoAVista + p_tinta_quantidade * v_precoSugestaoAVista;
    r_precoDesconto       := r_precoDesconto       + p_tinta_quantidade * v_precoDesconto;
    r_precoMinimo         := r_precoMinimo         + p_tinta_quantidade * v_precoMinimo;
    r_precoAPrazo         := r_precoAPrazo         + p_tinta_quantidade * v_precoAPrazo;
    r_precoAVista         := r_precoAVista         + p_tinta_quantidade * v_precoAVista;
    IF v_promocao = 1 THEN
      r_promocao          := 1;
    END IF;
    r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + p_tinta_quantidade * v_precoPromocaoAPrazo;
    r_precoPromocaoAVista := r_precoPromocaoAVista + p_tinta_quantidade * v_precoPromocaoAVista;
    r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + p_tinta_quantidade * v_precoIndexadoAPrazo;
    r_precoIndexadoAVista := r_precoIndexadoAVista + p_tinta_quantidade * v_precoIndexadoAVista;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_PROTIN;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TINTA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;
  FOR 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
    ADD_BUSCA_PRECO_INTERNO_PROTIN (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_cab_projeto,
      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
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista,
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista);
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        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
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_TINTA;

/

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

/

create or replace PROCEDURE ADD_BUSCA_PRECO_GRADE_PRODUTO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam 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_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            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_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tipoPreco                    OUT CHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER)
IS
  v_precoAPrazo         NUMBER;
  v_precoAVista         NUMBER;
  v_promocao            NUMBER;
  v_precoPromocaoAPrazo NUMBER;
  v_precoPromocaoAVista NUMBER;
  v_precoIndexadoAPrazo NUMBER;
  v_precoIndexadoAVista NUMBER;
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  v_precoAPrazo              := 0;
  v_precoAVista              := 0;
  v_promocao                 := 0;
  v_precoPromocaoAPrazo      := 0;
  v_precoPromocaoAVista      := 0;
  v_precoIndexadoAPrazo      := 0;
  v_precoIndexadoAVista      := 0;
  IF p_item_gradeProduto > 0 THEN
    FOR a IN (
      SELECT
        modDoc.capituloNaturezaFiscal,
        modDoc.tipoPreco,
        modDoc.tabelaPreco,
        modDoc.fatorMultiplicadorPreco,
        modDoc.tipoPrecoB,
        modDoc.tabelaPrecoB,
        modDoc.fatorMultiplicadorPrecoB,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE((
          SELECT MAX(munEndEst.uf)
          FROM CAENDERECOSPESSOA endEst
          JOIN SIMUNICIPIOS munEndEst
          ON munEndEst.municipio = endEst.municipio
          WHERE endEst.pessoa = est.pessoaEstabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),'  ') ufEstabelecimento,
        COALESCE((
          SELECT MAX(munEndPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munEndPess
          ON munEndPess.municipio = endPess.municipio
          WHERE endPess.pessoa = CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END
          AND endPess.ativo = 1
          AND endPess.principal = 1),'  ') ufPessoa
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = p_cab_estabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = p_item_modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto)
    LOOP
      IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
        r_tipoPreco := 'I';
      ELSE
        IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
          ADD_BUSCA_PRECO_INTERNO_TINTA (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.indicadorPropriedadePosseItem,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END, -- p_tipoPreco
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END, -- p_tabelaPreco
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
        ELSE
          -- A Tabela de Preço Anterior
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'A' THEN
            ADD_BUSCA_PRECO_INTERNO_ANTER (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- C Custo Médio da Venda (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'C' AND a.controleEstoque NOT IN (3,4) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- F Formação Preço (Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'F' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              a.controleEstoque,
              0); -- p_gerandoInventario
          -- G Custo Médio da Venda Gerencial (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'G' AND a.controleEstoque NOT IN (3,4) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- P Preço de Custo (Último Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'P' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- R Último Preço de Reposição
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'R' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              2, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- T Tabela de Preço
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'T' THEN
            ADD_BUSCA_PRECO_INTERNO_TABELA (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- U Última Compra
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'U' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- 2 Última Compra Bruto
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = '2' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              1, -- p_precoRetornar
              0); -- p_gerandoInventario
          END IF;
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END NOT IN ('A','T') THEN
            r_tabelaPreco              := ' ';
            r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
            r_precoDesconto            := 0;
            r_precoMinimo              := 0;
            r_informarPrecoManualmente := 0;
            v_precoAPrazo              := r_precoSugestaoAPrazo;
            v_precoAVista              := r_precoSugestaoAPrazo;
            v_promocao                 := 0;
            v_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
            v_precoPromocaoAVista      := r_precoSugestaoAPrazo;
            v_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
            v_precoIndexadoAVista      := r_precoSugestaoAPrazo;
          END IF;
          -- 3 = Combo / 4 = Kit
          IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
            ADD_BUSCA_PRECO_INTERNO_KIT (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_quantidade,
              a.produto,
              a.indicadorPropriedadePosseItem,
              p_manterPreco,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          END IF;
        END IF;
        -- Se encontrou preço
        IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR v_precoAPrazo <> 0 OR v_precoAVista <> 0 OR v_precoPromocaoAPrazo <> 0 OR v_precoPromocaoAVista <> 0 OR v_precoIndexadoAPrazo <> 0 OR v_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
          r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END;
          IF a.fatorMultiplicadorPreco NOT IN (0,1) AND (p_manterPreco = 0 OR p_tipoPreco = a.tipoPreco AND p_tabelaPreco = a.tabelaPreco) THEN
            r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * a.fatorMultiplicadorPreco;
            r_precoSugestaoAVista := r_precoSugestaoAVista * a.fatorMultiplicadorPreco;
            r_precoDesconto       := r_precoDesconto       * a.fatorMultiplicadorPreco;
            r_precoMinimo         := r_precoMinimo         * a.fatorMultiplicadorPreco;
            v_precoAPrazo         := v_precoAPrazo         * a.fatorMultiplicadorPreco;
            v_precoAVista         := v_precoAVista         * a.fatorMultiplicadorPreco;
            v_precoPromocaoAPrazo := v_precoPromocaoAPrazo * a.fatorMultiplicadorPreco;
            v_precoPromocaoAVista := v_precoPromocaoAVista * a.fatorMultiplicadorPreco;
            v_precoIndexadoAPrazo := v_precoIndexadoAPrazo * a.fatorMultiplicadorPreco;
            v_precoIndexadoAVista := v_precoIndexadoAVista * a.fatorMultiplicadorPreco;
          END IF;
        -- Se não encontrou preço, não mantém o atual e existe regra de preço B
        ELSIF p_manterPreco = 0 AND a.tipoPrecoB <> ' ' THEN
          ADD_BUSCA_PRECO (
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            a.fatorMultiplicadorPrecoB,
            ' ', --a.tipoPrecoB
            ' ', --a.tabelaPrecoB
            0, --a.fatorMultiplicadorPrecoB
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.produto,
            a.cor,
            a.tamanho,
            a.controleEstoque,
            a.indicadorPropriedadePosseItem,
            0, --p_manterPreco
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            r_tipoPreco,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
          -- Se não encontrou preço B, devolve tipo preço e tabela atual
          IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND v_precoAPrazo = 0 AND v_precoAVista = 0 AND v_precoPromocaoAPrazo = 0 AND v_precoPromocaoAVista = 0 AND v_precoIndexadoAPrazo = 0 AND v_precoIndexadoAVista = 0 AND a.tipoPrecoB <> 'I' THEN
            r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
            r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
          END IF;
        -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
        ELSE
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
        END IF;
        -- Efetua arredondamento de preço
        r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      END IF;
    END LOOP;
  END IF;
END ADD_BUSCA_PRECO_GRADE_PRODUTO;

/

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

/

create or replace PROCEDURE ADD_BUSCA_ICMS_ST_ANTERIOR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_calcularICMSSTAnterEfetivo   IN NUMBER,
  p_calcularFCP                  IN NUMBER,
  /* Retornos */
  r_item_baseICMSSTAnteriormente OUT NUMBER,
  r_item_valorICMSSTAnteriorment OUT NUMBER,
  r_item_valorICMSProprioSubstit OUT NUMBER,
  r_item_baseFCPSTAnteriormente  OUT NUMBER,
  r_item_valorFCPSTAnteriormente OUT NUMBER)
IS
  v_quantidade               NUMBER;
  v_baseICMSST               NUMBER;
  v_valorICMSST              NUMBER;
  v_baseICMSSTEscrituracao   NUMBER;
  v_valorICMSSTEscrituracao  NUMBER;
  v_baseICMSSTAnteriormente  NUMBER;
  v_valorICMSSTAnteriormente NUMBER;
  v_valorICMS                NUMBER;
  v_baseFCPST                NUMBER;
  v_valorFCPST               NUMBER;
  v_ufOrigDest_aliquotaIcms  NUMBER;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente  := 0;
  r_item_valorFCPSTAnteriormente := 0;
  v_quantidade                   := 0;
  v_baseICMSST                   := 0;
  v_valorICMSST                  := 0;
  v_baseICMSSTEscrituracao       := 0;
  v_valorICMSSTEscrituracao      := 0;
  v_baseICMSSTAnteriormente      := 0;
  v_valorICMSSTAnteriormente     := 0;
  v_valorICMS                    := 0;
  v_baseFCPST                    := 0;
  v_valorFCPST                   := 0;
  v_ufOrigDest_aliquotaIcms      := 0;
  SELECT
    COALESCE (MAX (a.quantidade), 0),
    COALESCE (MAX (a.baseICMSST), 0),
    COALESCE (MAX (a.valorICMSST), 0),
    COALESCE (MAX (a.baseICMSSTEscrituracao), 0),
    COALESCE (MAX (a.valorICMSSTEscrituracao), 0),
    COALESCE (MAX (a.baseICMSSTAnteriormente), 0),
    COALESCE (MAX (a.valorICMSSTAnteriormente), 0),
    COALESCE (MAX (a.valorICMS), 0),
    COALESCE (MAX (a.baseFCPST), 0),
    COALESCE (MAX (a.valorFCPST), 0)
  INTO
    v_quantidade,
    v_baseICMSST,
    v_valorICMSST,
    v_baseICMSSTEscrituracao,
    v_valorICMSSTEscrituracao,
    v_baseICMSSTAnteriormente,
    v_valorICMSSTAnteriormente,
    v_valorICMS,
    v_baseFCPST,
    v_valorFCPST
  FROM (
    SELECT
      ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida DESC) ordenacao,
      item.quantidade,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTEscrituracao,
      item.valorICMSSTEscrituracao,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMS,
      item.baseFCPST,
      item.valorFCPST
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = cab.estabelecimento
    JOIN CAPESSOAS pessEst
    ON pessEst.pessoa = est.pessoaEstabelecimento
    WHERE item.gradeProduto = p_item_gradeProduto
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND (item.baseICMSSTEscrituracao > 0
      AND item.valorICMSSTEscrituracao > 0
      OR item.baseICMSST > 0
      AND item.valorICMSST > 0
      OR item.baseICMSSTAnteriormente > 0
      AND item.valorICMSSTAnteriormente > 0
      OR item.valorICMS > 0)
    AND cab.entradaSaida = 'E'
    AND cab.nfFornecedor = 1
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND cab.dataEntradaSaida < TRUNC (CASE WHEN p_cab_dataEntradaSaida IS NULL THEN SYSDATE ELSE p_cab_dataEntradaSaida END) + 1
    AND (cab.estabelecimento = p_cab_estabelecimento
      OR est.pessoaEstabelecimento > 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est2
        WHERE est2.estabelecimento = p_cab_estabelecimento
        AND est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        AND est2.ativo = 1)
      OR p_config_209_filtrarGrupoEcon = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est2
        JOIN CAPESSOAS pessEst2
        ON pessEst2.pessoa = est2.pessoaEstabelecimento
        WHERE est2.estabelecimento = p_cab_estabelecimento
        AND est2.ativo = 1
        AND pessEst2.grupoEconomico = pessEst.grupoEconomico))) a
  WHERE a.ordenacao = 1;
  IF p_calcularICMSSTAnterEfetivo = 1 AND v_quantidade > 0 THEN
    IF v_baseICMSSTEscrituracao > 0 AND v_valorICMSSTEscrituracao > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
    ELSIF v_baseICMSST > 0 AND v_valorICMSST > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSST * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSST * p_item_quantidade / v_quantidade), 2);
    ELSE
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
    END IF;
    r_item_valorICMSProprioSubstit := ROUND ((v_valorICMS * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularFCP = 1 AND v_quantidade > 0 THEN
    r_item_baseFCPSTAnteriormente := ROUND ((v_baseFCPST * p_item_quantidade / v_quantidade), 2);
    r_item_valorFCPSTAnteriormente := ROUND ((v_valorFCPST * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularICMSSTAnterEfetivo = 1
    AND r_item_baseICMSSTAnteriormente = 0
    AND r_item_valorICMSSTAnteriorment = 0
    AND r_item_valorICMSProprioSubstit = 0
  THEN
    FOR a IN (
      SELECT
        a.produto,
        a.cor,
        a.tamanho
      FROM CAGRADESPRODUTO a
      WHERE a.gradeProduto = p_item_gradeProduto)
    LOOP
      r_item_baseICMSSTAnteriormente := ROUND ((p_item_quantidade *      
        FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          NULL,
          CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END,
          p_item_personalizacao,
          a.produto,
          a.cor,
          a.tamanho,
          0, -- p_precoRetornar
          0 -- p_gerandoInventario
        )), 2);    
      SELECT
        COALESCE ((
          SELECT MAX (ufOrigDest.aliquotaIcms)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst
          ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEst
          ON munEst.municipio = endEst.municipio
          JOIN PAUFORIGEMXUFDESTINO ufOrigDest
          ON ufOrigDest.ufOrigem = munEst.uf
          AND ufOrigDest.ufDestino = munEst.uf
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1), 0)
      INTO v_ufOrigDest_aliquotaIcms
      FROM DUAL;
      r_item_valorICMSSTAnteriorment := ROUND (r_item_baseICMSSTAnteriormente * v_ufOrigDest_aliquotaIcms / 100, 2);
    END LOOP;
  END IF;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_gradeProduto                 IN NUMBER,
  p_personalizacao               IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_valorProdutoServico          IN NUMBER,
  p_valorFreteTotal              IN NUMBER,
  p_valorSeguroTotal             IN NUMBER,
  p_valorDescontoTotal           IN NUMBER,
  p_valorOutrasDespesasTotal     IN NUMBER,
  p_valorAdicFreteMarinMerTotal  IN NUMBER,
  p_valorDespesasAduaneirasTotal IN NUMBER,
  p_cfop                         IN NUMBER,
  p_calcularISSQN                IN NUMBER,
  p_indicadorISSQN               IN CHAR,
  p_aliquotaISSQN                IN NUMBER,
  p_baseISSQN                    IN NUMBER,
  p_residuoISSQN                 IN NUMBER,
  p_valorISSQN                   IN NUMBER,
  p_calcularRetencaoIRRF         IN NUMBER,
  p_retencaoIRRF                 IN NUMBER,
  p_baseRetIRRF                  IN NUMBER,
  p_residuoRetIRRF               IN NUMBER,
  p_valorRetIRRF                 IN NUMBER,
  p_calcularRetencaoINSS         IN NUMBER,
  p_retencaoINSS                 IN NUMBER,
  p_baseRetINSS                  IN NUMBER,
  p_residuoRetINSS               IN NUMBER,
  p_valorRetINSS                 IN NUMBER,
  p_calcularRetencaoPIS          IN NUMBER,
  p_retencaoPIS                  IN NUMBER,
  p_baseRetPIS                   IN NUMBER,
  p_residuoRetPIS                IN NUMBER,
  p_valorRetPIS                  IN NUMBER,
  p_calcularRetencaoCOFINS       IN NUMBER,
  p_retencaoCOFINS               IN NUMBER,
  p_baseRetCOFINS                IN NUMBER,
  p_residuoRetCOFINS             IN NUMBER,
  p_valorRetCOFINS               IN NUMBER,
  p_calcularRetencaoCSLL         IN NUMBER,
  p_retencaoCSLL                 IN NUMBER,
  p_baseRetCSLL                  IN NUMBER,
  p_residuoRetCSLL               IN NUMBER,
  p_valorRetCSLL                 IN NUMBER,
  p_calcularRetencaoOutros       IN NUMBER,
  p_retencaoOutros               IN NUMBER,
  p_baseRetOutros                IN NUMBER,
  p_residuoRetOutros             IN NUMBER,
  p_valorRetOutros               IN NUMBER,
  p_calcularII                   IN NUMBER,
  p_aliquotaII                   IN NUMBER,
  p_baseII                       IN NUMBER,
  p_valorII                      IN NUMBER,
  p_calcularIOF                  IN NUMBER,
  p_aliquotaIOF                  IN NUMBER,
  p_baseIOF                      IN NUMBER,
  p_valorIOF                     IN NUMBER,
  p_calcularIPI                  IN NUMBER,
  p_aliquotaIPI                  IN NUMBER,
  p_valorAliquotaIPI             IN NUMBER,
  p_baseIPI                      IN NUMBER,
  p_valorIPI                     IN NUMBER,
  p_valorIPIDevolucao            IN NUMBER,
  p_calcularPIS                  IN NUMBER,
  p_aliquotaPIS                  IN NUMBER,
  p_valorAliquotaPIS             IN NUMBER,
  p_basePIS                      IN NUMBER,
  p_valorPIS                     IN NUMBER,
  p_calcularPISST                IN NUMBER,
  p_aliquotaPISST                IN NUMBER,
  p_valorAliquotaPISST           IN NUMBER,
  p_basePISST                    IN NUMBER,
  p_valorPISST                   IN NUMBER,
  p_calcularCOFINS               IN NUMBER,
  p_aliquotaCOFINS               IN NUMBER,
  p_valorAliquotaCOFINS          IN NUMBER,
  p_baseCOFINS                   IN NUMBER,
  p_valorCOFINS                  IN NUMBER,
  p_calcularCOFINSST             IN NUMBER,
  p_aliquotaCOFINSST             IN NUMBER,
  p_valorAliquotaCOFINSST        IN NUMBER,
  p_baseCOFINSST                 IN NUMBER,
  p_valorCOFINSST                IN NUMBER,
  p_calcularSimplesNacional      IN NUMBER,
  p_stSimplesNacional            IN CHAR,
  p_creditoSimplesNacional       IN NUMBER,
  p_baseCreditoSimplesNacional   IN NUMBER,
  p_valorCreditoSimplesNacional  IN NUMBER,
  p_calcularICMS                 IN NUMBER,
  p_stICMS                       IN CHAR,
  p_modalidadeBaseCalcICMS       IN CHAR,
  p_reducaoBaseICMS              IN NUMBER,
  p_aliquotaICMS                 IN NUMBER,
  p_diferimentoICMS              IN NUMBER,
  p_baseICMS                     IN NUMBER,
  p_valorICMSOperacao            IN NUMBER,
  p_valorICMSDiferido            IN NUMBER,
  p_valorICMS                    IN NUMBER,
  p_valorICMSDesoneracao         IN NUMBER,
  p_calcularICMSST               IN NUMBER,
  p_modalidadeBaseCalcICMSST     IN CHAR,
  p_margemValorAdicionadoST      IN NUMBER,
  p_reducaoBaseST                IN NUMBER,
  p_aliquotaICMSST               IN NUMBER,
  p_baseICMSST                   IN NUMBER,
  p_valorICMSST                  IN NUMBER,
  p_calcularICMSSTAnterEfetivo   IN NUMBER,
  p_baseICMSSTAnteriormente      IN NUMBER,
  p_valorICMSSTAnteriormente     IN NUMBER,
  p_valorICMSProprioSubstituto   IN NUMBER,
  p_reducaoBaseICMSEfetivo       IN NUMBER,
  p_aliquotaICMSEfetivo          IN NUMBER,
  p_baseICMSEfetivo              IN NUMBER,
  p_valorICMSEfetivo             IN NUMBER,
  p_calcularICMSEscrituracao     IN NUMBER,
  p_stICMSEscrituracao           IN CHAR,
  p_reducaoBaseICMSEscrituracao  IN NUMBER,
  p_aliquotaICMSEscrituracao     IN NUMBER,
  p_diferimentoICMSEscrituracao  IN NUMBER,
  p_baseICMSEscrituracao         IN NUMBER,
  p_valorICMSEscrituracao        IN NUMBER,
  p_valorICMSDesonEscrituracao   IN NUMBER,
  p_calcularICMSSTEscrituracao   IN NUMBER,
  p_margemValorAdicSTEscriturac  IN NUMBER,
  p_reducaoBaseSTEscrituracao    IN NUMBER,
  p_aliquotaICMSSTEscrituracao   IN NUMBER,
  p_baseICMSSTEscrituracao       IN NUMBER,
  p_valorICMSSTEscrituracao      IN NUMBER,
  p_calcularDIFAL                IN NUMBER,
  p_aliquotaICMSUFDestinatario   IN NUMBER,
  p_aliquotaICMSInterestadual    IN NUMBER,
  p_partilhaICMSInterestadual    IN NUMBER,
  p_baseICMSUFDestinatario       IN NUMBER,
  p_valorICMSUFDestinatario      IN NUMBER,
  p_baseICMSUFRemetente          IN NUMBER,
  p_valorICMSUFRemetente         IN NUMBER,
  p_calcularFCP                  IN NUMBER,
  p_aliquotaFCP                  IN NUMBER,
  p_baseFCP                      IN NUMBER,
  p_valorFCP                     IN NUMBER,
  p_aliquotaFCPST                IN NUMBER,
  p_baseFCPST                    IN NUMBER,
  p_valorFCPST                   IN NUMBER,
  p_aliquotaFCPSTAnteriormente   IN NUMBER,
  p_baseFCPSTAnteriormente       IN NUMBER,
  p_valorFCPSTAnteriormente      IN NUMBER,
  p_aliquotaFCPUFDestinatario    IN NUMBER,
  p_baseFCPUFDestinatario        IN NUMBER,
  p_valorFCPUFDestinatario       IN NUMBER,
  p_calcularImpostosEstimados    IN NUMBER,
  p_aliquotaEstImpFederais       IN NUMBER,
  p_aliquotaEstImpEstaduais      IN NUMBER,
  p_aliquotaEstImpMunicipais     IN NUMBER,
  p_baseEstimadaImpostos         IN NUMBER,
  p_valorEstimadoImpFederais     IN NUMBER,
  p_valorEstimadoImpEstaduais    IN NUMBER,
  p_valorEstimadoImpMunicipais   IN NUMBER,
  p_prod_tipoProduto             IN CHAR,
  p_prod_precoPautaTabelado      IN NUMBER,
  /* Retornos */
  r_baseISSQN                    OUT NUMBER,
  r_residuoISSQN                 OUT NUMBER,
  r_valorISSQN                   OUT NUMBER,
  r_baseRetIRRF                  OUT NUMBER,
  r_residuoRetIRRF               OUT NUMBER,
  r_valorRetIRRF                 OUT NUMBER,
  r_baseRetINSS                  OUT NUMBER,
  r_residuoRetINSS               OUT NUMBER,
  r_valorRetINSS                 OUT NUMBER,
  r_baseRetPIS                   OUT NUMBER,
  r_residuoRetPIS                OUT NUMBER,
  r_valorRetPIS                  OUT NUMBER,
  r_baseRetCOFINS                OUT NUMBER,
  r_residuoRetCOFINS             OUT NUMBER,
  r_valorRetCOFINS               OUT NUMBER,
  r_baseRetCSLL                  OUT NUMBER,
  r_residuoRetCSLL               OUT NUMBER,
  r_valorRetCSLL                 OUT NUMBER,
  r_baseRetOutros                OUT NUMBER,
  r_residuoRetOutros             OUT NUMBER,
  r_valorRetOutros               OUT NUMBER,
  r_baseII                       OUT NUMBER,
  r_valorII                      OUT NUMBER,
  r_baseIOF                      OUT NUMBER,
  r_valorIOF                     OUT NUMBER,
  r_baseIPI                      OUT NUMBER,
  r_valorIPI                     OUT NUMBER,
  r_basePIS                      OUT NUMBER,
  r_valorPIS                     OUT NUMBER,
  r_basePISST                    OUT NUMBER,
  r_valorPISST                   OUT NUMBER,
  r_baseCOFINS                   OUT NUMBER,
  r_valorCOFINS                  OUT NUMBER,
  r_baseCOFINSST                 OUT NUMBER,
  r_valorCOFINSST                OUT NUMBER,
  r_baseCreditoSimplesNacional   OUT NUMBER,
  r_valorCreditoSimplesNacional  OUT NUMBER,
  r_baseICMS                     OUT NUMBER,
  r_valorICMSOperacao            OUT NUMBER,
  r_valorICMSDiferido            OUT NUMBER,
  r_valorICMS                    OUT NUMBER,
  r_valorICMSDesoneracao         OUT NUMBER,
  r_baseICMSST                   OUT NUMBER,
  r_valorICMSST                  OUT NUMBER,
  r_baseICMSSTAnteriormente      OUT NUMBER,
  r_valorICMSSTAnteriormente     OUT NUMBER,
  r_valorICMSProprioSubstituto   OUT NUMBER,
  r_baseICMSEfetivo              OUT NUMBER,
  r_valorICMSEfetivo             OUT NUMBER,
  r_baseICMSEscrituracao         OUT NUMBER,
  r_valorICMSEscrituracao        OUT NUMBER,
  r_valorICMSDesonEscrituracao   OUT NUMBER,
  r_baseICMSSTEscrituracao       OUT NUMBER,
  r_valorICMSSTEscrituracao      OUT NUMBER,
  r_baseICMSUFDestinatario       OUT NUMBER,
  r_valorICMSUFDestinatario      OUT NUMBER,
  r_baseICMSUFRemetente          OUT NUMBER,
  r_valorICMSUFRemetente         OUT NUMBER,
  r_baseFCP                      OUT NUMBER,
  r_valorFCP                     OUT NUMBER,
  r_baseFCPST                    OUT NUMBER,
  r_valorFCPST                   OUT NUMBER,
  r_baseFCPSTAnteriormente       OUT NUMBER,
  r_valorFCPSTAnteriormente      OUT NUMBER,
  r_baseFCPUFDestinatario        OUT NUMBER,
  r_valorFCPUFDestinatario       OUT NUMBER,
  r_baseEstimadaImpostos         OUT NUMBER,
  r_valorEstimadoImpFederais     OUT NUMBER,
  r_valorEstimadoImpEstaduais    OUT NUMBER,
  r_valorEstimadoImpMunicipais    OUT NUMBER)
IS
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
BEGIN
  r_baseISSQN                   := p_baseISSQN;
  r_residuoISSQN                := p_residuoISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseRetIRRF                 := p_baseRetIRRF;
  r_residuoRetIRRF              := p_residuoRetIRRF;
  r_valorRetIRRF                := p_valorRetIRRF;
  r_baseRetINSS                 := p_baseRetINSS;
  r_residuoRetINSS              := p_residuoRetINSS;
  r_valorRetINSS                := p_valorRetINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_residuoRetPIS               := p_residuoRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_residuoRetCOFINS            := p_residuoRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_residuoRetCSLL              := p_residuoRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseRetOutros               := p_baseRetOutros;
  r_residuoRetOutros            := p_residuoRetOutros;
  r_valorRetOutros              := p_valorRetOutros;
  r_baseII                      := p_baseII;
  r_valorII                     := p_valorII;
  r_baseIOF                     := p_baseIOF;
  r_valorIOF                    := p_valorIOF;
  r_baseIPI                     := p_baseIPI;
  r_valorIPI                    := p_valorIPI;
  r_basePIS                     := p_basePIS;
  r_valorPIS                    := p_valorPIS;
  r_basePISST                   := p_basePISST;
  r_valorPISST                  := p_valorPISST;
  r_baseCOFINS                  := p_baseCOFINS;
  r_valorCOFINS                 := p_valorCOFINS;
  r_baseCOFINSST                := p_baseCOFINSST;
  r_valorCOFINSST               := p_valorCOFINSST;
  r_baseCreditoSimplesNacional  := p_baseCreditoSimplesNacional;
  r_valorCreditoSimplesNacional := p_valorCreditoSimplesNacional;
  r_baseICMS                    := p_baseICMS;
  r_valorICMSOperacao           := p_valorICMSOperacao;
  r_valorICMSDiferido           := p_valorICMSDiferido;
  r_valorICMS                   := p_valorICMS;
  r_valorICMSDesoneracao        := p_valorICMSDesoneracao;
  r_baseICMSST                  := p_baseICMSST;
  r_valorICMSST                 := p_valorICMSST;
  r_baseICMSSTAnteriormente     := p_baseICMSSTAnteriormente;
  r_valorICMSSTAnteriormente    := p_valorICMSSTAnteriormente;
  r_valorICMSProprioSubstituto  := p_valorICMSProprioSubstituto;
  r_baseICMSEfetivo             := p_baseICMSEfetivo;
  r_valorICMSEfetivo            := p_valorICMSEfetivo;
  r_baseICMSEscrituracao        := p_baseICMSEscrituracao;
  r_valorICMSEscrituracao       := p_valorICMSEscrituracao;
  r_valorICMSDesonEscrituracao  := p_valorICMSDesonEscrituracao;
  r_baseICMSSTEscrituracao      := p_baseICMSSTEscrituracao;
  r_valorICMSSTEscrituracao     := p_valorICMSSTEscrituracao;
  r_baseICMSUFDestinatario      := p_baseICMSUFDestinatario;
  r_valorICMSUFDestinatario     := p_valorICMSUFDestinatario;
  r_baseICMSUFRemetente         := p_baseICMSUFRemetente;
  r_valorICMSUFRemetente        := p_valorICMSUFRemetente;
  r_baseFCP                     := p_baseFCP;
  r_valorFCP                    := p_valorFCP;
  r_baseFCPST                   := p_baseFCPST;
  r_valorFCPST                  := p_valorFCPST;
  r_baseFCPSTAnteriormente      := p_baseFCPSTAnteriormente;
  r_valorFCPSTAnteriormente     := p_valorFCPSTAnteriormente;
  r_baseFCPUFDestinatario       := p_baseFCPUFDestinatario;
  r_valorFCPUFDestinatario      := p_valorFCPUFDestinatario;
  r_baseEstimadaImpostos        := p_baseEstimadaImpostos;
  r_valorEstimadoImpFederais    := p_valorEstimadoImpFederais;
  r_valorEstimadoImpEstaduais   := p_valorEstimadoImpEstaduais;
  r_valorEstimadoImpMunicipais  := p_valorEstimadoImpMunicipais;
  /* ISSQN */
  IF p_calcularISSQN = 1 THEN
    IF p_indicadorISSQN = '1' AND p_aliquotaISSQN > 0 THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 2);
      r_residuoISSQN := (r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN - ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 2);
    ELSE
      r_baseISSQN := 0;
      r_valorISSQN := 0;
    END IF;
  END IF;
  /* IRRF */
  IF p_calcularRetencaoIRRF = 1 THEN
    IF p_retencaoIRRF > 0 THEN
      r_baseRetIRRF := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetIRRF := ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF, 2);
      r_residuoRetIRRF := (r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF - ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF, 2);
    ELSE
      r_baseRetIRRF := 0;
      r_valorRetIRRF := 0;
    END IF;
  END IF;
  /* INSS */
  IF p_calcularRetencaoINSS = 1 THEN
    IF p_retencaoINSS > 0 THEN
      r_baseRetINSS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetINSS := ROUND ((r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS, 2);
      r_residuoRetINSS := (r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS - ROUND ((r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS, 2);
    ELSE
      r_baseRetINSS := 0;
      r_valorRetINSS := 0;
    END IF;
  END IF;
  /* Retenção PIS */
  IF p_calcularRetencaoPIS = 1 THEN
    IF p_retencaoPIS > 0 THEN
      r_baseRetPIS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetPIS := ROUND ((r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS, 2);
      r_residuoRetPIS := (r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS - ROUND ((r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS, 2);
    ELSE
      r_baseRetPIS := 0;
      r_valorRetPIS := 0;
    END IF;
  END IF;
  /* Retenção COFINS */
  IF p_calcularRetencaoCOFINS = 1 THEN
    IF p_retencaoCOFINS > 0 THEN
      r_baseRetCOFINS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCOFINS := ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS , 2);
      r_residuoRetCOFINS := (r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS - ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS, 2);
    ELSE
      r_baseRetCOFINS := 0;
      r_valorRetCOFINS := 0;
    END IF;
  END IF;
  /* Retenção CSLL */
  IF p_calcularRetencaoCSLL = 1 THEN
    IF p_retencaoCSLL > 0 THEN
      r_baseRetCSLL := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCSLL := ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL, 2);
      r_residuoRetCSLL := (r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL - ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL, 2);
    ELSE
      r_baseRetCSLL := 0;
      r_valorRetCSLL := 0;
    END IF;
  END IF;
  /* Retenção Outros */
  IF p_calcularRetencaoOutros = 1 THEN
    IF p_retencaoOutros > 0 THEN
      r_baseRetOutros := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetOutros := ROUND ((r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros, 2);
      r_residuoRetOutros := (r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros - ROUND ((r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros, 2);
    ELSE
      r_baseRetOutros := 0;
      r_valorRetOutros := 0;
    END IF;
  END IF;
  /* II */
  IF p_calcularII = 1 THEN
    IF p_aliquotaII > 0 THEN
      r_baseII :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorII := ROUND ((r_baseII * p_aliquotaII / 100), 2);
    ELSE
      r_baseII := 0;
      r_valorII := 0;
    END IF;
  END IF;
  /* IOF */
  IF p_calcularIOF = 1 THEN
    IF p_aliquotaIOF > 0 THEN
      r_baseIOF := 
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorIOF := ROUND ((r_baseIOF * p_aliquotaIOF / 100), 2);
    ELSE
      r_baseIOF := 0;
      r_valorIOF := 0;
    END IF;
  END IF;
  /* IPI */
  IF p_calcularIPI = 1 THEN
    IF p_aliquotaIPI > 0 THEN
      r_baseIPI :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF;
      r_valorIPI := ROUND ((r_baseIPI * p_aliquotaIPI / 100), 2);
    ELSE
      r_baseIPI := 0;
      r_valorIPI := 0;
    END IF;
    IF p_valorAliquotaIPI > 0 THEN
      r_valorIPI := ROUND ((r_valorIPI + (p_quantidade * p_valorAliquotaIPI)), 2);
    END IF;
  END IF;
  /* Simples Nacional */
  IF p_calcularSimplesNacional = 1 THEN
    IF p_stSimplesNacional IN('101','102','201','202','900')
      AND p_creditoSimplesNacional > 0
    THEN
      r_baseCreditoSimplesNacional :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      r_valorCreditoSimplesNacional := ROUND ((r_baseCreditoSimplesNacional * p_creditoSimplesNacional / 100), 2);
    ELSE
      r_baseCreditoSimplesNacional := 0;
      r_valorCreditoSimplesNacional := 0;
    END IF;
  END IF;
  /* ICMS */
  IF p_calcularICMS = 1 THEN
      r_baseICMS := 0;
      r_valorICMSOperacao := 0;
      r_valorICMSDiferido := 0;
      r_valorICMS := 0;
      r_valorICMSDesoneracao := 0;
    IF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('40','41','50') THEN
      r_valorICMSDesoneracao := ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
              THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END
      ) * p_aliquotaICMS / 100), 2);
    ELSIF p_aliquotaICMS > 0
      AND ((p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS IN ('00','10','20','51','70','90')
        OR p_stSimplesNacional = '900')
    THEN
      r_baseICMS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      IF p_prod_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMS = '1' OR p_modalidadeBaseCalcICMS = '2' AND r_baseICMS > p_quantidade * p_prod_precoPautaTabelado) THEN
        r_baseICMS := ROUND ((p_quantidade * p_prod_precoPautaTabelado), 2);
      END IF;
      r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
      IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('20','70','90') OR p_stSimplesNacional = '900') AND p_reducaoBaseICMS > 0 THEN
        r_valorICMSDesoneracao := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
        r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_valorICMSDesoneracao := r_valorICMSDesoneracao - r_valorICMS;
      ELSE
        IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' AND p_reducaoBaseICMS > 0 AND p_reducaoBaseICMS <> p_diferimentoICMS THEN
          r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
          r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        END IF;
        r_valorICMSDesoneracao := 0;
      END IF;
      IF (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '51'
      THEN
        r_valorICMSOperacao := r_valorICMS;
        r_valorICMSDiferido := ROUND ((r_valorICMSOperacao * p_diferimentoICMS / 100), 2);
        r_valorICMS := r_valorICMSOperacao - r_valorICMSDiferido;
        IF r_valorICMS <= 0 THEN
          IF p_cfop IN (5124, 6124) THEN
            r_baseICMS := 0;
          END IF;
          r_valorICMS := 0;
        END IF;
      ELSE
        r_valorICMSOperacao := 0;
        r_valorICMSDiferido := 0;
      END IF;
    END IF;
  END IF;
  /* ICMS ST */
  IF p_calcularICMSST = 1 THEN
    IF (p_stSimplesNacional IS NULL
      OR p_stSimplesNacional = '   ')
    AND (p_stICMS IN ('10','30','70')
      OR p_stICMS = '90'
      AND p_aliquotaICMSST > 0)
    OR p_stSimplesNacional IN ('201','202')
    OR p_stSimplesNacional = '900'
    AND p_aliquotaICMSST > 0
    THEN
      r_baseICMSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      IF p_prod_precoPautaTabelado > 0
        AND (p_modalidadeBaseCalcICMSST = '5'
          OR p_modalidadeBaseCalcICMSST = '0'
          AND r_baseICMSST > p_quantidade * p_prod_precoPautaTabelado)
        AND ((p_stSimplesNacional IS NULL
            OR p_stSimplesNacional = '   ')
          AND p_stICMS IN ('10','30','70','90')
          OR p_stSimplesNacional IN ('201','202','900'))
      THEN
        r_baseICMSST := ROUND ((p_quantidade * p_prod_precoPautaTabelado), 2);
      END IF;
      IF p_modalidadeBaseCalcICMSST = '4'
        OR (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '60'
        OR p_stSimplesNacional = '500'
      THEN
        r_baseICMSST := ROUND ((r_baseICMSST * (1 + p_margemValorAdicionadoST / 100)), 2);
      END IF;
      r_baseICMSST := ROUND ((r_baseICMSST * (1 - p_reducaoBaseST / 100)), 2);
      r_valorICMSST := ROUND (((r_baseICMSST * p_aliquotaICMSST / 100) - r_valorICMS), 2);
      IF r_valorICMSST <= 0 THEN
        r_baseICMSST := 0;
        r_valorICMSST := 0;
      END IF;
    ELSE
      r_baseICMSST := 0;
      r_valorICMSST := 0;
    END IF;
  END IF;
  /* Busca dados apenas quando precisa. */
  v_baseICMSSTAnteriormente := 0;
  v_valorICMSSTAnteriormente := 0;
  v_valorICMSProprioSubstituto := 0;
  v_baseFCPSTAnteriormente := 0;
  v_valorFCPSTAnteriormente := 0;
  IF (p_calcularICMSSTAnterEfetivo = 1
      OR p_calcularFCP = 1) 
    AND ((p_stSimplesNacional IS NULL
        OR p_stSimplesNacional = '   ')
      AND p_stICMS='60'
      OR p_stSimplesNacional='500') 
    AND p_cab_indicadorConsumidorFinal = '0' 
    AND (p_cab_entradaSaida = 'S'
      OR p_cfop IN (1201,1202,1203,1204,1208,1209,1410,1411,1503,1504,1505,1506,1553,1660,1661,1662,1918,1919)
      OR p_cfop IN (2201,2202,2203,2204,2208,2209,2410,2411,2503,2504,2505,2506,2553,2660,2661,2662,2918,2919)
      OR p_cfop IN (3201,3202,3211,3503,3553))
  THEN
    ADD_BUSCA_ICMS_ST_ANTERIOR (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataEntradaSaida,
      p_gradeProduto,
      p_personalizacao,
      p_quantidade,
      p_calcularICMSSTAnterEfetivo,
      p_calcularFCP,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente);
  END IF;
  /* ICMS ST Retido Anteriormente / Efetivo */
  IF p_calcularICMSSTAnterEfetivo = 1 THEN
    r_baseICMSSTAnteriormente := v_baseICMSSTAnteriormente;
    r_valorICMSSTAnteriormente := v_valorICMSSTAnteriormente;
    r_valorICMSProprioSubstituto := v_valorICMSProprioSubstituto;
    IF ((p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '60'
        OR p_stSimplesNacional = '500')
      AND p_aliquotaICMSEfetivo <> 0
    THEN
      r_baseICMSEfetivo :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      r_baseICMSEfetivo := ROUND ((r_baseICMSEfetivo * (1 - p_reducaoBaseICMSEfetivo / 100)), 2);
      r_valorICMSEfetivo := ROUND ((r_baseICMSEfetivo * p_aliquotaICMSEfetivo / 100), 2);
    ELSE
      r_baseICMSEfetivo := 0;
      r_valorICMSEfetivo := 0;
    END IF;
  END IF;
  /* ICMS Escrituracao */
  IF p_calcularICMSEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    THEN
      IF p_cab_nfFornecedor = 1
        AND p_stICMSEscrituracao = '51'
        AND p_diferimentoICMSEscrituracao <> 0
        AND p_diferimentoICMSEscrituracao <> p_reducaoBaseICMSEscrituracao
      THEN
        r_baseICMSEscrituracao := ROUND ((r_baseICMS * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
      ELSE
        r_baseICMSEscrituracao := r_baseICMS;
      END IF;
      r_valorICMSEscrituracao := r_valorICMS;
      r_valorICMSDesonEscrituracao := r_valorICMS;
    ELSE
      r_baseICMSEscrituracao := 0;
      r_valorICMSEscrituracao := 0;
      r_valorICMSDesonEscrituracao := 0;
      IF p_aliquotaICMSEscrituracao > 0
        AND p_stICMSEscrituracao IN ('40','41','50')
      THEN
        r_valorICMSDesonEscrituracao := ROUND (((
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END) * p_aliquotaICMSEscrituracao / 100), 2);
      ELSIF p_aliquotaICMSEscrituracao > 0
        AND p_stICMSEscrituracao IN ('00','10','20','51','70','90')
      THEN
        r_baseICMSEscrituracao :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        IF p_stICMSEscrituracao IN ('20','70','90')
          AND p_reducaoBaseICMSEscrituracao > 0
        THEN
          r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
        ELSIF p_stICMSEscrituracao = '51'
          AND p_reducaoBaseICMSEscrituracao > 0
          AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMSEscrituracao
        THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
            r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
            r_valorICMSDesonEscrituracao := 0;
        ELSE
          r_valorICMSDesonEscrituracao := 0;
        END IF;
        IF p_stICMSEscrituracao = '51' THEN
          r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMSEscrituracao / 100), 2);
          IF p_cab_nfFornecedor = 1 THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
          END IF;
          IF r_valorICMSEscrituracao < 0 THEN
            r_valorICMSEscrituracao := 0;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
  /* ICMS ST Escrituracao */
  IF p_calcularICMSSTEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
      AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
      AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
      AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
    THEN
      r_baseICMSSTEscrituracao := r_baseICMSST;
      r_valorICMSSTEscrituracao := r_valorICMSST;
    ELSIF p_stICMSEscrituracao IN ('10','30','70')
      OR p_stICMSEscrituracao = '90'
      AND p_aliquotaICMSSTEscrituracao > 0
    THEN
      r_baseICMSSTEscrituracao := ROUND ((ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END
      ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
      r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
      IF r_valorICMSSTEscrituracao <= 0 THEN
        r_baseICMSSTEscrituracao := 0;
        r_valorICMSSTEscrituracao := 0;
      END IF;
    ELSE
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  END IF;
  /* DIFAL */
  IF p_calcularDIFAL = 1 THEN
    IF p_cab_localDestinoOperacao = '2'
      AND (p_cab_entradaSaida = 'E'
        OR p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9')
      AND NOT(p_stICMS IN('40','41'))
      AND (p_stSimplesNacional IS NOT NULL
        OR NOT(p_stSimplesNacional IN('103','300','400')))
      AND NOT(p_cfop IN(6552,6922,6929))
      AND p_aliquotaICMSInterestadual <> 0
      AND p_partilhaICMSInterestadual <> 0
    THEN
      IF (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND r_baseICMS = 0
        OR p_stSimplesNacional IS NOT NULL
        AND p_stSimplesNacional <> '   '
        AND r_baseCreditoSimplesNacional = 0
      THEN
        r_baseICMSUFDestinatario :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      ELSE
        r_baseICMSUFDestinatario := CASE WHEN (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') THEN r_baseICMS ELSE r_baseCreditoSimplesNacional END;
      END IF;
      r_baseICMSUFRemetente := r_baseICMSUFDestinatario;
      IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
        r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
        r_valorICMSUFRemetente    := ROUND ((r_baseICMSUFRemetente    * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
      ELSE
        r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
        r_valorICMSUFRemetente    := ROUND ((r_baseICMSUFRemetente    * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
      END IF;
    ELSE
      r_baseICMSUFDestinatario := 0;
      r_valorICMSUFDestinatario := 0;
      r_baseICMSUFRemetente := 0;
      r_valorICMSUFRemetente := 0;
    END IF;
  END IF;
  /* Fundo de Combate a Pobreza */
  IF p_calcularFCP = 1 THEN
    IF r_baseCreditoSimplesNacional <> 0
      AND p_aliquotaFCP <> 0
    THEN
      r_baseFCP := r_baseCreditoSimplesNacional;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSIF (p_stSimplesNacional IS NULL
        OR p_stSimplesNacional = '   ')
      AND p_stICMS IN ('00','20','51','90')
      AND r_baseICMS <> 0
      AND p_aliquotaFCP <> 0
    THEN
      r_baseFCP := r_baseICMS;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSE
      r_baseFCP := 0;
      r_valorFCP := 0;
    END IF;
    /* Fundo de Combate a Pobreza ST */
    IF r_baseICMSST <> 0 AND p_aliquotaFCPST <> 0 THEN
      r_baseFCPST := r_baseICMSST;
      r_valorFCPST := ROUND ((r_baseFCPST * p_aliquotaFCPST / 100), 2);
    ELSE
      r_baseFCPST := 0;
      r_valorFCPST := 0;
    END IF;
    /* Fundo de Combate a Pobreza ICMS ST Retido Anteriormente */
    r_baseFCPSTAnteriormente := v_baseFCPSTAnteriormente;
    r_valorFCPSTAnteriormente := v_valorFCPSTAnteriormente;
    /* Fundo de Combate a Pobreza DIFAL */
    IF p_cab_localDestinoOperacao = '2'
      AND (p_cab_entradaSaida = 'E'
        OR p_cab_indicadorConsumidorFinal = '1'
        OR p_pess_indicadorInscricaoEstad = '9')
      AND r_baseICMSUFDestinatario <> 0
      AND p_aliquotaFCPUFDestinatario <> 0
    THEN
      r_baseFCPUFDestinatario := r_baseICMSUFDestinatario;
      r_valorFCPUFDestinatario := ROUND ((r_baseFCPUFDestinatario * p_aliquotaFCPUFDestinatario / 100), 2);
    ELSE
      r_baseFCPUFDestinatario := 0;
      r_valorFCPUFDestinatario := 0;
    END IF;
  END IF;
  /* PIS */
  IF p_calcularPIS = 1 THEN
    IF p_aliquotaPIS > 0 THEN
      r_basePIS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPIS := ROUND ((r_basePIS * p_aliquotaPIS / 100), 2);
    ELSE
      r_basePIS := 0;
      r_valorPIS := 0;
    END IF;
    IF p_valorAliquotaPIS > 0 THEN
      r_valorPIS := ROUND ((r_valorPIS + (p_quantidade * p_valorAliquotaPIS)), 2);
    END IF;
  END IF;
  /* PIS ST */
  IF p_calcularPISST = 1 THEN
    IF p_aliquotaPISST > 0 THEN
      r_basePISST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPISST := ROUND ((r_basePISST * p_aliquotaPISST / 100), 2);
    ELSE
      r_basePISST := 0;
      r_valorPISST := 0;
    END IF;
    IF p_valorAliquotaPISST > 0 THEN
      r_valorPISST := ROUND ((r_valorPISST + (p_quantidade * p_valorAliquotaPISST)), 2);
    END IF;
  END IF;
  /* COFINS */
  IF p_calcularCOFINS = 1 THEN
    IF p_aliquotaCOFINS > 0 THEN
      r_baseCOFINS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINS := ROUND ((r_baseCOFINS * p_aliquotaCOFINS / 100), 2);
    ELSE
      r_baseCOFINS := 0;
      r_valorCOFINS := 0;
    END IF;
    IF p_valorAliquotaCOFINS > 0 THEN
      r_valorCOFINS := ROUND ((r_valorCOFINS + (p_quantidade * p_valorAliquotaCOFINS)), 2);
    END IF;
  END IF;
  /* COFINS ST */
  IF p_calcularCOFINSST = 1 THEN
    IF p_aliquotaCOFINSST > 0 THEN
      r_baseCOFINSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINSST := ROUND ((r_baseCOFINSST * p_aliquotaCOFINSST / 100), 2);
    ELSE
      r_baseCOFINSST := 0;
      r_valorCOFINSST := 0;
    END IF;
    IF p_valorAliquotaCOFINSST > 0 THEN
      r_valorCOFINSST := ROUND ((r_valorCOFINSST + (p_quantidade * p_valorAliquotaCOFINSST)), 2);
    END IF;
  END IF;
  /* Impostos Estimados */
  IF p_calcularImpostosEstimados = 1 THEN
    IF p_aliquotaEstImpFederais > 0 OR p_aliquotaEstImpEstaduais > 0 OR p_aliquotaEstImpMunicipais > 0 THEN
      r_baseEstimadaImpostos :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal;
      r_valorEstimadoImpFederais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpFederais / 100), 2);
      r_valorEstimadoImpEstaduais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpEstaduais / 100), 2);
      r_valorEstimadoImpMunicipais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpMunicipais / 100), 2);
    ELSE
      r_baseEstimadaImpostos := 0;
      r_valorEstimadoImpFederais := 0;
      r_valorEstimadoImpEstaduais := 0;
      r_valorEstimadoImpMunicipais := 0;
    END IF;
  END IF;
END ADD_CALCULA_IMPOSTOS_ITEM;

/

create or replace PROCEDURE ADD_CALCULA_CUSTO_CMV (
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSSTEscrit       IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_item_valorDescCustoOpItem    IN NUMBER,
  p_item_valorDescCustoOpGeral   IN NUMBER,
  p_item_valorAcrescCustoOpItem  IN NUMBER,
  p_item_valorAcrescCustoOpGeral IN NUMBER,
  p_item_valorAcrescExtempTotal  IN NUMBER,
  /* Retornos */
  r_item_valorDescCustoOpTotal   OUT NUMBER,
  r_item_valorAcrescCustoOpTotal OUT NUMBER,
  r_item_precoCustoOperacao      OUT NUMBER,
  r_item_valorCustoOperacao      OUT NUMBER,
  r_item_precoCMV                OUT NUMBER,
  r_item_valorCMV                OUT NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT
      COALESCE (regraEst.creditaII, regra.creditaII) creditaII,
      COALESCE (regraEst.creditaIOF, regra.creditaIOF) creditaIOF,
      COALESCE (regraEst.creditaIPI, regra.creditaIPI) creditaIPI,
      COALESCE (regraEst.creditaPIS, regra.creditaPIS) creditaPIS,
      COALESCE (regraEst.creditaPISST, regra.creditaPISST) creditaPISST,
      COALESCE (regraEst.creditaCOFINS, regra.creditaCOFINS) creditaCOFINS,
      COALESCE (regraEst.creditaCOFINSST, regra.creditaCOFINSST) creditaCOFINSST,
      COALESCE (regraEst.creditaICMSST, regra.creditaICMSST) creditaICMSST,
      COALESCE (regraEst.creditaICMS, regra.creditaICMS) creditaICMS,
      COALESCE (regraEst.creditaSN, regra.creditaSN) creditaSN
    FROM PAMODELOSDOCUMENTO modDoc
    JOIN PAREGRASFORMACAOPRECO regra
    ON regra.regraFormacaoPreco = modDoc.regraFormacaoPreco
    LEFT JOIN PAREGRAFORMACAOPRECOXEST regraEst
    ON regraEst.regraFormacaoPreco = modDoc.regraFormacaoPreco
    AND regraEst.estabelecimento = p_cab_estabelecimento
    WHERE modDoc.modeloDocumento = p_item_modeloDocumento)
  LOOP
    r_item_valorDescCustoOpTotal   := 0;
    r_item_valorAcrescCustoOpTotal := 0;
    r_item_precoCustoOperacao      := 0;
    r_item_valorCustoOperacao      := 0;
    r_item_precoCMV                := 0;
    r_item_valorCMV                := 0;
    r_item_valorDescCustoOpTotal   := p_item_valorDescCustoOpItem + p_item_valorDescCustoOpGeral;
    r_item_valorAcrescCustoOpTotal := p_item_valorAcrescCustoOpItem + p_item_valorAcrescCustoOpGeral;
    /* Custo médio */
    IF p_cab_atualizaCustoMedio = 1 THEN
      r_item_valorCustoOperacao := ROUND ((
        p_item_valorLiquidoItem
        - r_item_valorDescCustoOpTotal
        + r_item_valorAcrescCustoOpTotal
        - CASE WHEN a.creditaII = 1 THEN p_item_valorII ELSE 0 END
        - CASE WHEN a.creditaIOF = 1 THEN p_item_valorIOF ELSE 0 END
        - CASE WHEN a.creditaIPI = 1 THEN p_item_valorIPI + p_item_valorIPIDevolucao ELSE 0 END
        - CASE WHEN a.creditaPIS = 1 THEN p_item_valorPIS ELSE 0 END
        - CASE WHEN a.creditaPISST = 1 THEN p_item_valorPISST ELSE 0 END
        - CASE WHEN a.creditaCOFINS = 1 THEN p_item_valorCOFINS ELSE 0 END
        - CASE WHEN a.creditaCOFINSST = 1 THEN p_item_valorCOFINSST ELSE 0 END
        - CASE WHEN a.creditaICMSST = 1 THEN CASE WHEN p_cab_nfFornecedor = 1 AND p_item_valorICMSSTEscrit <> 0 THEN p_item_valorICMSSTEscrit ELSE p_item_valorICMSST END ELSE 0 END
        - CASE WHEN a.creditaICMS = 1 AND p_item_valorICMSST = 0 AND (p_cab_nfFornecedor = 0 OR p_item_valorICMSSTEscrit = 0) THEN p_item_valorICMS ELSE 0 END
        - CASE WHEN a.creditaSN = 1 THEN p_item_valorCreditoSimplesNac ELSE 0 END
        + p_item_valorAcrescExtempTotal), 2);
      r_item_precoCustoOperacao := CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((r_item_valorCustoOperacao / p_item_quantidade), 7) END ;
      /* Pendente - calculo do novo CMV */
      r_item_precoCMV := 0;
      r_item_valorCMV := 0;      
    ELSE
      /* Pendente - busca CMV */
      r_item_precoCustoOperacao := 0;
      r_item_valorCustoOperacao := ROUND ((p_item_quantidade * r_item_precoCustoOperacao / 100), 2);
      r_item_precoCMV := r_item_precoCustoOperacao;
      r_item_valorCMV := r_item_valorCustoOperacao;
    END IF;
  END LOOP;
END ADD_CALCULA_CUSTO_CMV;

/

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  /* Retornos */
  r_valorLiquidoSemFreteSeguro   OUT NUMBER,
  r_valorCaptacao                OUT NUMBER,
  r_valorImpostos                OUT NUMBER,
  r_precoCusto                   OUT NUMBER,
  r_valorCusto                   OUT NUMBER,
  r_valorMargem                  OUT NUMBER,
  r_percentualMargem             OUT NUMBER)
IS
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             VARCHAR(10);
  v_prod_subcategoriaProduto     NUMBER;
  v_prod_marca                   NUMBER;
  v_prod_caracteristicaA         NUMBER;
  v_prod_caracteristicaB         NUMBER;
  v_prod_caracteristicaC         NUMBER;
  v_prod_caracteristicaD         NUMBER;
  v_prod_caracteristicaE         NUMBER;
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_controleEstoque         NUMBER;
  v_subCatProd_categoriaProduto  NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(256);    
BEGIN
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    prod.controleEstoque,
    subCatProd.categoriaProduto
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_subcategoriaProduto,
    v_prod_marca,
    v_prod_caracteristicaA,
    v_prod_caracteristicaB,
    v_prod_caracteristicaC,
    v_prod_caracteristicaD,
    v_prod_caracteristicaE,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_controleEstoque,
    v_subCatProd_categoriaProduto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  r_valorLiquidoSemFreteSeguro :=
    p_item_valorLiquidoItem
    - p_item_valorFreteItem
    - p_item_valorSeguroItem
    - p_item_valorFreteGeral
    - p_item_valorSeguroGeral
    - p_item_valorAdicFreteMarTotal
    - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO (
    p_cab_prazoMedioPonderado,
    p_regMarg_taxaCapitacaoCustoFi,
    r_valorLiquidoSemFreteSeguro);
  r_valorImpostos := 0;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos := FUNC_ADD_BUSCA_IMPOSTOS_MARGEM (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        p_cab_estabelecimento,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_modeloDocumento),
      p_cab_estabelecimento,
      p_munEndEst_uf,
      p_munEndPess_uf,
      p_item_quantidade,
      p_item_valorRetIRRF,
      p_item_valorRetCSLL,
      p_item_valorII,
      p_item_valorIOF,
      p_item_valorIPI,
      p_item_valorIPIDevolucao,
      p_item_valorPIS,
      p_item_valorPISST,
      p_item_valorCOFINS,
      p_item_valorCOFINSST,
      p_item_valorCreditoSimplesNac,
      p_item_valorICMSOperacao,
      p_item_valorICMSDiferido,
      p_item_valorICMS,
      p_item_valorICMSDesoneracao,
      p_item_valorICMSST,
      p_item_valorICMSUFDestinatario,
      p_item_valorICMSUFRemetente,
      p_item_valorFCP,
      p_item_valorFCPST,
      p_item_valorFCPSTAnteriormente,
      p_item_valorFCPUFDestinatario,
      r_valorLiquidoSemFreteSeguro,
      v_gradProd_produto,
      v_prod_subcategoriaProduto,
      v_prod_marca,
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_idNcm,
      v_prod_listaServicos,
      v_subCatProd_categoriaProduto);
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada, -- p_config_64_casasDecSaidas
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0, -- p_perfilUsuarioLogado
    0, -- p_usuarioLogado
    'E', -- p_cab_entradaSaida
    0, -- p_cab_devolucaoAnulacaoRetorno
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900', 'DD/MM/YYYY'), -- p_cab_dataPrecoInicial
    p_cab_dataEmissao, -- p_cab_dataPrecoFinal
    0, -- p_cab_pessoa
    ' ', -- p_cab_projeto
    0, -- p_modDoc_capituloNaturezaFisc
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf, -- p_endPessEst_uf
    p_munEndEst_uf, -- p_endPess_uf
    0, -- p_item_vendedor
    p_item_idFormulaTinta,
    p_item_personalizacao,
    0, -- p_item_localEstoque,
    0, -- p_item_pessoaParticipante,
    p_item_quantidade,
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    '0', -- v_locEst_indicadorPropPosseIt,
    0, -- p_manterPreco
    0, -- p_precoSugestaoAPrazoOriginal
    0, -- p_precoSugestaoAVistaOriginal
    ' ', -- p_tipoPreco
    ' ', -- p_tabelaPreco
    /* Retornos */
    v_auxVarchar, -- r_tipoPreco
    v_auxVarchar, -- r_tabelaPreco
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  r_valorCusto := ROUND ((p_item_quantidade * r_precoCusto), 2);
  r_valorMargem :=
    r_valorLiquidoSemFreteSeguro
    - r_valorCaptacao
    - r_valorImpostos
    - r_valorCusto;
  r_percentualMargem :=
    CASE
      WHEN r_valorLiquidoSemFreteSeguro = 0
      THEN 0
      ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8)
    END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_BUSCA_REGRA_DESCONTO_ITEM (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_valorProdutoServicoBrut IN NUMBER,
  p_item_valorProdutoServico     IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
  v_pessoa              NUMBER;
  v_indicadorPessoa     CHAR(1);
  v_idade               NUMBER;
  v_uf                  CHAR(2);
  v_produto             NUMBER;
  v_cor                 NUMBER;
  v_tamanho             VARCHAR2(10);
  v_categoriaProduto    NUMBER;
  v_subcategoriaProduto NUMBER;
  v_marca               NUMBER;
  v_caracteristicaA     NUMBER;
  v_caracteristicaB     NUMBER;
  v_caracteristicaC     NUMBER;
  v_caracteristicaD     NUMBER;
  v_caracteristicaE     NUMBER;
  v_idNcm               NUMBER;
  v_listaServicos       NUMBER;
  v_baseDesconto        NUMBER;
BEGIN
  SELECT
    pess.pessoa,
    pess.indicadorPessoa,
    CASE
      WHEN pess.nascimentoFundacao IS NULL
        OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
      THEN 0
      ELSE EXTRACT(YEAR FROM SYSDATE)
        - EXTRACT(YEAR FROM pess.nascimentoFundacao)
        - CASE
            WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
            THEN 1
            ELSE 0
          END
    END idade,
    COALESCE ((
      CASE
        WHEN pess.pessoa = 0
        THEN (
          SELECT MAX(munPess.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endPess
          ON endPess.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endPess.ativo = 1
          AND endPess.principal = 1)
        ELSE COALESCE ((
          SELECT MAX(munPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE endPess.pessoa = pess.pessoa
          AND endPess.ativo = 1
          AND endPess.principal = 1),(
          SELECT MAX(munPess.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endPess
          ON endPess.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endPess.ativo = 1
          AND endPess.principal = 1))
      END),'  ') uf
  INTO
    v_pessoa,
    v_indicadorPessoa,
    v_idade,
    v_uf
  FROM CAPESSOAS pess
  WHERE pess.pessoa =
    CASE
      WHEN p_orc_pessoa = 0
        OR p_config_227_manterPessoaOrcam = 0
      THEN p_cab_pessoa
      ELSE p_orc_pessoa
    END;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    subCatProd.categoriaProduto,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    CASE
      WHEN modDoc.diminuiDescontoPrUnit = 1
        OR modDoc.somaAcrescimosPrUnit = 1
        OR modDoc.somaFreteSeguroPrUnit = 1
        OR p_cab_entradaSaida =
          CASE
            WHEN p_cab_devolucaoAnulacaoRetorno = 1
            THEN 'E'
            ELSE 'S'
          END
        AND EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPres
          WHERE compPres.produto = gradProd.produto
          AND compPres.ativo = 1)
      THEN p_item_valorProdutoServicoBrut
      ELSE p_item_valorProdutoServico
    END baseDesconto
  INTO
    v_produto,
    v_cor,
    v_tamanho,
    v_categoriaProduto,
    v_subcategoriaProduto,
    v_marca,
    v_caracteristicaA,
    v_caracteristicaB,
    v_caracteristicaC,
    v_caracteristicaD,
    v_caracteristicaE,
    v_idNcm,
    v_listaServicos,
    v_baseDesconto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = p_item_modeloDocumento
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN v_baseDesconto <= 0
        THEN 0
        WHEN SUM (
            CASE
              WHEN a.valorDescontoSugestao < 0
              THEN 0
              ELSE a.valorDescontoSugestao
            END) >= v_baseDesconto
        THEN 100
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM(a.possuiRegra) > 1
        THEN
          CASE
            WHEN v_baseDesconto <= 0
            THEN 0
            ELSE 100 * COALESCE (SUM (
              CASE
                WHEN a.valorDescontoSugestao < 0
                THEN 0
                ELSE a.valorDescontoSugestao
              END), 0) / v_baseDesconto
          END
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND((
      CASE
        WHEN v_baseDesconto <= 0
        THEN 0
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= v_baseDesconto
        THEN v_baseDesconto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END), 2), 0) valorDescontoSugestao,
    COALESCE (ROUND((
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= v_baseDesconto
        THEN v_baseDesconto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END), 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_percentualDescontoSugestao,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.tipoRegraDescontoMargem,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * a.valorSugestao / v_baseDesconto
            END
          -- Preço unitário fixo
          WHEN 3
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * (v_baseDesconto - ROUND (p_item_quantidade * a.valorMaximoSemSenha, 2)) / v_baseDesconto
            END
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN v_idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * v_idade / v_baseDesconto
            END
          -- Preço total fixado
          WHEN 6
          THEN 100
          ELSE 0
        END), 8) percentualDescontoSugestao,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN v_baseDesconto * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao
           -- Preço unitário fixo
          WHEN 3
          THEN v_baseDesconto - ROUND (p_item_quantidade * a.valorSugestao, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN v_baseDesconto * v_idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN v_idade
          -- Preço total fixado
          WHEN 6
          THEN v_baseDesconto
          ELSE 0
        END), 2) valorDescontoSugestao,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN v_baseDesconto * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha
          -- Preço unitário fixo
          WHEN 3
          THEN v_baseDesconto - ROUND (p_item_quantidade * a.valorMaximoSemSenha, 2)
          WHEN 4
          THEN v_baseDesconto * v_idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN v_idade
          -- Preço total fixado
          WHEN 6
          THEN v_baseDesconto
          ELSE 0
        END), 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY a.ordenacao, a.regraDescontoMargem) ordenacao,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha
      FROM PAREGRASDESCONTOSMARGEM a
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = a.filtroCabecalho
      WHERE a.regraDescontoMargem > 0
      AND a.ativo = 1
      AND a.dataValidadeInicial <= TRUNC(SYSDATE)
      AND a.dataValidadeFinal >= TRUNC(SYSDATE)
      AND a.cabecalhoItemPagamento = 'I'
      AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
      -- Filtro Cabeçalho
      AND (a.filtroCabecalho = 0
        OR (filtroCab.filtrarEstabelecimentos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXESTABELEC filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.estabelecimento = p_cab_estabelecimento
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarUfs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXUFS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.uf = v_uf
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarPessoas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXPESSOAS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.pessoa = v_pessoa
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarPerfisUsuario = 0
          AND filtroCab.filtrarUsuarios = 0
          OR filtroCab.filtrarPerfisUsuario = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROCABECXPERFISUSUAR filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
            AND filtroCabX.ativo = 1)
          OR filtroCab.filtrarUsuarios = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROCABECXUSUARIOS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.usuario = p_usuarioLogado
            AND filtroCabX.ativo = 1))
        AND (filtroCab.indicadorPessoa = ' '
          OR filtroCab.indicadorPessoa = v_indicadorPessoa)
        AND (filtroCab.colaborador = ' '
          OR filtroCab.colaborador = 'N'
          AND (v_pessoa = 0
            OR NOT (EXISTS (
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = v_pessoa
              AND colab.ativo = 1 )))
          OR filtroCab.colaborador = 'S'
          AND v_pessoa <> 0
          AND EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = v_pessoa
            AND colab.ativo = 1)))
      -- Tabela de Preço
      AND (a.filtrarTabelaPreco = 0
        OR EXISTS (
          SELECT 1
          FROM PAREGRADESCMARGXTABELASPR x
          WHERE x.regraDescontoMargem = a.regraDescontoMargem
          AND x.tabelaPreco = p_item_tabelaPreco
          AND x.ativo = 1))
      -- Filtro Produto
      AND (
        SELECT COUNT(1)
        FROM PAREGRADESCMARGXFILTPROD b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem
        AND b.filtroProduto > 0
        AND b.ativo = 1) = (
        SELECT COUNT(1)
        FROM PAREGRADESCMARGXFILTPROD b
        JOIN PAFILTROSPRODUTO c
        ON c.filtroProduto = b.filtroProduto
        WHERE b.regraDescontoMargem = a.regraDescontoMargem
        AND b.filtroProduto > 0
        AND b.ativo = 1
        AND (c.filtrarVendedores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXVENDEDOR x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.vendedor = p_item_vendedor
          AND x.ativo = 1))
        AND (c.filtrarLocaisEstoque = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLOCAISEST x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.localEstoque = p_item_localEstoque
          AND x.ativo = 1))
        AND (c.filtrarPersonalizacoes = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPERSONAL x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.personalizacao = p_item_personalizacao
          AND x.ativo = 1))
        AND (c.filtrarProdutos = 0
          AND c.filtrarCategoriasProdutos = 0
          AND c.filtrarSubcategoriasProdutos = 0
          AND c.filtrarMarcas = 0
          AND c.filtrarCaracteristicasA = 0
          AND c.filtrarCaracteristicasB = 0
          AND c.filtrarCaracteristicasC = 0
          AND c.filtrarCaracteristicasD = 0
          AND c.filtrarCaracteristicasE = 0
          AND c.filtrarCores = 0
          AND c.filtrarTamanhos = 0
          AND c.filtrarNCMs = 0
          AND c.filtrarListasServicos = 0
          OR c.filtrarProdutos = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXPRODUTOS x
            WHERE x.filtroProduto = b.filtroProduto
            AND x.produto = v_produto
            AND x.ativo = 1)
          OR (c.filtrarCategoriasProdutos = 1
            OR c.filtrarSubcategoriasProdutos = 1
            OR c.filtrarMarcas = 1
            OR c.filtrarCaracteristicasA = 1
            OR c.filtrarCaracteristicasB = 1
            OR c.filtrarCaracteristicasC = 1
            OR c.filtrarCaracteristicasD = 1
            OR c.filtrarCaracteristicasE = 1
            OR c.filtrarCores = 1
            OR c.filtrarTamanhos = 1
            OR c.filtrarNCMs = 1
            OR c.filtrarListasServicos = 1)
          AND (c.filtrarCategoriasProdutos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCATEGPROD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.categoriaProduto = v_categoriaProduto
              AND x.ativo = 1))
          AND (c.filtrarSubcategoriasProdutos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXSUBCAPROD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.subcategoriaProduto = v_subcategoriaProduto
              AND x.ativo = 1))
          AND (c.filtrarMarcas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXMARCAS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.marca = v_marca
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasA = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERA x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaA = v_caracteristicaA
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasB = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERB x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaB = v_caracteristicaB
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasC = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERC x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaC = v_caracteristicaC
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasD = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaD = v_caracteristicaD
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasE = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERE x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaE = v_caracteristicaE
              AND x.ativo = 1))
          AND (c.filtrarCores = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCORES x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.cor = v_cor
              AND x.ativo = 1))
          AND (c.filtrarTamanhos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXTAMANHOS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.tamanho = v_tamanho
              AND x.ativo = 1))
          AND (c.filtrarNCMs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXNCMS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.idNcm = v_idNcm
              AND x.ativo = 1))
          AND (c.filtrarListasServicos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXLISTASSE x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.listaServicos = v_listaServicos
              AND x.ativo = 1))
          AND p_item_quantidade >= c.quantidadeMinima
          AND (c.quantidadeMaxima = 0
            OR p_item_quantidade <= c.quantidadeMaxima)))) a
    WHERE a.ordenacao = 1) a;
END ADD_BUSCA_REGRA_DESCONTO_ITEM;

/

create or replace PROCEDURE ADD_TEMPMARGEMCONTRIB_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_contadorSessao               IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_id                      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER)
IS
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  ADD_CALCULA_MARGEM_CONTRIB (
    p_usuarioLogado,
    p_perfilUsuarioLogado,
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataEmissao,
    p_cab_prazoMedioPonderado,
    p_munEndEst_uf,
    p_munEndPess_uf,
    p_item_modeloDocumento,
    p_item_gradeProduto,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_quantidade,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorRetIRRF,
    p_item_valorRetCSLL,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    /* Retornos */
    v_item_valorLiquidoSemFreteSeg,
    v_item_valorCaptacao,
    v_item_valorImpostos,
    v_item_precoCusto,
    v_item_valorCusto,
    v_item_valorMargem,
    v_item_percentualMargem);
  IF p_regMarg_exibImagemMargemItem = 1
    AND p_regMarg_regraImagemItem <> 0
  THEN
    v_item_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemItem,
        v_item_percentualMargem);
  ELSE
    v_item_imagemMargem := ' ';
  END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_contadorSessao               contadorSessao,
      p_item_id                      id,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.contadorSessao = b.contadorSessao
      AND a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    contadorSessao,
    id,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.id,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
END ADD_TEMPMARGEMCONTRIB_GRAVA;

/

create or replace PROCEDURE ADD_TEMPCONTABIL_GERA_TEMP (
  p_sessaoClient           IN VARCHAR,
  p_contadorSessao         IN NUMERIC,
  p_dataInicial            IN DATE,
  p_dataFinal              IN DATE,
  p_estabelecimento        IN NUMERIC,
  p_situacaoContabilizacao IN CHAR)
IS
  v_idRegraContabilizacao   NUMBER;
  v_idPlanoContaContabil    NUMBER;
  v_tipoAglutinacaoContabil NUMBER;
  v_valor                   NUMBER;
  v_residuo                 NUMBER;
  v_saldo                   NUMBER;
  v_idCriar                 NUMBER;
  v_idAtualizar             NUMBER;
  v_quebra                  VARCHAR (15);
  v_fato                    NUMBER;
  v_sequencia               NUMBER;
BEGIN
  DELETE TEMPCONTABILSINTETICO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  DELETE TEMPCONTABILANALITICO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  IF p_situacaoContabilizacao = 'C' THEN
    -- Início Gera TEMPCONTABILSINTETICO
    v_idCriar := 0;
    FOR a IN (
      SELECT
        idContabil,
        estabelecimento,
        data,
        pessoa,
        documento,
        fatoContabil,
        ordenacao,
        debitoCredito,
        idContaContabil,
        valor,
        historicoContabil,
        complemento,
        historicoMontado,
        origemContabil
      FROM MOCONTABEIS
      WHERE idContabil > 0
      AND data BETWEEN TO_DATE (
        CASE
          WHEN p_dataInicial IS NULL
          THEN '00/00/0000'
          ELSE TO_CHAR (p_dataInicial, 'DD/MM/YYYY')
        END || ' 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
      AND TO_DATE (
        CASE
          WHEN p_dataFinal IS NULL
            OR TO_CHAR (p_dataFinal, 'DD/MM/YYYY') = '00/00/0000'
          THEN '31/12/2500'
          ELSE TO_CHAR (p_dataFinal, 'DD/MM/YYYY')
        END || ' 23:59:59', 'DD/MM/YYYY HH24:MI:SS')
      AND estabelecimento = p_estabelecimento
      ORDER BY
        fatoContabil,
        ordenacao)
    LOOP
      IF a.debitoCredito = 'D' THEN
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = '1' || LPAD (a.fatoContabil, 14, '0')
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.debitar = 0;
      ELSE
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = '1' || LPAD (a.fatoContabil, 14, '0')
        AND b.valor = a.valor
        AND b.historicoContabil = a.historicoContabil
        AND b.creditar = 0;
      END IF;
      IF v_idAtualizar = 0 THEN
        v_idCriar := v_idCriar + 1;
        INSERT INTO TEMPCONTABILSINTETICO (
          sessaoClient,
          contadorSessao,
          id,
          quebra,
          fato,
          sequencia,
          selecionado,
          estabelecimento,
          estabelecimentoCodigoDescricao,
          idPlanoContaContabil,
          data,
          pessoa,
          pessoaCodigoDescricao,
          documento,
          fatoContabil,
          debitar,
          debitoIdContabil,
          debitoIdContaContabil,
          debitoReduzido,
          debitoCodigoDescricao,
          creditar,
          creditoIdContabil,
          creditoIdContaContabil,
          creditoReduzido,
          creditoCodigoDescricao,
          valor,
          historicoContabil,
          complemento,
          historicoMontado,
          origemContabil,
          idDocumento,
          documentoAberto,
          erroDebito,
          erroCredito,
          erroHistorico,
          erroValor,
          erroGeral)
        VALUES (
          p_sessaoClient,
          p_contadorSessao,
          v_idCriar, -- id
          '1' || LPAD (a.fatoContabil, 14, '0'),
          0, -- fato
          0, -- sequencia
          0, -- selecionado
          a.estabelecimento,
          ' ', -- estabelecimentoCodigoDescricao
          0, -- idPlanoContaContabil
          a.data,
          a.pessoa,
          ' ', -- pessoaCodigoDescricao
          a.documento,
          a.fatoContabil,
          CASE
            WHEN a.debitoCredito = 'D'
            THEN 1
            ELSE 0
          END, -- debitar
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContabil
            ELSE 0
          END, -- debitoIdContabil
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContaContabil
            ELSE 0
          END, -- debitoIdContaContabil
          0, -- debitoReduzido
          ' ', -- debitoCodigoDescricao
          CASE
            WHEN a.debitoCredito = 'C'
            THEN 1
            ELSE 0
          END, -- creditar,
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContabil
            ELSE 0
          END, -- creditoIdContabil
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContaContabil
            ELSE 0
          END, -- creditoIdContaContabil
          0, -- creditoReduzido
          ' ', -- creditoCodigoDescricao
          a.valor,
          a.historicoContabil,
          a.complemento,
          a.historicoMontado,
          a.origemContabil,
          0, -- idDocumento
          0, -- documentoAberto
          ' ',
          ' ',
          ' ',
          ' ',
          ' ');
      ELSIF a.debitoCredito = 'D' THEN
        UPDATE TEMPCONTABILSINTETICO b SET
          b.debitoIdContabil = a.idContabil,
          b.debitar = 1,
          b.debitoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      ELSE
        UPDATE TEMPCONTABILSINTETICO b SET
          b.creditoIdContabil = a.idContabil,
          b.creditar = 1,
          b.creditoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      END IF;
    END LOOP;
    -- Fim Gera TEMPCONTABILSINTETICO
  ELSE 
    v_idCriar := 0;
    -- Início Gera TEMPCONTABILANALITICO
    FOR a IN (
      SELECT fatoContabil
      FROM MOFATOSCONTABEIS
      WHERE fatoContabil > 0
      AND data BETWEEN TO_DATE (
        CASE
          WHEN p_dataInicial IS NULL
          THEN '00/00/0000'
          ELSE TO_CHAR (p_dataInicial, 'DD/MM/YYYY')
        END || ' 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
      AND TO_DATE (
        CASE
          WHEN p_dataFinal IS NULL
            OR TO_CHAR (p_dataFinal, 'DD/MM/YYYY') = '00/00/0000'
          THEN '31/12/2500'
          ELSE TO_CHAR (p_dataFinal, 'DD/MM/YYYY')
        END || ' 23:59:59', 'DD/MM/YYYY HH24:MI:SS')
      AND estabelecimento = p_estabelecimento
      AND situacaoContabilizacao = p_situacaoContabilizacao)
    LOOP
      FOR b IN (
        SELECT
          'MODOCFISCALXITENS' tabelaSistema,
          b.idItemDocFiscal idTabelaSistema,
          100 origemContabil,
          b.idDocumentoFiscal idDocumento,
          cab.dataEmissao data,
          cab.fatoContabil,
          cab.estabelecimento,
          cab.pessoa,
          TO_CHAR (cab.documentoFiscal) documento,
          COALESCE (SUBSTR (RTRIM (
            COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
            WITHIN GROUP (ORDER BY infCompl.sequencia)
            FROM MODOCFISCALXINFOCOMPLEMEN infCompl
            WHERE infCompl.idDocumentoFiscal = b.idDocumentoFiscal
            AND infCompl.geradoPeloSistema = 0
            AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 120),' ') complemento,
          CASE
            WHEN cab.situacaoDocumentoFiscal < 23
            THEN 1
            ELSE 0
          END documentoAberto,
          gradProd.produto,
          cab.contaFinanceira,
          0 carteiraFinanceira,
          b.valorLiquidoItem valorContabil,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorAcrescimoExtempTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.valorICMSST,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.valorICMSEfetivo,
          b.valorICMSUFDestinatario,
          b.valorICMSUFRemetente,
          b.valorFCP,
          b.valorFCPST,
          b.valorFCPSTAnteriormente,
          b.valorFCPUFDestinatario,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorCustoOperacao,
          b.valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MODOCFISCALXITENS b
        JOIN MODOCUMENTOSFISCAIS cab
        ON cab.idDocumentoFiscal = b.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = cab.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        WHERE cab.fatoContabil = a.fatoContabil
        AND b.cancelado = 0
        AND cab.situacaoDocumentoFiscal < 24
        UNION ALL
