SET DEFINE OFF;

DECLARE
  v_idArquivoConciliacao NUMBER;
BEGIN
  FOR a IN (
    SELECT
      b.idArquivoConciliacao,
      b.arquivo,
      b.situacaoConciliacao,
      b.usuarioImportacao,
      b.dataImportacao,
      b.observacoes
     FROM (
      SELECT a.idArquivoConciliacao
      FROM MOCONCILIACOESCARTOES a
      WHERE a.tipoOperacaoCartao = 'PG'
      AND a.credenciadoraTef = '00181'
      GROUP BY a.idArquivoConciliacao) a
    JOIN MOARQUIVOSCONCILIACOES b
    ON b.idArquivoConciliacao = a.idArquivoConciliacao
    WHERE b.tipoArquivoCartao = 'V')
  LOOP
    v_idArquivoConciliacao := FUNC_ADD_BUSCA_PROXIMO_ID('MOARQUIVOSCONCILIACOES', 'idArquivoConciliacao', 14, 1, NULL);
    INSERT INTO MOARQUIVOSCONCILIACOES (
      idArquivoConciliacao,
      tipoArquivoCartao,
      arquivo,
      situacaoConciliacao,
      usuarioImportacao,
      dataImportacao,
      observacoes)
    VALUES (
      v_idArquivoConciliacao,
      'P',
      a.arquivo,
      a.situacaoConciliacao,
      a.usuarioImportacao,
      a.dataImportacao,
      a.observacoes);
    UPDATE MOCONCILIACOESCARTOES b
    SET b.idArquivoConciliacao = v_idArquivoConciliacao
    WHERE b.idArquivoConciliacao = a.idArquivoConciliacao
    AND b.tipoOperacaoCartao = 'PG'
    AND b.credenciadoraTef = '00181';
  END LOOP;
END;

/

UPDATE SICONFIGURACOES SET
 mascara = '256',
 exibirCampo = 'P'
WHERE configuracao = 338;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (146, 'N', 'Não', 338, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (147, 'S', 'Sim', 338, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (148, 'B', 'Biometria', 338, 1, 3, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (149, 'L', 'Sempre (Sem perguntar)', 338, 1, 4, ' ');

COMMIT;

INSERT INTO SITIPOSBENEFICIOS (tipoBeneficio, descricao, ativo, observacoes) VALUES ('TP', 'Tabela de Preços', 1, ' ');

COMMIT;

CREATE TABLE PAREGRASPROMOCOES_2302 AS SELECT * FROM PAREGRASPROMOCOES;

ALTER TABLE PAREGRAPROMOCAOXPRODUTOS DROP CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK1;
ALTER TABLE PAREGRAPROMOCAOXTABELASPR DROP CONSTRAINT PAREGRAPROMOCAOXTABELASPR_FK1;
ALTER TABLE MOPREDOCUMXPROMOCOES DROP CONSTRAINT MOPREDOCUMXPROMOCOES_FK5;
ALTER TABLE MODOCFISCALXPROMOCOES DROP CONSTRAINT MODOCFISCALXPROMOCOES_FK5;
ALTER TABLE MOORCAMENTOXPROMOCOES DROP CONSTRAINT MOORCAMENTOXPROMOCOES_FK5;

DROP TABLE PAREGRASPROMOCOES;

-- PAREGRASPROMOCOES
CREATE TABLE PAREGRASPROMOCOES
  (
    regraPromocao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao              VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao              NUMERIC (11,0) DEFAULT 0 NOT NULL,
    quantidadeA            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeB            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeC            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoBeneficio          CHAR (2) DEFAULT '  ' NOT NULL,
    quantidadeBeneficio    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    percentualDesconto     NUMERIC (15,8) DEFAULT 0 NOT NULL,
    pontuacaoPorValor      NUMERIC (15,4) DEFAULT 0 NOT NULL,
    pontuacaoPorQuantidade NUMERIC (15,4) DEFAULT 0 NOT NULL,
    pontuacaoFixa          NUMERIC (15,4) DEFAULT 0 NOT NULL,
    valorFinal             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    faixaPromocaoPreco     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tabelaPreco            VARCHAR (10) DEFAULT ' ' NOT NULL,
    valorAPartirDe         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    dataValidadeInicial    DATE,
    dataValidadeFinal      DATE,
    filtroCabecalho        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    filtroPagamento        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    filtrarTabelaPreco     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    promocaoAcumulativa    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    gerarPontuacao         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_PK1 PRIMARY KEY (regraPromocao);
CREATE INDEX PAREGRASPROMOCOES_K2 ON PAREGRASPROMOCOES (descricao);
CREATE INDEX PAREGRASPROMOCOES_K3 ON PAREGRASPROMOCOES (ordenacao, regraPromocao);
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_FK1 FOREIGN KEY (tipoBeneficio) REFERENCES SITIPOSBENEFICIOS (tipoBeneficio);
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_FK2 FOREIGN KEY (faixaPromocaoPreco) REFERENCES PAFAIXASPROMOCOESPRECOS (faixaPromocaoPreco);
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_FK3 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_FK4 FOREIGN KEY (filtroCabecalho) REFERENCES PAFILTROSCABECALHO (filtroCabecalho);
ALTER TABLE PAREGRASPROMOCOES ADD CONSTRAINT PAREGRASPROMOCOES_FK5 FOREIGN KEY (filtroPagamento) REFERENCES PAFILTROSPAGAMENTO (filtroPagamento);

INSERT INTO PAREGRASPROMOCOES (regraPromocao, descricao, ativo, ordenacao, quantidadeA, quantidadeB, quantidadeC, tipoBeneficio, quantidadeBeneficio, percentualDesconto, pontuacaoPorValor, pontuacaoPorQuantidade, pontuacaoFixa, valorFinal, faixaPromocaoPreco, tabelaPreco, valorAPartirDe, dataValidadeInicial, dataValidadeFinal, filtroCabecalho, filtroPagamento, filtrarTabelaPreco, promocaoAcumulativa, gerarPontuacao, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, '  ', 0, 0, 0, 0, 0, 0, 0, ' ', 0, NULL, NULL, 0, 0, 0, 0, 0, ' ');
INSERT INTO PAREGRASPROMOCOES (regraPromocao, descricao, ativo, ordenacao, quantidadeA, quantidadeB, quantidadeC, tipoBeneficio, quantidadeBeneficio, percentualDesconto, pontuacaoPorValor, pontuacaoPorQuantidade, pontuacaoFixa, valorFinal, faixaPromocaoPreco, tabelaPreco, valorAPartirDe, dataValidadeInicial, dataValidadeFinal, filtroCabecalho, filtroPagamento, filtrarTabelaPreco, promocaoAcumulativa, gerarPontuacao, observacoes) SELECT regraPromocao, descricao, ativo, ordenacao, quantidadeA, quantidadeB, quantidadeC, tipoBeneficio, quantidadeBeneficio, percentualDesconto, pontuacaoPorValor, pontuacaoPorQuantidade, pontuacaoFixa, valorFinal, faixaPromocaoPreco, ' ', valorAPartirDe, dataValidadeInicial, dataValidadeFinal, filtroCabecalho, filtroPagamento, filtrarTabelaPreco, promocaoAcumulativa, gerarPontuacao, observacoes FROM PAREGRASPROMOCOES_2302 WHERE regraPromocao > 0;

COMMIT;

ALTER TABLE PAREGRAPROMOCAOXPRODUTOS ADD CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK1 FOREIGN KEY (regraPromocao) REFERENCES PAREGRASPROMOCOES (regraPromocao);
ALTER TABLE PAREGRAPROMOCAOXTABELASPR ADD CONSTRAINT PAREGRAPROMOCAOXTABELASPR_FK1 FOREIGN KEY (regraPromocao) REFERENCES PAREGRASPROMOCOES (regraPromocao);
ALTER TABLE MOPREDOCUMXPROMOCOES ADD CONSTRAINT MOPREDOCUMXPROMOCOES_FK5 FOREIGN KEY (regraPromocao) REFERENCES PAREGRASPROMOCOES (regraPromocao);
ALTER TABLE MODOCFISCALXPROMOCOES ADD CONSTRAINT MODOCFISCALXPROMOCOES_FK5 FOREIGN KEY (regraPromocao) REFERENCES PAREGRASPROMOCOES (regraPromocao);
ALTER TABLE MOORCAMENTOXPROMOCOES ADD CONSTRAINT MOORCAMENTOXPROMOCOES_FK5 FOREIGN KEY (regraPromocao) REFERENCES PAREGRASPROMOCOES (regraPromocao);

DROP TABLE TEMPPROMOCOES;

-- TEMPPROMOCOES
CREATE GLOBAL TEMPORARY TABLE TEMPPROMOCOES
  (
    uniqueMachineID        VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItem                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    regraPromocao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoBeneficio          CHAR (2) DEFAULT '  ' NOT NULL,
    multiplicador          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    percentualDesconto     NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDesconto          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    gerarPontuacao         NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPROMOCOES_PK1 ON TEMPPROMOCOES (uniqueMachineID, contadorSessao, idItem, regraPromocao);

create or replace PROCEDURE ADD_CONSULTA_DADOS_CPF_GRAVA (
    p_uniqueMachineID      IN VARCHAR2,
    p_contadorSessaoTemp   IN NUMBER,
    p_cnpjCpfIdEstrangeiro IN VARCHAR2,
    p_estabelecimento      IN NUMBER,
    p_usuario              IN NUMBER,
    /* Retornos */
    r_idConsultaDadoCpf    OUT NUMBER)
IS
BEGIN
  r_idConsultaDadoCpf := FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTASDADOSCPF', 'idConsultaDadoCpf', 0, p_estabelecimento, NULL);
  INSERT INTO MOCONSULTASDADOSCPF (
    idConsultaDadoCpf,
    cnpjCpfIdEstrangeiro,
    estabelecimento,
    usuario,
    data,
    protocolo,
    nomeRazaoSocial,
    sexo,
    nascimento,
    obitoProvavel,
    rg,
    ufRg,
    situacaoCadastral,
    dataSituacaoCadastral,
    mae,
    maeCpf,
    maeNascimento,
    observacoes)
  SELECT
    r_idConsultaDadoCpf,
    p_cnpjCpfIdEstrangeiro,
    p_estabelecimento,
    p_usuario,
    SYSDATE data,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.cabecalho.protocolo, ' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') protocolo,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.nome, ' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') nomeRazaoSocial,
    COALESCE (REPLACE (CAST (COALESCE (temp.conteudo.resposta.dadosCadastrais.sexo, ' ') AS CHAR(1)),'''',''''''),' ') sexo,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.dataNascimento, 'DD/MM/YYYY')) nascimento,
    COALESCE (CAST (CASE WHEN UPPER (TRIM(temp.conteudo.resposta.dadosCadastrais.obitoProvavel)) = 'TRUE' THEN 1 ELSE 0 END AS NUMBER(1)),0) obitoProvavel,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.rg,' '),1,20) AS VARCHAR2(20)),'''',''''''),' ') rg,
    COALESCE (REPLACE (CAST (COALESCE (temp.conteudo.resposta.dadosCadastrais.ufRg,' ') AS CHAR(2)),'''',''''''),'  ') ufRg,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.situacaoCadastral,' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') situacaoCadastral,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.dataSituacaoCadastral,'DD/MM/YYYY')) dataSituacaoCadastral,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.maeNome,' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') mae,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (REPLACE (TRANSLATE (temp.conteudo.resposta.dadosCadastrais.maeCpf,'.-/','   '),' ',''),' '),1,20) AS VARCHAR2(20)),'''',''''''),' ') maeCpf,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.maeDataNascimento,'DD/MM/YYYY')) maeNascimento,
    ' ' observacoes
  FROM TEMPJSON temp
  WHERE temp.uniqueMachineID = p_uniqueMachineID
  AND temp.contadorSessao = p_contadorSessaoTemp;
  INSERT INTO MOCONSULTADADOSCPFFONES (
    id,
    idConsultaDadoCpf,
    ordenacao,
    indicadorFone,
    numero,
    relacao,
    whatsApp,
    naoPerturbe,
    hotphone,
    plus,
    ultimoContato,
    avaliacao,
    justificativa,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFFONES', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROW_NUMBER() OVER (ORDER BY a.ordenacao) ordenacao,
    COALESCE (a.indicadorFone,0),
    COALESCE (CASE WHEN a.numero IN ('[',']') THEN ' ' ELSE SUBSTR (a.numero,1,60) END,' '),
    COALESCE (CASE WHEN a.relacao IN ('[',']') THEN ' ' ELSE SUBSTR (a.relacao,1,60) END,' '),
    COALESCE (a.whatsApp,0),
    COALESCE (a.naoPerturbe,0),
    COALESCE (a.hotphone,0),
    COALESCE (a.plus,0),
    COALESCE (CASE WHEN a.ultimoContato IN ('[',']') THEN ' ' ELSE SUBSTR (a.ultimoContato,1,4000) END,' '),
    COALESCE (CASE WHEN a.avaliacao IN ('[',']') THEN ' ' ELSE SUBSTR (a.avaliacao,1,60) END,' '),
    COALESCE (CASE WHEN a.justificativa IN ('[',']') THEN ' ' ELSE SUBSTR (a.justificativa,1,4000) END,' '),
    ' ' observacoes
  FROM (
    SELECT
      MIN(a.ordenacao) ordenacao,
      MAX(a.indicadorFone) indicadorFone,
      a.numero,
      MAX(a.relacao) relacao,
      MAX(a.whatsApp) whatsApp,
      MAX(a.naoPerturbe) naoPerturbe,
      MAX(a.hotphone) hotphone,
      MAX(a.plus) plus,
      MAX(a.ultimoContato) ultimoContato,
      MAX(a.avaliacao) avaliacao,
      MAX(a.justificativa) justificativa
    FROM (
      SELECT
        ROWNUM ordenacao,
        a.indicadorFone,
        REPLACE (TRANSLATE (a.numero,'[]()-"',' '),' ','') numero,
        REPLACE (a.relacao,'''','''''') relacao,
        a.whatsApp,
        a.naoPerturbe,
        a.hotphone,
        a.plus,
        REPLACE (a.ultimoContato,'''','''''') ultimoContato,
        REPLACE (a.avaliacao,'''','''''') avaliacao,
        REPLACE (a.justificativa,'''','''''') justificativa
      FROM (
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.relacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.naoPerturbe,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END naoPerturbe,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.ultimoContato,'[^","]+', 1, LEVEL),'[',''),']','')),' ') ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefones.fixos.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.fixos.relacao, 'null'), 'null', '" "'), '""', '" "') relacao,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.aplicativos.whatsAppBusiness,',','","'),'[','["'),']','"]') whatsApp,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.naoPerturbe,',','","'),'[','["'),']','"]') naoPerturbe,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.fixos.ultimoContato, 'null'), 'null', '" "'), '""', '" "') ultimoContato
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.relacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.naoPerturbe,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END naoPerturbe,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.ultimoContato,'[^","]+', 1, LEVEL),'[',''),']','')),' ') ultimoContato,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.hotphone,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END hotphone,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.plus,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefones.moveis.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.moveis.relacao, 'null'), 'null', '" "'), '""', '" "') relacao,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.aplicativos.whatsApp,',','","'),'[','["'),']','"]') whatsApp,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.naoPerturbe,',','","'),'[','["'),']','"]') naoPerturbe,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.moveis.ultimoContato, 'null'), 'null', '" "'), '""', '" "') ultimoContato,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.hotphone,',','","'),'[','["'),']','"]') hotphone,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.plus,',','","'),'[','["'),']','"]') plus
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefonesAdicionados.fixos.numero numero,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.aplicativos.whatsAppBusiness,',','","'),'[','["'),']','"]') whatsApp
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefonesAdicionados.moveis.numero numero,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.aplicativos.whatsApp,',','","'),'[','["'),']','"]') whatsApp
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          0 whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.avaliacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') avaliacao,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.justificativa,'[^","]+', 1, LEVEL),'[',''),']','')),' ') justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.feedbackTelefones.fixos.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.fixos.avaliacao, 'null'), 'null', '" "'), '""', '" "') avaliacao,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.fixos.justificativa, 'null'), 'null', '" "'), '""', '" "') justificativa
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          0 whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.avaliacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') avaliacao,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.justificativa,'[^","]+', 1, LEVEL),'[',''),']','')),' ') justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.feedbackTelefones.moveis.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.moveis.avaliacao, 'null'), 'null', '" "'), '""', '" "') avaliacao,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.moveis.justificativa, 'null'), 'null', '" "'), '""', '" "') justificativa
          FROM TEMPJSON temp
          WHERE temp.uniqueMachineID = p_uniqueMachineID
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL) a) a
    GROUP BY a.numero) a;
  INSERT INTO MOCONSULTADADOSCPFENDEREC (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cep,
    tipoLogradouro,
    logradouro,
    numero,
    complemento,
    bairroDistrito,
    municipio,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFENDEREC', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (TO_NUMBER(REPLACE (REPLACE (TRANSLATE (a.cep,'[]()-"',' '),' ',''),'''','''''')),0) cep,
    COALESCE ((
      SELECT MAX (logr.tipoLogradouro)
      FROM SITIPOSLOGRADOUROS logr
      WHERE logr.abreviaturaLogradouro = UPPER(RTRIM(REPLACE (a.tipoLogradouro,'''','''''')))
      AND logr.ativo = 1),0) tipoLogradouro,
    COALESCE (CASE WHEN a.logradouro IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.logradouro,1,60),'''','''''') END,' ') logradouro,
    COALESCE (CASE WHEN a.numero IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.numero,1,60),'''','''''') END,' ') numero,
    COALESCE (CASE WHEN a.complemento IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.complemento,1,60),'''','''''') END,' ') complemento,
    COALESCE (CASE WHEN a.bairro IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.bairro,1,60),'''','''''') END,' ') bairro,
    FUNC_ADD_BUSCA_MUNICIPIO(COALESCE (CASE WHEN a.cidade IN ('[',']') THEN ' ' ELSE REPLACE (a.cidade,'''','''''') END,' '), COALESCE (CASE WHEN a.uf IN ('[',']') THEN ' ' ELSE REPLACE (a.uf,'''','''''') END,' ')) municipio,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.tipoLogradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') tipoLogradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') logradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.complemento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') complemento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.bairro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') bairro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cidade,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cidade,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.uf,'[^","]+', 1, LEVEL),'[',''),']','')),' ') uf,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cep,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cep
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.tipoLogradouro, 'null'), 'null', '" "'), '""', '" "') tipoLogradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.logradouro, 'null'), 'null', '" "'), '""', '" "') logradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.numero, 'null'), 'null', '" "'), '""', '" "') numero,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.complemento, 'null'), 'null', '" "'), '""', '" "') complemento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.bairro, 'null'), 'null', '" "'), '""', '" "') bairro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.cidade, 'null'), 'null', '" "'), '""', '" "') cidade,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.uf, 'null'), 'null', '" "'), '""', '" "') uf,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.cep, 'null'), 'null', '"0"'), '""', '"0"') cep
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.logradouro <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.logradouro, '[^","]+', 1, LEVEL) IS NOT NULL
    UNION ALL
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.tipoLogradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') tipoLogradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') logradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.complemento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') complemento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.bairro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') bairro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cidade,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cidade,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.uf,'[^","]+', 1, LEVEL),'[',''),']','')),' ') uf,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cep,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cep
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.tipoLogradouro, 'null'), 'null', '" "'), '""', '" "') tipoLogradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.logradouro, 'null'), 'null', '" "'), '""', '" "') logradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.numero, 'null'), 'null', '" "'), '""', '" "') numero,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.complemento, 'null'), 'null', '" "'), '""', '" "') complemento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.bairro, 'null'), 'null', '" "'), '""', '" "') bairro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.cidade, 'null'), 'null', '" "'), '""', '" "') cidade,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.uf, 'null'), 'null', '" "'), '""', '" "') uf,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.cep, 'null'), 'null', '"0"'), '""', '"0"') cep
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.logradouro <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.logradouro, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFEMAILS (
    id,
    idConsultaDadoCpf,
    ordenacao,
    email,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFEMAILS', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.email IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.email,1,60),'''','''''') END,' ') email,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL),'[',''),']','')),' ') email
    FROM (
      SELECT
        REPLACE (COALESCE (temp.conteudo.resposta.emails.email, 'null'), 'null', '" "') email
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.email <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.email, '[^","]+', 1, LEVEL) IS NOT NULL
    UNION ALL
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL),'[',''),']','')),' ') email
    FROM (
      SELECT
        REPLACE (REPLACE (temp.conteudo.resposta.emailsAdicionados.email, 'null', '" "'), '""', '" "') email
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.email <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.email, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFPARTIC (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    cargo,
    dataEntrada,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFPARTIC', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.cnpj IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (REPLACE (TRANSLATE (a.cnpj,'.-/','   '),' ',''),1,60),'''','''''') END,' ') cnpjCpfIdEstrangeiro,
    COALESCE (CASE WHEN a.razaoSocial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.razaoSocial,1,60),'''','''''') END,' ') nomeRazaoSocial,
    COALESCE (CASE WHEN a.cargo IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.cargo,1,60),'''','''''') END,' ') cargo,
    CASE WHEN a.dataEntrada = 'null' THEN NULL ELSE TRUNC (TO_DATE (a.dataEntrada, 'DD/MM/YYYY')) END dataEntrada,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cnpj,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.razaoSocial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') razaoSocial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cargo,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cargo,
      TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.dataEntrada,'[^","]+', 1, LEVEL),'[',''),']','')) dataEntrada
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.cnpj, 'null'), 'null', '" "'), '""', '" "') cnpj,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.razaoSocial, 'null'), 'null', '" "'), '""', '" "') razaoSocial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.cargo, 'null'), 'null', '" "'), '""', '" "') cargo,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.dataEntrada, 'null'),'null','"null"'), '""', '"null"') dataEntrada
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.cnpj <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.cnpj, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFPROFISS (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    setor,
    cboDescricao,
    faixaSalarial,
    rendaEstimada,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFPROFISS', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.cnpj IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (REPLACE (TRANSLATE (COALESCE (a.cnpj,' '),'.-/','   '),' ',''),1,60),'''','''''') END,' ') cnpjCpfIdEstrangeiro,
    COALESCE (CASE WHEN a.razaoSocial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.razaoSocial,' '),1,60),'''','''''') END,' ') nomeRazaoSocial,
    COALESCE (CASE WHEN a.setor IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.setor,' '),1,60),'''','''''') END,' ') setor,
    COALESCE (CASE WHEN a.cboDescricao IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.cboDescricao,' '),1,60),'''','''''') END,' ') cboDescricao,
    COALESCE (CASE WHEN a.faixaSalarial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.faixaSalarial,' '),1,60),'''','''''') END ,' ')faixaSalarial,
    COALESCE (TO_NUMBER(TRIM(SUBSTR(REPLACE (REPLACE (COALESCE (a.rendaEstimada, 'R$ 0,00'),'.',''),',','.'),3,30))),0) rendaEstimada,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cnpj,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.razaoSocial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') razaoSocial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.setor,'[^","]+', 1, LEVEL),'[',''),']','')),' ') setor,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cboDescricao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cboDescricao,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.faixaSalarial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') faixaSalarial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.rendaEstimada,'[^","]+', 1, LEVEL),'[',''),']','')),'R$ 0,00') rendaEstimada
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.cnpj, 'null'), 'null', '" "'), '""', '" "') cnpj,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.razaoSocial, 'null'), 'null', '" "'), '""', '" "') razaoSocial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.setor, 'null'), 'null', '" "'), '""', '" "') setor,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.cboDescricao, 'null'), 'null', '" "'), '""', '" "') cboDescricao,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.faixaSalarial, 'null'), 'null', '" "'), '""', '" "') faixaSalarial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.rendaEstimada, 'null'), 'null', '"R$ 0,00"'), '""', '"R$ 0,00"') rendaEstimada
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.cnpj <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.cnpj, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFCONSULT (
    id,
    idConsultaDadoCpf,
    segmento,
    quantidade,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFCONSULT', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    COALESCE (CASE WHEN a.segmento IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.segmento,1,256),'''','''''') END,' ') segmento,
    COALESCE (TO_NUMBER(TRIM(REPLACE (REPLACE (a.quantidade,'.',''),',','.'))),0) quantidade,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') segmento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.quantidade,'[^","]+', 1, LEVEL),'[',''),']','')),'0') quantidade
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.historicoConsultasPorSegmento.segmentos.segmento, 'null'), 'null', '" "'), '""', '" "') segmento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.historicoConsultasPorSegmento.segmentos.quantidade, 'null'), 'null', '" "'), '""', '" "') quantidade
      FROM TEMPJSON temp
      WHERE temp.uniqueMachineID = p_uniqueMachineID
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.segmento <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.segmento, '[^","]+', 1, LEVEL) IS NOT NULL) a;
END ADD_CONSULTA_DADOS_CPF_GRAVA;

/

DROP TABLE TEMPCONFERENCIAPESSOAS;
DROP TABLE TEMPIMPORTCONFERENCIA;

CREATE GLOBAL TEMPORARY TABLE TEMPCONFERENCIAS
  (
    uniqueMachineID VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    selecionado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    nomeCampo       VARCHAR (256) DEFAULT ' ' NOT NULL,
    conteudoAtual   VARCHAR (4000) DEFAULT ' ' NOT NULL,
    conteudoNovo    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    mascara         VARCHAR (30) DEFAULT ' ' NOT NULL,
    excecaoTipi     CHAR (3) DEFAULT '   ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPCONFERENCIAS ADD CONSTRAINT TEMPCONFERENCIAS_PK1 PRIMARY KEY (uniqueMachineID, contadorSessao, id);

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 TRUNC (SYSDATE, 'YYYY')
        - TRUNC (pess.nascimentoFundacao, 'YYYY')
        - 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 = 1
      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 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;
END ADD_BUSCA_REGRA_DESCONTO_ITEM;

/

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

/

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

/

DROP FUNCTION FUNC_ADD_CALC_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    /* Retornos */
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_munEndEst_uf                 CHAR(2);
    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
  r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_cab_orcamento);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'O'
  AND idCabecalho = p_cab_orcamento;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_cab_orcamento;
  FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.idFormulaTinta,
        a.personalizacao,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.valorICMSST,
        a.valorICMSUFDestinatario,
        a.valorICMSUFRemetente,
        a.valorFCP,
        a.valorFCPST,
        a.valorFCPSTAnteriormente,
        a.valorFCPUFDestinatario,
        a.valorLiquidoItem,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = a.localEstoque
      WHERE orcamento = p_cab_orcamento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cab_valorTarifaCartao,
      v_munEndEst_uf,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.indicadorPropriedadePosseItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_item_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem) 
    VALUES (
      p_uniqueMachineID,
      'O',
      p_cab_orcamento,
      a.sequencia,
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem,
      v_item_imagemMargem);
  END LOOP;
  r_cab_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cab_valorMargem / (v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cab_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cab_percentualMargem);
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    /* Retornos */
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_munEndEst_uf                 CHAR(2);
    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
  r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_cab_preDocumento);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'P'
  AND idCabecalho = p_cab_preDocumento;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_cab_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    WHERE preDocumento = p_cab_preDocumento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cab_valorTarifaCartao,
      v_munEndEst_uf,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.indicadorPropriedadePosseItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_item_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem) 
    VALUES (
      p_uniqueMachineID,
      'P',
      p_cab_preDocumento,
      a.sequencia,
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem,
      v_item_imagemMargem);
  END LOOP;
  r_cab_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cab_valorMargem / (v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cab_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cab_percentualMargem);
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    /* Retornos */
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_munEndEst_uf                 CHAR(2);
    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
  r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_cab_idDocumentoFiscal);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'D'
  AND idCabecalho = p_cab_idDocumentoFiscal;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cab_valorTarifaCartao,
      v_munEndEst_uf,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.indicadorPropriedadePosseItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_item_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem)
    VALUES (
      p_uniqueMachineID,
      'D',
      p_cab_idDocumentoFiscal,
      a.sequencia,
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem,
      v_item_imagemMargem);
  END LOOP;
  r_cab_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cab_valorMargem / (v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
  AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cab_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cab_percentualMargem);
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2023002015, '2023.2.15', TO_DATE('29/05/2023','DD/MM/YYYY'), 1, 1, sysdate, ' ');

COMMIT;

--exec dbms_utility.compile_schema('ADDERI');
--exec dbms_stats.gather_schema_stats('ADDERI');

/*
*/