Array
(
)

Regras de negócio para estoque

Delphi32
   - 08 nov 2005

Pessoal, tenho uma dúvida quando a regras de negócio para controle de estoque. É que me apareceu uma situação um tanto quanto diferente. É que existem produtos que na hora de entrar entram com uma unidade, por exemplo, caixa, mas na hora de sair, sai como pacote porque eles compram caixas que contém n pacotes. Então, como compôr o estoque? Se eu somar a quantidade de caixas ao estoque então como dar saída? seria ruim a pessoa ter que cadastrar uma saída de ´0,2 caixas´ do estoque... Alguém já passou por algo semelhante?

t+!


Edilcimar
   - 08 nov 2005

Eu tenho um programa para farmácia onde existe fracionamento de produto (que é o teu caso), aí então eu criei uma campo ´fração´ onde o cliente coloca a quantidade de ´coisas´ que tem dentro da caixa. Quando dou entrada no estoque eu pego esta ´fração´ e multiplico pela quantidade comprada e somo ao estoque, portanto a partir daí a pessoa deixa de trabalhar com caixas e passa a trabalhar com a fração


Martins
   - 08 nov 2005


Citação:
Eu tenho um programa para farmácia onde existe fracionamento de produto (que é o teu caso), aí então eu criei uma campo ´fração´ onde o cliente coloca a quantidade de ´coisas´ que tem dentro da caixa. Quando dou entrada no estoque eu pego esta ´fração´ e multiplico pela quantidade comprada e somo ao estoque, portanto a partir daí a pessoa deixa de trabalhar com caixas e passa a trabalhar com a fração


Concordo com a lógica empregada em sua aplicação!!!


Lorde_morte.
   - 22 abr 2006


Citação:
Eu tenho um programa para farmácia onde existe fracionamento de produto (que é o teu caso), aí então eu criei uma campo ´fração´ onde o cliente coloca a quantidade de ´coisas´ que tem dentro da caixa. Quando dou entrada no estoque eu pego esta ´fração´ e multiplico pela quantidade comprada e somo ao estoque, portanto a partir daí a pessoa deixa de trabalhar com caixas e passa a trabalhar com a fração


Gostei desta solução Edicimar me ajudou muito. :)

Esta solução resolve tranquilamente o problema exposto pelo delphi32.

Mas como resolver essas outras situações tambem:

Situação I(O fator de conversão entre as unidades pode mudar)

Atenção: É raro de acontecer, mas acontece!

As unidades podem variar:
Ex:
Momento I
Entrou 10 Blocos e cada bloco contem 20 unidades.

Momento II
Entrou os mesmos 10 blocos só que desta vez em um bloco vem apenas 15 unidades e não os 20 anteriores.

Obs: Podem existir simultaneamente blocos com 20unit e com 15unit de um mesmo produto no estoque.

Situação II(O relacionamento entre as unidades pode ser diferente dependendo do produto)
Unidade e diferentes produtos:
Ex:
A UNIDADE CAIXA do produto A vem com 100 unidades de A e UNIDADE CAIXA do produto B vem com 50 unidades de B.

Situação III(Unidades com relacionamentos que nunca mudam e se aplicam a todos os produtos)
Algumas unidades e suas relações não mudam nunca, como as unidades de comprimento(km, hm, m....), unidades de volume(lml) e varias outras.

Comentarios:
A verdade é que a situação II me quebrou.
O ideal seria por as unidades em produtos, o que seria bom porque o usuário teria que definir as unidades dos produtos uma única vez na vida.

Mas a vida não é tão simples e o não tratamento deste caso I levaria o meu projeto ao erro.
Tentando resolver, para cada entrada de um produto o usuário teria que informar toda a relação entre as unidades daquele produto, algo que me soa demasiadamente impraticável e trabalhoso para o usuário. Imagine para cada entrada de um produto o usuário ter que definir toda a relação que aquele produto possui com as unidades. Pedrera! Relações essas que em alguns casos serão um tanto complexas, envolvendo varias outras unidades.
Todo este trabalho apenas para tratar mudanças de unidades que podem demorar um, dois, dez anos ou talvez até mesmo um mês para ocorrer.


Como ficaria a tabela neste caso?

Obrigado pessoal. Qualquer duvida estou ai.


Edilcimar
   - 22 abr 2006

Em princípio as caixas não mudam de tamanho a toda hora, e quando mudam, mudam de forma permanente(pelo menos por algum tempo), portanto antes de efetuar compra ou venda basta modificar o cadastro do produto para a nova embalagem, ou então quando o produto possui 2 embalagens diferentes, cadastrar as duas


Vitor Alcantara
   - 13 jun 2008

Ressuscitando o tópico acima me ocorreu uma situação em alguns clientes meus (geralmente pequenos mercadinhos), que gostaria da ajuda dos nobres colegas pra tentar solucionar.
O caso é o seguinte:
Existem alguns produtos que são vendidos inteiros ou fracionados (Sabão em barra 5x200g, iogurte dranone 6x1, bandeja de ovos 30x1...).
Ou seja, na hora da entrada ele vem, por exemplo, 1 cx do sabão barra 10x5x200g (dez pacotes de 5x200g), só que na hora da venda ele pode ser vendido tanto o pacote inteiro (5x200g) como só uma barrinha (200g), onde logicamente ele sai um pouco mais caro fracionado (Exemplo o pacote inteiro custa R$ 1,00 e a barrinha separada custa R$ 0,30 que daria R$ 1,50 as cinco barrinhas ), o que acarreta em ter que cadastrar os dois produtos separadamente, (até mesmo pra ganho de velocidade na hora de passar no caixa, pois existe a possibilidade de se confeccionar etiquetas de código de barras pra a barrinha separada).
Nesse caso não seria um fracionamento do produto e sim uma transformação.
Alguém aqui no fórum já solucionou uma situação dessas?
Ficam ai as minhas dúvidas.
1º Como alterar as quantidades dos produtos no ato da venda ou da entrada? Só alterar a quantidade em estoque de apenas um produto (sabão barra 5x200g) ou alterar a quantidade em estoque dos dois (tanto o sabão barra 5x200g como a barrinha 200g)? Acho eu que não daria muito certo gerando um estoque falso, pois iria dobrar o valor do produto no estoque.
2º Como fazer pra alterar o custo do produto fracionado (barrinha de 200g), pois na hora da entrada iria ser cadastrado apenas no sabão 5x200g?

Meus clientes reclamam muito, pois tem de ficar toda hora indo na prateleira e contando quantos produtos, existem fracionado (barrinha de 200g) e inteiro (pacote de 5x200g), tendo de dar saída no inteiro e dar entrada no fracionado, para evitar que o estoque do produto fracionado fique negativo e o produto inteiro fique com uma quantidade que não existe.

Aguardo sugestões
Atenciosamente Vitor Araújo Alcântara.


Emerson
   - 14 jun 2008

Vítor, esse é um problema de difícil solução pelo sistema.

imagine que você tem no estoque 3 produtos ´inteiros´ e mais 4 frações.

no sistema está cadastrado desta forma:
3 pacotes (5x200) = 15 unidades
4 barras (1x200) = 4 unidades
ou seja: tem um total de 19 barras, correto?

chega um cliente no caixa com 4 barras.
como você poderia saber se ele pegou as quatro soltas ou abriu um pacote?

não tem como controlar isso. é por esse tipo de coisa que existe a necessidade de recontagem dos produtos (inventário).

como faço no meu sistema:

tenho o cadastro de produtos e de embalagens dos produtos. basicamente isso:#Código

PRODUTO
-----------
IDPRODUTO int (PK)
Codigo varchar (IDX)
Descricao varchar (IDX)

PRODUTOEMBALAGEM
--------------------------
IDPRODUTOEMBALAGEM int (PK)
IDPRODUTO int (FK)
UNIDADE varchar
CODIGODEBARRAS varchar (UK)
VALOR numeric
FATOR numeric (em relação à menor unidade de venda)

ESTOQUE
-----------
IDESTOQUE int (PK)
IDPRODUTO int (FK)
SALDO numeric (saldo sempre na menor unidade)

ESTOQUELOTE
-----------------
IDESTOQUELOTE int (FK)
IDESTOQUE int (FK)
IDPRODUTOEMBALAGEM int (FK)
SALDO numeric
PK - chave primária
IDX - indexado
FK - chave estrangeira
UK - chave única


usando o seu exemplo, minhas tabelas seriam preenchidas assim:#Código
PRODUTO
-----------
IDPRODUTO CODIGO DESCRICAO
1 12345 Sabão em barra Marca X

PRODUTOEMBALAGEM
--------------------------
IDPRODUTOEMBALAGEM IDPRODUTO UNIDADE CODIGODEBARRAS VALOR FATOR
1 1 UN 789 0,3 1
2 1 PC 1789 1 5
3 1 CX 2789 9,5 50

ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 19

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
1 1 1 4 4
2 1 2 3 15

- Para saber o saldo físico, basta consultar a tabela ESTOQUE
- Para saber o saldo financeiro será preciso consultar a tabela EstoqueLote em conjunto com a tabela ProdutoEmbalagem.
(basta dividir o saldo pelo fator e multiplicar pelo valor)

ao passar no caixa um codigo de barras de unidade, seria abatido o saldo da unidade na tabela EstoqueLote (no caso, o registro de ID 1).
então vamos ao exemplo:
- passou no caixa 4 x Cod.Bar.789: abate o saldo de EstoqueLote ID 1. saldo fica em 0.
- passou no caixa 3 x Cod.Bar.789.
isso quer dizer que houve o rompimento de um pacote, pois não havia mais saldo de unidade.
então, deve-se diminuir o saldo da unidade PC (pacote) e adicionar na unidade UN, ficando a uinidade UN com saldo de 5
(isso mesmo, 5, pois um pacote tem 5 unidades).
depois faz-se o abatimento do saldo da unidade.

ilustrando:#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 19

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
1 1 1 4 (UN) 4
2 1 2 3 (PC) 15


- passou no caixa 4 x Cod.Bar.789.
abate o saldo de EstoqueLote ID 1 (pois esse é o ID cuja embalagem é 789). O saldo será zerado.

como ficam os registro após essa operação:#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 15

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
1 1 1 0 (UN) 0
2 1 2 3 (PC) 15


- agora, passou no caixa mais 3 x Cod.Bar.789.
isso quer dizer que houve o rompimento de um pacote, pois não havia mais saldo de unidade.
então, deve-se diminuir o saldo da unidade PC (pacote) e adicionar na unidade UN, ficando a unidade UN com saldo de 5
(isso mesmo, 5, pois um pacote tem 5 unidades).
como ficam os registro após essa operação:#Código
ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
1 1 1 5 (UN) 5
2 1 2 2 (PC) 10
obs.: se não existir um registro com saldo na unidade vendida, ele deverá ser criado.
nesse ponto NÃO será necessário alterar o estoque, pois o saldo total não foi alterado.

depois faz-se o abatimento do saldo da unidade: saída de 3 x Cod.Bar.789
como ficam os registro após essa operação:
#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 12

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
1 1 1 2 (UN) 2
2 1 2 2 (PC) 10

é o mais próximo que dá pra chegar de um saldo físico real.

lembrando que esse tipo de movimentação mostrado acima pode ser feita desde a entrada do produto (em CX).
na primeira saída você fraciona a caixa utilizando a unidade imadiatamente inferior, até chegar na unidade vendida.
por exemplo, imaginando que não há saldo para o produto, nem registro na EstoqueLote:
#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 0

deu entrada de 10 caixas, então os registros para o produto serão:#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 500

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 10 (CX) 500


agora vendi 2 pacotes. preciso fracionar 1 (uma) caixa:
#Código
ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 9 (CX) 450
24 1 2 10 (PC) 50

agora subtraio o saldo:#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 490

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 9 (CX) 450
24 1 2 8 (PC) 40


agora vamos usar aquela mesma entrada (10 CX), porém efetuando a saída de 3 UN (esqueçamos a saida de 2 barras).
procuro pelo saldo em UN. não encontrei, então preciso procurar pelo saldo na unidade imediatamente superior (PC).
não tem, então procuro pelo saldo na unidade imediatamente superior (CX). daí é só fracionar para ´baixo´, até a unidade vendida:
inicio:
#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 500

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 10 (CX) 500


para efetuar a saída de 3 UN precisamos alterar o estoque para as embalagens necessárias ao processo:
#Código
ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 9 (CX) 450
24 1 2 9 (PC) 45
25 1 1 5 (UN) 5

note que até aqui a soma dos produtos deve ser igual ao saldo (500), pois ainda não foi efetuada qualquer saída.

agora, efetivando a saída das 3 UN:
#Código
ESTOQUE
-----------
IDESTOQUE IDPRODUTO SALDO (SEMPRE NA MENOR UNIDADE)
1 1 497

ESTOQUELOTE
-----------------
IDESTOQUELOTE IDESTOQUE IDPRODUTOEMBALAGEM SALDO SALDOMENORUNIDADE
23 1 3 9 (CX) 450
24 1 2 9 (PC) 45
25 1 1 2 (UN) 2


na explicação parece complicado, mas na prática funciona satisfatoriamente.


Vitor Alcantara
   - 14 jun 2008

Caro emerson.en consegui entender o espírito da sua explicação.
Vou estudar com calma pra ver se tem como implementar essa idéia no meu sistema.
Do jeito que você demonstrou acima, daria até pra resolver outro problema que ocorre, a venda de varejo e atacado. Pois no varejo você venderia as unidades menores (PC e UN) com seus respectivos preços, e na venda atacado você poderia vender a unidade maior (CX). Outra idéia que poderia ser complementada na sua explicação seria a adição de um campo com o custo do fracionamento (como etiquetas de códigos de barras, ou embalagens extras utilizada pra confeccionar o produto na sua menor unidade), para que ficasse melhor de se confeccionar o preço final do produto.

Emerson.en muito obrigado pela sua resposta.


Bico
   - 16 jun 2008

Bom dia.

Vitor, você pode resolver a situação que você está colocando através da composição de produtos. No meu sistema existe uma tabela que é a estrutura do produto. Nesta tabela estão os produtos e as respectivas quantidades que formam o produto final.
Por exemplo: No seu caso o produto barrinha de sabão seria composto por 0,2 KG do produto sabão - Assumindo que a unidade de medida utilizada seja KG.
Na verdade é um sistema para indústria e acaba envolvendo ordens de fabricação de determinado produto.
Por exemplo: É gerada uma ordem de fabricação de 10 barrinhas de sabão. No momento que a ordem é concluída, entra no estoque 10 barrinhas de sabão e sai do estoque 2 KG de sabão.

Qualquer dúvida, dá um grito aí.

Atenciosamente,
Fernando.


Vitor Alcantara
   - 16 jun 2008

Amigo Bico, primeiramente muito obrigado pela resposta.
Você teria como mostrar um resumo da estrutura das suas tabelas (a de produtos e de composição de produtos), para que eu possa dar uma analisada na sua idéia.


Bico
   - 16 jun 2008

Boa tarde.

Por exemplo:
Vamos supor que seja uma fábrica de doces.
O usuário pode comprar uma caixa com 12 doces ou doces de forma individual, sem estar na caixa.
A estrutura do produto seria basicamente esta:
#Código

1 Un 10-Caixa de doces --+--- 1 Un 20-Caixa
|
+--- 12 Un 30-Doce --+--- 0,05 Kg 40-Farinha
|
+--- 0,1 Un 50-Fermento
|
+--- 0,01 Kg 60-Açúcar


De forma resumida, a representação desta estrutura nas tabelas do banco seria esta:

Tabela de produtos:
#Código
+---------+-----------------------+-------------+-----------+
| COD_PRD | DESCRICAO | VALOR_VENDA | UN_MEDIDA |
+---------+-----------------------+-------------+-----------+
| 10 | Caixa de doces | 10,00 | Un |
+---------+-----------------------+-------------+-----------+
| 20 | Caixa | 1,00 | Un |
+---------+-----------------------+-------------+-----------+
| 30 | Doce | 2,00 | Un |
+---------+-----------------------+-------------+-----------+
| 40 | Farinha | 4,00 | KG |
+---------+-----------------------+-------------+-----------+
| 50 | Fermento | 2,50 | Un |
+---------+-----------------------+-------------+-----------+
| 60 | Açúcar | 5,00 | KG |
+---------+-----------------------+-------------+-----------+


Tabela de estrutura de produtos:
#Código
+---------+----------------+---------+
| COD_PRD | COD_COMPONENTE | QTDE |
+---------+----------------+---------+
| 10 | 20 | 1,000 |
+---------+----------------+---------+
| 10 | 30 | 12,000 |
+---------+----------------+---------+
| 30 | 40 | 0,050 |
+---------+----------------+---------+
| 30 | 50 | 0,100 |
+---------+----------------+---------+
| 30 | 60 | 0,002 |
+---------+----------------+---------+


Neste exemplo o produto é composto por vários produtos, mas com esta estrutura pode ser composto de um produto, vários produtos e pode ter um ou vários níveis.

Eu vendo o produto, com seu preço de venda e baixo o mesmo do estoque.

Por exemplo: Se eu precisar fabricar mais 20 doces, eu gero uma ordem de fabricação de 20 doces. No momento que eu concluo a minha ordem de fabricação, dou entrada em 20 doces no estoque e saída das quantidades que utilizei para fabricar estes 20 doces.

Se eu quiser fabricar 2 caixas de doces (24 doces) eu gero uma ordem de fabricação de 2 caixas de doces. No momento de concluir a ordem de fabricação eu tenho que explodir a estrutura do produto, ignorando os intermediários e chegando aos produtos finais - matéria-prima. Dou entrada das caixas de doces e saída dos componentes do estoque.

A respeito dos produtos intermediários - os doces, por exemplo. Quando eu gero a ordem de fabricação e quando concluo ela eu dou ao usuário a opção de fabricar os produtos intermediários ou usar os que estiverem no estoque. Se for utilizado o que estiver no estoque, baixa apenas o primeiro nível da estrutura do estoque, senão baixa apenas o último nível da estrutura.

Espero ter ajudado.
Qualquer dúvida, estamos aí...

Atenciosamente,
Fernando.


Emerson
   - 16 jun 2008

Fernando, o que você apresentou é ideal para indústria e até pode ser aplicada no comércio (apesar de serem ramos distintos).

o ´X´ da questão é o procedimento a ser tomado quando um produto passar no caixa. com a sua solução ele ainda terá o mesmo problema citado anteriormente.

imagine, usando sua estrutura, que entraram no estoque 5 caixas de doce (cada caixa com 12 unidades).

ele pode vender tanto caixa fechada, quanto a unidade.
pelo que o Vitor apresentou, os donos do estabelecimento querem saber qual o saldo em cada unidade. seria simples se exibisse saldo=60 unidades (realmente seria muuuuito mais simples), mas não é isso que querem, pois a caixa tem um valor de venda e a unidade tem outro valor.

segundo o colega, ele precisa exibir que tem em estoque 5 caixas.
no momento da entrada do produto isso é fácil (na indústria seria a ´baixa da ordem de produção´).

então vamos ao problema...
temos 5 caixas de doce no estoque.
- um cliente passa com 5 unidades (com certeza abriu uma caixa, pois havia somente caixas).
- outro cliente passa, agora com 3 unidades. como saber se ele pegou essas três unidades da caixa aberta ou se abriu uma nova caixa?

porque para fabricar é simples: é 1 + 1.
é você quem fabrica e põe no estoque nas unidades que você quer.
mas e nesse caso de venda? como você resolveria com sua estrutura?

porque aí você somente exemplifica a ´estrutura´ do produto, e não a movimentação de estoque, que é o problema apontado pelo Vítor.

a solução que eu apresentei também não é infalível. sempre será necessário fazer um inventário periódico.

eu trabalho no ramo de logística e enfrento esse tipo de problema todos os dias.
aqui o caso é ainda pior: há vários que clientes que trabalham com o mesmo produto, cada um vendendo de uma forma.
por exemplo, clientes que trabalham com Tang (suco):
alguns vendem o pacotinho, outros vendem em display, outros em caixa...
alguns vendem em todas as unidades citadas...
outros montam a unidade a seu gosto (conjunto de 4 pacotinhos, por exemplo). todas essas formas, mesmo se tratando de um mesmo produto.
montar essas unidades é simples. o problema é controlar o saldo em estoque dessas várias unidades.