Sistema de ordem de compra

Índice

Gerar itens de compra

ORCCOM.PRO_GERAR_ITENS_COMPRA

Descrição

Permite gerar ordem de compras baseado em um SQL.

Configurações possíveis:
ORCCOM.PRO_GERAR_ITENS_COMPRA.CUSTOM_SQL: Permite incluir uma CUSTOM_SQL que irá substituir o SQL base gerado em tempo de desenvolvimento.
Esse SQL deverá respeitar as colunas mínimas(colunas da tabela referencias_produtos_pessoas, nome do estabelecimento para gerar a ordem de compra), mas poderá incluir joins de colunas de forma livre.
OBS: quando utilizada a macro ${dias} utiliza o valor informado no campo "dias" da query para realizar o filtro.
Exemplo:
select distinct forn.pessoa as PESSOA_FORN
, forn.nome_completo as NOME_FORNECEDOR
, nome_estabelecimento as ESTABELECIMENTO
, prod.id as produto_id
, prod.produto
, prod.descricao
, estoque_atual
, ordem_compra
, pedido_venda
, estoque_minimo
, quantidade_repor
, rpp.*
from(
select prod_id
, estabelecimento_id as estab_id
   , produto
   , descricao_produto
   , descricao_detalhada
   , marca
   , referencia_produto
   , tipo_produto
   , simbolo
   , sum(estoque_atual) as estoque_atual
   , sum(oc) as ordem_compra
   , sum(pv) as pedido_venda
   , sum(minimo) as estoque_minimo
   , sum(minimo - (estoque_atual - pv)) as quantidade_repor
   , (select sum(ip.quantidade)
           from itens_pedidos ip
           join pedidos p on p.id = ip.pedido_id
           where p.situacao not in ('C')
           and ip.produto_id = prod_id
           and p.data_conclusao between current_date - interval '30 day' 
                 and current_date) as venda_30
   , (select sum(ip.quantidade)
           from itens_pedidos ip
           join pedidos p on p.id = ip.pedido_id
           where p.situacao not in ('C')
           and ip.produto_id = prod_id
           and p.data_conclusao between current_date - interval '90 day'
                 and current_date) as venda_90
   from (
       select    ep.id
       , ep.estabelecimento_id as estabelecimento_id
       ,    p.id as prod_id
       ,    p.produto
       ,    p.descricao as descricao_produto
       ,    p.descricao_detalhada
       ,    p.referencia_fabricante as referencia_produto
       ,    m.marca
       ,    tp.tipo_produto
       ,    um.simbolo
       ,    ep.estoque_atual
       ,    0 as oc
       ,    0 as pv
       ,    case when (ep.estoque_minimo < 0) then 0 else ep.estoque_minimo end as minimo
       from estoques_produtos ep
       join tipos_estoques te on te.id = ep.tipo_estoque_id
       join produtos p on (p.id = ep.produto_id)
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tp on tp.id = p.tipo_produto_id
       where p.situacao <> 'C'
       
       union
       
       select     i.id
       ,   ped.estabelecimento_id as estabelecimento_id
       ,  p.id as prod_id
       ,    p.produto
       ,    p.descricao as descricao_produto
       ,    p.descricao_detalhada
       ,    p.referencia_fabricante as referencia
       ,    m.marca
       ,    tprod.tipo_produto
       ,    um.simbolo
       ,    0 as estoque_atual
       ,    i.quantidade_pendente as oc
       ,    0 as pv
       ,    0 as minimo
       from itens_pedidos i
       join pedidos ped on (ped.id = i.pedido_id)
       join tipos_pedidos tp on (tp.id = ped.tipo_pedido_id)
       join produtos p on (p.id = i.produto_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tprod on tprod.id = p.tipo_produto_id
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       where tp.categoria = 'C' and p.situacao in ('M', 'P')
       and p.situacao <> 'C'
       
       union
       
       select    i.id
       , ped.estabelecimento_id as estabelecimento_id
       , p.id as prod_id
       ,   p.produto
       ,   p.descricao as descricao_produto
       ,   p.descricao_detalhada
       ,   p.referencia_fabricante as referencia
       ,   m.marca
       ,   tprod.tipo_produto
       ,   um.simbolo
       ,   0 as estoque_atual
       ,   0 as oc
       ,   case when (i.quantidade_efetiva = null) 
          then i.quantidade_pendente 
          else i.quantidade_efetiva end as pv
       ,   0 as minimo
       from itens_pedidos i
       join pedidos ped on (ped.id = i.pedido_id)
       join tipos_pedidos tp on (tp.id = ped.tipo_pedido_id)
       join produtos p on (p.id = i.produto_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tprod on tprod.id = p.tipo_produto_id
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       where tp.categoria in ('V', 'S')
       and ped.situacao in ('M', 'P')
       and tprod.servico = 'N'
       and p.situacao <> 'C'
   
   ) query
   group by produto
   , descricao_produto
   , descricao_detalhada
   , referencia_produto
   , marca
   , tipo_produto
   , simbolo
   , prod_id
   , estabelecimento_id
   having sum(coalesce(minimo,0) - (coalesce(estoque_atual,0) - coalesce(pv,0)) ) >= 0
)q
join referencias_produtos_pessoas rpp on rpp.produto_id = q.prod_id 
join pessoas forn on forn.id = rpp.empresa_id
join estabelecimentos estab on estab.id = estab_id
join produtos prod on prod.id = rpp.produto_id
order by prod.produto, forn.nome_completo
ORCCOM.PRO_GERAR_ITENS_COMPRA.ADITIONAL_ITEMS: Deverá conter uma relação de nome/dominio/label de colunas adicionais (definidas no CUSTOM_SQL) e que devem ser apresentadas na tela.
Uma linha para cada campo, exemplo:
marca: ADSRT.TEXT :Marca
estoque_atual: ADSRT.DOUBLE : Estoque atual
estoque_minimo: ADSRT.DOUBLE :Estoque mínimo 
quantidade_repor: ADSRT.DOUBLE :Qtd repor
ORCCOM.PRO_GERAR_ITENS_COMPRA.ATRIBUTOS_ORDEM_COMPRA: Atributos que devem ser preenchidos na capa da ordem de compra durante o processo.
Deve ser informado um atributo por linha no formato:
ATRIBUTO=VALOR

Qualquer atributo existente na entidade PEDIDOS pode ser utilizado.

Exemplo:
VENDEDOR_ID=12345
REPRESENTANTE_ID=93984
DATA_PROGRAMADA=[SYSDATE+14]

Campos:

Código de identificação do produto. Calculado automaticamente ou informado conforme parametrização da respectiva engenharia de produto.
Texto que descreve o produto. Este é o texto utilizado por padrão em todos os documentos fiscais e interfaces de uso interno.
Código (único) de identificação da pessoa (física ou jurídica).
Nome completo da pessoa física ou razão social da pessoa jurídica. Razão social é o nome devidamente registrado sob o qual uma pessoa jurídica se individualiza e exerce suas atividades. A razão social diferencia-se do nome dado a um estabelecimento ou do nome comercial com que a empresa pode ser reconhecida junto ao público, o qual é conhecido como nome fantasia.
Estabelecimento para o qual deverá ser criada a ordem de compra.
Apresenta os campos criados dinamicamente a partir do SQL, que estejam informadas na preferência [ORCCOM.PRO_GERAR_ITENS_COMPRA.ADITIONAL_ITEMS]
Caso informado indica a quantidade de produtos a ser solicitada.
Quando informado indica o preço do produto.
Número de dias para o qual se deseja ter estoque. Quando informado pode ser utilizado na pesquisa pelo SQL customizado.
Link para a ordem de compra

Operações

Topo

Pesquisar

Ao pesquisar, o usuário poderá informar critérios de filtro para listar apenas os registros desejados. Normalmente depois de informar os filtros desejados, o usuário deverá executar a operação [b:Listar].
Obtenha maiores detalhes em Como utilizar a tela de pesquisa?.
Comportamento:Topo

Alterar

A partir da tela de consulta de um registro, esta operação permite alterar os dados do mesmo.
O sistema abre um formulário com os campos editáveis. Após alterar os campos, o usuário deverá clicar em [b:Salvar].
Comportamento:

Configurações

ORCCOM.PRO_GERAR_ITENS_COMPRA.ADITIONAL_ITEMS

Deverá conter uma relação de nome/dominio/label de colunas adicionais (definidas no CUSTOM_SQL) e que devem ser apresentadas na tela.
Uma linha para cada campo, exemplo:
marca: ADSRT.TEXT :Marca
estoque_atual: ADSRT.DOUBLE : Estoque atual
estoque_minimo: ADSRT.DOUBLE :Estoque mínimo 
quantidade_repor: ADSRT.DOUBLE :Qtd repor

Tipo: TEXT_LONG

ORCCOM.PRO_GERAR_ITENS_COMPRA.ATRIBUTOS_ORDEM_COMPRA

Atributos a serem definidos na criação da ordem de compra

Atributos que devem ser preenchidos na capa da ordem de compra durante o processo.
Deve ser informado um atributo por linha no formato:

ATRIBUTO=VALOR

Qualquer atributo existente na entidade PEDIDOS pode ser utilizado.

Exemplo:
VENDEDOR_ID=12345
REPRESENTANTE_ID=93984
DATA_PROGRAMADA=[SYSDATE+14]

Tipo: TEXT_LONG

ORCCOM.PRO_GERAR_ITENS_COMPRA.CUSTOM_SQL

Permite incluir uma CUSTOM_SQL que irá substituir o SQL base gerado em tempo de desenvolvimento.
Esse SQL deverá respeitar as colunas mínimas(colunas da tabela referencias_produtos_pessoas, nome do estabelecimento para gerar a ordem de compra), mas poderá incluir joins de colunas de forma livre.
OBS: quando utilizada a macro ${dias} utiliza o valor informado no campo "dias" da query para realizar o filtro.
Exemplo:
select distinct forn.pessoa as PESSOA_FORN
, forn.nome_completo as NOME_FORNECEDOR
, nome_estabelecimento as ESTABELECIMENTO
, prod.id as produto_id
, prod.produto
, prod.descricao
, estoque_atual
, ordem_compra
, pedido_venda
, estoque_minimo
, quantidade_repor
, rpp.*
from(
select prod_id
, estabelecimento_id as estab_id
   , produto
   , descricao_produto
   , descricao_detalhada
   , marca
   , referencia_produto
   , tipo_produto
   , simbolo
   , sum(estoque_atual) as estoque_atual
   , sum(oc) as ordem_compra
   , sum(pv) as pedido_venda
   , sum(minimo) as estoque_minimo
   , sum(minimo - (estoque_atual - pv)) as quantidade_repor
   , (select sum(ip.quantidade)
           from itens_pedidos ip
           join pedidos p on p.id = ip.pedido_id
           where p.situacao not in ('C')
           and ip.produto_id = prod_id
           and p.data_conclusao between current_date - interval '30 day' 
                 and current_date) as venda_30
   , (select sum(ip.quantidade)
           from itens_pedidos ip
           join pedidos p on p.id = ip.pedido_id
           where p.situacao not in ('C')
           and ip.produto_id = prod_id
           and p.data_conclusao between current_date - interval '90 day'
                 and current_date) as venda_90
   from (
       select    ep.id
       , ep.estabelecimento_id as estabelecimento_id
       ,    p.id as prod_id
       ,    p.produto
       ,    p.descricao as descricao_produto
       ,    p.descricao_detalhada
       ,    p.referencia_fabricante as referencia_produto
       ,    m.marca
       ,    tp.tipo_produto
       ,    um.simbolo
       ,    ep.estoque_atual
       ,    0 as oc
       ,    0 as pv
       ,    case when (ep.estoque_minimo < 0) then 0 else ep.estoque_minimo end as minimo
       from estoques_produtos ep
       join tipos_estoques te on te.id = ep.tipo_estoque_id
       join produtos p on (p.id = ep.produto_id)
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tp on tp.id = p.tipo_produto_id
       where p.situacao <> 'C'
       
       union
       
       select     i.id
       ,   ped.estabelecimento_id as estabelecimento_id
       ,  p.id as prod_id
       ,    p.produto
       ,    p.descricao as descricao_produto
       ,    p.descricao_detalhada
       ,    p.referencia_fabricante as referencia
       ,    m.marca
       ,    tprod.tipo_produto
       ,    um.simbolo
       ,    0 as estoque_atual
       ,    i.quantidade_pendente as oc
       ,    0 as pv
       ,    0 as minimo
       from itens_pedidos i
       join pedidos ped on (ped.id = i.pedido_id)
       join tipos_pedidos tp on (tp.id = ped.tipo_pedido_id)
       join produtos p on (p.id = i.produto_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tprod on tprod.id = p.tipo_produto_id
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       where tp.categoria = 'C' and p.situacao in ('M', 'P')
       and p.situacao <> 'C'
       
       union
       
       select    i.id
       , ped.estabelecimento_id as estabelecimento_id
       , p.id as prod_id
       ,   p.produto
       ,   p.descricao as descricao_produto
       ,   p.descricao_detalhada
       ,   p.referencia_fabricante as referencia
       ,   m.marca
       ,   tprod.tipo_produto
       ,   um.simbolo
       ,   0 as estoque_atual
       ,   0 as oc
       ,   case when (i.quantidade_efetiva = null) 
          then i.quantidade_pendente 
          else i.quantidade_efetiva end as pv
       ,   0 as minimo
       from itens_pedidos i
       join pedidos ped on (ped.id = i.pedido_id)
       join tipos_pedidos tp on (tp.id = ped.tipo_pedido_id)
       join produtos p on (p.id = i.produto_id)
       left join marcas m on m.id = p.marca_id
       join tipos_produtos tprod on tprod.id = p.tipo_produto_id
       join unidades_medidas um on (um.id = p.unidade_medida_id)
       where tp.categoria in ('V', 'S')
       and ped.situacao in ('M', 'P')
       and tprod.servico = 'N'
       and p.situacao <> 'C'
   
   ) query
   group by produto
   , descricao_produto
   , descricao_detalhada
   , referencia_produto
   , marca
   , tipo_produto
   , simbolo
   , prod_id
   , estabelecimento_id
   having sum(coalesce(minimo,0) - (coalesce(estoque_atual,0) - coalesce(pv,0)) ) >= 0
)q
join referencias_produtos_pessoas rpp on rpp.produto_id = q.prod_id 
join pessoas forn on forn.id = rpp.empresa_id
join estabelecimentos estab on estab.id = estab_id
join produtos prod on prod.id = rpp.produto_id
order by prod.produto, forn.nome_completo

Tipo: SOURCE_CODE

Regras

Alterar o sql

Caso a preferência ORCCOM.PRO_GERAR_ITENS_COMPRA.CUSTOM_SQL esteja configurada altera o sql padrão para o sql informado na preferência.
Eventos que disparam esta regra:
  • Antes de ler formulário "Pesquisar"

Apresentar campos conforme SQL custom

Quando a preferência ORCCOM.PRO_GERAR_ITENS_COMPRA.ADITIONAL_ITEMS estiver configurada apresenta na tela os campos informados que constem no SQL
Eventos que disparam esta regra:
  • Antes de apresentar uma tela formulário "Alterar"

Criar/pesquisar item

Ao alterar a quantidade ou preço, se quantidade e preço estiverem informados, deve criar/atualizar um item em uma ordem de compra do respectivo fornecedor que esteja em manutenção.
Se limpar um dos dois campos, deve excluir o respectivo item.
Deve apresentar o número da OC como um link.
Caso ainda não tenha uma ordem de compra em manutenção para o fornecedor no estabelecimento, cria a OC com os atributos informados na preferência ORCCOM.PRO_GERAR_ITENS_COMPRA.ATRIBUTOS_ORDEM_COMPRA
Eventos que disparam esta regra:
  • Ao alterar campo "Preço" do formulário "Alterar"
  • Ao alterar campo "Quantidade" do formulário "Alterar"

Pesquisar ordem compra

Pesquisa uma ordem de compra em manutenção para o produto, estabelecimento e fornecedor no SQL.
Se localizar, deve preencher os campos acima.
Se não localizar, deve limpar todos os campos
Se o SQL configurado não tiver os campos fornecedor, estabelecimento e produto, deve dar erro.
Eventos que disparam esta regra:
  • Antes de apresentar cada registro formulário "Alterar"