Criar um CRUD com laravel e fazer tudo funcionar é algo muito trivial, pois seguindo as convenções o laravel faz quase tudo sozinho.
Mas efetuar o cadastro no estoque ao mesmo tempo em que cadastra na tabela de compras já não é tão simples. Como também a cada venda abater a quantidade no estoque do referido id, também não.
É algo muito interessante usar o Eloquent ORM e o QueryBuuilder para controlar o fluxo do código do laravel.
É isso que mostro neste protótipo de estoque, especialmente nos controllers Buys e Sales.
Para complementar veja o repo: https://github.com/ribafs2/laravel-projetos
Com vários projetos e um livro.
Descompactar
Acessar a pasta
composer install
Criar o banco e ajustar no .env
php artisan migrate --seed
php artisan serve
Products já vem com dois registros no seeder, banana e manga
Vamos efetuar duas compras de bananas
comprar banana - 100 - 1 - hoje
Ver Estoques Veja que o id das bananas está com quantity 100
comprar banana - 10 - 1 - hoje
Ver Estoques Veja que o id das bananas está com quantity 110 (os 100 que havia mais estes 10 comprados)
Está funcionando redondinho.
Inicialmente lembrei apenas de cadastrar inventories quando efetuava uma compra
Apenas inclui no início
use App\Models\Inventory;
No store()
Como o modelo que eu estava usando de controller vindo do gerador de CRUDs já fazia
Buy::create($requestData);
Apenas adicionei: Inventory::create($requestData);
Beleza, quando adicionava a primeira compra ele também adicionava os mesmos dados no inventories.
Mas e na próxima compra?
Quando adicionava nova compra para um produyo existente no estoque ele criava novo registro do produto. Mas não era isso que eu precisava. Eu precisava de cada vez que adicionasse um registro na compra, verificar o id do produto e caso já estivesse cadastrado, não criasse novo registro, mas somasse ao existente a quantidade do novo registro.
As primeiras tentativas de fazer como fiz no Seller não funcionaram, pois quanto ia cadastrar o Seller/Venda já havia um registro em inventories, vindo da Compra. Mas como eu poderia cadastrar o primeiro registro de inventories quando fosse cadastrar comrpas, se inventories não tinha nenhum registro.
Depois de várias tentativas e de consultar a documentação do Eloquent e do QueryBuilder acabei chegando a esta solução:
- Primeiro, quando efetuar a compra, preciso usar o QueryBuilder paraa testar se inventories não tinha registro, caso não tivesse eu cadastrava o registro atual vindo do form create de Compras.
Com inventories já tendo um registro eu consegui fazer parecido com o que fiz em Sales. Assim cheguei a esta solução. Deu um certo trabalho, mas isso é a falta de prática, pois realmente o Laravel facilita muito as coisas. As duas ferramentas que utilizei foram o Eloquent e o QueryBuilder.
https://laravel.com/docs/11.x/eloquent https://laravel.com/docs/11.x/queries
Depois de boa pesquisa e algumas experiências elaborei os tutoriais que usei aqui abaixo nos itens 3.2 e 3.3
https://github.com/ribafs2/laravel-projetos
https://github.com/ribafs2/laravel-projetos/blob/main/LaravelProjetos.pdf