SET DEFINE OFF;

UPDATE SITABELASSISTEMA SET ordenacao = 50185 WHERE tabelaSistema = 'MOORCAMENTOXATIVIDADEREAL';

COMMIT;

UPDATE SIOPCOESCOMBOCONFIGURACAO SET ordenacao = 58 WHERE id = 169;

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (178, '59', '59 - Burgo Presentes', 204, 1, 59, ' ');

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (179, '60', '60 - Sulpharma', 204, 1, 60, ' ');

COMMIT;

INSERT INTO SIOPERACOESINTERNASESTOQUE (operacaoInternaEstoque, descricao, ativo, observacoes) values (105, '105 Ordem Produção', 1, ' ');

COMMIT;

-- MOORCAMENTOXFICHAPRODPREV
CREATE TABLE MOORCAMENTOXFICHAPRODPREV
  (
    idFichaProdutoPrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAtividadePrevOrcamento    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                   NUMERIC (11,0) DEFAULT 0 NOT NULL,
    modeloDocumento             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    entradaSaida                CHAR (1) DEFAULT ' ' NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldo             NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                 VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_PK1 PRIMARY KEY (idFichaProdutoPrevOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXFICHAPRODPREV_K2 ON MOORCAMENTOXFICHAPRODPREV (idAtividadePrevOrcamento, ordenacao);
CREATE INDEX MOORCAMENTOXFICHAPRODPREV_K3 ON MOORCAMENTOXFICHAPRODPREV (idAtividadePrevOrcamento);
CREATE INDEX MOORCAMENTOXFICHAPRODPREV_K4 ON MOORCAMENTOXFICHAPRODPREV (gradeProduto);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK3 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK4 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK5 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK6 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);

INSERT INTO MOORCAMENTOXFICHAPRODPREV (idFichaProdutoPrevOrcamento, idAtividadePrevOrcamento, ordenacao, modeloDocumento, entradaSaida, gradeProduto, personalizacao, idLoteEstoque, quantidade, quantidadeSaldo, observacoes) VALUES (0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOORCAMENTOXFICHAPRODPREV', 'Orçamento X Ficha Produto Prevista', 1, 50183, 'MO', 'idFichaProdutoPrevOrcamento', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

CREATE TABLE MOORCAMENTOXFICHAPRODREAL
  (
    idFichaProdutoRealOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAtividadeRealOrcamento    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                   NUMERIC (11,0) DEFAULT 0 NOT NULL,
    modeloDocumento             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    atualizaCustoMedio          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaUltimaCompra        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    entradaSaida                CHAR (1) DEFAULT ' ' NOT NULL,
    idFichaProdutoPrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    zerarSaldo                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoCustoOperacao          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    totalCustoOperacao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                    NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes                 VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_PK1 PRIMARY KEY (idFichaProdutoRealOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXFICHAPRODREAL_K2 ON MOORCAMENTOXFICHAPRODREAL (idAtividadeRealOrcamento, ordenacao);
CREATE INDEX MOORCAMENTOXFICHAPRODREAL_K3 ON MOORCAMENTOXFICHAPRODREAL (idAtividadeRealOrcamento);
CREATE INDEX MOORCAMENTOXFICHAPRODREAL_K4 ON MOORCAMENTOXFICHAPRODREAL (gradeProduto);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK1 FOREIGN KEY (idAtividadeRealOrcamento) REFERENCES MOORCAMENTOXATIVIDADEREAL (idAtividadeRealOrcamento);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK3 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK4 FOREIGN KEY (idFichaProdutoPrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK7 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);

INSERT INTO MOORCAMENTOXFICHAPRODREAL (idFichaProdutoRealOrcamento, idAtividadeRealOrcamento, ordenacao, modeloDocumento, atualizaCustoMedio, atualizaUltimaCompra, entradaSaida, idFichaProdutoPrevOrcamento, gradeProduto, personalizacao, idLoteEstoque, quantidade, zerarSaldo, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) VALUES (0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOORCAMENTOXFICHAPRODREAL', 'Orçamento X Ficha Produto Realizada', 1, 50186, 'MO', 'idFichaProdutoRealOrcamento', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MOORCAMENTOXFICHAXRESERVA
CREATE TABLE MOORCAMENTOXFICHAXRESERVA
  (
    id                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFichaProdutoPrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idReservaEstoque            NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOORCAMENTOXFICHAXRESERVA ADD CONSTRAINT MOORCAMENTOXFICHAXRESERVA_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOORCAMENTOXFICHAXRESERVA_K2 ON MOORCAMENTOXFICHAXRESERVA (idFichaProdutoPrevOrcamento, idReservaEstoque);
CREATE INDEX MOORCAMENTOXFICHAXRESERVA_K3 ON MOORCAMENTOXFICHAXRESERVA (idFichaProdutoPrevOrcamento);
CREATE INDEX MOORCAMENTOXFICHAXRESERVA_K4 ON MOORCAMENTOXFICHAXRESERVA (idReservaEstoque);
ALTER TABLE MOORCAMENTOXFICHAXRESERVA ADD CONSTRAINT MOORCAMENTOXFICHAXRESERVA_FK1 FOREIGN KEY (idFichaProdutoPrevOrcamento) REFERENCES MOORCAMENTOXFICHAPRODPREV (idFichaProdutoPrevOrcamento);
ALTER TABLE MOORCAMENTOXFICHAXRESERVA ADD CONSTRAINT MOORCAMENTOXFICHAXRESERVA_FK2 FOREIGN KEY (idReservaEstoque) REFERENCES MORESERVASESTOQUE (idReservaEstoque);

INSERT INTO MOORCAMENTOXFICHAXRESERVA (id, idFichaProdutoPrevOrcamento, idReservaEstoque) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOORCAMENTOXFICHAXRESERVA', 'Orçamento X Ficha Produto Prevista X Reservas Estoques', 1, 50554, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' ');

COMMIT;

-- MOORCAMENTOXFICHAXESTOQUE
CREATE TABLE MOORCAMENTOXFICHAXESTOQUE
  (
    id                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFichaProdutoRealOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idEstoque                   NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOORCAMENTOXFICHAXESTOQUE ADD CONSTRAINT MOORCAMENTOXFICHAXESTOQUE_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOORCAMENTOXFICHAXESTOQUE_K2 ON MOORCAMENTOXFICHAXESTOQUE (idFichaProdutoRealOrcamento, idEstoque);
CREATE INDEX MOORCAMENTOXFICHAXESTOQUE_K3 ON MOORCAMENTOXFICHAXESTOQUE (idFichaProdutoRealOrcamento);
CREATE INDEX MOORCAMENTOXFICHAXESTOQUE_K4 ON MOORCAMENTOXFICHAXESTOQUE (idEstoque);
ALTER TABLE MOORCAMENTOXFICHAXESTOQUE ADD CONSTRAINT MOORCAMENTOXFICHAXESTOQUE_FK1 FOREIGN KEY (idFichaProdutoRealOrcamento) REFERENCES MOORCAMENTOXFICHAPRODREAL (idFichaProdutoRealOrcamento);
ALTER TABLE MOORCAMENTOXFICHAXESTOQUE ADD CONSTRAINT MOORCAMENTOXFICHAXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);

INSERT INTO MOORCAMENTOXFICHAXESTOQUE (id, idFichaProdutoRealOrcamento, idEstoque) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOORCAMENTOXFICHAXESTOQUE', 'Orçamento X Ficha Produto Realizada X Estoques', 1, 50531, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' ');

COMMIT;

CREATE TABLE PAFUNILCRMXETAPAS_0401 AS SELECT * FROM PAFUNILCRMXETAPAS;

ALTER TABLE PATIPOSACOESCRMPERMITIDAS DROP CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK6;
ALTER TABLE MOCRMS DROP CONSTRAINT MOCRMS_FK7;
ALTER TABLE MOCRMXHISTORICO DROP CONSTRAINT MOCRMXHISTORICO_FK3;

DROP TABLE PAFUNILCRMXETAPAS;

-- PAFUNILCRMXETAPAS
CREATE TABLE PAFUNILCRMXETAPAS
  (
    etapaFunilCRM    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    funilCRM         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    situacaoFunilCRM CHAR (1) DEFAULT ' ' NOT NULL,
    exigeOrcamento   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_PK1 PRIMARY KEY (etapaFunilCRM);
CREATE INDEX PAFUNILCRMXETAPAS_K2 ON PAFUNILCRMXETAPAS (descricao);
CREATE INDEX PAFUNILCRMXETAPAS_K3 ON PAFUNILCRMXETAPAS (funilCRM, ordenacao, etapaFunilCRM);
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_FK1 FOREIGN KEY (funilCRM) REFERENCES PAFUNISCRM (funilCRM);
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_FK2 FOREIGN KEY (situacaoFunilCRM) REFERENCES SISITUACOESFUNILCRM (situacaoFunilCRM);

INSERT INTO PAFUNILCRMXETAPAS (etapaFunilCRM, descricao, ativo, funilCRM, ordenacao, situacaoFunilCRM, exigeOrcamento, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, ' ', 0, ' ');
INSERT INTO PAFUNILCRMXETAPAS (etapaFunilCRM, descricao, ativo, funilCRM, ordenacao, situacaoFunilCRM, exigeOrcamento, observacoes) SELECT etapaFunilCRM, descricao, ativo, funilCRM, ordenacao, situacaoFunilCRM, 0, observacoes FROM PAFUNILCRMXETAPAS_0401 WHERE etapaFunilCRM > 0;

COMMIT;

ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK6 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK7 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK3 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);

CREATE TABLE PACATEGORIASPRODUTOSVENDA_0401 AS SELECT * FROM PACATEGORIASPRODUTOSVENDA;

DROP TABLE PACATEGORIASPRODUTOSVENDA;

-- PACATEGORIASPRODUTOSVENDA
CREATE TABLE PACATEGORIASPRODUTOSVENDA
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao          VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    estabelecimento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    perfilUsuario      NUMERIC (6,0) DEFAULT 0 NOT NULL,
    usuario            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    filtroProduto      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    iniciarAtendimento NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACATEGORIASPRODUTOSVENDA ADD CONSTRAINT PACATEGORIASPRODUTOSVENDA_PK1 PRIMARY KEY (id);
CREATE INDEX PACATEGORIASPRODUTOSVENDA_K2 ON PACATEGORIASPRODUTOSVENDA (descricao);
CREATE INDEX PACATEGORIASPRODUTOSVENDA_K3 ON PACATEGORIASPRODUTOSVENDA (ordenacao, id);
ALTER TABLE PACATEGORIASPRODUTOSVENDA ADD CONSTRAINT PACATEGORIASPRODUTOSVENDA_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PACATEGORIASPRODUTOSVENDA ADD CONSTRAINT PACATEGORIASPRODUTOSVENDA_FK2 FOREIGN KEY (perfilUsuario) REFERENCES PAPERFISUSUARIO (perfilUsuario);
ALTER TABLE PACATEGORIASPRODUTOSVENDA ADD CONSTRAINT PACATEGORIASPRODUTOSVENDA_FK3 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE PACATEGORIASPRODUTOSVENDA ADD CONSTRAINT PACATEGORIASPRODUTOSVENDA_FK4 FOREIGN KEY (filtroProduto) REFERENCES PAFILTROSPRODUTO (filtroProduto);

INSERT INTO PACATEGORIASPRODUTOSVENDA (id, descricao, ativo, ordenacao, estabelecimento, perfilUsuario, usuario, filtroProduto, iniciarAtendimento, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PACATEGORIASPRODUTOSVENDA (id, descricao, ativo, ordenacao, estabelecimento, perfilUsuario, usuario, filtroProduto, iniciarAtendimento, observacoes) SELECT id, descricao, ativo, ordenacao, estabelecimento, perfilUsuario, usuario, filtroProduto, 0, observacoes FROM PACATEGORIASPRODUTOSVENDA_0401 WHERE id > 0;

COMMIT;

CREATE TABLE CAPESSOASXESTABELECIMTOS_0401 AS SELECT * FROM CAPESSOASXESTABELECIMTOS;

DROP TABLE CAPESSOASXESTABELECIMTOS;

-- CAPESSOASXESTABELECIMTOS
CREATE TABLE CAPESSOASXESTABELECIMTOS
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ativo           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    principal       NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE CAPESSOASXESTABELECIMTOS ADD CONSTRAINT CAPESSOASXESTABELECIMTOS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX CAPESSOASXESTABELECIMTOS_K2 ON CAPESSOASXESTABELECIMTOS (pessoa, estabelecimento);
CREATE INDEX CAPESSOASXESTABELECIMTOS_K3 ON CAPESSOASXESTABELECIMTOS (estabelecimento, pessoa);
CREATE INDEX CAPESSOASXESTABELECIMTOS_K4 ON CAPESSOASXESTABELECIMTOS (pessoa, estabelecimento, ativo);
ALTER TABLE CAPESSOASXESTABELECIMTOS ADD CONSTRAINT CAPESSOASXESTABELECIMTOS_FK1 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE CAPESSOASXESTABELECIMTOS ADD CONSTRAINT CAPESSOASXESTABELECIMTOS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);

INSERT INTO CAPESSOASXESTABELECIMTOS (id, pessoa, estabelecimento, ativo, principal) VALUES (0, 0, 0, 1, 0);
INSERT INTO CAPESSOASXESTABELECIMTOS (id, pessoa, estabelecimento, ativo, principal) SELECT id, pessoa, estabelecimento, ativo, 0 FROM CAPESSOASXESTABELECIMTOS_0401 WHERE id > 0;

COMMIT;

CREATE TABLE CAPRODUTOS_0401 AS SELECT * FROM CAPRODUTOS;

ALTER TABLE CAPRODUTOXLENTESOCULOS DROP CONSTRAINT CAPRODUTOXLENTESOCULOS_FK1;
ALTER TABLE CAPRODUTOXINGRESSOS DROP CONSTRAINT CAPRODUTOXINGRESSOS_FK1;
ALTER TABLE CAPRODUTOXVALIDADESINGRES DROP CONSTRAINT CAPRODUTOXVALIDADESINGRES_FK1;
ALTER TABLE CAPRODUTOXALTURAS DROP CONSTRAINT CAPRODUTOXALTURAS_FK1;
ALTER TABLE CAPRODUTOXESTABELECIMENTO DROP CONSTRAINT CAPRODUTOXESTABELECIMENTO_FK1;
ALTER TABLE CAPRODUTOXFORNECEDORES DROP CONSTRAINT CAPRODUTOXFORNECEDORES_FK1;
ALTER TABLE CAPRODUTOXALTERNATIVOS DROP CONSTRAINT CAPRODUTOXALTERNATIVOS_FK1;
ALTER TABLE CAPRODUTOXALTERNATIVOS DROP CONSTRAINT CAPRODUTOXALTERNATIVOS_FK2;
ALTER TABLE CAPRODUTOXRELACIONADOS DROP CONSTRAINT CAPRODUTOXRELACIONADOS_FK1;
ALTER TABLE CAPRODUTOXRELACIONADOS DROP CONSTRAINT CAPRODUTOXRELACIONADOS_FK2;
ALTER TABLE CAPRODUTOXARQUIVOS DROP CONSTRAINT CAPRODUTOXARQUIVOS_FK1;
ALTER TABLE CAPRODUTOXCUSTOS DROP CONSTRAINT CAPRODUTOXCUSTOS_FK1;
ALTER TABLE CAPRODUTOXCONTASCONTABEIS DROP CONSTRAINT CAPRODUTOXCONTASCONTABEIS_FK1;
ALTER TABLE PAAGRUPFISCXPRODUTOS DROP CONSTRAINT PAAGRUPFISCXPRODUTOS_FK2;
ALTER TABLE PAFILTROPRODUTOXPRODUTOS DROP CONSTRAINT PAFILTROPRODUTOXPRODUTOS_FK2;
ALTER TABLE CAGRADESPRODUTO DROP CONSTRAINT CAGRADESPRODUTO_FK1;
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC DROP CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK1;
ALTER TABLE CATABELAPRECOXPRECOS DROP CONSTRAINT CATABELAPRECOXPRECOS_FK2;
ALTER TABLE CAPRODUTOXMARGEMMARKUP DROP CONSTRAINT CAPRODUTOXMARGEMMARKUP_FK1;
ALTER TABLE PAMETAXEXCECOES DROP CONSTRAINT PAMETAXEXCECOES_FK3;
ALTER TABLE PAREGRAPROMOCAOXPRODUTOS DROP CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK2;
ALTER TABLE PAMVAS DROP CONSTRAINT PAMVAS_FK2;
ALTER TABLE PADESONERACOESFISCAIS DROP CONSTRAINT PADESONERACOESFISCAIS_FK2;
ALTER TABLE PAREGRASDISTRIBUICOES DROP CONSTRAINT PAREGRASDISTRIBUICOES_FK9;
ALTER TABLE PAABERTURASCOMPRA DROP CONSTRAINT PAABERTURASCOMPRA_FK9;
ALTER TABLE CAPRODUTOXCONTROLEENTREGA DROP CONSTRAINT CAPRODUTOXCONTROLEENTREGA_FK1;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK1;
ALTER TABLE MOPAINELCOMPRAXITENS DROP CONSTRAINT MOPAINELCOMPRAXITENS_FK3;

DROP TABLE CAPRODUTOS;

-- CAPRODUTOS
CREATE TABLE CAPRODUTOS
  (
    produto                      NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricao                    VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    subcategoriaProduto          NUMERIC (8,0) DEFAULT 0 NOT NULL,
    marca                        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaA              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaB              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaC              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaD              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaE              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoA            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoB            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoC            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoD            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoE            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    referencia                   VARCHAR (60) DEFAULT ' ' NOT NULL,
    gradeCor                     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeTamanho                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradePersonalizacao          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    controlaLote                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    diasValidadeLote             NUMERIC (6,0) DEFAULT 0 NOT NULL,
    controlaNumeroSerie          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    controleEstoque              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    unidadeMedida                VARCHAR (6) DEFAULT ' ' NOT NULL,
    controleQuantidadeVenda      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaVenda           VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidadeVenda     NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimoVenda              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiploVenda            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquido                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    solicitaPesoLiquido          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    pesoBruto                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    solicitaPesoBruto            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    altura                       NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                      NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                  NUMERIC (14,3) DEFAULT 0 NOT NULL,
    empilhamentoMaximoVolumes    NUMERIC (15,0) DEFAULT 0 NOT NULL,
    excecaoLocalizacao           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    obsoleto                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarECommerce              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    lancamento                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    vitrine                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    promocao                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    encomenda                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    gerarDOF                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitarInformacaoComplemen NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoProduto                  CHAR (2) DEFAULT '  ' NOT NULL,
    origemMercadoria             CHAR (1) DEFAULT ' ' NOT NULL,
    valorSaidaMercadoriaInterest NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorParcelaImportada        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualCI                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    codigoFCI                    VARCHAR (36) DEFAULT ' ' NOT NULL,
    idNcm                        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    listaServicos                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    codigoProdutoAnp             NUMERIC (9,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    estabelecimentoFaturamento   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    classificacaoProduto         VARCHAR (3) DEFAULT ' ' NOT NULL,
    dataClassificacaoProduto     DATE,
    tipoAtendimento              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    aplicacao                    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    detalhamento                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    informacoesAdicionaisProduto VARCHAR (500) DEFAULT ' ' NOT NULL,
    metaTitulo                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    metaDescription              VARCHAR (256) DEFAULT ' ' NOT NULL,
    metaKeywords                 VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL,
    dataInclusao                 DATE,
    usuarioInclusao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataAlteracao                DATE,
    usuarioAlteracao             NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_PK1 PRIMARY KEY (produto);
CREATE INDEX CAPRODUTOS_K2 ON CAPRODUTOS (descricao);
CREATE INDEX CAPRODUTOS_K3 ON CAPRODUTOS (referencia);
CREATE INDEX CAPRODUTOS_K4 ON CAPRODUTOS (subcategoriaProduto);
CREATE INDEX CAPRODUTOS_K5 ON CAPRODUTOS (marca);
CREATE INDEX CAPRODUTOS_K6 ON CAPRODUTOS (caracteristicaA);
CREATE INDEX CAPRODUTOS_K7 ON CAPRODUTOS (caracteristicaB);
CREATE INDEX CAPRODUTOS_K8 ON CAPRODUTOS (caracteristicaC);
CREATE INDEX CAPRODUTOS_K9 ON CAPRODUTOS (caracteristicaD);
CREATE INDEX CAPRODUTOS_K10 ON CAPRODUTOS (caracteristicaE);
CREATE INDEX CAPRODUTOS_K11 ON CAPRODUTOS (exclusivoProdutoA);
CREATE INDEX CAPRODUTOS_K12 ON CAPRODUTOS (exclusivoProdutoB);
CREATE INDEX CAPRODUTOS_K13 ON CAPRODUTOS (exclusivoProdutoC);
CREATE INDEX CAPRODUTOS_K14 ON CAPRODUTOS (exclusivoProdutoD);
CREATE INDEX CAPRODUTOS_K15 ON CAPRODUTOS (exclusivoProdutoE);
CREATE INDEX CAPRODUTOS_K16 ON CAPRODUTOS (controleEstoque);
CREATE INDEX CAPRODUTOS_K17 ON CAPRODUTOS (idNcm);
CREATE INDEX CAPRODUTOS_K18 ON CAPRODUTOS (listaServicos);
CREATE INDEX CAPRODUTOS_K19 ON CAPRODUTOS (codigoProdutoAnp);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK1 FOREIGN KEY (subcategoriaProduto) REFERENCES PASUBCATEGORIASPRODUTO (subcategoriaProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK2 FOREIGN KEY (marca) REFERENCES PAMARCAS (marca);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK3 FOREIGN KEY (caracteristicaA) REFERENCES PACARACTERISTICASA (caracteristicaA);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK4 FOREIGN KEY (caracteristicaB) REFERENCES PACARACTERISTICASB (caracteristicaB);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK5 FOREIGN KEY (caracteristicaC) REFERENCES PACARACTERISTICASC (caracteristicaC);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK6 FOREIGN KEY (caracteristicaD) REFERENCES PACARACTERISTICASD (caracteristicaD);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK7 FOREIGN KEY (caracteristicaE) REFERENCES PACARACTERISTICASE (caracteristicaE);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK8 FOREIGN KEY (exclusivoProdutoA) REFERENCES PAEXCLUSIVOSPRODUTOA (exclusivoProdutoA);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK9 FOREIGN KEY (exclusivoProdutoB) REFERENCES PAEXCLUSIVOSPRODUTOB (exclusivoProdutoB);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK10 FOREIGN KEY (exclusivoProdutoC) REFERENCES PAEXCLUSIVOSPRODUTOC (exclusivoProdutoC);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK11 FOREIGN KEY (exclusivoProdutoD) REFERENCES PAEXCLUSIVOSPRODUTOD (exclusivoProdutoD);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK12 FOREIGN KEY (exclusivoProdutoE) REFERENCES PAEXCLUSIVOSPRODUTOE (exclusivoProdutoE);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK13 FOREIGN KEY (gradeCor) REFERENCES PAGRADESCOR (gradeCor);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK14 FOREIGN KEY (gradeTamanho) REFERENCES PAGRADESTAMANHO (gradeTamanho);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK15 FOREIGN KEY (gradePersonalizacao) REFERENCES PAGRADESPERSONALIZACAO (gradePersonalizacao);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK16 FOREIGN KEY (controleEstoque) REFERENCES SICONTROLESESTOQUE (controleEstoque);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK17 FOREIGN KEY (unidadeMedida) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK18 FOREIGN KEY (controleQuantidadeVenda) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK19 FOREIGN KEY (unidadeMedidaVenda) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK20 FOREIGN KEY (excecaoLocalizacao) REFERENCES PAEXCECOESLOCALIZACAO (excecaoLocalizacao);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK21 FOREIGN KEY (tipoProduto) REFERENCES SITIPOSPRODUTO (tipoProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK22 FOREIGN KEY (origemMercadoria) REFERENCES SIORIGENSMERCADORIA (origemMercadoria);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK23 FOREIGN KEY (idNcm) REFERENCES SINCMS (idNcm);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK24 FOREIGN KEY (listaServicos) REFERENCES SILISTASERVICOS (listaServicos);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK25 FOREIGN KEY (codigoProdutoAnp) REFERENCES SICODIGOSPRODUTOSANP (codigoProdutoAnp);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK26 FOREIGN KEY (estabelecimentoFaturamento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK27 FOREIGN KEY (classificacaoProduto) REFERENCES PACLASSIFICACOESPRODUTO (classificacaoProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK28 FOREIGN KEY (tipoAtendimento) REFERENCES PATIPOSATENDIMENTO (tipoAtendimento);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK29 FOREIGN KEY (usuarioInclusao) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK30 FOREIGN KEY (usuarioAlteracao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO CAPRODUTOS (produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, enviarECommerce, lancamento, vitrine, promocao, encomenda, gerarDOF, solicitarInformacaoComplemen, tipoProduto, origemMercadoria, valorSaidaMercadoriaInterest, valorParcelaImportada, percentualCI, codigoFCI, idNcm, listaServicos, codigoProdutoAnp, precoPautaTabelado, estabelecimentoFaturamento, classificacaoProduto, dataClassificacaoProduto, tipoAtendimento, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, ' ', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', ' ', 0, 0, 0, ' ', 0, 0, 0, 0, 0, ' ', NULL, 0, ' ', ' ', ' ', ' ', ' ', ' ', ' ', NULL, 0, NULL, 0);
INSERT INTO CAPRODUTOS (produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, enviarECommerce, lancamento, vitrine, promocao, encomenda, gerarDOF, solicitarInformacaoComplemen, tipoProduto, origemMercadoria, valorSaidaMercadoriaInterest, valorParcelaImportada, percentualCI, codigoFCI, idNcm, listaServicos, codigoProdutoAnp, precoPautaTabelado, estabelecimentoFaturamento, classificacaoProduto, dataClassificacaoProduto, tipoAtendimento, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao) SELECT produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, enviarECommerce, lancamento, vitrine, promocao, encomenda, gerarDOF, 0, tipoProduto, origemMercadoria, valorSaidaMercadoriaInterest, valorParcelaImportada, percentualCI, codigoFCI, idNcm, listaServicos, codigoProdutoAnp, precoPautaTabelado, estabelecimentoFaturamento, classificacaoProduto, dataClassificacaoProduto, 0, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao FROM CAPRODUTOS_0401 WHERE produto > 0;

COMMIT;

ALTER TABLE CAPRODUTOXLENTESOCULOS ADD CONSTRAINT CAPRODUTOXLENTESOCULOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXINGRESSOS ADD CONSTRAINT CAPRODUTOXINGRESSOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXVALIDADESINGRES ADD CONSTRAINT CAPRODUTOXVALIDADESINGRES_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTURAS ADD CONSTRAINT CAPRODUTOXALTURAS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXESTABELECIMENTO ADD CONSTRAINT CAPRODUTOXESTABELECIMENTO_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXFORNECEDORES ADD CONSTRAINT CAPRODUTOXFORNECEDORES_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTERNATIVOS ADD CONSTRAINT CAPRODUTOXALTERNATIVOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTERNATIVOS ADD CONSTRAINT CAPRODUTOXALTERNATIVOS_FK2 FOREIGN KEY (produtoAlternativo) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXRELACIONADOS ADD CONSTRAINT CAPRODUTOXRELACIONADOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXRELACIONADOS ADD CONSTRAINT CAPRODUTOXRELACIONADOS_FK2 FOREIGN KEY (produtoRelacionado) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXARQUIVOS ADD CONSTRAINT CAPRODUTOXARQUIVOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCONTASCONTABEIS ADD CONSTRAINT CAPRODUTOXCONTASCONTABEIS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAAGRUPFISCXPRODUTOS ADD CONSTRAINT PAAGRUPFISCXPRODUTOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAFILTROPRODUTOXPRODUTOS ADD CONSTRAINT PAFILTROPRODUTOXPRODUTOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC ADD CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CATABELAPRECOXPRECOS ADD CONSTRAINT CATABELAPRECOXPRECOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXMARGEMMARKUP ADD CONSTRAINT CAPRODUTOXMARGEMMARKUP_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAMETAXEXCECOES ADD CONSTRAINT PAMETAXEXCECOES_FK3 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAREGRAPROMOCAOXPRODUTOS ADD CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAMVAS ADD CONSTRAINT PAMVAS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PADESONERACOESFISCAIS ADD CONSTRAINT PADESONERACOESFISCAIS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAREGRASDISTRIBUICOES ADD CONSTRAINT PAREGRASDISTRIBUICOES_FK9 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAABERTURASCOMPRA ADD CONSTRAINT PAABERTURASCOMPRA_FK9 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCONTROLEENTREGA ADD CONSTRAINT CAPRODUTOXCONTROLEENTREGA_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOPAINELCOMPRAXITENS ADD CONSTRAINT MOPAINELCOMPRAXITENS_FK3 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (248, 20003021, 'Solicitar Informação Complementar', 1, 20003, 'L', '1', 'E', 0, 0, 0, 0, 1, 0, 'Solicitar Informação Complementar', ' ', ' ', ' ');
INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (249, 20003022, 'Tipo Atendimento', 1, 20003, 'N', '4', 'P', 0, 0, 0, 0, 1, 0, 'Tipo Atendimento', ' ', 'PATIPOSATENDIMENTO', ' ');

COMMIT;

CREATE TABLE CAPRODUTOXCUSTOS_2401 AS SELECT * FROM CAPRODUTOXCUSTOS;

ALTER TABLE CAPRODUTOXCUSTOXALIQUOTAS DROP CONSTRAINT CAPRODUTOXCUSTOXALIQUOTAS_FK1;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK6;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK7;

DROP TABLE CAPRODUTOXCUSTOS;

-- CAPRODUTOXCUSTOS
CREATE TABLE CAPRODUTOXCUSTOS
  (
    idProdutoXCusto         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                 NUMERIC (7,0) DEFAULT 0 NOT NULL,
    cor                     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    tamanho                 VARCHAR (10) DEFAULT ' ' NOT NULL,
    personalizacao          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    data                    DATE NOT NULL,
    ativo                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoUltimaCompra       NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoAtual         NUMERIC (15,7) DEFAULT 0 NOT NULL,
    novoPrecoCusto          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percentualVariacaoCusto NUMERIC (15,8) DEFAULT 0 NOT NULL,
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_PK1 PRIMARY KEY (idProdutoXCusto);
CREATE INDEX CAPRODUTOXCUSTOS_K2 ON CAPRODUTOXCUSTOS (idItemPreDocumento);
CREATE INDEX CAPRODUTOXCUSTOS_K3 ON CAPRODUTOXCUSTOS (idItemDocFiscal);
CREATE INDEX CAPRODUTOXCUSTOS_K4 ON CAPRODUTOXCUSTOS (produto, cor, tamanho, personalizacao, data);
CREATE INDEX CAPRODUTOXCUSTOS_K5 ON CAPRODUTOXCUSTOS (produto);
CREATE INDEX CAPRODUTOXCUSTOS_K6 ON CAPRODUTOXCUSTOS (cor);
CREATE INDEX CAPRODUTOXCUSTOS_K7 ON CAPRODUTOXCUSTOS (tamanho);
CREATE INDEX CAPRODUTOXCUSTOS_K8 ON CAPRODUTOXCUSTOS (personalizacao);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK3 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK4 FOREIGN KEY (cor) REFERENCES PACORES (cor);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK5 FOREIGN KEY (tamanho) REFERENCES PATAMANHOS (tamanho);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);

INSERT INTO CAPRODUTOXCUSTOS (idProdutoXCusto, idItemPreDocumento, idItemDocFiscal, produto, cor, tamanho, personalizacao, data, ativo, precoUltimaCompra, precoCustoAtual, novoPrecoCusto, percentualVariacaoCusto, observacoes) VALUES (0, 0, 0, 0, 0, ' ', 0, TO_DATE('01/01/1900', 'DD/MM/YYYY'), 1, 0, 0, 0, 0, ' ');
INSERT INTO CAPRODUTOXCUSTOS (idProdutoXCusto, idItemPreDocumento, idItemDocFiscal, produto, cor, tamanho, personalizacao, data, ativo, precoUltimaCompra, precoCustoAtual, novoPrecoCusto, percentualVariacaoCusto, observacoes) SELECT idProdutoXCusto, 0, 0, produto, cor, tamanho, personalizacao, data, ativo, precoUltimaCompra, precoCustoAtual, novoPrecoCusto, percentualVariacaoCusto, observacoes FROM CAPRODUTOXCUSTOS_2401 WHERE idProdutoXCusto > 0;

COMMIT;

ALTER TABLE CAPRODUTOXCUSTOXALIQUOTAS ADD CONSTRAINT CAPRODUTOXCUSTOXALIQUOTAS_FK1 FOREIGN KEY (idProdutoXCusto) REFERENCES CAPRODUTOXCUSTOS (idProdutoXCusto);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK6 FOREIGN KEY (idProdutoXCustoAtual) REFERENCES CAPRODUTOXCUSTOS (idProdutoXCusto);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK7 FOREIGN KEY (idProdutoXCustoNovo) REFERENCES CAPRODUTOXCUSTOS (idProdutoXCusto);

UPDATE SITABELASSISTEMA SET ordenacao = 50383 WHERE tabelaSistema = 'CAPRODUTOXCUSTOS';
UPDATE SITABELASSISTEMA SET ordenacao = 50384 WHERE tabelaSistema = 'CAPRODUTOXCUSTOXALIQUOTAS';

COMMIT;

-- MOPREDOCUMXATENDIMENTO
CREATE TABLE MOPREDOCUMXATENDIMENTO
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAtendimento      NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOPREDOCUMXATENDIMENTO ADD CONSTRAINT MOPREDOCUMXATENDIMENTO_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOPREDOCUMXATENDIMENTO_K2 ON MOPREDOCUMXATENDIMENTO (idItemPreDocumento, idAtendimento);
CREATE INDEX MOPREDOCUMXATENDIMENTO_K3 ON MOPREDOCUMXATENDIMENTO (idItemPreDocumento);
CREATE INDEX MOPREDOCUMXATENDIMENTO_K4 ON MOPREDOCUMXATENDIMENTO (idAtendimento);
ALTER TABLE MOPREDOCUMXATENDIMENTO ADD CONSTRAINT MOPREDOCUMXATENDIMENTO_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXATENDIMENTO ADD CONSTRAINT MOPREDOCUMXATENDIMENTO_FK2 FOREIGN KEY (idAtendimento) REFERENCES MOATENDIMENTOS (idAtendimento);

INSERT INTO MOPREDOCUMXATENDIMENTO (id, idItemPreDocumento, idAtendimento) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOPREDOCUMXATENDIMENTO', 'Pré-Documento X Atendimento', 1, 50207, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MODOCFISCALXATENDIMENTO
CREATE TABLE MODOCFISCALXATENDIMENTO
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAtendimento   NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MODOCFISCALXATENDIMENTO ADD CONSTRAINT MODOCFISCALXATENDIMENTO_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MODOCFISCALXATENDIMENTO_K2 ON MODOCFISCALXATENDIMENTO (idItemDocFiscal, idAtendimento);
CREATE INDEX MODOCFISCALXATENDIMENTO_K3 ON MODOCFISCALXATENDIMENTO (idItemDocFiscal);
CREATE INDEX MODOCFISCALXATENDIMENTO_K4 ON MODOCFISCALXATENDIMENTO (idAtendimento);
ALTER TABLE MODOCFISCALXATENDIMENTO ADD CONSTRAINT MODOCFISCALXATENDIMENTO_FK2 FOREIGN KEY (idAtendimento) REFERENCES MOATENDIMENTOS (idAtendimento);

INSERT INTO MODOCFISCALXATENDIMENTO (id, idItemDocFiscal, idAtendimento) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MODOCFISCALXATENDIMENTO', 'Documento Fiscal X Atendimento', 1, 50281, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (429, 'Pesquisar produto pelo campo "Código Fornecedor" (Produtos X Fornecedores)', 1, 20001, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (202, 'Ordem Produção', 'Ord.Prod.', 1, 'E', 0, 0, 0, ' ');

COMMIT;

CREATE TABLE PAETAPASORCAMENTO_0401 AS SELECT * FROM PAETAPASORCAMENTO;

ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK18;
ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK20;
ALTER TABLE PAETAPASORCAMENTODEPARA DROP CONSTRAINT PAETAPASORCAMENTODEPARA_FK4;
ALTER TABLE PAETAPASORCAMENTODEPARA DROP CONSTRAINT PAETAPASORCAMENTODEPARA_FK5;
ALTER TABLE PAETAPASORCAMENTOPERMITID DROP CONSTRAINT PAETAPASORCAMENTOPERMITID_FK4;
ALTER TABLE PAIMPRESSORAXDOCUMENTO DROP CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK7;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK30;
ALTER TABLE MOORCAMENTOXETAPAS DROP CONSTRAINT MOORCAMENTOXETAPAS_FK3;

DROP TABLE PAETAPASORCAMENTO;

-- PAETAPASORCAMENTO
CREATE TABLE PAETAPASORCAMENTO
  (
    etapaOrcamento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                     VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                     NUMERIC (11,0) DEFAULT 0 NOT NULL,
    situacaoOrcamento             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    financeiro                    CHAR (1) DEFAULT ' ' NOT NULL,
    transferencia                 CHAR (1) DEFAULT ' ' NOT NULL,
    habilitaImprimirManual        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirTrocaEtapa            CHAR (1) DEFAULT ' ' NOT NULL,
    corLegenda                    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    etapaObrigatoriaReceitaOculos NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitarConfirmacao          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    textoConfirmacao              VARCHAR (256) DEFAULT ' ' NOT NULL,
    enviarSms                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarEmail                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    assuntoEmailSms               VARCHAR (256) DEFAULT ' ' NOT NULL,
    corpoEmail                    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    informarEvento                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoEvento                    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    validoOrcamento               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPedidoCompra            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoOrdemServico            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoContrato                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoOrdemProducao           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirFinanceiro            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirCondPagamentoSinal    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirCondPagamentoAReceber NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirObservacoesEtapa      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    efetivarObservacoesEtapa      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_PK1 PRIMARY KEY (etapaOrcamento);
CREATE INDEX PAETAPASORCAMENTO_K2 ON PAETAPASORCAMENTO (descricao);
CREATE INDEX PAETAPASORCAMENTO_K3 ON PAETAPASORCAMENTO (ordenacao, etapaOrcamento);
CREATE INDEX PAETAPASORCAMENTO_K4 ON PAETAPASORCAMENTO (situacaoOrcamento);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK1 FOREIGN KEY (situacaoOrcamento) REFERENCES SISITUACOESORCAMENTO (situacaoOrcamento);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK2 FOREIGN KEY (financeiro) REFERENCES SISOLICITAOBRIGANAOINFORMA (solicitaObrigaNaoInforma);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK3 FOREIGN KEY (transferencia) REFERENCES SISOLICITAOBRIGANAOINFORMA (solicitaObrigaNaoInforma);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK4 FOREIGN KEY (imprimirTrocaEtapa) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK5 FOREIGN KEY (tipoEvento) REFERENCES PATIPOSEVENTO (tipoEvento);

INSERT INTO PAETAPASORCAMENTO (etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, transferencia, habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, validoContrato, validoOrdemProducao, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, ' ', ' ', 0, ' ', 0, 0, 0, ' ', 0, 0, ' ', ' ', 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, ' ');
INSERT INTO PAETAPASORCAMENTO (etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, transferencia, habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, validoContrato, validoOrdemProducao, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes) SELECT etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, transferencia, habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, validoContrato, 0, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes FROM PAETAPASORCAMENTO_0401 WHERE etapaOrcamento > 0;

COMMIT;

ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK18 FOREIGN KEY (transfEtapaOrcamentoSaida) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK20 FOREIGN KEY (transfEtapaOrcamentoEntrada) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTODEPARA ADD CONSTRAINT PAETAPASORCAMENTODEPARA_FK4 FOREIGN KEY (etapaOrcamentoDe) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTODEPARA ADD CONSTRAINT PAETAPASORCAMENTODEPARA_FK5 FOREIGN KEY (etapaOrcamentoPara) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTOPERMITID ADD CONSTRAINT PAETAPASORCAMENTOPERMITID_FK4 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK7 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK30 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE MOORCAMENTOXETAPAS ADD CONSTRAINT MOORCAMENTOXETAPAS_FK3 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (969, 'Ordem Produção', 1, 3010009690, 30, 'MOV', 0, 970, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'OrdemProducao', ' ', 3, 3, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (970, 'Pesquisa Ordens Produção', 1, 3010009700, 30, 'MOV', 0, 969, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqOrdensProducao', 'OrdemProducao', 3, 3, NULL, ' ');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (250, 30001001, 'Modelo Documento Ordem Produção', 1, 30001, 'N', '4', 'P', 0, 0, 0, 1, 1, 1, 'Modelo Documento', ' ', 'PAMODELOSDOCUMENTO', ' ');

COMMIT;

INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, habilitaAbrirGaveta, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) VALUES (58, 'Ordem de Produção', 1, 104, 1, 0, 0, 0, 1, '%SYS_DIR_ARQ_MODELOS%OrdemProducao.rtf', 1, 'Tipo Documento = "O"', 0, ' ');

COMMIT;

CREATE TABLE MOORCAMENTOXATIVIDADEPREV_2401 AS SELECT * FROM MOORCAMENTOXATIVIDADEPREV;

ALTER TABLE MOORCAMENTOXFICHAPRODPREV DROP CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK1;
ALTER TABLE MOORCAMENTOXTAREFAS DROP CONSTRAINT MOORCAMENTOXTAREFAS_FK1;
ALTER TABLE MOORCAMENTOXATIVIDADEREAL DROP CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK1;
ALTER TABLE MOORCAMENTOXFICHAPRODREAL DROP CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK4;
ALTER TABLE MOPLANEJAMENTOXATIVIDPREV DROP CONSTRAINT MOPLANEJAMENTOXATIVIDPREV_FK2;

DROP TABLE MOORCAMENTOXATIVIDADEPREV;

-- MOORCAMENTOXATIVIDADEPREV
CREATE TABLE MOORCAMENTOXATIVIDADEPREV
  (
    idAtividadePrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                NUMERIC (3,0) DEFAULT 0 NOT NULL,
    atividadeServico         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (4000) DEFAULT ' ' NOT NULL,
    tecnico                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarAtividade         CHAR (1) DEFAULT ' ' NOT NULL,
    checklist                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoApontamento          CHAR (1) DEFAULT ' ' NOT NULL,
    etapaAtividade           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    statusAtividadeServico   CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio               DATE,
    dataTermino              DATE,
    quantidade               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitario            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_PK1 PRIMARY KEY (idAtividadePrevOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXATIVIDADEPREV_K2 ON MOORCAMENTOXATIVIDADEPREV (idItemOrcamento, sequencia);
CREATE INDEX MOORCAMENTOXATIVIDADEPREV_K3 ON MOORCAMENTOXATIVIDADEPREV (idItemOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK3 FOREIGN KEY (tecnico) REFERENCES CATECNICOS (tecnico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK4 FOREIGN KEY (faturarAtividade) REFERENCES SIFATURARATIVIDADES (faturarAtividade);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK5 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK6 FOREIGN KEY (tipoApontamento) REFERENCES SITIPOSAPONTAMENTO (tipoApontamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK7 FOREIGN KEY (etapaAtividade) REFERENCES PAETAPASATIVIDADE (etapaAtividade);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK8 FOREIGN KEY (statusAtividadeServico) REFERENCES SISTATUSATIVIDADESERVICO (statusAtividadeServico);

INSERT INTO MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, faturarAtividade, checklist, tipoApontamento, etapaAtividade, statusAtividadeServico, dataInicio, dataTermino, quantidade, precoUnitario, observacoes) VALUES (0, 0, 0, 0, 'SELECIONE', 0, ' ', 0, ' ', 0, ' ', NULL, NULL, 0, 0, ' ');
INSERT INTO MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, faturarAtividade, checklist, tipoApontamento, etapaAtividade, statusAtividadeServico, dataInicio, dataTermino, quantidade, precoUnitario, observacoes) SELECT idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, faturarAtividade, checklist, 'I', etapaAtividade, statusAtividadeServico, dataInicio, dataTermino, quantidade, precoUnitario, observacoes FROM MOORCAMENTOXATIVIDADEPREV_2401 WHERE idAtividadePrevOrcamento > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXFICHAPRODPREV ADD CONSTRAINT MOORCAMENTOXFICHAPRODPREV_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXTAREFAS ADD CONSTRAINT MOORCAMENTOXTAREFAS_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK4 FOREIGN KEY (idFichaProdutoPrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOPLANEJAMENTOXATIVIDPREV ADD CONSTRAINT MOPLANEJAMENTOXATIVIDPREV_FK2 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_MINIMO (
  p_estabelecimento  IN NUMBER,
  p_gradProd_produto IN NUMBER)
  RETURN NUMBER
IS
  v_estoqueMinimo NUMBER;
BEGIN
  SELECT COALESCE (MAX (distrXEst.estoqueMinimo), 0)
  INTO v_estoqueMinimo      
  FROM PAREGRASDISTRIBUICOES distr
  JOIN CAPRODUTOS prod
  ON prod.produto = p_gradProd_produto
  JOIN PASUBCATEGORIASPRODUTO subCat
  ON subCat.subcategoriaProduto = prod.subcategoriaProduto
  JOIN PAREGRASDISTRIBXESTABELEC distrXEst
  ON distrXEst.idRegraDistribuicao = distr.idRegraDistribuicao
  WHERE distr.idRegraDistribuicao > 0
  AND distr.ativo = 1
  AND distrXEst.estabelecimento = p_estabelecimento
  AND distrXEst.dataValidadeInicial <= TRUNC (SYSDATE)
  AND distrXEst.dataValidadeFinal >= TRUNC (SYSDATE)
  AND (distr.categoriaProduto = 0
    OR distr.categoriaProduto = subCat.categoriaProduto)
  AND (distr.subcategoriaProduto = 0
    OR distr.subcategoriaProduto = prod.subcategoriaProduto)
  AND (distr.marca = 0
    OR distr.marca = prod.marca)
  AND (distr.caracteristicaA = 0
    OR distr.caracteristicaA = prod.caracteristicaA)
  AND (distr.caracteristicaB = 0
    OR distr.caracteristicaB = prod.caracteristicaB)
  AND (distr.caracteristicaC = 0
    OR distr.caracteristicaC = prod.caracteristicaC)
  AND (distr.caracteristicaD = 0
    OR distr.caracteristicaD = prod.caracteristicaD)
  AND (distr.caracteristicaE = 0
    OR distr.caracteristicaE = prod.caracteristicaE)
  AND (distr.produto = 0
    OR distr.produto = p_gradProd_produto);
  IF v_estoqueMinimo = 0 THEN
    SELECT COALESCE (MAX (estoqueMinimo), 0)
    INTO v_estoqueMinimo      
    FROM CAPRODUTOXESTABELECIMENTO
    WHERE produto = p_gradProd_produto
    AND estabelecimento = p_estabelecimento
    AND ativo = 1;
  END IF;
  IF v_estoqueMinimo = 0
    AND p_estabelecimento > 0
  THEN
    SELECT COALESCE (MAX (estoqueMinimo), 0)
    INTO v_estoqueMinimo      
    FROM CAPRODUTOXESTABELECIMENTO
    WHERE produto = p_gradProd_produto
    AND estabelecimento = 0
    AND ativo = 1;
  END IF;
  RETURN v_estoqueMinimo;  
END;

/

create or replace FUNCTION BUSCA_RESERVAS_ESTOQUE (
  p_config_82_considLenteDispon IN NUMBER,
  p_config_83_considLenteEstoqu IN NUMBER,
  p_config_160_permiteTransfSem IN CHAR,
  p_produto                     IN NUMBER,
  p_cor                         IN NUMBER,
  p_tamanho                     IN VARCHAR,
  p_gradeProduto                IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_indicadorPropriedadePosseIt IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_idEnderecoEstoque           IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_orcamentoDesconsiderar      IN NUMBER,
  p_transferenciaDesconsiderar  IN NUMBER,
  p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas NUMBER(15,6);
BEGIN
  v_quantidadeReservas := FUNC_ADD_BUSCA_RESERVAS_PROD (
    p_config_82_considLenteDispon,
    p_config_83_considLenteEstoqu,
    p_config_160_permiteTransfSem,
    p_produto,
    p_cor,
    p_tamanho,
    p_gradeProduto,
    p_idLoteEstoque,
    p_estabelecimento,
    CASE
      WHEN p_indicadorPropriedadePosseIt IS NULL
        OR p_indicadorPropriedadePosseIt = ' '
      THEN '0'
      ELSE p_indicadorPropriedadePosseIt
    END,
    p_pessoaParticipante,
    p_localEstoque,
    0, -- p_personalizacao
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN 'O'
      WHEN p_transferenciaDesconsiderar > 0
      THEN 'T'
      ELSE ''
    END, -- p_documentoDesconsiderar
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN p_orcamentoDesconsiderar
      WHEN p_transferenciaDesconsiderar > 0
      THEN p_transferenciaDesconsiderar
      ELSE 0
    END, -- p_idDocumentoDesconsiderar
    p_entradaSaida);
  RETURN v_quantidadeReservas;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_TABELA_PRECO (
  p_perfilUsuarioLogado  IN NUMBER,
  p_usuarioLogado        IN NUMBER,
  p_cab_estabelecimento  IN NUMBER,
  p_cab_dataPreco        IN DATE,
  p_cab_pessoa           IN NUMBER,
  p_endPessEst_uf        IN CHAR,
  p_endPess_uf           IN CHAR,
  p_item_vendedor        IN NUMBER,
  p_grade_produto        IN NUMBER,
  p_grade_cor            IN NUMBER,
  p_grade_tamanho        IN VARCHAR,
  p_prod_controleEstoque IN NUMBER)
  RETURN CHAR
IS
  v_tabelaPreco CHAR (10);
BEGIN
  IF p_prod_controleEstoque IN (3,4) THEN
    FOR a IN (
      SELECT 
        a.quantidade,
        gradProdFilho.produto,
        gradProdFilho.cor,
        gradProdFilho.tamanho,
        prodFilho.controleEstoque
      FROM CAGRADEPRODUTOXKITSCOMBOS a
      JOIN CAGRADESPRODUTO gradProdPai
      ON gradProdPai.gradeProduto = a.gradeProduto
      JOIN CAGRADESPRODUTO gradProdFilho
      ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho
      ON prodFilho.produto = gradProdFilho.produto
      WHERE gradProdPai.produto = p_grade_produto
      AND a.gradeProdutoFilho > 0
      AND a.ativo = 1
      AND a.quantidade > 0
      AND a.gradeProduto <> a.gradeProdutoFilho)
    LOOP
      v_tabelaPreco := FUNC_ADD_BUSCA_TABELA_PRECO (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_estabelecimento,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque);    
      EXIT WHEN v_tabelaPreco = ' ';
    END LOOP;
  ELSE
    SELECT COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco
    INTO v_tabelaPreco
    FROM(
      SELECT a.tabelaPreco
      FROM (
        SELECT 
          a.tabelaPreco,
          ROW_NUMBER() OVER (
            ORDER BY tabela.ordenacao,
              a.tabelaPreco,
              a.ordenacao,
              a.idPrecoTabela) ordenacao
        FROM CATABELAPRECOXPRECOS a
        JOIN PATABELASPRECO tabela
        ON tabela.tabelaPreco = a.tabelaPreco
        JOIN PAFILTROSCABECALHO filtroCab
        ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
        JOIN CAPESSOAS pess
        ON pess.pessoa = p_cab_pessoa
        WHERE a.produto = p_grade_produto
        AND a.tabelaPreco <> ' '
        AND a.ativo = 1
        AND a.quantidadeMinima <= 1
        AND a.quantidadeMaxima >= 1
        AND a.dataValidadeInicial <= p_cab_dataPreco
        AND a.dataValidadeFinal >= p_cab_dataPreco
        AND (p_grade_cor = 0
          AND a.filtrarCores = 0
          OR p_grade_cor > 0
          AND (a.filtrarCores = 0
            OR EXISTS (
              SELECT 1
              FROM CATABELAPRECOXCORES tabcor
              WHERE tabcor.idPrecoTabela = a.idPrecoTabela
              AND tabcor.cor = p_grade_cor
              AND tabcor.ativo = 1)))
        AND (p_grade_tamanho = ' '
          AND a.filtrarTamanhos = 0
          OR p_grade_tamanho <> ' '
          AND (a.filtrarTamanhos = 0
            OR EXISTS (
              SELECT 1
              FROM CATABELAPRECOXTAMANHOS tabtam
              WHERE tabtam.idPrecoTabela = a.idPrecoTabela
              AND tabtam.tamanho = p_grade_tamanho
              AND tabtam.ativo = 1)))
        AND a.filtrarPersonalizacoes = 0
        AND tabela.ativo = 1 
        AND tabela.validoParaVenda = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND tabela.filtrarLocaisEstoque = 0
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1)))) a
      WHERE a.ordenacao = 1) a;
  END IF;
  RETURN v_tabelaPreco;
END;

/

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

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_GRAVA (
  p_idReservaEstoque            IN NUMBER,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  p_estabelecimentoAtivo        IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_gradeProduto                IN NUMBER,
  p_modeloDocumento             IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_indicadorPropPosseItem      IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_idEnderecoEstoque           IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  p_idItemOrcamento             IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  r_idReservaEstoque            OUT NUMBER,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
BEGIN
  IF p_idReservaEstoque > 0 THEN
    r_idReservaEstoque       := p_idReservaEstoque;
    r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ELSIF p_bufferIdReservaEstoque IS NOT NULL AND LENGTH (RTRIM (p_bufferIdReservaEstoque)) >= 14 THEN
    r_idReservaEstoque       := TO_NUMBER (SUBSTR (p_bufferIdReservaEstoque, 1, 14));
    r_bufferIdReservaEstoque := RTRIM (SUBSTR (p_bufferIdReservaEstoque, 16, 31984));
  ELSE
    r_idReservaEstoque       := FUNC_ADD_BUSCA_PROXIMO_ID ('MORESERVASESTOQUE', 'idReservaEstoque', 14, p_estabelecimentoAtivo, NULL);
    r_bufferIdReservaEstoque := '';
  END IF;
  MERGE INTO MORESERVASESTOQUE a USING (
    SELECT
      r_idReservaEstoque idReservaEstoque,
      p_estabelecimento estabelecimento,
      p_dataEntrega dataEntrega,
      p_gradeProduto gradeProduto,
      p_modeloDocumento modeloDocumento,
      p_entradaSaida entradaSaida,
      p_indicadorPropPosseItem indicadorPropriedadePosseItem,
      p_pessoaParticipante pessoaParticipante,
      p_localEstoque localEstoque,
      p_personalizacao personalizacao,
      p_idLoteEstoque idLoteEstoque,
      p_idEnderecoEstoque idEnderecoEstoque,
      p_idNumeroSerie idNumeroSerie,
      p_quantidadeSaldo quantidadeSaldo,
      p_observacoes observacoes
    FROM DUAL) b
  ON (a.idReservaEstoque = b.idReservaEstoque)
  WHEN MATCHED THEN UPDATE SET 
    a.estabelecimento = b.estabelecimento,
    a.dataEntrega = b.dataEntrega,
    a.gradeProduto = b.gradeProduto,
    a.modeloDocumento = b.modeloDocumento,
    a.entradaSaida = b.entradaSaida,
    a.indicadorPropriedadePosseItem = b.indicadorPropriedadePosseItem,
    a.pessoaParticipante = b.pessoaParticipante,
    a.localEstoque = b.localEstoque,
    a.personalizacao = b.personalizacao,
    a.idLoteEstoque = b.idLoteEstoque,
    a.idEnderecoEstoque = b.idEnderecoEstoque,
    a.idNumeroSerie = b.idNumeroSerie,
    a.quantidadeSaldo = b.quantidadeSaldo,
    a.observacoes = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idReservaEstoque,
    estabelecimento,
    dataEntrega,
    gradeProduto,
    modeloDocumento,
    entradaSaida,
    indicadorPropriedadePosseItem,
    pessoaParticipante,
    localEstoque,
    personalizacao,
    idLoteEstoque,
    idEnderecoEstoque,
    idNumeroSerie,
    quantidadeSaldo,
    observacoes)
  VALUES (
    b.idReservaEstoque,
    b.estabelecimento,
    b.dataEntrega,
    b.gradeProduto,
    b.modeloDocumento,
    b.entradaSaida,
    b.indicadorPropriedadePosseItem,
    b.pessoaParticipante,
    b.localEstoque,
    b.personalizacao,
    b.idLoteEstoque,
    b.idEnderecoEstoque,
    b.idNumeroSerie,
    b.quantidadeSaldo,
    b.observacoes);
  IF p_idItemOrcamento > 0 THEN
    MERGE INTO MOORCAMENTOXRESERVAESTOQ a USING (
      SELECT
        p_idItemOrcamento idItemOrcamento,
        r_idReservaEstoque idReservaEstoque
      FROM DUAL) b
    ON (a.idReservaEstoque = b.idReservaEstoque)
    WHEN MATCHED THEN UPDATE SET 
      a.idItemOrcamento = b.idItemOrcamento
    WHEN NOT MATCHED THEN INSERT (
      id,
      idReservaEstoque,
      idItemOrcamento)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXRESERVAESTOQ', 'id', 14, p_estabelecimentoAtivo, NULL),
      b.idReservaEstoque,
      b.idItemOrcamento);
  END IF;
  IF p_idFichaProdutoPrevOrcamento > 0 THEN
    MERGE INTO MOORCAMENTOXFICHAXRESERVA a USING (
      SELECT
        p_idFichaProdutoPrevOrcamento idFichaProdutoPrevOrcamento,
        r_idReservaEstoque            idReservaEstoque
      FROM DUAL) b
    ON (a.idReservaEstoque = b.idReservaEstoque)
    WHEN MATCHED THEN UPDATE SET 
      a.idFichaProdutoPrevOrcamento = b.idFichaProdutoPrevOrcamento
    WHEN NOT MATCHED THEN INSERT (
      id,
      idReservaEstoque,
      idFichaProdutoPrevOrcamento)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXFICHAXRESERVA', 'id', 14, p_estabelecimentoAtivo, NULL),
      b.idReservaEstoque,
      b.idFichaProdutoPrevOrcamento);
  END IF; 
  IF p_idItemDocTransferencia > 0 THEN
    MERGE INTO MODOCTRANSFXRESERVAESTOQ a USING (
      SELECT
        p_idItemDocTransferencia idItemDocTransferencia,
        r_idReservaEstoque       idReservaEstoque
      FROM DUAL) b
    ON (a.idReservaEstoque = b.idReservaEstoque)
    WHEN MATCHED THEN UPDATE SET 
      a.idItemDocTransferencia = b.idItemDocTransferencia
    WHEN NOT MATCHED THEN INSERT (
      id,
      idReservaEstoque,
      idItemDocTransferencia)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXRESERVAESTOQ', 'id', 14, p_estabelecimentoAtivo, NULL),
      b.idReservaEstoque,
      b.idItemDocTransferencia);
  END IF;
END ADD_RESERVA_ESTOQUE_GRAVA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_KIT (
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_idFichaProdutoPrevOrcam IN NUMBER,
  p_item_idItemDocTransferencia  IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_quantidadeSaldo         IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho gradeProduto,
      prodFilho.controleEstoque,
      ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE
          WHEN p_cab_dataEntrega IS NULL
            OR p_cab_dataEntrega < p_cab_dataEmissao
          THEN p_cab_dataEmissao
          ELSE p_cab_dataEntrega
        END, --p_data
        a.gradeProduto,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_item_personalizacao
        0, -- p_idLoteEstoque
        p_item_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidadeSaldo,
        p_item_observacoes,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP; 
END ADD_RESERVA_ESTOQUE_KIT;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_PROD_TINTA (
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_idFichaProdutoPrevOrcam IN NUMBER,
  p_item_idItemDocTransferencia  IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_quantidadeSaldo         IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidadeSaldo * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidadeSaldo * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
        p_tinta_gradeProduto,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_item_personalizacao
        0, --p_idLoteEstoque
        p_item_idEnderecoEstoque,
        0, --p_idNumeroSerie
        a.quantidadeSaldo,
        p_item_observacoes,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_PROD_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_FORM_TINTA ( 
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_idFichaProdutoPrevOrcam IN NUMBER,
  p_item_idItemDocTransferencia  IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      formTinta.idBaseTinta,
      baseTinta.gradeProduto,
      formTinta.idColoranteTintaA,
      formTinta.quantidadeA,
      COALESCE(colTintaA.gradeProduto, 0) gradeProdutoA,
      formTinta.idColoranteTintaB,
      formTinta.quantidadeB,
      COALESCE(colTintaB.gradeProduto, 0) gradeProdutoB,
      formTinta.idColoranteTintaC,
      formTinta.quantidadeC,
      COALESCE(colTintaC.gradeProduto, 0) gradeProdutoC,
      formTinta.idColoranteTintaD,
      formTinta.quantidadeD,
      COALESCE(colTintaD.gradeProduto, 0) gradeProdutoD,
      formTinta.idColoranteTintaE,
      formTinta.quantidadeE,
      COALESCE(colTintaE.gradeProduto, 0) gradeProdutoE,
      formTinta.idColoranteTintaF,
      formTinta.quantidadeF,
      COALESCE(colTintaF.gradeProduto, 0) gradeProdutoF,
      formTinta.idColoranteTintaG,
      formTinta.quantidadeG,
      COALESCE(colTintaG.gradeProduto, 0) gradeProdutoG,
      formTinta.idColoranteTintaH,
      formTinta.quantidadeH,
      COALESCE(colTintaH.gradeProduto, 0) gradeProdutoH,
      formTinta.idColoranteTintaI,
      formTinta.quantidadeI,
      COALESCE(colTintaI.gradeProduto, 0) gradeProdutoI,
      formTinta.idColoranteTintaJ,
      formTinta.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto, 0) gradeProdutoJ,
      formTinta.idColoranteTintaK,
      formTinta.quantidadeK,
      COALESCE(colTintaK.gradeProduto, 0) gradeProdutoK,
      formTinta.idColoranteTintaL,
      formTinta.quantidadeL,
      COALESCE(colTintaL.gradeProduto, 0) gradeProdutoL,
      formTinta.idColoranteTintaM,
      formTinta.quantidadeM,
      COALESCE(colTintaM.gradeProduto, 0) gradeProdutoM,
      formTinta.idColoranteTintaN,
      formTinta.quantidadeN,
      COALESCE(colTintaN.gradeProduto, 0) gradeProdutoN,
      formTinta.idColoranteTintaO,
      formTinta.quantidadeO,
      COALESCE(colTintaO.gradeProduto, 0) gradeProdutoO
    FROM CAFORMULASTINTAS formTinta 
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = formTinta.idBaseTinta
    LEFT JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = formTinta.idColoranteTintaA
    LEFT JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = formTinta.idColoranteTintaB
    LEFT JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = formTinta.idColoranteTintaC
    LEFT JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = formTinta.idColoranteTintaD
    LEFT JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = formTinta.idColoranteTintaE
    LEFT JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = formTinta.idColoranteTintaF
    LEFT JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = formTinta.idColoranteTintaG
    LEFT JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = formTinta.idColoranteTintaH
    LEFT JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = formTinta.idColoranteTintaI
    LEFT JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = formTinta.idColoranteTintaJ
    LEFT JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = formTinta.idColoranteTintaK
    LEFT JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = formTinta.idColoranteTintaL
    LEFT JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = formTinta.idColoranteTintaM
    LEFT JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = formTinta.idColoranteTintaN
    LEFT JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = formTinta.idColoranteTintaO
    WHERE formTinta.idFormulaTinta = p_item_idFormulaTinta
    AND formTinta.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_RESERVA_ESTOQUE_PROD_TINTA (
      r_bufferIdReservaEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_idItemOrcamento,
      p_item_idFichaProdutoPrevOrcam,
      p_item_idItemDocTransferencia,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_idEnderecoEstoque,
      p_item_quantidade,
      p_item_observacoes,
      p_locEst_indicProprPosseItem,
      a.gradeProduto,
      900, -- p_quantidade
      r_bufferIdReservaEstoque);
    IF a.idColoranteTintaA > 0
      AND a.quantidadeA > 0
      AND a.gradeProdutoA > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.quantidadeB > 0
      AND a.gradeProdutoB > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.quantidadeC > 0
      AND a.gradeProdutoC > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.quantidadeD > 0
      AND a.gradeProdutoD > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.quantidadeE > 0
      AND a.gradeProdutoE > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.quantidadeF > 0
      AND a.gradeProdutoF > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.quantidadeG > 0
      AND a.gradeProdutoG > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.quantidadeH > 0
      AND a.gradeProdutoH > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.quantidadeI > 0
      AND a.gradeProdutoI > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.quantidadeJ > 0
      AND a.gradeProdutoJ > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.quantidadeK > 0
      AND a.gradeProdutoK > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.quantidadeL > 0
      AND a.gradeProdutoL > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.quantidadeM > 0
      AND a.gradeProdutoM > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.quantidadeN > 0
      AND a.gradeProdutoN > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.quantidadeO > 0
      AND a.gradeProdutoO > 0
    THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idFichaProdutoPrevOrcam,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_FORM_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_EXCLUI (
  p_idReservaEstoque IN NUMBER)
IS
BEGIN
  DELETE MODOCTRANSFXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MOORCAMENTOXFICHAXRESERVA
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MOORCAMENTOXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MORESERVASESTOQUE
  WHERE idReservaEstoque = p_idReservaEstoque;
END ADD_RESERVA_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_bufferIdReservaEstoque      IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque      OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MOORCAMENTOXFICHAXRESERVA
    WHERE idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_FIC_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
  p_idItemOrcamento        IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MOORCAMENTOXRESERVAESTOQ
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
	AND idAtividadePrevOrcamento > 0)
  LOOP
    FOR b IN (
      SELECT b.idFichaProdutoPrevOrcamento
      FROM MOORCAMENTOXFICHAPRODPREV b
      WHERE b.idAtividadePrevOrcamento = idAtividadePrevOrcamento
      AND b.idFichaProdutoPrevOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
        b.idFichaProdutoPrevOrcamento,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END LOOP;
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MODOCTRANSFXRESERVAESTOQ
    WHERE idItemDocTransferencia = p_idItemDocTransferencia)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_RES_ITEM (
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_estabelecimentoSaida     IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_tipoDocumentoSaida       IN NUMBER,
  p_cab_situacaoDocTransferencia IN CHAR,
  p_modDoc_movimentaEstoque      IN NUMBER,
  p_item_idItemDocTransferencia  IN NUMBER,
  p_item_cancelado               IN NUMBER,
  p_item_validoSaida             IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoqueSaida       IN NUMBER,
  p_item_pessoaParticipanteSaida IN NUMBER,
  p_item_quantidadeSaldo         IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  /* Retornos */
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
    p_item_idItemDocTransferencia,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  FOR a IN (
    SELECT
      p_cab_dataEmissao dataEmissao,
      p_item_quantidadeSaldo quantidadeSaldo,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = p_item_localEstoqueSaida
    WHERE gradProd.gradeProduto = p_item_gradeProduto
    AND p_cab_tipoDocumentoSaida > 100
    AND p_cab_situacaoDocTransferencia = 'A'
    AND p_modDoc_movimentaEstoque = 1
    AND p_item_cancelado = 0
    AND p_item_validoSaida = 1
    AND p_item_quantidadeSaldo <> 0)
  LOOP
    IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_RESERVA_ESTOQUE_FORM_TINTA (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        a.dataEmissao,
        a.dataEmissao, -- a.dataEntrega
        0, -- p_item_idItemOrcamento
        0, -- p_item_idFichaProdutoPrevOrcam
        p_item_idItemDocTransferencia,
        p_item_idFormulaTinta,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        a.quantidadeSaldo,
        p_item_observacoes,
        a.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        a.dataEmissao,
        a.dataEmissao, -- a.dataEntrega
        0, -- p_item_idItemOrcamento
        0, -- p_item_idFichaProdutoPrevOrcam
        p_item_idItemDocTransferencia,
        p_item_gradeProduto,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        a.quantidadeSaldo,
        p_item_observacoes,
        a.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimentoSaida,
        a.dataEmissao, --p_data
        p_item_gradeProduto,
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        a.indicadorPropriedadePosseItem,
        p_item_pessoaParticipanteSaida,
        p_item_localEstoqueSaida,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        0, -- p_idEnderecoEstoque
        0, -- p_idNumeroSerie
        a.quantidadeSaldo,
        p_item_observacoes,
        0, -- p_item_idItemOrcamento
        0, -- p_item_idFichaProdutoPrevOrcam
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;  
END ADD_DOCTRANSF_ITEM_RES_ITEM;


/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_RESERVA_GRAV (
  p_documentoTransferencia IN NUMBER,
  p_estabelecimentoAtivo   IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimentoSaida,
      cab.dataEmissao,
      cab.tipoDocumentoSaida,
      cab.situacaoDocTransferencia,
      modDoc.movimentaEstoque,
      item.idItemDocTransferencia,
      item.cancelado,
      item.validoSaida,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.quantidadeSaldo,
      item.observacoes
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    WHERE item.documentoTransferencia = p_documentoTransferencia
    AND cab.tipoDocumentoSaida > 100
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1
    AND item.cancelado = 0
    AND item.validoSaida = 1
    AND item.quantidadeSaldo <> 0)
  LOOP
    ADD_DOCTRANSF_ITEM_RES_ITEM (
      v_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      a.modeloDocumento,
      a.estabelecimentoSaida,
      a.dataEmissao,
      a.tipoDocumentoSaida,
      a.situacaoDocTransferencia,
      a.movimentaEstoque,
      a.idItemDocTransferencia,
      a.cancelado,
      a.validoSaida,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.quantidadeSaldo,
      a.observacoes,
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_DOCTRANSF_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_ESTOQUE_INSERE (
  p_bufferIdEstoque             IN VARCHAR2,
  p_estabelecimentoAtivo        IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_data                        IN DATE,
  p_gradeProduto                IN NUMBER,
  p_modeloDocumento             IN NUMBER,
  p_operacaoInternaEstoque      IN NUMBER,
  p_atualizaCustoMedio          IN NUMBER,
  p_atualizaUltimaCompra        IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_indicadorPropPosseItem      IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_idEnderecoEstoque           IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_precoCustoOperacao          IN NUMBER,
  p_totalCustoOperacao          IN NUMBER,
  p_precoCMV                    IN NUMBER,
  p_valorCMV                    IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_idItemPreDocumento          IN NUMBER,
  p_idItemDocFiscal             IN NUMBER,
  p_idItemSeparacao             IN NUMBER,
  p_divergenciaBalanco          IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  r_bufferIdEstoque             OUT VARCHAR2)
IS
  v_idEstoque NUMBER (14,0);
BEGIN
  IF p_bufferIdEstoque IS NOT NULL AND LENGTH(RTRIM(p_bufferIdEstoque)) >= 14
  THEN
    v_idEstoque       := TO_NUMBER(SUBSTR(p_bufferIdEstoque, 1, 14));
    r_bufferIdEstoque := RTRIM(SUBSTR(p_bufferIdEstoque,16,32000));
  ELSE
    v_idEstoque       := FUNC_ADD_BUSCA_PROXIMO_ID ('MOESTOQUES', 'idEstoque', 14, p_estabelecimentoAtivo, NULL);
    r_bufferIdEstoque := '';
  END IF;
  INSERT INTO MOESTOQUES (
    idEstoque,
    estabelecimento,
    data,
    gradeProduto,
    modeloDocumento,
    operacaoInternaEstoque,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    entradaSaida,
    indicadorPropriedadePosseItem,
    pessoaParticipante,
    localEstoque,
    personalizacao,
    idLoteEstoque,
    idEnderecoEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES(
    v_idEstoque,
    p_estabelecimento,
    p_data,
    p_gradeProduto,
    p_modeloDocumento,
    p_operacaoInternaEstoque,
    p_atualizaCustoMedio,
    p_atualizaUltimaCompra,
    p_entradaSaida,
    p_indicadorPropPosseItem,
    p_pessoaParticipante,
    p_localEstoque,
    p_personalizacao,
    p_idLoteEstoque,
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    p_quantidade,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes);
  IF p_idFichaProdutoRealOrcamento > 0 THEN
    INSERT INTO MOORCAMENTOXFICHAXESTOQUE (
      id,
      idFichaProdutoRealOrcamento,
      idEstoque)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXFICHAXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idFichaProdutoRealOrcamento,
      v_idEstoque);
  END IF;
  IF p_idItemPreDocumento > 0 THEN
    INSERT INTO MOPREDOCUMXESTOQUE (
      id,
      idItemPreDocumento,
      idEstoque)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idItemPreDocumento,
      v_idEstoque);
  END IF;
  IF p_idItemDocFiscal > 0 THEN
    INSERT INTO MODOCFISCALXESTOQUE (
      id,
      idItemDocFiscal,
      idEstoque)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idItemDocFiscal,
      v_idEstoque);
  END IF;
  IF p_idItemSeparacao > 0 THEN
    INSERT INTO MOSEPARACAOXESTOQUE (
      id,
      idItemSeparacao,
      idEstoque)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOSEPARACAOXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idItemSeparacao,
      v_idEstoque);
  END IF;
  IF p_divergenciaBalanco > 0 THEN
    INSERT INTO MOBALANCOXESTOQUE (
      id,
      divergenciaBalanco,
      idEstoque)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOBALANCOXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_divergenciaBalanco,
      v_idEstoque);
  END IF;
  IF p_idItemDocTransferencia > 0 THEN
    INSERT INTO MODOCTRANSFXESTOQUE (
      id,
      idItemDocTransferencia,
      idEstoque,
      quantidade)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idItemDocTransferencia,
      v_idEstoque,
      p_quantidade);
  END IF;
END ADD_ESTOQUE_INSERE;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ESTOQUE_EXCLUI (
  p_idEstoque IN NUMBER)
IS
BEGIN
  UPDATE MODOCTROCAXITENS
  SET idEstoque = 0
  WHERE idEstoque = p_idEstoque;
  DELETE MOORCAMENTOXFICHAXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOPREDOCUMXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCFISCALXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOSEPARACAOXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOBALANCOXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCTRANSFXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOESTOQUES
  WHERE idEstoque = p_idEstoque;
END ADD_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_FIC_TEC_EXCLUI (
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_bufferIdEstoque             IN VARCHAR,
  r_bufferIdEstoque             OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOORCAMENTOXFICHAXESTOQUE
    WHERE idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_FIC_TEC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_AT_REAL_EXCLUI (
  p_idAtividadeRealOrcamento IN NUMBER,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idFichaProdutoRealOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL
    WHERE idAtividadeRealOrcamento = p_idAtividadeRealOrcamento
	AND idFichaProdutoRealOrcamento > 0)
  LOOP
    ADD_ESTOQUE_FIC_TEC_EXCLUI (
      a.idFichaProdutoRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_AT_REAL_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_AT_PREV_EXCLUI (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadeRealOrcamento
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
	AND idAtividadeRealOrcamento > 0)
  LOOP
    ADD_ESTOQUE_AT_REAL_EXCLUI (
      a.idAtividadeRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_AT_PREV_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_EXCLUI (
  p_idItemOrcamento IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
	AND idAtividadePrevOrcamento > 0)
  LOOP
    ADD_ESTOQUE_AT_PREV_EXCLUI (
      a.idAtividadePrevOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_ORCAMENTO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_EXCLUI (
  p_idItemPreDocumento IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOPREDOCUMXESTOQUE
    WHERE idItemPreDocumento = p_idItemPreDocumento
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_EXCLUI (
  p_idItemDocFiscal IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MODOCFISCALXESTOQUE
    WHERE idItemDocFiscal = p_idItemDocFiscal
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_SEPARACAO_EXCLUI (
  p_idItemSeparacao IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOSEPARACAOXESTOQUE 
    WHERE idItemSeparacao = p_idItemSeparacao
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
  END LOOP;
END ADD_ESTOQUE_SEPARACAO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_BALANCO_EXCLUI (
  p_divergenciaBalanco IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOBALANCOXESTOQUE
    WHERE divergenciaBalanco = p_divergenciaBalanco
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_BALANCO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_TRANSF_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdEstoque        IN VARCHAR,
  r_bufferIdEstoque        OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MODOCTRANSFXESTOQUE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_TRANSF_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_SIT_GRAVA (
  p_usuarioLogado            IN NUMBER,
  p_estabelecimentoAtivo     IN NUMBER,
  p_documentoTransferencia   IN NUMBER,
  p_situacaoDocTransferencia IN CHAR,
  p_usuario                  IN NUMBER,
  p_motivoCancelamento       IN VARCHAR,
  p_origem                   IN VARCHAR)
IS
  v_situacaoDocTransferencia CHAR (1);
  v_observacoes              VARCHAR (4000);
  v_auxNumber                NUMBER;
BEGIN
  SELECT
    situacaoDocTransferencia,
    observacoes
  INTO
    v_situacaoDocTransferencia,
    v_observacoes
  FROM MODOCUMENTOSTRANSFERENCIA
  WHERE documentoTransferencia = p_documentoTransferencia;
  IF v_observacoes <> ' '
    AND p_motivoCancelamento <> ' '
  THEN
    v_observacoes := RTRIM(SUBSTR(RTRIM(v_observacoes) || ' - ' || p_motivoCancelamento, 1, 4000));
  ELSIF p_motivoCancelamento <> ' ' THEN
    v_observacoes := p_motivoCancelamento;
  END IF;
  IF v_situacaoDocTransferencia = 'F'
    AND p_situacaoDocTransferencia NOT IN ('C','F')
  THEN
    FOR a IN (
      SELECT idItemDocTransferencia
      FROM MODOCUMENTOTRANSFXITENS
      WHERE documentoTransferencia = p_documentoTransferencia
      AND cancelado = 0)
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        a.idItemDocTransferencia,
        'R',
        p_situacaoDocTransferencia,
        0,
        0,
        v_auxNumber,
        v_auxNumber);
    END LOOP;
  END IF;
  IF p_situacaoDocTransferencia = 'C' THEN
    FOR a IN (
      SELECT est.idEstoque
      FROM MODOCTRANSFXESTOQUE est
      JOIN MODOCUMENTOTRANSFXITENS item
      ON item.idItemDocTransferencia = est.idItemDocTransferencia
      where item.documentoTransferencia = p_documentoTransferencia
      AND est.idEstoque > 0)
    LOOP
      ADD_ESTOQUE_EXCLUI (a.idEstoque);
    END LOOP;
  END IF;
  UPDATE MODOCUMENTOSTRANSFERENCIA SET
    situacaoDocTransferencia = p_situacaoDocTransferencia,
    observacoes = v_observacoes
  WHERE documentoTransferencia = p_documentoTransferencia;
  ADD_DOCTRANSF_CAB_SIT_CRIA (
    p_usuarioLogado,
    p_estabelecimentoAtivo,
    p_documentoTransferencia,
    p_usuario,
    p_situacaoDocTransferencia,
    CASE
      WHEN p_origem IS NULL
        OR p_origem = ' '
      THEN ''
      ELSE TRIM(p_origem) || ' - '
    END || 'ADD_DOCTRANSF_CAB_SIT_GRAVA');
  ADD_DOCTRANSF_CAB_RESERVA_GRAV (
    p_documentoTransferencia,
    p_estabelecimentoAtivo);
END ADD_DOCTRANSF_CAB_SIT_GRAVA;

/

create or replace PROCEDURE ADD_CONSERTO_CANCELA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_idConserto                   IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      cliente,
      documentoTransferenciaLojaCd,
      documentoTransferenciaFornec,
      documentoTransferenciaCdLoja
    FROM MOCONSERTOS
    WHERE idConserto = p_idConserto
    AND situacaoConserto <> 'C')
  LOOP
    IF a.documentoTransferenciaLojaCd <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferenciaLojaCd,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    IF a.documentoTransferenciaFornec <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferenciaFornec,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    IF a.documentoTransferenciaCdLoja <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferenciaCdLoja,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    ADD_EVENTO_GRAVA (
      p_estabelecimentoAtivo,
      0, -- p_evento
      'MOCONSERTOS', -- p_tabelaSistema
      p_idConserto, -- p_id
      a.cliente, -- p_pessoa
      ' ', -- p_projeto
      SYSDATE, -- p_data
      p_usuarioLogado, -- p_usuario
      1, -- p_sistema
      p_person_184_tipoEventoCancCon, -- p_tipoEvento
      'Cancelamento Automático.', -- p_descricao
      ' ', -- p_observacoes
      /* Retornos */
      v_auxNumber);
    UPDATE MOCONSERTOS
    SET situacaoConserto = 'C'
    WHERE idConserto = p_idConserto;
  END LOOP;
END ADD_CONSERTO_CANCELA;

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_REGRA_DESC_CAB (
  p_usuarioLogado               IN NUMBER,
  p_perfilUsuarioLogado         IN NUMBER,
  p_orcamento                   IN NUMBER,
  /* Retornos */
  r_possuiRegra                 OUT NUMBER,
  r_valorDescontoSugestao       OUT NUMBER,
  r_valorDescontoMaximoSemSenha OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            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 = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1), (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      a.valorBasePagamento
    FROM (
      SELECT
        a.estabelecimento,
        a.pessoa,
        a.valorBasePagamento
      FROM MOORCAMENTOS a
      WHERE a.orcamento = p_orcamento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao), 2) valorBaseRegra,
      a.valorDescontoItem,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.orcamento = p_orcamento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBasePagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'C'
    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 = 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 = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.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 = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBasePagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem), 0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 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) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBasePagamento,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao * a.multiplicador
           -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END - a.valorDescontoItem, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBasePagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento) a) a;
END ADD_ORCAMENTO_REGRA_DESC_CAB;

/

create or replace PROCEDURE ADD_ORCAMENTO_REGRA_DESC_PAG (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_246_baseDescontoPagam IN CHAR,
  p_config_337_descontoSobreFret IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_soma_valorPagamentoBruto     IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_valorPagamentoBruto      IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            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 = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1), (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      CASE
        WHEN p_config_246_baseDescontoPagam = 'S'
        THEN a.valorBasePagamento
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE a.valorFreteTotal + a.valorSeguroTotal
            END
        WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
        THEN 0
        WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
        THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * (a.valorBasePagamento - p_soma_valorPagamentoBruto)
                / a.valorBasePagamento, 2)
            END
        ELSE p_pag_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * p_pag_valorPagamentoBruto
                / a.valorBasePagamento, 2)
            END
      END valorBaseDesconto,
      ( CASE
          WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
          THEN 0
          WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
          THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          ELSE p_pag_valorPagamentoBruto
        END
        / a.valorBasePagamento) proporcaoPagamento
    FROM (
      SELECT
        a.estabelecimento,
        a.pessoa,
        a.valorBasePagamento,
        a.tipoPagamentoFrete,
        a.valorFreteTotal,
        a.valorSeguroTotal
      FROM MOORCAMENTOS a
      WHERE a.orcamento = p_orcamento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao), 2) valorBaseRegra,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.orcamento = p_orcamento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBaseDesconto,
      cab.proporcaoPagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'P'
    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 = 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 = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.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 = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))
    -- Filtro Pagamento
    AND (a.filtroPagamento = 0
      OR (filtroPag.filtrarMeiosPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXMEIOPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.meioPagamento = p_pag_meioPagamento
          AND filtroPagX.ativo = 1))
      AND (filtroPag.filtrarCondicoesPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXCONDPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.condicaoPagamento = p_pag_condicaoPagamento
          AND filtroPagX.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem,
      b.valorDescontoGeral
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBaseDesconto,
      a.proporcaoPagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
          OR SUM(a.valorBaseDescontoSugestao) <> MAX(a.valorBaseDesconto)
          OR SUM(a.valorDescontoItem) <> 0
          OR SUM(a.valorDescontoGeral) <> 0
          OR SUM(a.possuiRegra) > 1
        THEN 100
          * ROUND(
              CASE
                WHEN SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END) >= p_pag_valorPagamentoBruto
                THEN p_pag_valorPagamentoBruto - 0.01
                ELSE SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END)
              END, 2) / MAX(a.valorBaseDesconto)
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 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) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 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.valorBaseDesconto,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra
          -- Desconto em valor
          WHEN 2
          THEN a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseDesconto
          ELSE 0
        END, 2) valorBaseDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN 100 * a.valorSugestao * a.multiplicador / a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN 100 * (a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha, 2)) / a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN 100 * a.idade * a.multiplicador / a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN 100 * a.valorBaseRegra / a.valorBaseDesconto
          ELSE 0
        END, 8) percentualDescontoSugestao,
      ROUND (
        ( CASE a.tipoRegraDescontoMargem
            -- Desconto em percentual
            WHEN 1
            THEN a.valorBaseRegra * a.valorSugestao / 100
            -- Desconto em valor
            WHEN 2
            THEN a.valorSugestao * a.multiplicador
             -- Preço unitário fixo
            WHEN 3
            THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao, 2)
            -- Desconto igual a idade em percentual
            WHEN 4
            THEN a.valorBaseRegra * a.idade / 100
            -- Desconto igual a idade em valor
            WHEN 5
            THEN a.idade * a.multiplicador
            -- Preço total fixado
            WHEN 6
            THEN a.valorBaseRegra
            ELSE 0
          END
          - a.valorDescontoItem
          - a.valorDescontoGeral)
        * a.proporcaoPagamento, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra * a.valorMaximoSemSenha, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END * a.proporcaoPagamento, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem - a.valorDescontoGeral)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem,
        SUM (a.valorDescontoGeral) valorDescontoGeral
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBaseDesconto,
          a.proporcaoPagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorDescontoGeral,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos,
          a.valorDescontoGeralTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            0 valorDescontoGeral,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos,
            b.valorDescontoGeral valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento) a) a;
END ADD_ORCAMENTO_REGRA_DESC_PAG;

/

create or replace PROCEDURE ADD_DOC_FISC_REGRA_DESC_CAB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            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 = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX (munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      a.valorBasePagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento
      FROM MODOCUMENTOSFISCAIS a
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao), 2) valorBaseRegra,
      a.valorDescontoItem,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBasePagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'C'
    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 = 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 = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.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 = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBasePagamento,
      COALESCE ((
        SELECT COUNT (1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT (1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT (1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX (a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND (
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= MAX (a.valorBasePagamento)
        THEN MAX (a.valorBasePagamento) - 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) >= MAX (a.valorBasePagamento)
        THEN MAX (a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBasePagamento,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao * a.multiplicador
           -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra * a.valorSugestao, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END - a.valorDescontoItem, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra - ROUND (a.quantidadeRegra * a.valorMaximoSemSenha, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento,
        SUM (a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBasePagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento) a) a;
END ADD_DOC_FISC_REGRA_DESC_CAB;

/

create or replace PROCEDURE ADD_DOC_FISC_REGRA_DESC_PAG (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_246_baseDescontoPagam IN CHAR,
  p_config_337_descontoSobreFret IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_soma_valorPagamentoBruto     IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_valorPagamentoBruto      IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE ((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX (munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            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 = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END), '  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      CASE
        WHEN p_config_246_baseDescontoPagam = 'S'
        THEN a.valorBasePagamento
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE a.valorFreteTotal + a.valorSeguroTotal
            END
        WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
        THEN 0
        WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
        THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * (a.valorBasePagamento - p_soma_valorPagamentoBruto)
                / a.valorBasePagamento, 2)
            END
        ELSE p_pag_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * p_pag_valorPagamentoBruto
                / a.valorBasePagamento, 2)
            END
      END valorBaseDesconto,
      ( CASE
          WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
          THEN 0
          WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
          THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          ELSE p_pag_valorPagamentoBruto
        END
        / a.valorBasePagamento) proporcaoPagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento,
        a.tipoPagamentoFrete,
        a.valorFreteTotal,
        a.valorSeguroTotal
      FROM MODOCUMENTOSFISCAIS a
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao), 2) valorBaseRegra,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBaseDesconto,
      cab.proporcaoPagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC (SYSDATE)
    AND a.dataValidadeFinal >= TRUNC (SYSDATE)
    AND a.cabecalhoItemPagamento = 'P'
    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 = 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 = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.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 = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))
    -- Filtro Pagamento
    AND (a.filtroPagamento = 0
      OR (filtroPag.filtrarMeiosPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXMEIOPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.meioPagamento = p_pag_meioPagamento
          AND filtroPagX.ativo = 1))
      AND (filtroPag.filtrarCondicoesPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXCONDPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.condicaoPagamento = p_pag_condicaoPagamento
          AND filtroPagX.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem,
      b.valorDescontoGeral
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBaseDesconto,
      a.proporcaoPagamento,
      COALESCE ((
        SELECT COUNT (1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem), 0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT (1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT (1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX (a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND ((
      CASE
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
          OR SUM(a.valorBaseDescontoSugestao) <> MAX (a.valorBaseDesconto)
          OR SUM(a.valorDescontoItem) <> 0
          OR SUM(a.valorDescontoGeral) <> 0
          OR SUM(a.possuiRegra) > 1
        THEN 100
          * ROUND (
              CASE
                WHEN SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END) >= p_pag_valorPagamentoBruto
                THEN p_pag_valorPagamentoBruto - 0.01
                ELSE SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END)
              END, 2) / MAX (a.valorBaseDesconto)
        ELSE MAX (a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND (
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 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) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 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.valorBaseDesconto,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra
          -- Desconto em valor
          WHEN 2
          THEN a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseDesconto
          ELSE 0
        END, 2) valorBaseDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN 100 * a.valorSugestao * a.multiplicador / a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN 100 * (a.valorBaseRegra - ROUND (a.quantidadeRegra * a.valorMaximoSemSenha, 2)) / a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN 100 * a.idade * a.multiplicador / a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN 100 * a.valorBaseRegra / a.valorBaseDesconto
          ELSE 0
        END, 8) percentualDescontoSugestao,
      ROUND (
        ( CASE a.tipoRegraDescontoMargem
            -- Desconto em percentual
            WHEN 1
            THEN a.valorBaseRegra * a.valorSugestao / 100
            -- Desconto em valor
            WHEN 2
            THEN a.valorSugestao * a.multiplicador
             -- Preço unitário fixo
            WHEN 3
            THEN a.valorBaseRegra-ROUND (a.quantidadeRegra * a.valorSugestao, 2)
            -- Desconto igual a idade em percentual
            WHEN 4
            THEN a.valorBaseRegra * a.idade / 100
            -- Desconto igual a idade em valor
            WHEN 5
            THEN a.idade * a.multiplicador
            -- Preço total fixado
            WHEN 6
            THEN a.valorBaseRegra
            ELSE 0
          END
          - a.valorDescontoItem
          - a.valorDescontoGeral)
        * a.proporcaoPagamento, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra - ROUND (a.quantidadeRegra * a.valorMaximoSemSenha, 2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END * a.proporcaoPagamento, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem - a.valorDescontoGeral)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem,
        SUM (a.valorDescontoGeral) valorDescontoGeral
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBaseDesconto,
          a.proporcaoPagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorDescontoGeral,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos,
          a.valorDescontoGeralTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            0 valorDescontoGeral,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos,
            b.valorDescontoGeral valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento) a) a;
END ADD_DOC_FISC_REGRA_DESC_PAG;

/

create or replace PROCEDURE ADD_PRODUTO_CUSTO_EXCLUI (
  p_idProdutoXCusto IN NUMBER)
IS
BEGIN
  DELETE CATABELAPRECOXFORMACOESPR
  WHERE idProdutoXCustoAtual = p_idProdutoXCusto;
  DELETE CATABELAPRECOXFORMACOESPR
  WHERE idProdutoXCustoNovo = p_idProdutoXCusto;
  DELETE CAPRODUTOXCUSTOXALIQUOTAS
  WHERE idProdutoXCusto = p_idProdutoXCusto;
  DELETE CAPRODUTOXCUSTOS
  WHERE idProdutoXCusto = p_idProdutoXCusto;
END ADD_PRODUTO_CUSTO_EXCLUI;

/

DROP PROCEDURE ADD_PRODUTO_CUSTO_DATA_EXCLUI;

/

create or replace PROCEDURE ADD_PRODUTO_CLASSIFIC_ATUALIZA (
  p_usuarioLogado        IN NUMBER,
  p_perfilUsuarioLogado  IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_produto              IN NUMBER,
  /* Retornos */
  r_atualizou            OUT NUMBER)
IS
  v_classificacaoProdutoAtual VARCHAR(3);
  v_classificacaoProdutoNova  VARCHAR(3);
  v_auxNumber                 NUMBER;
BEGIN
  r_atualizou := 0;
  v_classificacaoProdutoNova := FUNC_ADD_BUSCA_CLASSIF_PRODUTO (
    p_usuarioLogado,
    p_perfilUsuarioLogado,
    p_estabelecimentoAtivo,
    p_produto);
  IF v_classificacaoProdutoNova <> ' ' THEN
    SELECT classificacaoProduto
    INTO v_classificacaoProdutoAtual
    FROM CAPRODUTOS
    WHERE produto = p_produto;
    IF v_classificacaoProdutoNova <> v_classificacaoProdutoAtual THEN
      r_atualizou := 1;
      UPDATE CAPRODUTOS SET
        classificacaoProduto = v_classificacaoProdutoNova,
        dataClassificacaoProduto = SYSDATE
      WHERE produto = p_produto;
    END IF;
  END IF;
END ADD_PRODUTO_CLASSIFIC_ATUALIZA;

/

create or replace PROCEDURE ADD_TROCA_PESSOA (
  p_pessoaDe   IN NUMBER,
  p_pessoaPara IN NUMBER)
IS
  v_existe NUMBER;
BEGIN
  -- Pessoa Fisica
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOASFISICAS
  WHERE pessoa = p_pessoaPara;
  IF v_existe = 0 THEN
    INSERT INTO CAPESSOASFISICAS (
      pessoa,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado)
    SELECT p_pessoaPara,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado
    FROM CAPESSOASFISICAS
    WHERE pessoa = p_pessoaDe;
  END IF;
  -- Transportadora
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATRANSPORTADORAS a
    SET a.ativo            = 1
    WHERE a.transportadora = p_pessoaPara
    AND a.ativo            = 0
    AND EXISTS
      (SELECT 1
      FROM CATRANSPORTADORAS b
      WHERE b.transportadora = p_pessoaDe
      AND b.ativo            = 1
      );
  ELSE
    INSERT INTO CATRANSPORTADORAS (
      transportadora,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CATRANSPORTADORAS
    WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAVENDEDORES a
    SET a.ativo      = 1
    WHERE a.vendedor = p_pessoaPara
    AND a.ativo      = 0
    AND EXISTS
      (SELECT 1 FROM CAVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.ativo = 1
      );
  ELSE
    INSERT INTO CAVENDEDORES (
      vendedor,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CAVENDEDORES
    WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSB a
    SET a.ativo           = 1
    WHERE a.comissionadoB = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSB b
      WHERE b.comissionadoB = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSB (
      comissionadoB,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CACOMISSIONADOSB
    WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSC a
    SET a.ativo           = 1
    WHERE a.comissionadoC = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSC b
      WHERE b.comissionadoC = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSC (
      comissionadoC,
      ativo,
      percentualComissaoB,
      percentualComissaoC)
    SELECT p_pessoaPara,
      ativo,
      percentualComissaoB,
      percentualComissaoC
    FROM CACOMISSIONADOSC
    WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaborador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOLABORADORES a
    SET a.ativo         = 1
    WHERE a.colaborador = p_pessoaPara
    AND a.ativo         = 0
    AND EXISTS
      (SELECT 1
      FROM CACOLABORADORES b
      WHERE b.colaborador = p_pessoaDe
      AND b.ativo         = 1
      );
  ELSE
    INSERT INTO CACOLABORADORES (
      colaborador,
      ativo,
      permiteDescontoEmFolha)
    SELECT p_pessoaPara,
      ativo,
      permiteDescontoEmFolha
    FROM CACOLABORADORES
    WHERE colaborador = p_pessoaDe;
  END IF;
  -- Usuário
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAUSUARIOS a
    SET a.login = COALESCE((SELECT MAX(b.login)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.senha = COALESCE((SELECT MAX(b.senha)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.ativo     = 1
    WHERE a.usuario = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CAUSUARIOS (
      usuario,
      ativo,
      login,
      senha,
      perfilUsuario)
    SELECT p_pessoaPara,
      ativo,
      login,
      senha,
      perfilUsuario
    FROM CAUSUARIOS
    WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnico
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATECNICOS a
    SET a.ativo     = 1
    WHERE a.tecnico = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CATECNICOS b
      WHERE b.tecnico = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CATECNICOS (
      tecnico,
      ativo,
      equipeTecnica)
    SELECT p_pessoaPara,
      ativo,
      equipeTecnica
    FROM CATECNICOS
    WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CASEPARADORES a
    SET a.ativo       = 1
    WHERE a.separador = p_pessoaPara
    AND a.ativo       = 0
    AND EXISTS
      (SELECT 1
      FROM CASEPARADORES b
      WHERE b.separador = p_pessoaDe
      AND b.ativo       = 1
      );
  ELSE
    INSERT INTO CASEPARADORES (
      separador,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CASEPARADORES
    WHERE separador = p_pessoaDe;
  END IF;
  -- Profissional Registrado
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPROFISSIONAISREGISTRAD a
    SET a.ativo                    = 1
    WHERE a.profissionalRegistrado = p_pessoaPara
    AND a.ativo                    = 0
    AND EXISTS
      (SELECT 1
      FROM CAPROFISSIONAISREGISTRAD b
      WHERE b.profissionalRegistrado = p_pessoaDe
      AND b.ativo                    = 1
      );
  ELSE
    INSERT INTO CAPROFISSIONAISREGISTRAD (
      profissionalRegistrado,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro)
    SELECT p_pessoaPara,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro
    FROM CAPROFISSIONAISREGISTRAD
    WHERE profissionalRegistrado = p_pessoaDe;
  END IF;
  -- Credenciadora Cartão
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACREDENCIADORASCARTAO a
    SET a.ativo                 = 1
    WHERE a.credenciadoraCartao = p_pessoaPara
    AND a.ativo                 = 0
    AND EXISTS
      (SELECT 1
      FROM CACREDENCIADORASCARTAO b
      WHERE b.credenciadoraCartao = p_pessoaDe
      AND b.ativo                 = 1
      );
  ELSE
    INSERT INTO CACREDENCIADORASCARTAO (
      credenciadoraCartao,
      ativo,
      credenciadoraTef)
    SELECT p_pessoaPara,
      ativo,
      credenciadoraTef
    FROM CACREDENCIADORASCARTAO
    WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Orgão Federal / Estadual / Municipal
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAORGAOSFEDERESTADMUNIC
  WHERE orgaoFederalEstadualMunicipal = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAORGAOSFEDERESTADMUNIC a
    SET a.ativo                           = 1
    WHERE a.orgaoFederalEstadualMunicipal = p_pessoaPara
    AND a.ativo                           = 0
    AND EXISTS
      (SELECT 1
      FROM CAORGAOSFEDERESTADMUNIC b
      WHERE b.orgaoFederalEstadualMunicipal = p_pessoaDe
      AND b.ativo                           = 1
      );
  ELSE
    INSERT INTO CAORGAOSFEDERESTADMUNIC (
        orgaoFederalEstadualMunicipal,
        ativo,
        federalEstadualMunicipal)
    SELECT p_pessoaPara,
      ativo,
      federalEstadualMunicipal
    FROM CAORGAOSFEDERESTADMUNIC
    WHERE orgaoFederalEstadualMunicipal = p_pessoaDe;
  END IF;
  -- Pessoa Estabelecimento
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPESSOAESTABELECIMENTOS a
    SET a.ativo                   = 1
    WHERE a.pessoaEstabelecimento = p_pessoaPara
    AND a.ativo                   = 0
    AND EXISTS
      (SELECT 1
      FROM CAPESSOAESTABELECIMENTOS b
      WHERE b.pessoaEstabelecimento = p_pessoaDe
      AND b.ativo                   = 1
      );
  ELSE
    INSERT INTO CAPESSOAESTABELECIMENTOS (
      pessoaEstabelecimento,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CAPESSOAESTABELECIMENTOS
    WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Cliente
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACLIENTES a
    SET a.ativo     = 1
    WHERE a.cliente = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CACLIENTES b
      WHERE b.cliente = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CACLIENTES (
      cliente,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento)
    SELECT p_pessoaPara,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento
    FROM CACLIENTES
    WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAFORNECEDORES a
    SET a.ativo        = 1
    WHERE a.fornecedor = p_pessoaPara
    AND a.ativo        = 0
    AND EXISTS
      (SELECT 1
      FROM CAFORNECEDORES b
      WHERE b.fornecedor = fornecedor
      AND b.ativo        = 1
      );
  ELSE
    INSERT INTO CAFORNECEDORES (
      fornecedor,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra)
    SELECT p_pessoaPara,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra
    FROM CAFORNECEDORES
    WHERE fornecedor = p_pessoaDe;
  END IF;
  -- Botões
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoa = p_pessoaPara AND b.pessoaAutorizada = a.pessoaAutorizada);
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoaAutorizada = p_pessoaPara WHERE a.pessoaAutorizada = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoaAutorizada = p_pessoaPara AND b.pessoa = a.pessoa);
  UPDATE CAREFERBANCARIASPESSOA    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERBANCARIASPESSOA b WHERE b.pessoa = p_pessoaPara AND b.banco = a.banco AND b.agenciaBanco = a.agenciaBanco AND b.contaBanco = a.contaBanco);
  UPDATE CAREFERCOMERCIAISPESSOA   a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERCOMERCIAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.empresa = a.empresa);
  UPDATE CAREFERPESSOAISPESSOA     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERPESSOAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.contato = a.contato);
  UPDATE CAPESSOAXARQUIVOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CAPESSOAXBIOMETRIAS       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXBIOMETRIAS b WHERE b.pessoa = p_pessoaPara AND b.dedo = a.dedo);
  UPDATE CAPESSOAXUFS              a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXUFS b WHERE b.pessoa = p_pessoaPara AND b.uf = a.uf);
  UPDATE CAPESSOAXCONTASCONTABEIS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXCONTASCONTABEIS b WHERE b.pessoa = p_pessoaPara AND b.categoriaContabil = a.categoriaContabil AND b.idPlanoContaContabil = a.idPlanoContaContabil);
  UPDATE CAPLACAS                    SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento);
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaDe AND b.estabelecimento = a.estabelecimento AND b.ativo = 1);
  -- Parâmetros / Cadastros
  UPDATE PAFILTROCABECXPESSOAS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho);
  UPDATE PAFILTROCABECXPESSOAS     a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
  UPDATE PAREGRASFRETE             a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASFRETE b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.uf = a.uf AND b.mesorregiaoGeografica = a.mesorregiaoGeografica AND b.microrregiaoGeografica = a.microrregiaoGeografica AND b.municipio = a.municipio AND b.bairroDistrito = a.bairroDistrito AND b.exclusivoPessoaA = a.exclusivoPessoaA AND b.exclusivoPessoaB = a.exclusivoPessoaB AND b.exclusivoPessoaC = a.exclusivoPessoaC AND b.exclusivoPessoaD = a.exclusivoPessoaD AND b.exclusivoPessoaE = a.exclusivoPessoaE);
  UPDATE CAGRADEPRODUTOXPESSOAS    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAGRADEPRODUTOXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.gradeProduto = a.gradeProduto AND b.codigoProduto = a.codigoProduto);
  UPDATE PAPROJETOS                  SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PACARTOESPROPRIOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CARECEITASLENTESCLIENTE     SET paciente = p_pessoaPara WHERE paciente = p_pessoaDe;
  UPDATE PAMETAXCONTEUDOS            SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE PAMETAXCOMISSIONADO       a SET a.comissionado = p_pessoaPara WHERE a.comissionado = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo);
  UPDATE PAMETAXCOMISSIONADO       a SET a.ativo = 1 WHERE a.comissionado = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
  UPDATE PAMODELOSFINANCEIRO         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAOPERFISCALXPESSOAS      a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAOPERFISCALXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.operacaoFiscal = a.operacaoFiscal);
  UPDATE PAOPERFISCALXPESSOAS      a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAOPERFISCALXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.operacaoFiscal = a.operacaoFiscal AND b.ativo = 1);
  UPDATE PAMVAS                    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMVAS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem);
  UPDATE PADESONERACOESFISCAIS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PADESONERACOESFISCAIS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem AND b.stICMS = a.stICMS);
  -- Movimentações
  UPDATE MOHISTORICOCREDITO          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTABEIS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MOORCAMENTOXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONTRATOS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTRATOS                 SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MOPREDOCUMXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMXPAGAMENTOS       SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST     SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXSERVICO         SET intermediario = p_pessoaPara WHERE intermediario = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MODOCFISCALXSERVICO         SET intermediario = p_pessoaPara WHERE intermediario = p_pessoaDe;
  UPDATE MODOCFISCALXNFREF           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MODOCFISCALXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET beneficiario = p_pessoaPara WHERE beneficiario = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOFINANCEIROXCOMISSOES      SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE MOFINANCEIROXBAIXAS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MONEGOCIACOESDIVIDAS        SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCELAMENTOS           SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCXPAGAMENTOS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSPCREGISTROS              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCOBRANCA         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCRMS                      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPONTUACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSEPARACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXITENS   SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXFISC    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOESTOQUES                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTROCA           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCTROCAXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOBALANCOS                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTRANSFERENCIA   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONSERTOS                 SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  UPDATE MORESERVASESTOQUE           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOMOTIVOSBLOQUEIOS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOLOTESINGRESSO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOEVENTOS                   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  -- Transportadoras
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAREGRASFRETE               SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Cadastros
    UPDATE CAPLACAS                    SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.filtroProduto = a.filtroProduto);
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.filtroProduto = a.filtroProduto AND b.ativo = 1);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaPara AND b.tabelaPreco = a.tabelaPreco);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.tabelaPreco = a.tabelaPreco AND b.ativo = 1);
    UPDATE PAMETAXVENDEDOR           a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo);
    UPDATE PAMETAXVENDEDOR           a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaPara AND b.cliente = a.cliente);
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOS                SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOORCAMENTOXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOPREDOCUMXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCFISCALXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOVALESDESCONTO             SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTROCA           SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCTROCAXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOMOTIVOSBLOQUEIOS          SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaboradores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAINDICADORES               SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPLANEJAMENTOATIVIDADES    SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRetirada = p_pessoaPara WHERE colaboradorResponsavelRetirada = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRecebim  = p_pessoaPara WHERE colaboradorResponsavelRecebim  = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOENTREGAS                  SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET comprador = p_pessoaPara WHERE comprador = p_pessoaDe;
    UPDATE MOLOTESINGRESSO             SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
  END IF;
  -- Usuários
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAMENUSCUSTOMIZADOS         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MONOTIFICACOES              SET usuarioCriacao = p_pessoaPara WHERE usuarioCriacao = p_pessoaDe;
    UPDATE MONOTIFICACAOXUSUARIOS      SET usuarioNotificado = p_pessoaPara WHERE usuarioNotificado = p_pessoaDe;
    UPDATE MOMARCADORES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAWHATSAPPCONEXOES        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAWHATSAPPCONEXOES b WHERE b.usuario = p_pessoaPara AND b.wsWhatsApp = a.wsWhatsApp AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAWHATSAPPCONEXOES        a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAWHATSAPPCONEXOES b WHERE b.usuario = p_pessoaDe AND b.wsWhatsApp = a.wsWhatsApp AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho);
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
    UPDATE PACLASSIFICPRODXREGRAS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACLASSIFICPRODXREGRAS b WHERE b.usuario = p_pessoaPara AND b.classificacaoProduto = a.classificacaoProduto AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONFIGURACAOXCONTEUDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONFIGURACAOXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.configuracao = a.configuracao AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAPERSCAMPOSXCONTEUDOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAPERSCAMPOSXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.personalizacaoCampo = a.personalizacaoCampo AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXPERMISSOES         a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXPERMISSOES b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXFAVORITOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXFAVORITOS b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXATALHOS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXATALHOS b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXLAYOUTPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXLAYOUTPESQUISA b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo);
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONTASFINANCPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONTASFINANCPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.contaFinanceira = a.contaFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAVALIDACOESPESSOA        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAVALIDACOESPESSOA b WHERE b.usuario = p_pessoaPara AND b.campoValidarPessoa = a.campoValidarPessoa AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.localValidarCampoPessoa = a.localValidarCampoPessoa AND b.meioPagamento = a.meioPagamento);
    UPDATE PACONTROLESENTREGA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASENTREGA             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.permiteOrcamento = 'S' WHERE a.usuario = p_pessoaPara AND a.permiteOrcamento <> 'S' AND EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permiteOrcamento = 'S');
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.permiteLogistica = 'S' WHERE a.usuario = p_pessoaPara AND a.permiteLogistica <> 'S' AND EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permiteLogistica = 'S');
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCobranca = a.listaCobranca);
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCobranca = a.listaCobranca AND b.ativo = 1);
    UPDATE PALISTACRMXUSUARIOS       a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCRM = a.listaCRM);
    UPDATE PALISTACRMXUSUARIOS       a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCRM = a.listaCRM AND b.ativo = 1);
    UPDATE PAREGRASCREDITO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAMOTORCREDITO              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMOTIVOSBLOQPERMITIDOS   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMOTIVOSBLOQPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.motivoBloqueioDocumento = a.motivoBloqueioDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAETAPASORCAMENTODEPARA   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAETAPASORCAMENTODEPARA b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.etapaOrcamentoDe = a.etapaOrcamentoDe AND b.etapaOrcamentoPara = a.etapaOrcamentoPara);
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAEMAILS                  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaPara AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAEMAILS                  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaDe AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAWEBSERVICESCONEXOES     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAWEBSERVICESCONEXOES b WHERE b.usuario = p_pessoaPara AND b.tipoWebService = a.tipoWebService AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAWEBSERVICESCONEXOES     a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAWEBSERVICESCONEXOES b WHERE b.usuario = p_pessoaDe AND b.tipoWebService = a.tipoWebService AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAIMAGENSSISTEMA          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAIMAGENSSISTEMA b WHERE b.usuario = p_pessoaPara AND b.tipoImagemSistema = a.tipoImagemSistema AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo);
    UPDATE PAIMPRESSORAXDOCUMENTO    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAIMPRESSORAXDOCUMENTO b WHERE b.usuario = p_pessoaPara AND b.tipoDocumentoImpresso = a.tipoDocumentoImpresso AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC AND b.etapaOrcamento = a.etapaOrcamento);
    UPDATE PACAIXASUSUARIOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACAIXASUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC);
    UPDATE PAMEIOSPAGAMENTOABRIRGAV  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOABRIRGAV b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMEIOSPAGAMENTOABRIRGAV  a SET a.abrirGaveta = 1 WHERE a.usuario = p_pessoaPara AND a.abrirGaveta = 0 AND EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOABRIRGAV b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.abrirGaveta = 1);
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PACONDICOESPAGAMENTOAUTO  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONDICOESPAGAMENTOAUTO b WHERE b.usuario = p_pessoaPara AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONDICOESPAGAMENTOAUTO  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS (SELECT 1 FROM PACONDICOESPAGAMENTOAUTO b WHERE b.usuario = p_pessoaPara AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PAREGRASCAIXAS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASCAIXAS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAREGRASMARGEMCONTRIBUIC  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASMARGEMCONTRIBUIC b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACATEGORIASPRODUTOSVENDA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASFAIXASATRASO        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Cadastros
    UPDATE CAPRODUTOS                  SET usuarioInclusao = p_pessoaPara WHERE usuarioInclusao = p_pessoaDe;
    UPDATE CAPRODUTOS                  SET usuarioAlteracao = p_pessoaPara WHERE usuarioAlteracao = p_pessoaDe;
    UPDATE CATABELAPRECOXALTERACOES    SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE CAPRODUTOXCONTROLEENTREGA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Movimentações
    UPDATE MOCATEGORIASMENUUSUARIO   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOCATEGORIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.areaMenu = a.areaMenu AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu);
    UPDATE MOGUIASMENUUSUARIO        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOGUIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.guia = a.guia AND b.categoria = a.categoria);
    UPDATE MOACESSOSMENU             a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOACESSOSMENU b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu);
    UPDATE MOSESSOES                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOLOGALTERACOES             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSULTASDADOSCPF         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCCONSULTAS              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXETAPAS          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOSESSOESCAIXA              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXSTATUS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXBLOQUEIOSEST     SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCFISCALXSITUACOES       SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MODOCFISCALXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MONEGOCIACOESDIVIDAS        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOREPARCELAMENTOS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCREGISTROS              SET usuarioRegistroSPC = p_pessoaPara WHERE usuarioRegistroSPC = p_pessoaDe;
    UPDATE MOSPCREGISTROS              SET usuarioExclusaoSPC = p_pessoaPara WHERE usuarioExclusaoSPC = p_pessoaDe;
    UPDATE MOHISTORICOCOBRANCA         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCRMS                      SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCRMXHISTORICO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCOBRANCA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPONTUACOES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCONCILIACOES      SET usuarioImportacao = p_pessoaPara WHERE usuarioImportacao = p_pessoaDe;
    UPDATE MOCONCILIACOESCARTOES       SET usuarioProcessamento = p_pessoaPara WHERE usuarioProcessamento = p_pessoaDe;
    UPDATE MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente);
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred);
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor);
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico);
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto);
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO (
  p_gradeProdutoDe   IN NUMBER,
  p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto);
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque);
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque);
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie);
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAATIV a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXFICHAATIV b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.ordenacao = a.ordenacao);
  UPDATE CAGRADEPRODUTOXFICHAATIV
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAPROD
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXFICHAPRODPREV
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXFICHAPRODREAL
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MODISTRIBUICAODFEXGRADE b
    WHERE b.distribuicaoDFe = a.distribuicaoDFe
    AND b.sequencia = a.sequencia
    AND b.gradeProduto = p_gradeProdutoPara);
  UPDATE MODISTRIBUICAODFEXGRADE a SET
    a.quantidade = a.quantidade + COALESCE ((
      SELECT SUM (b.quantidade)
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe), 0)
    WHERE a.gradeProduto = p_gradeProdutoPara
    AND EXISTS (
      SELECT 1
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe);
  DELETE MODISTRIBUICAODFEXGRADE
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie);
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante);
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1);
END ADD_TROCA_GRADEPRODUTO;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_N_SERIE (
  p_bufferIdReservaEstoque     IN VARCHAR2,
  p_estabelecimentoAtivo       IN NUMBER,
  p_cab_entradaSaida           IN CHAR,
  p_cab_estabelecimento        IN NUMBER,
  p_cab_dataEmissao            IN DATE,
  p_cab_dataEntrega            IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_modeloDocumento       IN NUMBER,
  p_item_gradeProduto          IN NUMBER,
  p_item_personalizacao        IN NUMBER,
  p_item_idLoteEstoque         IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_item_idEnderecoEstoque     IN NUMBER,
  p_item_observacoes           IN VARCHAR2,
  p_end_idEnderecoEstoqueOrcam IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  r_bufferIdReservaEstoque     OUT VARCHAR2,
  r_quantidadeNumerosSerie     OUT NUMBER)
IS
  v_idReservaEstoque NUMBER (14,0);  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE 
    WHERE idItemOrcamento = p_item_idItemOrcamento
    AND idEnderecoEstoqueOrcamento = p_end_idEnderecoEstoqueOrcam
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_RESERVA_ESTOQUE_GRAVA (
      0,
      r_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_estabelecimento,
      CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
      p_item_gradeProduto,
      p_item_modeloDocumento,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_idEnderecoEstoque,
      a.idNumeroSerie,
      1, -- p_quantidadeSaldo
      p_item_observacoes,
      p_item_idItemOrcamento,
      0, -- p_idFichaProdutoPrevOrcamento
      0, -- p_idItemDocTransferencia
      v_idReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_N_SERIE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_KIT (
  p_bufferIdReservaEstoque     IN VARCHAR2,
  p_estabelecimentoAtivo       IN NUMBER,
  p_cab_entradaSaida           IN CHAR,
  p_cab_estabelecimento        IN NUMBER,
  p_cab_dataEmissao            IN DATE,
  p_cab_dataEntrega            IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_modeloDocumento       IN NUMBER,
  p_item_gradeProduto          IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_item_idEnderecoEstoque     IN NUMBER,
  p_item_quantidadeSaldo       IN NUMBER,
  p_item_observacoes           IN VARCHAR2,
  p_end_idEnderecoEstoqueOrcam IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  r_bufferIdReservaEstoque     OUT VARCHAR2)
IS
  v_idReservaEstoque       NUMBER (14,0);
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      a.gradeProdutoFilho gradeProduto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_KIT (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_modeloDocumento,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_end_idEnderecoEstoqueOrcam,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ORCAMENTO_ITEM_RES_N_SERIE (
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntrega,
          p_item_idItemOrcamento,
          p_item_modeloDocumento,
          a.gradeProduto,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_idEnderecoEstoque,
          p_item_observacoes,
          p_end_idEnderecoEstoqueOrcam,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
        ADD_RESERVA_ESTOQUE_GRAVA (
          0,
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
          a.gradeProduto,
          p_item_modeloDocumento,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidadeSaldo - v_quantidadeNumerosSerie,
          p_item_observacoes,
          p_item_idItemOrcamento,
          0, -- p_idFichaProdutoPrevOrcamento
          0, -- p_idItemDocTransferencia
          v_idReservaEstoque,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
  END LOOP; 
END ADD_ORCAMENTO_ITEM_RES_KIT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_COMP (
  p_bufferIdReservaEstoque     IN VARCHAR2,
  p_estabelecimentoAtivo       IN NUMBER,
  p_cab_entradaSaida           IN CHAR,
  p_cab_estabelecimento        IN NUMBER,
  p_cab_dataEmissao            IN DATE,
  p_cab_dataEntrega            IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_modeloDocumento       IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_item_idEnderecoEstoque     IN NUMBER,
  p_item_quantidadeSaldo       IN NUMBER,
  p_end_idEnderecoEstoqueOrcam IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  r_bufferIdReservaEstoque     OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      comp.gradeProdutoEstoque gradeProduto,
      a.observacoes,
      prod.controleEstoque,
      ROUND (p_item_quantidadeSaldo * a.quantidade, uniMed.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM MOORCAMENTOXCOMPOSICOESPR a 
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = a.composicaoPreco
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = comp.gradeProdutoEstoque
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE a.idItemOrcamento = p_item_idItemOrcamento
    AND a.selecionado = 1
    AND comp.gradeProdutoEstoque > 0
    AND ROUND (p_item_quantidadeSaldo * a.quantidade, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_KIT (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_modeloDocumento,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        a.quantidadeSaldo,
        a.observacoes,
        p_end_idEnderecoEstoqueOrcam,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
        a.gradeProduto,
        p_item_modeloDocumento,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao,
        0, -- p_idLoteEstoque,
        p_item_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidadeSaldo,
        a.observacoes,
        p_item_idItemOrcamento,
        0, -- p_idFichaProdutoPrevOrcamento
        0, -- p_idItemDocTransferencia
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP; 
END ADD_ORCAMENTO_ITEM_RES_COMP;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_ENDEREC (
  p_bufferIdReservaEstoque     IN VARCHAR2,
  p_estabelecimentoAtivo       IN NUMBER,
  p_cab_entradaSaida           IN CHAR,
  p_cab_estabelecimento        IN NUMBER,
  p_cab_dataEmissao            IN DATE,
  p_cab_dataEntrega            IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_modeloDocumento       IN NUMBER,
  p_item_gradeProduto          IN NUMBER,
  p_item_idFormulaTinta        IN NUMBER,
  p_item_personalizacao        IN NUMBER,
  p_item_idLoteEstoque         IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_item_quantidadeSaldo       IN NUMBER,
  p_item_observacoes           IN VARCHAR2,
  p_prod_controlaNumeroSerie   IN NUMBER,
  p_prod_controleEstoque       IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  r_bufferIdReservaEstoque     OUT VARCHAR2,
  r_quantidadeEnderecoEstoque  OUT NUMBER)
IS
  v_idReservaEstoque       NUMBER (14,0);
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque    := p_bufferIdReservaEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT 
      idEnderecoEstoque,
      idEnderecoEstoqueOrcamento,
      quantidadeSaldo 
    FROM MOORCAMENTOXENDERECOESTOQ
    WHERE idItemOrcamento = p_item_idItemOrcamento
    AND quantidadeSaldo > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidadeSaldo;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_RESERVA_ESTOQUE_FORM_TINTA (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_item_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        0, -- p_idFichaProdutoPrevOrcamento
        0, -- p_idItemDocTransferencia
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.idEnderecoEstoque,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_KIT (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_modeloDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.idEnderecoEstoque,
        a.quantidadeSaldo,
        p_item_observacoes,
        a.idEnderecoEstoqueOrcamento,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_ORCAMENTO_ITEM_RES_N_SERIE (
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntrega,
          p_item_idItemOrcamento,
          p_item_modeloDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          a.idEnderecoEstoque,
          p_item_observacoes,
          a.idEnderecoEstoqueOrcamento,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
        ADD_RESERVA_ESTOQUE_GRAVA (
          0,
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
          p_item_gradeProduto,
          p_item_modeloDocumento,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidadeSaldo - v_quantidadeNumerosSerie,
          p_item_observacoes,
          p_item_idItemOrcamento,
          0, -- p_idFichaProdutoPrevOrcamento
          0, -- p_idItemDocTransferencia
          v_idReservaEstoque,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
    ADD_ORCAMENTO_ITEM_RES_COMP (
      r_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_idItemOrcamento,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      a.idEnderecoEstoque,
      a.quantidadeSaldo,
      a.idEnderecoEstoqueOrcamento,
      p_locEst_indicProprPosseItem,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_ENDEREC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_FIC_KIT (
  p_estabelecimentoAtivo        IN NUMBER,
  p_cab_estabelecimento         IN NUMBER,
  p_cab_dataEmissao             IN DATE,
  p_cab_dataEntrega             IN DATE,
  p_item_localEstoque           IN NUMBER,
  p_item_pessoaParticipante     IN NUMBER,
  p_locEst_indicProprPosseItem  IN CHAR,
  p_ativ_dataInicio             IN DATE,
  p_ativ_dataTermino            IN DATE,
  p_ficha_idFichaProdutoPrevOrc IN NUMBER,
  p_ficha_modeloDocumento       IN NUMBER,
  p_ficha_entradaSaida          IN CHAR,
  p_ficha_gradeProduto          IN NUMBER,
  p_ficha_quantidadeSaldo       IN NUMBER,
  p_ficha_observacoes           IN VARCHAR2,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR kit IN (
    SELECT
      kit.gradeProdutoFilho gradeProduto,
      prodFilho.controleEstoque,
      ROUND (p_ficha_quantidadeSaldo * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_ficha_gradeProduto
    AND kit.ativo = 1
    AND ROUND (p_ficha_quantidadeSaldo * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF kit.controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_FIC_KIT (
        p_estabelecimentoAtivo,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_locEst_indicProprPosseItem,
        p_ativ_dataInicio,
        p_ativ_dataTermino,
        p_ficha_idFichaProdutoPrevOrc,
        p_ficha_modeloDocumento,
        p_ficha_entradaSaida,
        kit.gradeProduto,
        kit.quantidadeSaldo,
        p_ficha_observacoes,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    ELSIF kit.controleEstoque IN(1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE
          WHEN p_ficha_entradaSaida = 'E'
            AND p_ativ_dataTermino IS NOT NULL
            AND (p_ativ_dataInicio IS NULL
              OR p_ativ_dataTermino >= p_ativ_dataInicio)
          THEN p_ativ_dataTermino
          WHEN p_ativ_dataInicio IS NOT NULL
          THEN p_ativ_dataInicio
          WHEN p_cab_dataEntrega IS NOT NULL
            AND p_cab_dataEntrega >= p_cab_dataEmissao
          THEN p_cab_dataEntrega
          ELSE p_cab_dataEmissao
        END, -- p_data
        kit.gradeProduto,
        p_ficha_modeloDocumento,
        p_ficha_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        0, -- p_idEnderecoEstoque
        0, -- p_idNumeroSerie
        kit.quantidadeSaldo,
        p_ficha_observacoes,
        0, -- p_item_idItemOrcamento
        p_ficha_idFichaProdutoPrevOrc,
        0, -- p_idItemDocTransferencia
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP; 
END ADD_ORCAMENTO_ITEM_RES_FIC_KIT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_FICHA (
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.modeloDocumento,
      a.entradaSaida,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeSaldo,
      a.observacoes,
      prod.controleEstoque
    FROM MOORCAMENTOXFICHAPRODPREV a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
    AND a.quantidadeSaldo > 0
    ORDER BY a.ordenacao)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_FIC_KIT (
        p_estabelecimentoAtivo,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_locEst_indicProprPosseItem,
        p_ativ_dataInicio,
        p_ativ_dataTermino,
        a.idFichaProdutoPrevOrcamento,
        a.modeloDocumento,
        a.entradaSaida,
        a.gradeProduto,
        a.quantidadeSaldo,
        a.observacoes,
        r_bufferIdReservaEstoque, 
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE
          WHEN a.entradaSaida = 'E'
            AND p_ativ_dataTermino IS NOT NULL
            AND (p_ativ_dataInicio IS NULL
              OR p_ativ_dataTermino >= p_ativ_dataInicio)
          THEN p_ativ_dataTermino
          WHEN p_ativ_dataInicio IS NOT NULL
          THEN p_ativ_dataInicio
          WHEN p_cab_dataEntrega IS NOT NULL
            AND p_cab_dataEntrega >= p_cab_dataEmissao
          THEN p_cab_dataEntrega
          ELSE p_cab_dataEmissao
        END, -- p_data
        a.gradeProduto,
        a.modeloDocumento,
        a.entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        a.personalizacao,
        a.idLoteEstoque,
        0, -- idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidadeSaldo,
        a.observacoes,
        0, -- p_idItemOrcamento,
        a.idFichaProdutoPrevOrcamento,
        0, -- p_idItemDocTransferencia
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_FICHA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_AT_PREV (
  p_estabelecimentoAtivo       IN NUMBER,
  p_cab_estabelecimento        IN NUMBER,
  p_cab_dataEmissao            IN DATE,
  p_cab_dataEntrega            IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  p_bufferIdReservaEstoque     IN VARCHAR2,
  r_bufferIdReservaEstoque     OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      idAtividadePrevOrcamento,
      dataInicio,
      dataTermino
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_item_idItemOrcamento
    AND statusAtividadeServico IN ('A', 'I', 'P')
    ORDER BY sequencia)
  LOOP
    ADD_ORCAMENTO_ITEM_RES_FICHA (
      p_estabelecimentoAtivo,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_locEst_indicProprPosseItem,
      a.idAtividadePrevOrcamento,
      a.dataInicio,
      a.dataTermino,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_AT_PREV;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EST_FICHA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_ativ_idAtividadeRealOrcament IN NUMBER,
  p_ativ_dataTermino             IN DATE,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidade,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      prod.controleEstoque
    FROM MOORCAMENTOXFICHAPRODREAL a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idAtividadeRealOrcamento = p_ativ_idAtividadeRealOrcament
    AND a.quantidade > 0
    ORDER BY a.ordenacao)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        a.modeloDocumento,
        105, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        p_cab_estabelecimento,
        p_ativ_dataTermino,
        p_ativ_dataTermino,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit
        0, -- p_modDoc_transitoLocalEstoque
        ' ', -- p_locEstTransito_indicProprPos
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.totalCustoOperacao,
        a.observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.idFichaProdutoRealOrcamento,
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_ESTOQUE_INSERE (
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        p_ativ_dataTermino, -- p_data
        a.gradeProduto,
        a.modeloDocumento,
        105, --p_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        a.personalizacao,
        a.idLoteEstoque,
        0, -- idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        a.precoCustoOperacao,
        a.totalCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.observacoes,
        a.idFichaProdutoRealOrcamento,
        0, -- p_idItemPreDocumento,
        0, -- p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_EST_FICHA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EST_AT_REAL (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT
      idAtividadeRealOrcamento,
      dataTermino
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
    AND statusAtividadeServico = 'E'
    ORDER BY sequencia)
  LOOP
    ADD_ORCAMENTO_ITEM_EST_FICHA (
      p_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_locEst_indicProprPosseItem,
      a.idAtividadeRealOrcamento,
      a.dataTermino,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_EST_AT_REAL;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EST_AT_PREV (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_item_idItemOrcamento
    ORDER BY sequencia)
  LOOP
    ADD_ORCAMENTO_ITEM_EST_AT_REAL (
      p_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_locEst_indicProprPosseItem,
      a.idAtividadePrevOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_EST_AT_PREV;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_ITEM (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_idReservaEstoque          NUMBER;
  v_quantidadeEnderecoEstoque NUMBER;
  v_quantidadeNumerosSerie    NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque := p_bufferIdEstoque;
  ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
    p_item_idItemOrcamento,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  ADD_ESTOQUE_ORCAMENTO_EXCLUI (
    p_item_idItemOrcamento,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  FOR a IN (
    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END estabelecimento,
      cabOrc.dataEmissao,
      itemOrc.dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemOrc.gradeProduto,
      itemOrc.personalizacao,
      itemOrc.idFormulaTinta,
      itemOrc.idLoteEstoque,
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END localEstoque,
      itemOrc.pessoaParticipante,
      itemOrc.quantidadeSaldo,
      itemOrc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemOrc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque =
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = 
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END
    AND estXLoc.localEstoque =
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END 
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND (cabOrc.tipoDocumento = 202
      OR itemOrc.quantidadeSaldo > 0)
    AND etapOrc.situacaoOrcamento BETWEEN 41 AND 89
    UNION ALL
