SET DEFINE OFF;

DROP TABLE MOINVENTARIOESTOQUEXITENS_2202;

create or replace PROCEDURE ADD_BUSCA_REGRA_FRETE (
    p_estabelecimento        IN NUMBER,    -- 4
    p_pessoa                 IN NUMBER,    -- 14
    p_enderecoEntregaPessoa  IN NUMBER,    -- 14
    p_valorBaseFrete         IN NUMBER,    -- 13.2
    p_pesoLiquido            IN NUMBER,    -- 9.6
    p_pesoBruto              IN NUMBER,    -- 9.6
    /* Retornos */
    r_transportadora         OUT NUMBER,    -- 14
    r_valorFrete             OUT NUMBER,    -- 13.2
    r_encontrouRegraFrete    OUT NUMBER,    -- 1
    r_valorFreteMinimo       OUT NUMBER,    -- 13.2
    r_multiplicarPeloPeso    OUT NUMBER,    -- 1
    r_percentualFrete        OUT NUMBER)    -- 7.8
IS
    v_idRegraFrete        NUMBER;
    v_valorFreteMinimo    NUMBER;
    v_multiplicarPeloPeso NUMBER;
    v_percentualFrete     NUMBER;
    v_transportadora      NUMBER;
BEGIN
  r_transportadora      := 0;
  r_valorFrete          := 0;
  r_encontrouRegraFrete := 0;
  r_valorFreteMinimo    := 0;
  r_multiplicarPeloPeso := 0;
  r_percentualFrete     := 0;
  SELECT
    COALESCE(MAX(a.idRegraFrete),0),
    COALESCE(MAX(a.valorFreteMinimo),0),
    COALESCE(MAX(a.multiplicarPeloPeso),0),
    COALESCE(MAX(a.percentualFrete),0),
    COALESCE(MAX(a.transportadora),0)
  INTO
    v_idRegraFrete,
    v_valorFreteMinimo,
    v_multiplicarPeloPeso,
    v_percentualFrete,
    v_transportadora
  FROM (
    SELECT
      frete.idRegraFrete,
      frete.valorFreteMinimo,
      frete.multiplicarPeloPeso,
      frete.percentualFrete,
      frete.transportadora,
      ROW_NUMBER() OVER (
        ORDER BY
          frete.pessoa DESC,
          frete.exclusivoPessoaE DESC,
          frete.exclusivoPessoaD DESC,
          frete.exclusivoPessoaC DESC,
          frete.exclusivoPessoaB DESC,
          frete.exclusivoPessoaA DESC,
          frete.municipio DESC,
          frete.microrregiaoGeografica DESC,
          frete.mesorregiaoGeografica DESC,
          frete.uf DESC,
          frete.estabelecimento DESC,
          frete.idRegraFrete DESC) rowNumber
    FROM CAPESSOAS pess
    JOIN CAENDERECOSPESSOA endEntr ON endEntr.enderecoPessoa = p_enderecoEntregaPessoa
    JOIN SIMUNICIPIOS mun ON mun.municipio = endEntr.municipio
    JOIN SIMICRORREGIOESGEOGRAFICA micro ON micro.microrregiaoGeografica = mun.microrregiaoGeografica
    JOIN PAREGRASFRETE frete ON frete.idRegraFrete > 0
    WHERE pess.pessoa = p_pessoa
    AND frete.idRegraFrete > 0
    AND frete.ativo = 1
    AND (frete.estabelecimento = 0 OR frete.estabelecimento = p_estabelecimento)
    AND (frete.uf = ' ' OR frete.uf = mun.uf)
    AND (frete.mesorregiaoGeografica = 0 OR frete.mesorregiaoGeografica = micro.mesorregiaoGeografica)
    AND (frete.microrregiaoGeografica = 0 OR frete.microrregiaoGeografica = mun.microrregiaoGeografica)
    AND (frete.municipio = 0 OR frete.municipio = endEntr.municipio)
    AND (frete.bairroDistrito = ' ' OR frete.bairroDistrito = endEntr.bairroDistrito)
    AND (frete.exclusivoPessoaA = 0 OR frete.exclusivoPessoaA = pess.exclusivoPessoaA)
    AND (frete.exclusivoPessoaB = 0 OR frete.exclusivoPessoaB = pess.exclusivoPessoaB)
    AND (frete.exclusivoPessoaC = 0 OR frete.exclusivoPessoaC = pess.exclusivoPessoaC)
    AND (frete.exclusivoPessoaD = 0 OR frete.exclusivoPessoaD = pess.exclusivoPessoaD)
    AND (frete.exclusivoPessoaE = 0 OR frete.exclusivoPessoaE = pess.exclusivoPessoaE)
    AND (frete.pessoa = 0 OR frete.pessoa = pess.pessoa)
  ) a
  WHERE a.rowNumber = 1;
  IF v_idRegraFrete <> 0 THEN
    r_transportadora      := v_transportadora;
    r_encontrouRegraFrete := 1;
    r_valorFreteMinimo    := v_valorFreteMinimo;
    r_multiplicarPeloPeso := v_multiplicarPeloPeso;
    r_percentualFrete     := v_percentualFrete;
    r_valorFrete := 
      CASE
        WHEN ROUND(p_valorBaseFrete * v_percentualFrete/100,0) <
          ROUND(v_valorFreteMinimo
            * CASE
                WHEN V_multiplicarPeloPeso = 1
                  AND CASE
                        WHEN p_pesoBruto > p_pesoLiquido
                        THEN p_pesoBruto
                        ELSE p_pesoLiquido
                      END <> 0
                THEN
                  CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END
                ELSE 1
              END,2)
        THEN ROUND(v_valorFreteMinimo *
          CASE
            WHEN V_multiplicarPeloPeso = 1
              AND CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END <> 0
            THEN
              CASE
                WHEN p_pesoBruto > p_pesoLiquido
                THEN p_pesoBruto
                ELSE p_pesoLiquido
              END
            ELSE 1
          END,2)
        ELSE ROUND(p_valorBaseFrete * v_percentualFrete/100,0)
      END;
  END IF;
END ADD_BUSCA_REGRA_FRETE;

/

create or replace PROCEDURE ADD_ORCAMENTO_BUSCA_FRETE_ENTR (
    p_cab_orcamento                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_pessoa                   IN NUMBER,
    p_cab_enderecoEntregaPessoa    IN NUMBER,
    p_cab_transportadora           IN NUMBER,
    p_cab_valorFreteGeral          IN NUMBER,
    p_item_sequencia               IN NUMBER,
    p_item_pesoLiquido             IN NUMBER,
    p_item_pesoBruto               IN NUMBER,
    p_item_valorProdutoServicoBrut IN NUMBER,
    p_item_valorDescontoItem       IN NUMBER,
    p_item_valorAcrescimoItem      IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_contrEntr_habilitaFrete      IN NUMBER,
    /* Retornos */
    r_cab_transportadora           OUT NUMBER,
    r_cab_valorFreteGeral          OUT NUMBER)
IS
  v_auxNumber                NUMBER;
  v_somaItens_valorBaseFrete NUMBER;
  v_somaItens_pesoLiquido    NUMBER;
  v_somaItens_pesoBruto      NUMBER;
  v_transportadora           NUMBER;
  v_valorFreteGeral          NUMBER;
  v_encontrouFrete           NUMBER;
  v_utilizaRegraFrete        NUMBER;
  v_percentualFrete          NUMBER;
BEGIN
  r_cab_transportadora  := p_cab_transportadora;
  r_cab_valorFreteGeral := p_cab_valorFreteGeral;
  SELECT
    COALESCE(SUM(a.valorProdutoServicoBruto-a.valorDescontoItem+a.valorAcrescimoItem),0),
    COALESCE(SUM(a.pesoLiquido),0),
    COALESCE(SUM(a.pesoBruto),0)
  INTO
    v_somaItens_valorBaseFrete,
    v_somaItens_pesoLiquido,
    v_somaItens_pesoBruto
  FROM MOORCAMENTOXITENS a
  JOIN PACONTROLESENTREGA b ON b.controleEntrega = a.controleEntrega AND b.entregaFutura = 1
  WHERE a.orcamento = p_cab_orcamento
  AND a.sequencia <> p_item_sequencia
  AND a.cancelado = 0
  AND a.controleEntrega > 0;
  IF CASE WHEN p_item_controleEntrega = 0 OR p_contrEntr_habilitaFrete = 0 THEN 0 ELSE p_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem END + v_somaItens_valorBaseFrete = 0 THEN
    v_transportadora  := 0;
    v_valorFreteGeral := 0;
    v_encontrouFrete  := 0;
    v_percentualFrete := 0;
  ELSE
    ADD_BUSCA_REGRA_FRETE (
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_cab_enderecoEntregaPessoa,
      (CASE WHEN p_item_controleEntrega = 0 OR p_contrEntr_habilitaFrete = 0 THEN 0 ELSE p_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem END + v_somaItens_valorBaseFrete),
      (CASE WHEN p_item_controleEntrega = 0 OR p_contrEntr_habilitaFrete = 0 THEN 0 ELSE p_item_pesoLiquido END + v_somaItens_pesoLiquido),
      (CASE WHEN p_item_controleEntrega = 0 OR p_contrEntr_habilitaFrete = 0 THEN 0 ELSE p_item_pesoBruto END + v_somaItens_pesoBruto),
      /* Retornos */
      v_transportadora,
      v_valorFreteGeral,
      v_encontrouFrete,
      v_auxNumber,
      v_auxNumber,
      v_percentualFrete);
  END IF;
  v_utilizaRegraFrete := v_encontrouFrete;
  IF v_utilizaRegraFrete = 1 THEN
    SELECT CASE WHEN EXISTS (SELECT 1 FROM PAREGRASFRETE WHERE idRegraFrete > 0 AND ativo = 1) THEN 1 ELSE 0 END
    INTO v_utilizaRegraFrete
    FROM DUAL;
  END IF;
  IF v_encontrouFrete = 1
    AND (p_item_sequencia = 0
      OR v_percentualFrete <> 0
      OR r_cab_valorFreteGeral = 0
      AND v_valorFreteGeral <> r_cab_valorFreteGeral)
    OR r_cab_valorFreteGeral <> 0
    AND v_valorFreteGeral = 0
    AND v_utilizaRegraFrete = 1 THEN
    IF CASE WHEN p_item_controleEntrega = 0 OR p_contrEntr_habilitaFrete = 0 THEN 0 ELSE p_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem END + v_somaItens_valorBaseFrete = 0 THEN
      v_transportadora  := 0;
      v_valorFreteGeral := 0;
    END IF;
    IF v_transportadora <> 0 THEN
      r_cab_transportadora := v_transportadora;
    END IF;
    r_cab_valorFreteGeral := v_valorFreteGeral;
  END IF;
END ADD_ORCAMENTO_BUSCA_FRETE_ENTR;

/

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (226, 30002021, 'Coluna "Vendedor" nos itens dos documentos', 1, 30002, 'A', '120', 'E', 0, 0, 1, 1, 0, 0, 'Vendedor', ' ', ' ', ' ');
INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (227, 30001013, 'Exibir totalizadores nas pesquisas de documentos', 1, 30001, 'A', '120', 'E', 0, 0, 1, 1, 0, 0, 'Totalizadores', ' ', ' ', ' ');

COMMIT;

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2022002010, '2022.2.10', sysdate, 1, 1, sysdate, ' ');

COMMIT;

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

/*
*/