Controle de Venda, Compra e Estoque - melhor solução

Pessoal, estou desenvolvendo um sistema, no qual criei as seguintes entidades:
-Venda
-Itens de Venda
-Compra
-Itens de Compra

O sistema é bem grande, preciso calcular o estoque, pensei em algumas estrategias e queria que alguem experiente em desenvolver grandes sistemas me desse uma opinião sobre a melhor.

1- Criar uma tabela Estoque e criar triggers no banco para quando criar uma Compra, ele adicionar no estoque e quando fazer uma Venda ele remover.
Possiveis problemas: Quando efetuando uma venda vamos supor que a energia cai, e ele efetua a venda mas n executa a trigger, isso pode acontecer? ou o banco garante que a atomicidade da Venda+trigger?

2- Calcular o estoque buscando as Compras de um produto e depois buscar todas as Vendas e assim conseguir saber fazendo a subtração.
Possiveis problemas: Como o sistema vai ser muito grande, me parece uma operação bem custosa.

3- Criar a tabela estoque e quando fazer uma Venda, fazer uma baixa na tabela estoque naquele produto, fazer essa logica via software no próprio sistema.
Possiveis problemas: Pode ser que aconteca uma queda de energia apos inserir a venda e nao diminua do estoque, acho q essa seria a pior resolução para o problema.

Alguem tem uma boa solucao para isso?

Obrigado pela atenção

A primeira. Com transações o banco garante a atomicidade da trigger. Ela também evita que haja furos no banco.

obrigado Vini
Estou usando hibernate, dai na tabela estoque nao tenho q fazer nada? nem falar pro hibernate que vai ter trigger??
Nao crio relacionamento nenhum na tabela estoque nao? faco so o mapeamento normal?

[quote=fredcrs]obrigado Vini
Estou usando hibernate, dai na tabela estoque nao tenho q fazer nada? nem falar pro hibernate que vai ter trigger??
Nao crio relacionamento nenhum na tabela estoque nao? faco so o mapeamento normal?
[/quote]

Boa noite a todos.

Não, voce não precisa dizer ao hibernate o que uma trigger vai fazer, isto porque, como o próprio nome já diz em inglês “Trigger” que quer dizer “Gatilho”, é uma implementação do Banco de Dados, que é disparado quando há uma ação de “Insert”, “Update” ou “Delete” em determinada tabela do Banco de Dados.

O que o Hibernate vai fazer é criar automaticamente as Instruções de Insert, Update e Delete e um Select na tabela, quando executa as tres primeiras ações, a Trigger (Gatilho) é executada dentro do banco e não na aplicação.

Depende muito do seu estoque, pois controle de estoque não é apenas dar baixa quando uma compra é feita… Então a possibilidade de criar apenas uma trigger não sei se seria a melhor solução.

Conheço em alguns casos que o controle de estoque é utilizado para realizar as compras, e a empresa tem um estoque mínimo e este produto fica na loja (mercado), então a baixa de estoque não precisa ser feita online, logo existe um processo no final do expediente que baixa o estoque já gerando relatórios.

O seu estoque precisa ser feito online? Ou seja, é necessário saber em tempo real quantos itens têm para evitar uma venda sem aquele produto?

Outro detalhe que deve ser pensando é a possibilidade do estoque ser controlado por mais filiais, ou seja, o cliente compra na loja A, mas vai retirar o produto na loja B, onde o produto está disponível.

Outro fator que precisa considerar é como vai ser feito a entrada em estoque? através de nota fiscal de compra, porém precisa pensar no caso de lançamento de produto errado, erro na nota, ou até mesmo devolução de produto com defeito, como vai ser feito o acerto no estoque?

Bom a principio, acho que temos pouca informação como vai ser feito o seu controle de estoque, todas as soluções que mostrou da para ser implementada, a dúvida é só questão de como vai ser controlado seu estoque (online, off-line)

Att

Astork,
obrigado pelas dicas, vou explicar melhor…

Trata-se de um sistema para mais de uma loja e como você disse, o estoque deve ser controlado online pois, se não, duas lojas podem vender o mesmo produto em estoque.

A questão da entrada no estoque, eu estou fazendo pela Compra, mas existe uma confirmação para essa compra onde ela deve ser finalizada com o rebecimento da carga e conferida por um funcionário. Só depois disso ela será adicionada ao estoque.
Até ai tudo ok
O problema é que, suponha que a carga chegue errada ou com algum com defeito, mas mesmo assim o funcionário quer aceitar essa parte da carga, na compra consta 50 itens mas ele vai pegar apenas 20, entao oq faço com esses 30? retiro da compra?

Obrigado pela ajuda

Veja se é online o estoque, de fato você vai precisar de alguma transação para ser feito baixa na compra e no estoque, como uma unica transação.

Mas é preciso verificar com seu cliente se existe a possibilidade de uma reserva de compra, pois em alguns casos vai existir o produto em estoque, mas o mesmo não vai estar disponivel para venda, pois outro cliente está em processo de compra, logo você não pode fazer uma trigger na hora da venda… !!! Neste caso seria um módulo de reserva de produto ou de orçamento.

[quote]O problema é que, suponha que a carga chegue errada ou com algum com defeito, mas mesmo assim o funcionário quer aceitar essa parte da carga, na compra consta 50 itens mas ele vai pegar apenas 20, entao oq faço com esses 30? retiro da compra?
[/quote]
É necessário ver como seu cliente e confirmar que a forma de trabalho dele é esta, pois como ele vai fazer com a nota? A nota fiscal vai vim com o valor cheio, incluíndo impostos etc. Vai ser retificado esta nota? vai vim outra com outro numero?
E caso você queira saber que nota veio uma determinada carga? o numero da carga vai ser da antiga nota errada, ou da nova nota com apenas as 20 unidades?

A questão principal em relação a sua duvida é entender perfeitamente como seu cliente quer, pois a implementação não é dificil.
Estou fazendo estas perguntas, para tentar lembrar você de algo que não foi levantado com o cliente e depois com todas informações discutirmos formas tecnicas de serem feitos… mas cuidado pois o grande problema do Controle de Estoque, está em sua regra com muitos detalhes.

Att

Agora falando tecnicamente e formas de implementar. A solução utilizando trigger no banco de dados não é uma boa solução.

  • Você vai ficar dependente de banco de dados, e uma migração para outro banco, requer escrever algumas coisas que não seja padrões entre os bancos.
  • O estoque vai ter muito mais coisas que fazer, do que apenas da baixa, existem (reserva de produtos, transferencia de lojas, venda (problemas com venda, cliente comprou e não quer mais, pode devolver), compra (problemas na compra, nota fiscal errada, produto com erro).

Outro detalhe muito importante, estoque não são 100% confiaveis, pois o seu sistema vai estar seguro até um momento, mas nas empresas que desenvolvemos estoque um grande problema era rouba, desvio, então sempre, sempre vai ter estoque furado, e você vai precisar fazer uma conferencia, logo você não vai querer que seu cliente fica te ligando para você acertar o estoque certo?

Então você teoricamente precisa desenvolver módulos de ajuste de estoque, com uma grande segurança (para apenas pessoas autorizadas poderem alterar / acertar estoque sem uma nota fiscal vinculada).

Outro detalhe, que esqueci de perguntar, que tipo de produto você está mexendo? Produtos pequenos, por exemplo mercado (arroz, feijão, refrigerante, chocolate, etc) ou produtos maiores (computador, televisão). Que tipo de segmento é seu cliente…

Pois cada segmento é diferente.

Onde desenvolvemos um sistema era para um mercado, então existia muito furo de roubo, sempre ele estavam fazendo conferencia, em varios casos era obrigado acertar o estoque na mão por um supervisor e claro descobrirem porque tal “sumiço”. Outra coisa que eles tinham produção propria, então alguns produtos entrava no estoque mas não existia venda, apenas era feito transferencia para outros setores da empresa (depósito transfere 500 Kg de farinha para padaria, 300 ovos para confeitaria), logo não existia venda, mesmo assim era necessário controlar o estoque para não parar a produção interna.

Você ja fez o analise do cliente? Existe cliente? É um produto para qualquer segmento, ou é um software personalizado?

Bom desculpe tantas perguntas… !!! Mas apenas para conhecer um pouco mais seu negocio.

Att

Esse sistema não é para um cliente em específico, é um sistema generico e por isso estou tentando cobrir diferentes maneiras de como o cliente pode trabalhar(regras de negócio)…

Legal fredcrs, seria interessante você fazer o levantamento de requisitos, se possivel em alguma empresa… caso não consiga… tentar pensar em todas possibilidades, criar os requisitos… e caso queira… apresente aqui no forum e podemos discutir…

Infelizmente tecnicamente!! Eu só consigo de ajudar dizendo que por trigger acredito não acho uma boa solução… !!! Mais detalhes so com o problema todo mapeado.

Att

Astork, seus posts estão sendo de grande ajuda.

Sobre a implementação vejo que trigger pode não ser mesmo a melhor solução…
Mas não consigo enxergar algo mais facil…

Posso sim implementar um ajuste de estoque para pessoas autorizadas, é uma boa ideia mesmo…
O sistema não engloba empresas que produzem, apenas compra e venda. Então será algo a menos para se preocupar.

Estou preenchendo um documento com os requisitos, antes de fazer o diagrama de classes…
Quando terminar posto algo e conversamos, obrigado pela ajuda

Eu iria por este caminho a principio.

Tratar a lógica de negócio no seu modelo, e utilizar apenas o banco apenas para guardar dados… Com uma tabela de estoque (não esqueça da coluna FILIAL, ou algo do genero, para controlar por filial o estoque).

Utiliza o java (modelo) para tratar de atualizações, e sobre problemas de queda de energia, utiliza transações tornando o processo de baixa de estoque e compra da nota, como uma unica transação.

Att

Eu iria por este caminho a principio.

Tratar a lógica de negócio no seu modelo, e utilizar apenas o banco apenas para guardar dados… Com uma tabela de estoque (não esqueça da coluna FILIAL, ou algo do genero, para controlar por filial o estoque).

Utiliza o java (modelo) para tratar de atualizações, e sobre problemas de queda de energia, utiliza transações tornando o processo de baixa de estoque e compra da nota, como uma unica transação.

Att[/quote]

Entendi, mas nao vejo como utilizar apenas uma tabela para fazer compra e estoque - venda e estoque

Depende do nivel de informação que você quer armazenar… !!!

Você quer fazer um rastreamento pela movimentação de uma mercadoria? algo como

Filial A -->> Transfere 100un Produto A -->> Filial B
Filial A -->> Vende 2un Produto A
Filial A -->> Vende 5un Produto B
Filial A -->> Recebe 100un Compra N.F. 112233

Se for assim, de fato vc não vai conseguir com apenas uma tabela… !!! agora em casos mais básicos, apenas o numero atual do produto já resolve.

Lembrando que Compra e venda de produto, faz movimentação do estoque, mas eles não são o módulo de estoque.
O que faz parte do estoque é, atualização de estoque (acerto), transferencia de estoque, etc… Saida para loja.

No final tudo movimenta a mesma regra de negócio, mas são coisas distintas.