Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"permissions": {
"allow": [
"Bash(find:*)"
],
"deny": []
}
}
2 changes: 1 addition & 1 deletion .github/workflows/pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:

strategy:
matrix:
node-version: [20.x]
node-version: [22.17.1]

steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v22.17.1
22 changes: 22 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"eslint.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"eslint.workingDirectories": [
{
"mode": "auto"
}
],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": false,
"eslint.options": {
"overrideConfigFile": ".eslintrc.cjs"
},
"eslint.nodePath": "./node_modules"
}
19 changes: 19 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Claude instructions

## Vendomatic API

Things to consider:

* Everytime you generate code or suggest code explain the reasons of the changes

* Use your best judgement and don't be afraid to ask questions.

* Please use the latest documentation and best practices for anything.

* Please use the latest version of the codebase and best practices for anything.

* Always consider the project specification described in PROJECT_SPECIFICATION.md

* Define properties and functions inside object always sorted alphabetically.

* All source code should be written in TypeScript and use absolute imports.
229 changes: 229 additions & 0 deletions PROJECT_SPECIFICATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
# 🏪 Vendomatic - Sistema de Gestão de Máquinas de Venda Automática

## 📋 Visão Geral do Projeto

O **Vendomatic** é um sistema de dashboard/backoffice para gestão e monitorização de máquinas de venda automática de uma empresa. O sistema permite o controle completo das operações, desde a gestão de máquinas e produtos até ao acompanhamento de reabastecimentos e manutenção.

## 🎯 Objetivos Principais

### Gestão de Máquinas

- Adicionar, remover e alterar localização das máquinas
- Monitorizar o estado operacional de cada máquina
- Registar informações de localização e configuração

### Gestão de Produtos

- Gerir produtos em cada máquina individualmente
- Definir preços variáveis por localização
- Controlar stock e disponibilidade

### Controlo de Reabastecimentos

- Registar reabastecimentos com detalhes completos
- Rastrear quantidades adicionadas e dinheiro recolhido
- Documentar produtos descartados (desperdício)
- Associar funcionário responsável a cada operação

### Manutenção e Monitorização

- Registar atividades de manutenção
- Acompanhar histórico de intervenções
- Análise estatística (implementação futura)

---

## 👥 User Stories

### 🏢 Gestão de Máquinas

**US001 - Adicionar Nova Máquina**

> Como administrador, quero adicionar uma nova máquina ao sistema para poder começar a monitorizá-la.
>

**Critérios de Aceitação:**

- Posso inserir localização, código identificador e configurações iniciais
- O sistema valida se o código da máquina é único
- A máquina fica imediatamente disponível para gestão de produtos

**US002 - Alterar Localização de Máquina**

> Como administrador, quero alterar a localização de uma máquina existente para manter os dados atualizados.
>

**Critérios de Aceitação:**

- Posso selecionar uma máquina existente
- Posso alterar a localização mantendo o histórico
- Os preços dos produtos são atualizados conforme a nova localização

**US003 - Remover Máquina**

> Como administrador, quero remover uma máquina do sistema quando ela é desativada.
>

**Critérios de Aceitação:**

- Posso marcar uma máquina como inativa
- O histórico de operações é mantido
- A máquina não aparece nas operações ativas

### 🛍️ Gestão de Produtos

**US004 - Adicionar Produto à Máquina**

> Como administrador, quero adicionar um produto a uma máquina específica para disponibilizá-lo aos clientes.
>

**Critérios de Aceitação:**

- Posso selecionar produto do catálogo ou criar novo
- Posso definir preço específico para a localização
- Posso definir quantidade inicial e capacidade máxima

**US005 - Atualizar Preço de Produto**

> Como administrador, quero atualizar o preço de um produto numa máquina específica.
>

**Critérios de Aceitação:**

- Posso alterar preço mantendo histórico de alterações
- A alteração é específica para a máquina/localização
- Sistema regista data e utilizador da alteração

**US006 - Remover Produto da Máquina**

> Como administrador, quero remover um produto de uma máquina quando não está mais disponível.
>

**Critérios de Aceitação:**

- Posso remover produto mantendo histórico
- Sistema alerta se há stock existente
- Remoção não afeta outras máquinas

### 📦 Gestão de Reabastecimentos

**US007 - Registar Reabastecimento**

> Como funcionário, quero registar um reabastecimento para manter o controlo de stock e dinheiro.
>

**Critérios de Aceitação:**

- Posso selecionar máquina e produtos reabastecidos
- Posso inserir quantidades adicionadas por produto
- Posso registar valor monetário recolhido
- Sistema regista automaticamente minha identificação

**US008 - Registar Desperdício**

> Como funcionário, quero registar produtos descartados durante o reabastecimento.
>

**Critérios de Aceitação:**

- Posso selecionar produtos descartados e quantidades
- Sistema calcula valor monetário do desperdício
- Posso adicionar motivo do descarte
- Informação fica associada ao reabastecimento

**US009 - Consultar Histórico de Reabastecimentos**

> Como administrador, quero consultar o histórico de reabastecimentos para análise operacional.
>

**Critérios de Aceitação:**

- Posso filtrar por máquina, funcionário ou período
- Posso ver detalhes de cada reabastecimento
- Posso exportar relatórios

### 🔧 Gestão de Manutenção

**US010 - Registar Manutenção**

> Como técnico, quero registar atividades de manutenção realizadas numa máquina.
>

**Critérios de Aceitação:**

- Posso selecionar máquina e tipo de manutenção
- Posso inserir descrição detalhada da intervenção
- Sistema regista data, hora e técnico responsável
- Posso anexar fotos ou documentos

**US011 - Consultar Histórico de Manutenção**

> Como administrador, quero consultar o histórico de manutenção para planeamento preventivo.
>

**Critérios de Aceitação:**

- Posso filtrar por máquina, tipo ou período
- Posso ver frequência de intervenções
- Posso identificar máquinas com mais problemas

### 📊 Relatórios e Análise (Implementação Futura)

**US012 - Visualizar Estatísticas de Vendas**

> Como administrador, quero visualizar estatísticas gráficas de vendas por produto e máquina.
>

**US013 - Análise de Rentabilidade**

> Como gestor, quero analisar a rentabilidade de cada máquina e localização.
>

**US014 - Relatório de Desperdício**

> Como administrador, quero analisar padrões de desperdício para otimizar operações.
>

---

## 🔐 Perfis de Utilizador

### Administrador

- Acesso completo a todas as funcionalidades
- Gestão de utilizadores e permissões
- Acesso a relatórios e análises

### Funcionário/Técnico

- Registar reabastecimentos e manutenção
- Consultar informações das máquinas
- Acesso limitado a relatórios

### Gestor

- Visualizar relatórios e análises
- Monitorizar performance operacional
- Não pode alterar configurações

---

## 🛠️ Funcionalidades Técnicas

### Autenticação e Autorização

- Sistema de login seguro
- Gestão de perfis e permissões
- Auditoria de ações dos utilizadores

### Interface Responsiva

- Dashboard adaptável a diferentes dispositivos
- Navegação intuitiva e eficiente
- Feedback visual para ações do utilizador

### Gestão de Dados

- Base de dados robusta e escalável
- Backup automático de informações
- Exportação de dados em diferentes formatos
4 changes: 4 additions & 0 deletions env/custom.env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ export default () => {
server: {
port: process.env.SERVER_PORT ?? 3000,
},
supabase: {
key: process.env.SUPABASE_KEY,
url: process.env.SUPABASE_URL,
},
};

return merge(customConfig, configuration());
Expand Down
4 changes: 4 additions & 0 deletions env/test.env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@ export default () => ({
graphql: {
debug: true,
},
supabase: {
key: 'test',
url: 'http://localhost:54321',
},
});
6 changes: 6 additions & 0 deletions jest.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,10 @@ module.exports = {
transform: {
'^.+\\.(t|j)s$': 'ts-jest',
},
collectCoverageFrom: [
'src/**/*.(t|j)s',
'!src/**/*.spec.ts',
'!src/**/*.e2e-spec.ts',
],
coverageDirectory: './coverage',
};
28 changes: 9 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@
"author": "",
"private": true,
"license": "UNLICENSED",
"engines": {
"node": ">=22.17.1"
},
"scripts": {
"build": "nest build",
"docker": "docker-compose -f docker-compose.dev.yml up",
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
"format:fix": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"lint:check": "eslint \"{src,apps,libs,test}/**/*.ts\"",
"migration:generate": "yarn typeorm migration:generate",
"migration:generate": "yarn typeorm migration:create",
"migration:revert": "yarn typeorm migration:revert",
"migration:run": "yarn build && yarn typeorm migration:run -d ./dist/src/database/datasource.config.js",
"prepare": "husky",
Expand All @@ -38,6 +41,9 @@
"@nestjs/graphql": "^12.2.0",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/typeorm": "^10.0.2",
"@supabase/supabase-js": "^2.52.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.2",
"graphql": "^16.9.0",
"lodash": "^4.17.21",
"pg": "^8.12.0",
Expand Down Expand Up @@ -68,7 +74,8 @@
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-sort-destructure-keys": "^2.0.0",
"husky": "^9.0.11",
"jest": "^29.5.0",
"jest": "^30.0.5",
"jest-mock-extended": "^4.0.0",
"prettier": "^3.3.3",
"source-map-support": "^0.5.21",
"supertest": "^7.0.0",
Expand All @@ -78,22 +85,5 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.1.3",
"webpack": "^5.93.0"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
Loading