Sistema de orçamentos de reserva

Minha família tem uma pequena pousada na Praia da Pinheira, e em Julho de 2023, meu pai, que administra os negócios, me pediu pra desenvolver um sistema que facilitasse na confecção de orçamentos para facilitar o seu trabalho, pois, até o momento, ele utilizava planilhas do Excel para fazer e enviar orçamentos para os clientes.

Com base na sua necessidade, desenvolvi um sistema para gerenciar os orçamentos. O controle vai desde a confecção do orçamento, a geração do contrato dos orçamentos aprovados, o controle dos pagamentos e despesas extras de cada reserva, e também o controle dos checkins, checkouts, e cronogramas de limpezas das acomodações.

Alguns requisitos do sistema

Além da nossa pousada, meu pai também administra a locação de outros dois imóveis de parceiros, portanto, um dos requisitos seria separar as acomodações em cada empreendimento que ela pertence, ou seja, o empreendimento da nossa pousada (Residencial Sol de Verão), outro empreendimento de que ele tem junto como parceiro (Moradas Pé na Areia), e o outro empreendimento que ele administra as reservas, que pertence a um amigo (Casas/Aptos do Léo). E também, ter a opção, caso, futuramente ele tenha novos empreendimentos. Portanto, primeiramente, pensei em fazer uma tabela de empreendimentos, onde, inicialmente tem esses três empreendimentos cadastrados, mas, fica aberta a possibilidade de cadastrar novos empreendimentos.

Abaixo, a lista das tabelas que utilizei para construção do sistema.

Cadastro das acomodações

Um cadastro básico das acomodações, informando a qual empreendimento elas pertencem, nome da acomodação, tipo de acomodação, número de quartos, valor base, limite ideal de ocupantes, limite adicional de ocupantes, se aceita pet, e uma descrição livre da acomodação.

Tela de cadastro de acomodações

Orçamentos de reserva

Esta é a principal entrada de dados do sistema, pois é através do orçamento, que futuramente, será gerado o contrato, caso o cliente aprove o orçamento.

O orçamento é feito em duas etapas, primeiramente, é informado o cliente, a acomodação, o número de ocupantes, uma observação opcional sobre os ocupantes, se será diária cheia, ou apenas pernoite, a data de entrada, o horário previsto para o checkin, a data de saída, o horário previsto para o checkout, e o período.

Na segunda etapa, é informado o valor da diária, o valor da taxa de limpeza, valor de descontos, valor de acréscimos, valor do pacote, e número de dias do pacote, então, é clicado em “Calcular” e o sistema faz o cálculo do orçamento.

Após isso, basta inserir as observações, e gerar o orçamento.

Tela onde o usuário vai selecionar o cliente para fazer um orçamento
Tela onde o usuário irá colocar as informações sobre a acomodação e as datas do orçamento
Tela onde ocorre o cálculo do orçamento, e é inserida as observações

PDF do orçamento

Após gerar o orçamento, já é possível gerar um PDF para envio ao cliente.

Para gerar esse PDF, utilizei a biblioteca do Reportlab.

Após enviado o PDF para o cliente,  basta aguardar a sua aprovação por parte do cliente (caso necessite alguma alteração, é possível também alterar o orçamento, mas será necessário informar o motivo da modificação. Neste caso, após a alteração, se houver, o orçamento ficará com uma flag indicando que ele foi modificado).

Tela onde o usuário vai gerar o PDF do orçamento, e enviar para o cliente
PDF do orçamento

Contrato simplificado

Após aprovado o orçamento pelo cliente, já é possível gerar um contrato, que basicamente, será gerado automaticamente usando os dados do orçamento que foi aprovado.

Para geração do contrato, será apenas solicitado que se inclua algumas observações e informações adicionais.

Tela onde o usuário vai gerar o contrato para posteriormente, enviar o PDF do contrato para o cliente
Tela onde o usuário deve informar basicamente a conta para o depósito, e algumas observações adicionais do contrato

PDF do contrato

Após gerar o contrato, já é possível gerar um PDF para envio ao cliente.

Após enviado o PDF para o cliente,  o orçamento mudará seu status para “contrato gerado”, e já será possível o lançamento de pagamentos e despesas extras.

Tela onde o usuário poderá selecionar o contrato que deseja gerar PDF para envio ao cliente
PDF do contrato

Lançamento de pagamentos e despesas extras

Após gerar o contrato,  já é possível lançar pagamentos e despesas extras para esse orçamento (normalmente, por padrão, já é pedido um pagamento para confirmação da reserva, mas tudo isso é combinado, e está descrito no contrato). Assim que o cliente faz o primeiro depósito para confirmar a reserva, o mesmo deve ser informado nessa seção, pois após lançar o primeiro pagamento, o orçamento recebe uma flag informando que o orçamento foi confirmado.

Além de informar a confirmação da reserva, também é possível informar todos os pagamentos recebidos, pois várias vezes, o pagamento é recebido em diversas parcelas, dependendo da negociação que é feita.

Em certos casos, existe a possibilidade de haver cobranças extras por algum serviço ou pessoa adicional que eventualmente não estava previsto no contrato, neste caso, utilizamos a função de informar acréscimo, pois essa função irá gerar um acréscimo para o orçamento, dando a possibilidade de incluir novos valores não previstos no momento do fechamento do contrato, de acordo com a necessidade.

Tela onde o usuário deve informar o pagamento de confirmação da reserva
Tela onde é informado o depósito de confirmação da reserva
Tela onde é possível, tanto selecionar a função de informar pagamentos, como também, informar despesas extras.
Tela onde será informado as despesas extras

Relatório financeiro da reserva

Nesta opção, é possível visualizar um PDF com todas as informações financeiras da reserva, tais como o valor da reserva acertado no contrato, os valores já pagos, os valores de extras lançados, e o saldo que ainda resta pagar.

Tela onde o usuário pode visualizar o relatório financeiro da reserva
PDF do relatório financeiro da reserva

Controle de checkins e checkouts

Nessa opção, criei três tipos de relatórios, são eles:

Relatório de checkins

Lista todas as reservas com entrada prevista em um intervalo de datas.

Esse relatório é útil para saber as acomodações que precisam ser preparadas e revisadas antes da entrada do hóspede.

Tela onde o usuário informa o intervalo de datas que deseja pesquisar
PDF da programação de checkins
Relatório de checkouts

Lista todas as reservas com saída prevista em um intervalo de datas.

Esse relatório é útil para saber as acomodações que estão desocupando e precisam ser limpas.

Tela onde o usuário informa o intervalo de datas que deseja pesquisar
PDF da programação de checkouts
Relatório de checkins/checkouts

Basicamente uma união dos dois relatórios acima, podendo ver as reservas com entrada e saída programadas para aquele intervalo de datas escolhido.

Tela onde o usuário informa o intervalo de datas que deseja pesquisar
PDF da programação de checkins e checkouts

Projeto de controle de despesas

Este foi o projeto final do Jovem Programador Senac módulo 3.

Este projeto foi feito em grupo, fiz com meus colegas Marcelo Henrique Gaspar Gonçalves e Kauan Trindade Gonçalves.

O projeto conta com os seguintes recursos:

Por se tratar do projeto final do Jovem Programador, tivemos que apresenta-lo durante a reunião e cerimônia de encerramento do curso da unidade do Senac de Palhoça.

Nessa cerimônia estava presente os coordenadores do Senac de Palhoça, a turma de análise e desenvolvimento de sistemas da faculdade do Senac, com seus professores, e também os nossos professores do Jovem Programador, isso ocorreu no auditório do Senac de Palhoça.

Para ficar mais fácil de explicar e contextualizar esse projeto, vou deixar abaixo os slides que fiz para apresentar o projeto a banca do Senac na conclusão do curso.

Como dito nos slides acima, a ideia foi criar grupos de despesa, e dentro desses grupos, criar os tipos de despesa, porém percebemos que daria muito trabalho para o usuário cadastrar seus grupos e tipos de despesa, para só depois cadastrar as despesas, então resolvemos criar alguns grupos e tipos de despesa previamente cadastrados que estarão disponíveis para todos os usuários (grupos como Saúde e tipos como plano de saúde e exames são alguns exemplos de opções previamente cadastradas que estão disponíveis para todos os usuários).

Percebemos também que apenas estas opções padronizadas podem não atender plenamente a necessidade de cada usuário, então deixamos disponível a opção do usuário cadastrar seus próprios grupos e tipos de despesa personalizados, mas, um usuário não consegue ver os grupos e tipos criados por outro usuário, apenas os padrão e os seus personalizados, assim como ele não consegue ativar ou desativar os grupos padrão, apenas os seus personalizados.

Para o lançamento da despesa é bem simples, basta informar a data da despesa, o tipo (não é necessário informar o grupo, pois ele já está sendo referenciado no tipo), a forma de pagamento, o valor e opcionalmente uma descrição (essa descrição será importante em consultas, ou relatórios futuros, pois lembra o usuário do que foi exatamente aquele gasto, mas essa informação é opcional)

Exemplo da tela de lançamento de despesas

Apesar de um lançamento de despesa ser bastante simples, e com relativamente poucos dados, conseguimos com vários registros de  apenas esses poucos dados agrupados, ver diversas opções de relatórios e gráficos, como por exemplo:

Dentro desses relatórios, em alguns casos, além dos dados do relatório, ainda será fornecido gráficos.

Além de todos esses relatórios, também, a medida que são incluídos novos registros o sistema automaticamente de forma interativa vai atualizando o Dashboard da página inicial.

Os dados do Dashboard da página inicial são os seguintes:

No Dashboard do mês corrente, mostra apenas as despesas do mês corrente agrupadas e totalizadas por grupo, aparece o total acumulado geral com o número de registros, o total acumulado por grupo com o número de registros, além de um gráfico, e a opção de clicar no ícone do olho para verificar cada um dos registros do grupo. Existe também a opção de ver o Dashboard de meses anteriores através de um select no início do Dashboard do mês atual.

Logo abaixo do Dashboard do mês corrente, é possível ver o Dashboard do ano corrente, nesta opção é possível ver o acumulado do ano corrente com o número de registros, e o acumulado mês a mês com o número de registros, além do gráfico do ano corrente. Neste também temos a opção do select para selecionar anos anteriores.

Por último temos o Dashboard de todo o período, onde é possível ver o acumulado de todo o período com o número de registros e o acumulado ano a ano com o número de registros, além do gráfico.

Para conseguir todos esses relatórios e gráficos foi necessário organizar e fazer várias consultas SQL no banco de dados, o que é uma das coisas que eu gosto muito de explorar.

Este projeto também fiz deploy em uma VPS, então também está disponível para quem quiser utilizar, basta se cadastrar e alimentar o sistema com os registros de despesas para poder ver os relatórios e os Dashboards funcionando. Caso alguém tenha interesse em ver ele já com dados, pode entrar em contato comigo e solicitar, que tenho um usuário de testes com vários registros, para que você faça testes sem a necessidade de digitar diversos registros para ver os resultados.

O sistema possui também um tutorial detalhado do seu uso, onde é possível acessar até mesmo sem estar cadastrado e logado.

O tempo que tivemos para desenvolver esse sistema de conclusão do curso foi relativamente curto, menos de três semanas, e o tema era livre.

Sei que um sistema de controle de despesas é um sistema bastante clichê para programadores iniciantes, por isso tentei explorar ao máximo todas as possibilidades de transformar um sistema relativamente simples como esse, em algo mais incrementado e com muitas opções de relatórios e gráficos para valorizar e tornar  possível de ser apresentado como um trabalho de encerramento de curso.

Imagem do telão na apresentação do projeto no Senac Palhoça/SC

 Como eu havia feito o deploy deste projeto em minha VPS, consegui além dos Slides apresentar uma demonstração pratica do projeto diretamente no telão para todos os convidados e meu grupo foi bastante aplaudido e todos elogiaram muito nosso sistema.

Vou deixar os links para o deploy do sistema em minha VPS e também o link para o projeto no meu Github.

API CEP e IBGE

Após o primeiro projeto de consumo de API que foi o das informações de filmes, o professor Wildson do Jovem Programador módulo 3 nos lançou um desafio de construirmos um novo projeto, onde ficaríamos livres para escolher a API que quiséssemos e deveríamos apresentar esse projeto para a classe.

O desafio consistia em pelo menos uma API, porém eu inicialmente optei por fazer um projeto utilizando uma API do IBGE, a API que eu escolhi para meu projeto foi a API de nomes, mas no decorrer do projeto, também achei muito legal e útil a API de CEPs do viacep, portanto resolvi fazer o meu projeto utilizando essas duas APIs.

Na tela inicial haverá dois ícones para o usuário escolher qual API quer ver.

API de nomes do IBGE

Essa é uma API muito legal que encontrei no site do IBGE,  ela traz diversas informações estatísticas sobre os nomes baseado nos censos do IBGE.

No momento essa API possui informações estatísticas até a década de 2010, sobre os nomes das pessoas.

Meu projeto nesta API constitui do seguinte:

Exemplo da tela do APP de nomes do IBGE

Ainda neste APP, tem um link para uma página de curiosidades sobre esta API, que basicamente traz algumas perguntas e respostas mais comuns sobre a API, e também um botão de Home para voltar a tela inicial.

API de CEPs

Sempre tive curiosidade de trabalhar com essa API, pois sempre achei que ela pode ser muito útil na prática para fazer cadastros, essa é a API de CEPs do viacep.

Exemplo da tela do APP de CEPs

O APP que desenvolvi basicamente consiste em:

Exemplo do retorno da consulta informando o CEP 88139427
Exemplo de retorno informando o estado SC, cidade "pal" e rua "patrício"

Podemos ver que nessa opção de consultas existe um botão de mais detalhes, e ao clicar nesse botão, o sistema vai retornar os detalhes do registro selecionado, que será basicamente os dados que aparecem na primeira consulta, onde informamos o CEP.

Conclusão

Fiquei muito satisfeito com o resultado do meu projeto, pois atingiu o objetivo proposto pelo desafio, e exercitei a lógica para o consumo de APIs.

Gostei tanto do resultado desse projeto, que resolvi fazer o deploy em minha VPS.

Vou deixar abaixo o link para este projeto no Github e também o link para o deploy em minha VPS.

Projeto Info Filmes

Uma das coisas que aprendi no módulo 3 do curso Jovem Programador Senac foi consumir dados de uma API através de requisições, baseado no que aprendemos, recebemos a missão de desenvolver um site de informações de filmes utilizando dados da API https://www.omdbapi.com/ 

Esta API possui um banco de dados com informações de vários filmes e séries, então tivemos que desenvolver um projeto com os seguintes requisitos:

Como eu desenvolvi meu projeto

Para fazer o Front End utilizei o Bootstrap, aproveitando suas facilidades e a responsividade.

Na página inicial coloquei um carrossel com algumas imagens de capas de filmes.

Ao clicar em “Fazer login” o usuário será redirecionado para a tela de login, onde ele pode se logar, ou se cadastrar caso não tenha cadastro.

Após logado, o usuário tem uma barra de pesquisa onde ele pode digitar um termo, e o sistema vai fazer a consulta na API de filmes e retornar os dados de filmes e séries que correspondem ao termo digitado.

Por exemplo: Ao digitar Star Wars, o sistema retornará uma lista com todos os títulos relacionados a Star Wars.

Exemplo da lista de filmes relacionados a Star Wars

Na lista vai aparecer a capa do título (caso a API retorne a imagem de capa), ou “sem imagem” caso a API não disponha da imagem de capa.

Vai aparecer também o título, o tipo (série, filme, etc, dependendo do que está na API) e o ano.

Além dessas informações, coloquei um botão de mais informações, que ao clicar, o sistema irá buscar na API detalhes sobre o título solicitado.

Coloquei também uma estrela para identificar se o usuário classificou aquele título como um de seus favoritos (apesar de não ser um critério solicitado no desafio do projeto). Se a estrela aparecer amarela é porque esse filme já foi marcado como favorito por esse usuário, se aparecer azul é porque ainda não foi marcado como favorito.

Exemplo da tela de informações para um filme não marcado como favorito
Exemplo da tela de informações para um filme marcado como favorito

Nesta tela de detalhes vão aparecer todas as informações do título que o sistema encontrar na API.

Algumas das informações disponíveis são:

OBS: Todas as informações serão em Inglês, pois é o idioma que a API retorna, dependendo do título podem vir mais, ou menos informações do que as citadas acima, pois o sistema trará todas as informações disponibilizadas pela API.

Se o usuário não tiver favoritado o título ainda, vai aparecer um botão logo abaixo da imagem de capa, permitindo que ele favorite o título, caso o título já esteja favoritado pelo usuário, vai aparecer um botão permitindo desfavoritar o título.

Ao clicar sobre o nome do usuário, vai ter a opção de verificar todos os seus favoritos, ou sair do sistema.

Exemplo da tela de filmes favoritos do usuário

Conclusões finais do projeto

Este projeto serviu para conhecer como funciona o consumo de uma API, e foi muito importante, pois sabemos que na prática isso é muito utilizado.

Foi minha primeira experiência com consumo de API.

Neste projeto utilizei basicamente os seguintes recursos:

OBS: O banco de dados foi utilizado apenas para os recursos necessários do Django e também para o sistema de favoritar os títulos para os usuários, mas as demais informações dos títulos vêm diretamente da API.

Projeto E-commerce

Esse projeto foi um desafio proposto pelo curso Jovem Programador Senac módulo 3, que consiste em explorar um pouco do que aprendemos durante o curso englobando as principais stacks estudadas no curso.

Este trabalho era individual e o tema proposto pelo desafio era um E-commerce de uma loja de livros, para isso deveríamos usar o framework Django para desenvolver este projeto.

Basicamente este projeto deveria ter ao menos o seguinte:

Esses acima eram os requisitos mínimos do projeto.

Como pensei e desenvolvi esse projeto

Para fazer o Front End, eu utilizei o Bootstrap para aproveitar suas funcionalidades e também a responsividade.

Quanto ao conteúdo do site, fiz um cadastro básico de livros que é feito utilizando a interface administrativa do próprio Django. Criei também um cadastro de categorias para dividir os livros por categoria, pensando em facilitar as consultas.

Os principais campos de cadastro do livro são: 

Na barra de navegação coloquei o campo de pesquisa, onde é possível pesquisar por um termo e o sistema retorna se aquele termo está presente no título, autor, ou categoria.

Nesta barra de navegação também tem um pequeno menu com as categorias, onde, ao clicar em uma delas o sistema retornará todos os livros daquela categoria em uma lista.

Quando o usuário estiver autenticado, vai ter também um menu com algumas funções que o usuário pode fazer, sendo elas:

Além disso, nessa mesma barra de navegação terá também o ícone para o carrinho de compras, e a indicação de quantos itens estão no carrinho, e também a opção para fazer logout.

Barra de navegação sem o usuário logado
Barra de navegação com o usuário logado

Na página inicial coloquei um carrossel que mostra os cinco livros com a melhor média de classificação, e logo abaixo uma galeria com as  novidades, que são os oito últimos livros adicionados ao sistema.

Exemplo da tela inicial

Acessando o botão “mais títulos” no final da página inicial, vai abrir uma lista com todos os títulos cadastrados em ordem alfabética pelo título, com uma paginação apresentando 5 livros por página.

Exemplo da lista de produtos

Esse exemplo de tela também é a que aparece para as categorias, ou então para as consultas feitas pela barra de pesquisa.

Nessa lista aparecem as informações do livro como:

Selecionando algum item da lista, vai aparecer os dados detalhados desse item, como por exemplo, sua sinopse, sua média de avaliação, seu preço, se o produto está em estoque e também as opções de adicionar ao carrinho, deixar uma avaliação, ou ver todas as avaliações.

As avaliações podem ser anônimas caso a pessoa não queira se identificar, ou não esteja autenticada no sistema.

Se o produto não estiver em estoque não vai aparecer a opção de adicionar ao carrinho, ao invés disso vai aparecer a opção “Avise me quando estiver disponível”.

Exemplo da tela de informações do produto

Se o usuário não estiver devidamente autenticado e clicar em “Adicionar ao carrinho”, será direcionado a tela de login para fazer autenticação, e logo após, poderá retornar e adicionar o item ao seu carrinho, caso ele já esteja autenticado, poderá diretamente adicionar o item ao seu carrinho.

Carrinho de compras

Ao entrar na tela do carrinho, o usuário verá todos os itens adicionados em seu carrinho, tendo a possibilidade de adicionar, ou remover unidades daquele item, e também as opções de finalizar pedido ou adicionar mais produtos.

Ainda nesta tela, tem a opção de calcular o frete (como é apenas um trabalho didático, considerei como regra de negócio que o frete de cada livro custa R$ 4,99 e se comprar acima de 10 unidades, o frete é grátis).

Caso o usuário tente finalizar o pedido sem calcular o frete o sistema não vai permitir, solicitando que calcule o frete para prosseguir.

Exemplo da tela de carrinho de compras

Após calcular o frete já é possível finalizar o pedido, com isso, o usuário será direcionado para a tela de finalização do pedido.

Ao finalizar o pedido, caso o usuário não tenha nenhum endereço de entrega cadastrado, ele será redirecionado a tela de cadastro de endereço, e se já tiver algum endereço cadastrado, será direcionado para a tela de conclusão do pedido.

Caso ele queira adicionar um novo endereço de entrega, também haverá a opção nessa tela para cadastrar um novo endereço.

Exemplo da tela de seleção de endereço e forma de pagamento

Após isso, o usuário deverá selecionar o endereço de entrega que prefere, e também a forma de pagamento, e então será possível prosseguir para a última parte que é a finalização do pedido.

Nesta parte basta o usuário conferir se está tudo de acordo, caso não esteja ele pode retornar e fazer as correções necessárias, e se estiver tudo de acordo, basta confirmar a compra.

Exemplo da tela de confirmação da compra

Após isso, o sistema já vai dar baixa no estoque dos livros, e o usuário já poderá acessar no seu painel os dados de seus pedidos.

Conclusão final do projeto

Vale lembrar que como se trata de um projeto didático, foram abstraídas diversas funcionalidades que sei que um E-commerce de verdade deve ter.

O desafio era apenas a lógica básica de um E-commerce, com o carrinho de compras, os pedidos e o controle de estoque.

Foi um projeto bastante desafiador para um programador de nível inicial como eu, mas que serviu para colocar em prática e exercitar bastante a lógica de um E-commerce.

Neste projeto foi exercitado bastante a parte dos models e das views do Django, inclusive, como fiz deploy deste projeto em minha VPS, tive que utilizar o Cloudinary para hospedar as imagens das capas dos livros.

Vou postar abaixo um link para o deploy em minha VPS e também um link para o projeto no meu Github.

Projeto estoque

Durante o módulo 3 do curso Jovem Programador Senac, aprendemos sobre desenvolvimento Web, e um dos desafios durante o curso foi o desenvolvimento de um sistema de controle de estoque, que tivesse os seguintes requisitos:

Além desses requisitos, a regra que o professor exigiu nesse desafio, era que cada usuário fosse independente, ou seja, cada usuário iria cadastrar os seus produtos e fazer as suas movimentações, os registros de todos os usuários ficariam no mesmo banco de dados, porém, cada usuário só teria acesso aos seus registros.

Esses acima eram os requisitos que o desafio exigia, e também, foi sugerido de utilizarmos o máximo de conhecimentos que tínhamos até aquele momento do curso, como por exemplo, no cadastro de produtos tivesse a opção de colocar uma imagem para o produto.

Além disso, também era necessário que fosse possível fazer o CRUD, e que também tivesse um dashboard do produto, mostrando as suas posições de estoque, e algumas informações a respeito da movimentação do estoque.

Com isso, pensei em um sistema que de uma forma simples, simulasse um sistema de vendas, com entradas e saídas para poder controlar o estoque.

Além disso, criei categorias para classificar os produtos e unidades de medida para controlar as entradas e saídas do estoque.

Outra coisa que criei para ser um diferencial no dashboard do produto no meu sistema, foi o cálculo de preço médio de compra e preço médio de venda.

Mas para isso, tive que imaginar duas situações, a primeira é a situação de operação comercial que é a compra e a venda do produto, que são operações que devem ser levadas em conta para calcular um preço médio de compra e um preço médio de venda, assim como entrada e saída do estoque.

A segunda situação é a operação que é apenas contábil, que seria as devoluções para fornecedor, e também devoluções de clientes, que são operações que devem ser levadas em conta para a movimentação do estoque, porém não devem ser levadas em conta para calcular o preço médio de compra e venda.

Para resolver esse problema, criei um cadastro de tipos de movimentação, onde podem ser criados os tipos de movimentação necessários de acordo com a regra de negócio, como por exemplo, uma operação de venda a consumidor final, essa operação seria uma operação de saída e uma operação comercial. Já a compra de um item pra estoque seria uma operação de entrada e também uma operação comercial. Por outro lado, a devolução de um item que um cliente comprou e devolveu seria uma operação de entrada, mas que seria apenas contábil, da mesma forma que um produto que fosse devolvido para o fornecedor seria uma operação de saída, e somente contábil.

Exemplo da tela de cadastro de tipos de movimentação

O cadastro de produtos, fiz bem simples, ele tem apenas os seguintes campos:

Exemplo da tela de cadastro de produtos

Na barra de pesquisa na página inicial, é possível pesquisar por um termo e o sistema retornará se encontrar esse termo, no nome do produto ou na sua descrição.

Na tela inicial também vamos ter um atalho para o cadastro de produtos, e para os cadastros auxiliares (cadastro de categorias, cadastro de medidas e cadastro de tipos de movimentação)

Nesta mesma tela, também temos um botão para mais consultas, nessa opção é possível efetuar a consulta por categoria, e também verificar os itens com pouco estoque (inicialmente ele trará os itens cujo estoque estiver zerado, mas tem um campo onde pode ser informado abaixo de quantas unidades você quer que liste, exemplo: ver todos os itens com menos de 10 unidades em estoque).

Exemplo da tela inicial com a barra de pesquisa
Exemplo da tela de consulta de itens com pouco estoque

Assim como a opção de consultar itens com pouco estoque, há também a opção de consultar itens com muito estoque, para isso é só entrar na opção consultar itens com muito estoque, e informar a quantidade acima de qual você considera que é muito estoque (por padrão ele começará mostrando os itens com mais de 10 unidades, mas você pode informar outra quantidade se preferir)

Na página inicial, vai aparecer todos os itens cadastrados (são 5 itens por página, sendo que aparece sempre os últimos cadastrados) clicando no nome do produto, ou no Id, vai abrir a página de informações do produto, por essa página é possível ver todos os detalhes do produto e também lançar movimentações de entrada e saída.

Clicando no ícone da lupa, vai abrir a tela de movimentação desse produto, nessa tela, vai aparecer os dados do produto, como por exemplo, a quantidade em estoque, preço da última compra, preço de venda, data da última compra e data da última venda. E também a sua movimentação com opção de eliminar o registro de movimentação.

Nessa tela também vai ter a opção de lançar entradas ou saídas do produto.

Exemplo da tela de relatório do produto

Na tela de relatório do produto, existe o botão de acesso ao dashboard do produto, nesse dashboard será possível ver com mais detalhes diversas informações relevantes sobre esse produto, como por exemplo:

Nesse sistema também, aproveitei para exercitar e fazer diversas validações, como por exemplo: caso não tenha estoque suficiente, não permitir a venda, caso o produto tenha em estoque, não permitir desativação, caso não tenha sido realizada nenhuma movimentação o sistema não permite acessar o dashboard financeiro do produto, ao fazer movimentações, se a movimentação for entrada aparece apenas as opções que são do tipo entrada, da mesma forma, ao fazer saída só aparecem as movimentações do tipo saída.

Movimentações do tipo entrada somente contábil vão dar entrada no estoque, mas não vão influenciar no preço médio, assim como saídas do tipo somente contábil vão dar saídas no estoque mas não vão influenciar no preço médio.

Finalmente, após o projeto ser concluído, fiz o deploy dele em minha VPS.