{"id":14986212,"url":"https://github.com/pedroka-dev/demaria-x-company","last_synced_at":"2026-03-16T22:34:41.849Z","repository":{"id":246573645,"uuid":"819567829","full_name":"pedroka-dev/DeMaria-X-Company","owner":"pedroka-dev","description":"CRUD para registro de Produtos, Clientes e Veda e Visualização de Relatórios utilizando Winforms do C# .NET e ReportViewer. Se conecta com um banco Postgres16 através do Entity Framework e NPGSQL. Parte do processo seletivo para Desenvolvedor Pleno C# da empresa DeMaria","archived":false,"fork":false,"pushed_at":"2024-07-12T21:31:22.000Z","size":398,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-20T07:37:31.032Z","etag":null,"topics":["crud","csharp","dotnet","entityframework","orm","reportviewer","winforms"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedroka-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-24T19:11:38.000Z","updated_at":"2024-07-12T21:31:26.000Z","dependencies_parsed_at":"2024-07-12T23:03:41.411Z","dependency_job_id":"4d8e7e9b-24a5-47b7-b44f-fa71e3fe6161","html_url":"https://github.com/pedroka-dev/DeMaria-X-Company","commit_stats":null,"previous_names":["pedro-ca/demaria-x-company","pedroka-dev/demaria-x-company"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroka-dev%2FDeMaria-X-Company","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroka-dev%2FDeMaria-X-Company/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroka-dev%2FDeMaria-X-Company/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroka-dev%2FDeMaria-X-Company/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedroka-dev","download_url":"https://codeload.github.com/pedroka-dev/DeMaria-X-Company/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243364774,"owners_count":20279211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","csharp","dotnet","entityframework","orm","reportviewer","winforms"],"created_at":"2024-09-24T14:12:32.229Z","updated_at":"2025-12-29T22:09:59.237Z","avatar_url":"https://github.com/pedroka-dev.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DeMaria X Company \nParte do processo seletivo para a vaga de Desenvolvedor Pleno C# da empresa DeMaria. Essa aplicação foi realizada em 5 dias (entre dia 24/06 até 28/06). Meu principal objetivo é demostrar não só minhas habilidades técnicas, mas também habilidades no planejamento, prototipação e organização no contexto do ciclo de desenvolvimento. Foi utilizado PostGres 16 e .NET 8.0 para realização desse projeto.\n\n# Como executar\n* É necessário ter o [Postgres 16](https://www.postgresql.org/about/news/postgresql-16-released-2715/) instalado e sua extensão [postgis-bundle-pg16-3.4.2](https://download.osgeo.org/postgis/windows/pg16/)\n* Para criar as tabelas em banco utilizando migração do Entity Framework, abra o \"Package Manager\" do Visual Studio selecione \"Default Project\" como \"2.Infra\\X-Company.ORM\". O próprio ORM em conjunto com a biblioteca NPGSQL faz gerenciamento do banco de dados.\n  \n  ![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/10c5ac58-efc2-489a-9c7b-b339b1d19d21)\n  * Caso ocorra problemas de banco, se certifique que a connection string \"Host=localhost;Username=postgres;Password=admin;Database=postgres\" presente no XCompanyDBContext aponte para um banco e credenciais verdadeiras\n  * Se o problema persistir, **SOMENTE EM ULTIMO CASO** realize a criação da tabela [utilizando a query SQL diretamente no banco](https://github.com/pedro-ca/DeMaria-X-Company/blob/main/ScriptIfEntityFrameworkCrashes.sql).\n\n\n# Requisitos \nCenário: A empresa X precisa de um sistema para gerenciar seus clientes e produtos. O sistema deve permitir:\n* Cadastrar, editar e remover clientes, com informações como nome, endereço, telefone e email.\n* Cadastrar, editar e remover produtos, com informações como nome, descrição, preço e estoque.\n* Realizar a venda de produtos, registrando o cliente, os produtos e a quantidade de cada item.\n* Gerar relatórios de vendas, clientes e estoque.\n\nRequisitos técnicos:\n* C#\n* Windows Forms\n* PostgreSQL (especificar versão na entrega)\n* NPGSQL\n* Git\n* ReportViewer\n\nTarefas:\n* Criar o banco de dados:\n  * Criar as tabelas para clientes, produtos e vendas no PostgreSQL.\n  * Definir as chaves primárias, estrangeiras e índices.\n  * Criar as queries para inserir, atualizar, remover e consultar dados.\n\n* Desenvolver a aplicação desktop:\n  * Criar a interface gráfica do usuário (GUI) utilizando Windows Forms.\n  * Implementar a funcionalidade de cadastro, edição e remoção para as entidades criadas.\n  * Implementar a funcionalidade de geração de relatórios utilizando o ReportViewer.\n  * Utilizar a biblioteca NPGSQL para acessar o banco de dados.\n\n* Testar a aplicação (Opcional - Será considerado um direrencial o desenvolvimento desta etapa):\n  * Realizar testes unitários para verificar o funcionamento correto de cada módulo da aplicação.\n  * Realizar testes de integração para verificar a interação entre os diferentes módulos.\n  * Documentar os testes realizados e os resultados.\n\n# Planejamento Inicial \nEssa etapa foi realizada no primeiro dia, para analisar os requisitos e escopo da aplicação. O planejamento pode ser dividido em 4 sub etapas:\n* Modelagem de Classe: Utilização de UML para modelar a classes que serão utilizada, para fins de documentação e para ser utilzando como referência na criação do domínio e banco de dados da aplicação\n* Definições de Negócios: Define as regras de negócios levando em consideração os requisitos, simulando as definições de négocio oferecidas por um Product Manager. \n* Definições Visuais: Define a aparência da interface Windows Forms, simulando as definições visuais oferecidas por um Product Managetr.\n* Sprint Planning: Definine o escopo e realiza criação de tarefas no Backlog do quadro Kanbam, simulando um sprint planning da metodologia Scrum.\n  \n### Modelagem de Classe\nPara modelagem de classe, foi utilizado o draw.io para fazer um diagrama de clasess UML. Foi escolhido 0..* para 1 para ambos as relações \"Sale\"\u003c-\u003e\"Client\" quanto \"Sale\"\u003c-\u003e\"Product\", ou seja, uma venda sempre deve obrigatoriamente ter um cliente e um produto. Nesse contexto, o atributo \"quantity\" representa a quantidade de produtos do mesmo tipo que foram vendidos. \n\nTodas as classes vão possuir um método chamado \"Validate()\" que retorna uma mensagem de erro ou sucesso, com o objetivo de verificar o input do usuário antes de enviar para o banco. \n\n![Company X drawio(2)](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/ece0afd6-ba9f-4496-a4ac-0144925bc4a0)\n\nFoi ponderado também a possibilidade de poder haver mais que um tipo de produto em uma venda, em uma relação 1..* para 1..*. Porém essa ideia foi descarta pois aumentaria o escopo da aplicação e poderia fugir dos requisitos previamente estipulados.\n\n### Definições de Negócios\nLevando em consideração os requisitos, podemos abstrair as seguintes regras de negócio implicitas para as 3 classes:\n* Product:\n  * Atributo \"name\" não pode ser vazio\n  * Atributo \"description\" não pode ser vazio\n  * Atributo \"price\" não pode ser um valor menor ou igual a zero\n  * Atributo \"inStock\" não pode ser um valor menor que zero\n  * Objeto não pode ser removido caso houver \"Sale\" atrelada\n* Client:\n  * Atributo \"name\" não pode ser vazio\n  * Atributo \"address\" não pode ser vazio\n  * Atributo \"phone\" deve ser um número de telefone válido\n  * Atributo \"email\" deve ser um email válido\n  * Objeto não pode ser removido caso houver \"Sale\" atrelada\n* Sale:\n  * Atributo \"Client\" não deve ser nulo\n  * Atributo \"Product\" não deve ser nulo\n  * Em relação a quantidade de itens:\n    * Atributo \"quantity\" não pode ser um valor menor ou igual a zero\n    * Não deve permitir a venda caso o atributo \"InStock\" do \"Product\" atrelado seja menor que a quantidade desejada de compra\n    * Ao cadastrar venda, deve subtrair a quantidade de itens vendidos do atributo \"InStock\" do \"Product\" atrelado\n\n### Definições Visuais\nPara as definições, foi utilizado o Figma para criar um protótipo de interface. Esse protótipo apresenta um menu principal com 3 botões, cada um apontando para a tela de cada uma das classes. \n\nCada tela possui um ReportViewer, um botão \"New\", um botão \"Edit\", um botão \"Delete\" e um botão \"Report\". Como estilo do tema, foi utilizado o X (antigo Twitter) como inspiração\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/588e2d0a-4663-4fe4-ba2a-19113d1cbc99)\n\n### Sprint Planning\nFoi criado um quadro Kamban contendo tarefas para as features do projeto. O padrão escolhido para a escrita de todas as stories é:\n* Justificativa (Como X, Desejo Y)\n* Definições visuais\n* Definições Técnicas (se houver)\n* Definições de Negócio (se houver)\n\nNo total foi criado 10 user stories. A divisão foi realizada baseada na similaridade de escopo entre elas. As stories que foram criadas são:\n* [Tela Principal](https://github.com/pedro-ca/DeMaria-X-Company/issues/1)\n* [Visualizar Product](https://github.com/pedro-ca/DeMaria-X-Company/issues/2)\n* [Visualizar Client](https://github.com/pedro-ca/DeMaria-X-Company/issues/3) \n* [Visualizar Sales](https://github.com/pedro-ca/DeMaria-X-Company/issues/4)\n* [Inserir, Editar e Remover Product](https://github.com/pedro-ca/DeMaria-X-Company/issues/5)\n* [Inserir, Editar e Remover Client](https://github.com/pedro-ca/DeMaria-X-Company/issues/6)\n* [Inserir, Editar e Remover Sale](https://github.com/pedro-ca/DeMaria-X-Company/issues/7)\n* [Client Report](https://github.com/pedro-ca/DeMaria-X-Company/issues/9)\n* [Product Report](https://github.com/pedro-ca/DeMaria-X-Company/issues/10)\n* [Sale Report](https://github.com/pedro-ca/DeMaria-X-Company/issues/11)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/43410626-110b-4b31-af12-93c7b5f5d84b)\n\n\n# Desenvolvimento\nAqui está documentado algumas notas, observações e informações importantes sobre o desenvolvimento. \n\n### Conexão com o PortgresSQL utilizando ORM\nPara conexão com o banco de dados PostgresSQL 16, foi utilizado o principio de design chamado Object Relational Mapping (ORM) ao invés de ADO.Net. Através do Entity Framework e do NPGSQL, o design ORM permite integração do PostgresSQL com maior grau de escalabilidade e facilidade de manutenção.\n\nCom isso, foi necessário instalar as biblioteca [Microsoft.EntityFramework.Core](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore) em conjunto sua extensão [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite).\n\nPosteriormente, foi realizado a modelagem da camada de ORM:\n* Implementação de um DBContext, para uma database no host \"localhost\" de nome \"postgres\", com usuário \"postgres\" e senha \"admin:\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/9c11981f-ebc2-4e32-aebe-602288418d76)\n* Implementação de um repositório com operações genéricas:\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/40df4cfb-0ecb-4e94-a0fe-d53919735654)\n* Mapeamento dos atributos de uma classe existente para o Entity Framework\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/9aa57731-af29-4a7a-9ab4-a23146fb4d2a)\n\nCom essas alterações feita, é necessário criar uma nova migration do Entity Framework e atualizar o banco: \n* No \"Package Manager Console\" do Visual Studio com o projeto \"X-Company.ORM\" selecionado, crie uma nova migration com o comando:\n\t`add-migration devmigration`\n* Posteriormente, atualize o esquema da database com o comando: `update-database`\n  * Caso retorne um erro dizendo que falta a extensão postgis, [siga esse guia ](https://postgis.net/documentation/getting_started/).\n* Se houver criação qualquer alteração dos atributos das classes e/ou seu mapeamento ORM, é necessário realizar migração de novo \n\n# Interface\nFoi seguido o protótipo, com algumas pequenas mudanças. Nas telas de visualização, elementos escalam de acordo com o tamanho da janela.\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/0c88809d-d0d5-43d6-b2ad-4e4229114698)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/51749827-97d2-4b3a-adc4-dc57bd8c60e1)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/45ecaae0-bed3-4182-a737-dbbef4620f47)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/5e3b0b40-93ba-49cd-81ed-9c55e85a59ac)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/8c53f0f7-8623-4d4d-bb16-e76c70035cd9)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/24075638-b5c7-493a-ad4d-64065c924fa6)\n\n\n# Validação de Campos\nA validação dos campos foi feita através de um método chamado \"Validate()\" da camada de domínio. O método pode retornar um ou mais erros caso não seja válido, permitindo assim que o usuário veja as correções faltam para poder inserir a entidade.\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/7bfcf602-112c-4a1b-9015-ad88807dceca)\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/219f8653-484f-4b1b-b3bc-6b6db6573aeb)\n\n# Testes Automatizados\nFoi criado um total de 23 testes automatizados, sendo eles 18 testes unitários e 15 testes de integração.\n\nOs testes unitários foram criados para a validação das classes de domínio e para o método Sale.RemoveProductFromStocK()\n\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/db69e874-01b4-4559-8234-4550393315d7)\n\nOs testes de integração foram criados para as operações de BaseRepository\u003cT\u003e para cada classe de domínio. Após a adição de bibliotecas do Reportviewer, porém, eles quebraram e não foi possível de resolver.\n\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/144da9c8-9527-4372-a415-193948792ee9)\n\n\n# ReportViewer \nUm dos maiores desafios desse projeto foi a implementação do ReportViwer. Isso se deve pelo fato que o projeto inteiro foi desenvolvido em .NET 8, equanto o biblioteca oficial do ReportViewer é para .NET Framework 4.0. \n\nPara resolver, foi necessário utilizar uma biblioteca chamada [ReportViewerCore](https://github.com/lkosson/reportviewercore). Houve muitos problemas de depêndencia e mudança de biblioteca para ser compatível com essa funcionalidade, mas no final foi possível fazer Reports funcionarem utilizando um projeto separado chamado X-Company.Reports. \n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/0a784cd6-4e99-4d5f-aae3-2f82ceea3b49)\n\n\n# Débito Técnico\nApesar de o programa estar feature complete, alguns detalhes e correções ficaram de fora da última versão. Com isso, foi criado stories de débito técnico. Foi criado um total de [8 stóries de débito técnico](https://github.com/pedro-ca/DeMaria-X-Company/issues) dessa versão.\n\n![image](https://github.com/pedro-ca/DeMaria-X-Company/assets/50923316/fc1989ed-ba57-49b3-a0c7-f5114b2c1bb7)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedroka-dev%2Fdemaria-x-company","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedroka-dev%2Fdemaria-x-company","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedroka-dev%2Fdemaria-x-company/lists"}