first commit
This commit is contained in:
14
.env.example
Normal file
14
.env.example
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Database
|
||||||
|
DATABASE_URL="postgresql://username:password@localhost:5432/millions"
|
||||||
|
|
||||||
|
# Supabase
|
||||||
|
NEXT_PUBLIC_SUPABASE_URL="https://your-project.supabase.co"
|
||||||
|
NEXT_PUBLIC_SUPABASE_ANON_KEY="your-anon-key"
|
||||||
|
SUPABASE_SERVICE_ROLE_KEY="your-service-role-key"
|
||||||
|
|
||||||
|
# Next.js
|
||||||
|
NEXTAUTH_URL="http://localhost:3000"
|
||||||
|
NEXTAUTH_SECRET="your-secret-key"
|
||||||
|
|
||||||
|
# App Configuration
|
||||||
|
NODE_ENV="development"
|
||||||
BIN
docs/.DS_Store
vendored
Normal file
BIN
docs/.DS_Store
vendored
Normal file
Binary file not shown.
44
docs/00_PROJECT_BRIEF.md
Normal file
44
docs/00_PROJECT_BRIEF.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Project Brief
|
||||||
|
|
||||||
|
## Nome provisório
|
||||||
|
App de Gestão Operacional para Revenda de Roupa
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
Aplicação web para gerir o ciclo operacional de um pequeno negócio de revenda de roupa, desde a encomenda ao fornecedor até ao envio ao cliente final.
|
||||||
|
|
||||||
|
## Objetivo principal
|
||||||
|
Reduzir o tempo e os erros na gestão de encomendas, receção de mercadoria, controlo de stock, preparação de artigos para venda, registo de vendas e gestão de envios.
|
||||||
|
|
||||||
|
## Público-alvo
|
||||||
|
Pequeno negócio de revenda de roupa com operação manual e necessidade de controlo simples, rápido e rastreável.
|
||||||
|
|
||||||
|
## Problemas principais
|
||||||
|
- Dificuldade em controlar o que foi encomendado e o que falta receber
|
||||||
|
- Dificuldade em registar stock após receção
|
||||||
|
- Dificuldade em saber que artigos estão prontos para venda
|
||||||
|
- Dificuldade em controlar vendas e perceber rapidamente para quem enviar
|
||||||
|
|
||||||
|
## Objetivo da V1
|
||||||
|
Criar um MVP operacional que permita controlar:
|
||||||
|
1. encomendas ao fornecedor
|
||||||
|
2. receções parciais e totais
|
||||||
|
3. inventário por estado
|
||||||
|
4. vendas e envios pendentes
|
||||||
|
|
||||||
|
## Stack tecnológica selecionada
|
||||||
|
- Next.js 16 com App Router
|
||||||
|
- TypeScript
|
||||||
|
- PostgreSQL
|
||||||
|
- Prisma ORM
|
||||||
|
- Supabase (database, auth, storage)
|
||||||
|
- Tailwind CSS
|
||||||
|
- shadcn/ui
|
||||||
|
- React Hook Form
|
||||||
|
- Zod
|
||||||
|
|
||||||
|
## Princípios técnicos
|
||||||
|
- Uma única codebase full-stack na V1
|
||||||
|
- Backend implementado dentro do projeto Next.js
|
||||||
|
- Arquitetura simples, modular e orientada ao domínio
|
||||||
|
- Documentação Markdown como fonte de verdade
|
||||||
|
- Projeto preparado para desenvolvimento assistido por agentes de IA
|
||||||
32
docs/01_VISION_AND_SCOPE.md
Normal file
32
docs/01_VISION_AND_SCOPE.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Vision and Scope
|
||||||
|
|
||||||
|
## Visão do produto
|
||||||
|
Criar uma aplicação simples, rápida e operacional para gerir todo o ciclo de revenda de roupa, desde a encomenda ao fornecedor até ao envio ao cliente final, reduzindo erros e dependência de controlo manual.
|
||||||
|
|
||||||
|
## Proposta de valor
|
||||||
|
A aplicação deve funcionar como sistema operacional do negócio e não apenas como inventário. O foco é dar visibilidade total sobre o que foi pedido, recebido, preparado, vendido e expedido.
|
||||||
|
|
||||||
|
## Objetivo principal
|
||||||
|
Permitir ao utilizador saber, em qualquer momento, o estado exato de cada encomenda, artigo e venda.
|
||||||
|
|
||||||
|
## Âmbito da V1
|
||||||
|
- Gestão de fornecedores
|
||||||
|
- Criação de encomendas
|
||||||
|
- Receção total e parcial de mercadoria
|
||||||
|
- Registo de inventário
|
||||||
|
- Gestão de estados operacionais dos artigos
|
||||||
|
- Registo manual de vendas
|
||||||
|
- Gestão de envios pendentes
|
||||||
|
- Dashboard operacional
|
||||||
|
- Autenticação básica
|
||||||
|
- Estrutura técnica preparada para crescimento
|
||||||
|
|
||||||
|
## Fora de âmbito na V1
|
||||||
|
- Contabilidade
|
||||||
|
- Faturação certificada
|
||||||
|
- Integração automática com Vinted
|
||||||
|
- Gestão financeira avançada
|
||||||
|
- Multiempresa
|
||||||
|
- Business intelligence avançada
|
||||||
|
- App mobile nativa
|
||||||
|
- Backend separado em microserviços
|
||||||
27
docs/02_BUSINESS_CONTEXT.md
Normal file
27
docs/02_BUSINESS_CONTEXT.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Business Context
|
||||||
|
|
||||||
|
## Modelo de negócio
|
||||||
|
Pequeno negócio de venda de roupa.
|
||||||
|
|
||||||
|
## Processo atual
|
||||||
|
1. A roupa é encomendada a fornecedores
|
||||||
|
2. Após receção, é necessário conferir o material recebido
|
||||||
|
3. Os artigos têm de ser registados no inventário
|
||||||
|
4. Os artigos são preparados para venda
|
||||||
|
5. A venda é feita através da plataforma Vinted
|
||||||
|
6. Após venda, é necessário identificar rapidamente o comprador e preparar o envio
|
||||||
|
|
||||||
|
## Fornecedor referido
|
||||||
|
Hacco
|
||||||
|
|
||||||
|
## Canal de venda
|
||||||
|
Vinted
|
||||||
|
|
||||||
|
## Limitações atuais
|
||||||
|
- Processo muito manual
|
||||||
|
- Baixa visibilidade sobre encomendas incompletas
|
||||||
|
- Dificuldade em distinguir stock recebido, stock preparado e stock vendido
|
||||||
|
- Gestão de envios morosa e sujeita a erro
|
||||||
|
|
||||||
|
## Oportunidade
|
||||||
|
Estruturar digitalmente o processo de ponta a ponta para reduzir tempo operacional, aumentar controlo e preparar futuras automações.
|
||||||
23
docs/03_PROBLEM_STATEMENT.md
Normal file
23
docs/03_PROBLEM_STATEMENT.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Problem Statement
|
||||||
|
|
||||||
|
## Problema central
|
||||||
|
O negócio depende de controlo manual em várias etapas operacionais, gerando perda de tempo, falta de visibilidade e maior probabilidade de erro.
|
||||||
|
|
||||||
|
## Problemas específicos
|
||||||
|
- Ao receber encomendas com muitos artigos, é difícil perceber o que chegou e o que ainda falta receber
|
||||||
|
- O registo no inventário consome demasiado tempo
|
||||||
|
- Não existe uma visão clara do estado operacional de cada artigo
|
||||||
|
- Após uma venda, é moroso perceber para quem deve ser preparado o envio
|
||||||
|
- A informação está dispersa e não existe um fluxo único de controlo
|
||||||
|
|
||||||
|
## Impacto no negócio
|
||||||
|
- Perda de tempo operacional
|
||||||
|
- Risco de erros na receção
|
||||||
|
- Risco de falhas no controlo de stock
|
||||||
|
- Risco de atrasos ou erros no envio
|
||||||
|
|
||||||
|
## O que a app deve resolver
|
||||||
|
- Centralizar a informação operacional
|
||||||
|
- Tornar a receção controlada e auditável
|
||||||
|
- Dar visibilidade ao estado do stock
|
||||||
|
- Simplificar o registo de vendas e o processo de envio
|
||||||
27
docs/04_PRODUCT_GOALS.md
Normal file
27
docs/04_PRODUCT_GOALS.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Product Goals
|
||||||
|
|
||||||
|
## Objetivos principais
|
||||||
|
- Centralizar a operação do negócio numa única aplicação
|
||||||
|
- Reduzir o tempo necessário para receção e conferência de encomendas
|
||||||
|
- Melhorar a visibilidade do stock em cada fase
|
||||||
|
- Tornar simples o controlo de vendas e envios pendentes
|
||||||
|
|
||||||
|
## Objetivos secundários
|
||||||
|
- Garantir rastreabilidade mínima por artigo ou unidade
|
||||||
|
- Preparar o projeto para futuras automações
|
||||||
|
- Reduzir dependência de memória e controlo informal
|
||||||
|
|
||||||
|
## Resultado esperado
|
||||||
|
O utilizador deve conseguir saber, em qualquer momento:
|
||||||
|
- o que foi encomendado
|
||||||
|
- o que já foi recebido
|
||||||
|
- o que ainda falta receber
|
||||||
|
- o que está pronto para venda
|
||||||
|
- o que foi vendido
|
||||||
|
- o que está pendente de envio
|
||||||
|
|
||||||
|
## Indicadores de sucesso desejáveis
|
||||||
|
- Menos tempo gasto na conferência de receções
|
||||||
|
- Menos erros no controlo de stock
|
||||||
|
- Menos tempo para identificar vendas por enviar
|
||||||
|
- Maior previsibilidade operacional
|
||||||
43
docs/05_USER_WORKFLOWS.md
Normal file
43
docs/05_USER_WORKFLOWS.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# User Workflows
|
||||||
|
|
||||||
|
## Workflow 1 — Criar encomenda ao fornecedor
|
||||||
|
1. Selecionar fornecedor
|
||||||
|
2. Criar nova encomenda
|
||||||
|
3. Adicionar artigos e quantidades
|
||||||
|
4. Guardar encomenda com estado `ordered`
|
||||||
|
|
||||||
|
## Workflow 2 — Receber mercadoria
|
||||||
|
1. Abrir encomenda pendente
|
||||||
|
2. Visualizar lista de artigos esperados
|
||||||
|
3. Registar quantidade recebida por artigo
|
||||||
|
4. Marcar discrepâncias ou faltas
|
||||||
|
5. Fechar receção
|
||||||
|
6. Atualizar estado da encomenda para:
|
||||||
|
- `received`
|
||||||
|
- `partially_received`
|
||||||
|
- `pending`
|
||||||
|
|
||||||
|
## Workflow 3 — Registar inventário
|
||||||
|
1. Ver artigos recebidos e ainda não registados
|
||||||
|
2. Confirmar entrada no inventário
|
||||||
|
3. Criar unidades ou stock registado
|
||||||
|
4. Definir estado inicial operacional
|
||||||
|
|
||||||
|
## Workflow 4 — Preparar artigo para venda
|
||||||
|
1. Ver artigos registados e ainda não preparados
|
||||||
|
2. Marcar como preparado
|
||||||
|
3. Marcar como publicado/anunciado
|
||||||
|
4. Guardar referência do anúncio, se aplicável
|
||||||
|
|
||||||
|
## Workflow 5 — Registar venda
|
||||||
|
1. Selecionar artigo vendido
|
||||||
|
2. Introduzir dados da venda
|
||||||
|
3. Associar comprador
|
||||||
|
4. Alterar estado para `sold` ou `pending_shipment`
|
||||||
|
|
||||||
|
## Workflow 6 — Gerir envio
|
||||||
|
1. Ver lista de vendas pendentes de envio
|
||||||
|
2. Abrir venda
|
||||||
|
3. Confirmar destinatário
|
||||||
|
4. Marcar envio como concluído
|
||||||
|
5. Atualizar estado para `shipped`
|
||||||
41
docs/06_FUNCTIONAL_REQUIREMENTS.md
Normal file
41
docs/06_FUNCTIONAL_REQUIREMENTS.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Functional Requirements
|
||||||
|
|
||||||
|
## Fornecedores e encomendas
|
||||||
|
- O sistema deve permitir registar fornecedores
|
||||||
|
- O sistema deve permitir criar encomendas por fornecedor
|
||||||
|
- O sistema deve permitir adicionar múltiplos artigos a cada encomenda
|
||||||
|
- O sistema deve permitir editar estados de encomenda
|
||||||
|
- O sistema deve manter histórico básico da encomenda
|
||||||
|
|
||||||
|
## Receção de mercadoria
|
||||||
|
- O sistema deve permitir registar receções totais e parciais
|
||||||
|
- O sistema deve permitir comparar quantidade encomendada com quantidade recebida
|
||||||
|
- O sistema deve sinalizar divergências
|
||||||
|
- O sistema deve manter encomendas abertas enquanto existirem artigos por receber
|
||||||
|
|
||||||
|
## Inventário
|
||||||
|
- O sistema deve permitir criar inventário a partir de artigos recebidos
|
||||||
|
- O sistema deve permitir consultar stock por estado
|
||||||
|
- O sistema deve permitir filtrar por fornecedor, lote, artigo, tamanho e estado
|
||||||
|
- O sistema deve impedir dupla disponibilidade do mesmo artigo vendido
|
||||||
|
|
||||||
|
## Preparação e venda
|
||||||
|
- O sistema deve permitir marcar artigos como preparados para venda
|
||||||
|
- O sistema deve permitir marcar artigos como publicados
|
||||||
|
- O sistema deve permitir registar vendas manualmente
|
||||||
|
- O sistema deve permitir associar comprador à venda
|
||||||
|
- O sistema deve permitir listar vendas pendentes de envio
|
||||||
|
- O sistema deve permitir guardar referência manual ao anúncio Vinted
|
||||||
|
|
||||||
|
## Envios
|
||||||
|
- O sistema deve permitir marcar vendas como enviadas
|
||||||
|
- O sistema deve manter histórico do estado do envio
|
||||||
|
|
||||||
|
## Dashboard
|
||||||
|
- O sistema deve apresentar indicadores operacionais essenciais
|
||||||
|
- O sistema deve destacar tarefas pendentes do dia
|
||||||
|
|
||||||
|
## Administração e autenticação
|
||||||
|
- O sistema deve exigir autenticação para acesso à aplicação
|
||||||
|
- O sistema deve suportar pelo menos um utilizador administrador na V1
|
||||||
|
- O sistema deve registar timestamps de criação e atualização nas entidades principais
|
||||||
37
docs/07_NON_FUNCTIONAL_REQUIREMENTS.md
Normal file
37
docs/07_NON_FUNCTIONAL_REQUIREMENTS.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Non-Functional Requirements
|
||||||
|
|
||||||
|
## Usabilidade
|
||||||
|
- A aplicação deve ser simples de usar por uma única pessoa
|
||||||
|
- As ações principais devem exigir poucos cliques
|
||||||
|
- A navegação deve ser clara e centrada em tarefas operacionais
|
||||||
|
- A interface deve ser adequada a desktop e utilizável em tablet/mobile
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
- O sistema deve responder rapidamente em operações correntes
|
||||||
|
- Listagens e filtros devem ser imediatos em contexto de pequeno negócio
|
||||||
|
- O dashboard principal deve carregar sem sensação de lentidão
|
||||||
|
|
||||||
|
## Fiabilidade
|
||||||
|
- O sistema deve preservar integridade dos estados
|
||||||
|
- O sistema deve reduzir risco de erro humano em processos repetitivos
|
||||||
|
- As mutações críticas devem ser validadas no servidor
|
||||||
|
|
||||||
|
## Rastreabilidade
|
||||||
|
- Alterações importantes devem ficar registadas
|
||||||
|
- O utilizador deve conseguir compreender o histórico operacional
|
||||||
|
|
||||||
|
## Portabilidade
|
||||||
|
- A aplicação deve ser web-first
|
||||||
|
- O sistema deve correr numa única stack full-stack baseada em Next.js
|
||||||
|
- O projeto deve poder ser desenvolvido localmente e deployado sem arquitetura distribuída
|
||||||
|
|
||||||
|
## Segurança
|
||||||
|
- O acesso deve ser autenticado
|
||||||
|
- Deve existir mecanismo básico de backup e recuperação
|
||||||
|
- Devem existir regras de acesso mínimas para dados e ficheiros
|
||||||
|
- Os segredos devem ser geridos por variáveis de ambiente
|
||||||
|
|
||||||
|
## Manutenibilidade
|
||||||
|
- O código deve ser modular, tipado e documentado
|
||||||
|
- A estrutura do projeto deve favorecer trabalho com agentes de IA
|
||||||
|
- As regras de negócio devem estar separadas da camada de apresentação
|
||||||
195
docs/08_DOMAIN_MODEL.md
Normal file
195
docs/08_DOMAIN_MODEL.md
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
# Domain Model
|
||||||
|
|
||||||
|
## Abordagem de modelação
|
||||||
|
O domínio deve ser modelado em torno do fluxo operacional do negócio e não apenas em torno de produtos abstratos. A unidade principal de controlo é a encomenda ao fornecedor, a receção, a unidade de inventário e o ciclo de venda/envio.
|
||||||
|
|
||||||
|
## Entidades principais
|
||||||
|
|
||||||
|
### User
|
||||||
|
Representa o utilizador autenticado da aplicação.
|
||||||
|
Na V1 pode existir apenas um utilizador administrador, mas a modelação deve admitir crescimento futuro.
|
||||||
|
|
||||||
|
### Supplier
|
||||||
|
Representa um fornecedor de roupa.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- contact_name
|
||||||
|
- email
|
||||||
|
- phone
|
||||||
|
- notes
|
||||||
|
- created_at
|
||||||
|
- updated_at
|
||||||
|
|
||||||
|
### PurchaseOrder
|
||||||
|
Representa uma encomenda feita a um fornecedor.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- supplier_id
|
||||||
|
- external_reference
|
||||||
|
- status
|
||||||
|
- ordered_at
|
||||||
|
- expected_at
|
||||||
|
- notes
|
||||||
|
- created_at
|
||||||
|
- updated_at
|
||||||
|
|
||||||
|
### PurchaseOrderItem
|
||||||
|
Representa uma linha da encomenda, com artigo, variante e quantidade.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- purchase_order_id
|
||||||
|
- product_model_id
|
||||||
|
- variant_label
|
||||||
|
- size
|
||||||
|
- color
|
||||||
|
- sku_supplier
|
||||||
|
- quantity_ordered
|
||||||
|
- unit_cost
|
||||||
|
- notes
|
||||||
|
|
||||||
|
### Receipt
|
||||||
|
Representa um evento de receção de mercadoria relativo a uma encomenda.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- purchase_order_id
|
||||||
|
- receipt_date
|
||||||
|
- status
|
||||||
|
- notes
|
||||||
|
- created_by
|
||||||
|
- created_at
|
||||||
|
|
||||||
|
### ReceiptItem
|
||||||
|
Representa a quantidade recebida de cada linha da encomenda.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- receipt_id
|
||||||
|
- purchase_order_item_id
|
||||||
|
- quantity_received
|
||||||
|
- quantity_rejected
|
||||||
|
- discrepancy_note
|
||||||
|
|
||||||
|
### ProductModel
|
||||||
|
Representa o artigo ou modelo comercial.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- brand
|
||||||
|
- category
|
||||||
|
- default_size
|
||||||
|
- default_color
|
||||||
|
- internal_sku
|
||||||
|
- supplier_sku
|
||||||
|
- notes
|
||||||
|
- created_at
|
||||||
|
- updated_at
|
||||||
|
|
||||||
|
### InventoryUnit
|
||||||
|
Representa uma unidade concreta ou unidade lógica rastreável no inventário.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- product_model_id
|
||||||
|
- purchase_order_id
|
||||||
|
- receipt_item_id
|
||||||
|
- inventory_status
|
||||||
|
- condition
|
||||||
|
- storage_location
|
||||||
|
- cost_price
|
||||||
|
- ready_for_listing_at
|
||||||
|
- created_at
|
||||||
|
- updated_at
|
||||||
|
|
||||||
|
Nota:
|
||||||
|
A V1 deve favorecer rastreabilidade por unidade sempre que possível. Caso existam cenários de stock agregado, essa decisão deve ser explícita e documentada.
|
||||||
|
|
||||||
|
### Listing
|
||||||
|
Representa um anúncio publicado ou preparado para publicação.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- inventory_unit_id
|
||||||
|
- platform
|
||||||
|
- external_reference
|
||||||
|
- listing_status
|
||||||
|
- listed_price
|
||||||
|
- listed_at
|
||||||
|
- url
|
||||||
|
- notes
|
||||||
|
|
||||||
|
### Customer
|
||||||
|
Representa o comprador associado a uma venda.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- platform_username
|
||||||
|
- shipping_name
|
||||||
|
- shipping_address
|
||||||
|
- phone
|
||||||
|
- email
|
||||||
|
- notes
|
||||||
|
|
||||||
|
### Sale
|
||||||
|
Representa a venda de uma unidade ou artigo.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- inventory_unit_id
|
||||||
|
- customer_id
|
||||||
|
- sale_channel
|
||||||
|
- sale_status
|
||||||
|
- sale_price
|
||||||
|
- sold_at
|
||||||
|
- notes
|
||||||
|
- created_at
|
||||||
|
|
||||||
|
### Shipment
|
||||||
|
Representa o envio associado a uma venda.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- sale_id
|
||||||
|
- shipment_status
|
||||||
|
- shipped_at
|
||||||
|
- tracking_code
|
||||||
|
- carrier
|
||||||
|
- label_reference
|
||||||
|
- notes
|
||||||
|
|
||||||
|
### StatusHistory
|
||||||
|
Representa o histórico de transições de estado relevantes.
|
||||||
|
|
||||||
|
Campos indicativos:
|
||||||
|
- id
|
||||||
|
- entity_type
|
||||||
|
- entity_id
|
||||||
|
- from_status
|
||||||
|
- to_status
|
||||||
|
- changed_by
|
||||||
|
- changed_at
|
||||||
|
- note
|
||||||
|
|
||||||
|
## Relações principais
|
||||||
|
- Um User pode criar Receipts e alterar estados
|
||||||
|
- Um Supplier pode ter muitas PurchaseOrders
|
||||||
|
- Uma PurchaseOrder tem muitos PurchaseOrderItems
|
||||||
|
- Uma PurchaseOrder pode ter muitas Receipts
|
||||||
|
- Uma Receipt tem muitos ReceiptItems
|
||||||
|
- Um ProductModel pode existir em muitos PurchaseOrderItems
|
||||||
|
- Um InventoryUnit resulta de receção e registo
|
||||||
|
- Um InventoryUnit pode originar um Listing
|
||||||
|
- Um InventoryUnit pode estar associado a uma Sale
|
||||||
|
- Uma Sale pode gerar um Shipment
|
||||||
|
- As entidades críticas podem gerar StatusHistory
|
||||||
|
|
||||||
|
## Observações de implementação
|
||||||
|
- O modelo de dados deve ser implementado em PostgreSQL
|
||||||
|
- O acesso à base de dados deve ser feito através de Prisma ORM
|
||||||
|
- As regras de domínio não devem ficar dispersas em componentes de interface
|
||||||
48
docs/09_STATES_AND_LIFECYCLES.md
Normal file
48
docs/09_STATES_AND_LIFECYCLES.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# States and Lifecycles
|
||||||
|
|
||||||
|
## Estados de encomenda
|
||||||
|
- `draft`
|
||||||
|
- `ordered`
|
||||||
|
- `partially_received`
|
||||||
|
- `received`
|
||||||
|
- `closed`
|
||||||
|
- `cancelled`
|
||||||
|
|
||||||
|
## Estados de receção
|
||||||
|
- `pending`
|
||||||
|
- `in_progress`
|
||||||
|
- `completed`
|
||||||
|
- `completed_with_discrepancies`
|
||||||
|
|
||||||
|
## Estados de inventário/unidade
|
||||||
|
- `ordered`
|
||||||
|
- `received`
|
||||||
|
- `registered`
|
||||||
|
- `ready_for_listing`
|
||||||
|
- `listed`
|
||||||
|
- `reserved`
|
||||||
|
- `sold`
|
||||||
|
- `pending_shipment`
|
||||||
|
- `shipped`
|
||||||
|
- `completed`
|
||||||
|
- `blocked`
|
||||||
|
|
||||||
|
## Estados de venda
|
||||||
|
- `draft`
|
||||||
|
- `confirmed`
|
||||||
|
- `pending_shipment`
|
||||||
|
- `shipped`
|
||||||
|
- `completed`
|
||||||
|
- `cancelled`
|
||||||
|
|
||||||
|
## Estados de envio
|
||||||
|
- `not_started`
|
||||||
|
- `pending`
|
||||||
|
- `shipped`
|
||||||
|
- `delivered`
|
||||||
|
- `issue`
|
||||||
|
|
||||||
|
## Observações
|
||||||
|
- Uma unidade vendida não deve voltar a ficar disponível sem operação explícita
|
||||||
|
- Uma encomenda parcialmente recebida deve manter-se aberta
|
||||||
|
- Estados finais devem ser reduzidos e claros para evitar ambiguidade
|
||||||
47
docs/10_MVP_DEFINITION.md
Normal file
47
docs/10_MVP_DEFINITION.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# MVP Definition
|
||||||
|
|
||||||
|
## Objetivo do MVP
|
||||||
|
Resolver as dores operacionais principais com o mínimo de complexidade possível.
|
||||||
|
|
||||||
|
## Funcionalidades obrigatórias
|
||||||
|
- Gestão de fornecedores
|
||||||
|
- Criação de encomendas
|
||||||
|
- Receção parcial e total
|
||||||
|
- Registo de inventário
|
||||||
|
- Gestão de estados dos artigos
|
||||||
|
- Registo manual de vendas
|
||||||
|
- Gestão de envios pendentes
|
||||||
|
- Dashboard operacional básico
|
||||||
|
- Autenticação base
|
||||||
|
- Estrutura para anexar referência manual de anúncio
|
||||||
|
|
||||||
|
## Funcionalidades desejáveis
|
||||||
|
- Histórico de alterações
|
||||||
|
- Filtros avançados
|
||||||
|
- Gestão simples de localização física do artigo
|
||||||
|
- Upload de imagens em fase posterior do MVP, se não complicar a entrega
|
||||||
|
|
||||||
|
## Funcionalidades adiadas
|
||||||
|
- Integração automática com Vinted
|
||||||
|
- Gestão financeira
|
||||||
|
- Faturação
|
||||||
|
- Multiutilizador avançado
|
||||||
|
- Relatórios complexos
|
||||||
|
- App mobile nativa
|
||||||
|
- Backend separado
|
||||||
|
- Automações avançadas
|
||||||
|
|
||||||
|
## Critério de sucesso do MVP
|
||||||
|
O utilizador consegue controlar sem folhas dispersas:
|
||||||
|
- o que falta receber
|
||||||
|
- o que existe em stock por estado
|
||||||
|
- o que foi vendido
|
||||||
|
- o que falta enviar
|
||||||
|
|
||||||
|
## Critério técnico do MVP
|
||||||
|
O MVP deve ser entregue numa única aplicação full-stack com:
|
||||||
|
- frontend em Next.js
|
||||||
|
- backend dentro do projeto Next.js
|
||||||
|
- base de dados PostgreSQL
|
||||||
|
- ORM Prisma
|
||||||
|
- autenticação e storage suportados por Supabase
|
||||||
491
docs/11_ROADMAP.md
Normal file
491
docs/11_ROADMAP.md
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
# 11_ROADMAP.md
|
||||||
|
|
||||||
|
## Objetivo deste documento
|
||||||
|
Este documento define o roadmap de implementação do projeto, com foco em execução faseada, controlo de dependências, clareza para agentes de IA e redução de retrabalho.
|
||||||
|
|
||||||
|
O roadmap deve ser lido em conjunto com:
|
||||||
|
- `00_PROJECT_BRIEF.md`
|
||||||
|
- `04_PRODUCT_GOALS.md`
|
||||||
|
- `05_USER_WORKFLOWS.md`
|
||||||
|
- `08_DOMAIN_MODEL.md`
|
||||||
|
- `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
- `10_MVP_DEFINITION.md`
|
||||||
|
- `16_DECISIONS_LOG.md`
|
||||||
|
- `17_PROGRESS.md`
|
||||||
|
- `18_AGENT_HANDOFF.md`
|
||||||
|
- `19_TECH_STACK.md`
|
||||||
|
- `20_PROJECT_STRUCTURE.md`
|
||||||
|
- `21_ENGINEERING_GUIDELINES.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Princípios de execução
|
||||||
|
|
||||||
|
1. Implementar por fases curtas e controladas.
|
||||||
|
2. Não avançar para fases dependentes sem a base anterior consolidada.
|
||||||
|
3. Priorizar sempre valor operacional real.
|
||||||
|
4. Evitar complexidade desnecessária na V1.
|
||||||
|
5. Atualizar `16_DECISIONS_LOG.md`, `17_PROGRESS.md` e `18_AGENT_HANDOFF.md` no final de cada fase ou subfase relevante.
|
||||||
|
6. Não introduzir funcionalidades fora do MVP sem registo explícito.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Visão geral das fases
|
||||||
|
|
||||||
|
O projeto deve ser implementado em 7 fases principais:
|
||||||
|
|
||||||
|
1. Consolidação funcional
|
||||||
|
2. Preparação técnica
|
||||||
|
3. Fundação do projeto
|
||||||
|
4. Núcleo operacional do MVP
|
||||||
|
5. Dashboard e produtividade
|
||||||
|
6. Qualidade, robustez e lançamento
|
||||||
|
7. Evolução pós-MVP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 1 — Consolidação funcional
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Fechar a lógica do negócio antes do desenvolvimento técnico.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
No final desta fase deve estar claramente definido:
|
||||||
|
- o que a aplicação faz;
|
||||||
|
- quais são os fluxos principais;
|
||||||
|
- quais são os estados do sistema;
|
||||||
|
- o que entra no MVP;
|
||||||
|
- o que fica fora do MVP;
|
||||||
|
- quais são as regras de negócio críticas.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- rever a documentação base do projeto;
|
||||||
|
- consolidar o modelo de domínio;
|
||||||
|
- consolidar os estados e ciclos de vida;
|
||||||
|
- validar os workflows principais;
|
||||||
|
- fechar a definição do MVP;
|
||||||
|
- listar regras críticas de integridade de dados;
|
||||||
|
- registar decisões em aberto;
|
||||||
|
- atualizar os ficheiros de continuidade do projeto.
|
||||||
|
|
||||||
|
### Entregáveis
|
||||||
|
- `08_DOMAIN_MODEL.md`
|
||||||
|
- `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
- `10_MVP_DEFINITION.md`
|
||||||
|
- `13_DATA_RULES.md`
|
||||||
|
- `15_OPEN_QUESTIONS.md` atualizado
|
||||||
|
- `16_DECISIONS_LOG.md` atualizado
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
Nenhum agente deve começar a implementar funcionalidades sem esta fase estabilizada.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 2 — Preparação técnica
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Traduzir a visão funcional numa base técnica clara e consistente.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
A stack, organização do projeto, convenções de engenharia e abordagem de desenvolvimento devem estar fechadas.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- consolidar a stack tecnológica escolhida;
|
||||||
|
- definir a estrutura de diretórios do projeto;
|
||||||
|
- definir convenções de nomenclatura;
|
||||||
|
- definir abordagem para autenticação, base de dados e storage;
|
||||||
|
- definir fluxo de migrations com Prisma;
|
||||||
|
- definir abordagem de validação com Zod;
|
||||||
|
- definir regras de organização por feature/domain;
|
||||||
|
- definir princípios de tratamento de erros e logging;
|
||||||
|
- definir estratégia de testes para o MVP.
|
||||||
|
|
||||||
|
### Entregáveis
|
||||||
|
- `19_TECH_STACK.md`
|
||||||
|
- `20_PROJECT_STRUCTURE.md`
|
||||||
|
- `21_ENGINEERING_GUIDELINES.md`
|
||||||
|
- prompts técnicos atualizados para agentes
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
O projeto técnico está pronto para scaffolding sem improviso.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 3 — Fundação do projeto
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Criar a base real do repositório e da aplicação.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
Projeto funcional, organizado e pronto para receber funcionalidades.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- inicializar projeto com Next.js 16 e TypeScript;
|
||||||
|
- configurar Tailwind CSS;
|
||||||
|
- integrar shadcn/ui;
|
||||||
|
- configurar Prisma ORM;
|
||||||
|
- ligar a aplicação ao Supabase;
|
||||||
|
- configurar autenticação base;
|
||||||
|
- configurar storage base;
|
||||||
|
- criar `.env.example`;
|
||||||
|
- criar estrutura inicial de `src/`;
|
||||||
|
- criar layout base da aplicação;
|
||||||
|
- configurar linting e formatação;
|
||||||
|
- preparar tratamento base de erros;
|
||||||
|
- criar schema inicial Prisma com entidades nucleares;
|
||||||
|
- criar seed opcional para ambiente de desenvolvimento.
|
||||||
|
|
||||||
|
### Entregáveis
|
||||||
|
- repositório inicial funcional;
|
||||||
|
- autenticação mínima operacional;
|
||||||
|
- ligação à base de dados funcional;
|
||||||
|
- schema Prisma inicial;
|
||||||
|
- estrutura técnica estabilizada.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
A aplicação corre localmente e está pronta para começar a implementar módulos de negócio.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4 — Núcleo operacional do MVP
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Construir o coração operacional da aplicação.
|
||||||
|
|
||||||
|
### Módulos desta fase
|
||||||
|
1. fornecedores
|
||||||
|
2. encomendas ao fornecedor
|
||||||
|
3. receção de mercadoria
|
||||||
|
4. inventário
|
||||||
|
5. preparação para venda
|
||||||
|
6. vendas e envios
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4.1 — Fornecedores e encomendas
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Permitir criar e gerir encomendas ao fornecedor.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- implementar CRUD de fornecedores;
|
||||||
|
- implementar criação de encomendas;
|
||||||
|
- implementar linhas de encomenda;
|
||||||
|
- implementar estados da encomenda;
|
||||||
|
- implementar listagem de encomendas;
|
||||||
|
- implementar detalhe da encomenda;
|
||||||
|
- implementar filtros por fornecedor, estado e data.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
O utilizador consegue registar uma encomenda completa ao fornecedor e consultá-la com clareza.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
Existe um fluxo estável para criação, consulta e gestão básica de encomendas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4.2 — Receção de mercadoria
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Resolver a dor principal da receção: perceber o que chegou e o que ainda falta receber.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- criar ecrã de receção por encomenda;
|
||||||
|
- permitir receção parcial;
|
||||||
|
- permitir receção total;
|
||||||
|
- permitir registo de discrepâncias;
|
||||||
|
- calcular automaticamente quantidades em falta;
|
||||||
|
- guardar histórico de receções;
|
||||||
|
- atualizar automaticamente o estado da encomenda.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
O utilizador consegue perceber rapidamente:
|
||||||
|
- o que foi encomendado;
|
||||||
|
- o que já foi recebido;
|
||||||
|
- o que continua em falta;
|
||||||
|
- se existem diferenças entre o pedido e a receção.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
É possível receber uma encomenda parcialmente e manter visibilidade exata do saldo pendente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4.3 — Inventário
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Registar os artigos recebidos e dar visibilidade ao stock real.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- criar unidades de inventário a partir das receções;
|
||||||
|
- associar unidades a encomendas e receções;
|
||||||
|
- implementar estados operacionais das unidades;
|
||||||
|
- implementar listagem de inventário;
|
||||||
|
- implementar filtros por estado, fornecedor, artigo e lote;
|
||||||
|
- implementar detalhe da unidade;
|
||||||
|
- implementar histórico básico de alterações relevantes.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
O utilizador consegue saber o que foi recebido, o que já foi registado e o que ainda não está pronto para venda.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
O inventário representa o estado real da operação e não apenas quantidades abstratas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4.4 — Preparação para venda
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Controlar os artigos que já estão em condições de ser anunciados ou vendidos.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- permitir marcar artigo como registado;
|
||||||
|
- permitir marcar artigo como preparado;
|
||||||
|
- permitir marcar artigo como publicado/anunciado;
|
||||||
|
- guardar referência do anúncio, se aplicável;
|
||||||
|
- permitir listar artigos por estado operacional;
|
||||||
|
- facilitar transições rápidas de estado.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
O utilizador consegue distinguir claramente:
|
||||||
|
- artigos recebidos;
|
||||||
|
- artigos registados;
|
||||||
|
- artigos preparados;
|
||||||
|
- artigos publicados.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
Existe visibilidade operacional completa da fase intermédia entre receção e venda.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 4.5 — Vendas e envios
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Eliminar a dificuldade em perceber para quem deve ser feito o envio.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- implementar registo de venda;
|
||||||
|
- associar venda a unidade de inventário;
|
||||||
|
- guardar dados do comprador;
|
||||||
|
- alterar estado do artigo para vendido;
|
||||||
|
- marcar venda como pendente de envio;
|
||||||
|
- marcar envio como concluído;
|
||||||
|
- implementar lista de vendas pendentes de envio;
|
||||||
|
- implementar detalhe da venda com destinatário e estado.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
O utilizador consegue ver rapidamente tudo o que está por enviar e respetivo destinatário.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
Existe um painel simples e fiável para gestão de envios pendentes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 5 — Dashboard e produtividade
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Transformar a aplicação numa ferramenta diária de operação.
|
||||||
|
|
||||||
|
### Resultados esperados
|
||||||
|
Ao abrir a aplicação, o utilizador deve perceber imediatamente o estado da operação e o que precisa de fazer.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- implementar dashboard principal;
|
||||||
|
- criar métricas operacionais resumidas;
|
||||||
|
- criar blocos de ações pendentes;
|
||||||
|
- mostrar encomendas por receber;
|
||||||
|
- mostrar artigos por registar;
|
||||||
|
- mostrar artigos por preparar;
|
||||||
|
- mostrar artigos por publicar;
|
||||||
|
- mostrar vendas por enviar;
|
||||||
|
- criar filtros rápidos e atalhos de navegação;
|
||||||
|
- implementar ações rápidas diretamente no dashboard.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
O dashboard permite orientar o trabalho diário com poucos cliques.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 6 — Qualidade, robustez e lançamento
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Passar de uma aplicação funcional para uma aplicação confiável para uso diário.
|
||||||
|
|
||||||
|
### Tarefas
|
||||||
|
- implementar testes unitários para regras críticas;
|
||||||
|
- implementar testes de integração para fluxos principais;
|
||||||
|
- validar coerência dos estados;
|
||||||
|
- reforçar proteção contra inconsistências;
|
||||||
|
- melhorar UX de formulários, tabelas e feedback visual;
|
||||||
|
- implementar loading states e empty states;
|
||||||
|
- reforçar tratamento de erros;
|
||||||
|
- rever permissões mínimas e segurança básica;
|
||||||
|
- rever backups e recuperação;
|
||||||
|
- criar documentação de setup e execução;
|
||||||
|
- preparar checklist de lançamento;
|
||||||
|
- configurar ambiente de produção.
|
||||||
|
|
||||||
|
### Critério de conclusão
|
||||||
|
A aplicação pode ser usada em contexto real com confiança operacional.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fase 7 — Evolução pós-MVP
|
||||||
|
|
||||||
|
### Objetivo
|
||||||
|
Expandir a aplicação com base no uso real e em necessidades confirmadas.
|
||||||
|
|
||||||
|
### Possíveis evoluções
|
||||||
|
- importação semiautomática de vendas;
|
||||||
|
- notificações e alertas;
|
||||||
|
- automações com IA;
|
||||||
|
- lista de trabalho automática do dia;
|
||||||
|
- deteção de discrepâncias mais inteligente;
|
||||||
|
- relatórios operacionais;
|
||||||
|
- métricas por fornecedor;
|
||||||
|
- métricas por categoria de artigo;
|
||||||
|
- gestão mais avançada de imagens;
|
||||||
|
- múltiplos utilizadores e perfis;
|
||||||
|
- PWA ou versão mobile;
|
||||||
|
- integrações futuras com plataformas externas.
|
||||||
|
|
||||||
|
### Regra de controlo
|
||||||
|
Nenhuma funcionalidade desta fase deve entrar antes do núcleo operacional do MVP estar sólido.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ordem prática de implementação
|
||||||
|
|
||||||
|
### Bloco 1 — Fechar documentação
|
||||||
|
- domínio
|
||||||
|
- estados
|
||||||
|
- MVP
|
||||||
|
- regras de dados
|
||||||
|
|
||||||
|
### Bloco 2 — Montar base técnica
|
||||||
|
- projeto
|
||||||
|
- autenticação
|
||||||
|
- base de dados
|
||||||
|
- estrutura
|
||||||
|
- UI base
|
||||||
|
|
||||||
|
### Bloco 3 — Implementar compras e receção
|
||||||
|
- fornecedores
|
||||||
|
- encomendas
|
||||||
|
- receções
|
||||||
|
|
||||||
|
### Bloco 4 — Implementar inventário
|
||||||
|
- unidades
|
||||||
|
- estados
|
||||||
|
- filtros
|
||||||
|
|
||||||
|
### Bloco 5 — Implementar vendas e envios
|
||||||
|
- venda
|
||||||
|
- comprador
|
||||||
|
- pendentes de envio
|
||||||
|
|
||||||
|
### Bloco 6 — Implementar dashboard
|
||||||
|
- visão central da operação
|
||||||
|
- tarefas do dia
|
||||||
|
- atalhos rápidos
|
||||||
|
|
||||||
|
### Bloco 7 — Hardening
|
||||||
|
- testes
|
||||||
|
- UX
|
||||||
|
- produção
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Roadmap em formato de sprints
|
||||||
|
|
||||||
|
### Sprint 1 — Definição funcional
|
||||||
|
- fechar domínio
|
||||||
|
- fechar estados
|
||||||
|
- fechar MVP
|
||||||
|
- fechar regras de dados
|
||||||
|
|
||||||
|
### Sprint 2 — Base técnica
|
||||||
|
- setup do projeto
|
||||||
|
- autenticação
|
||||||
|
- base de dados
|
||||||
|
- estrutura
|
||||||
|
- UI base
|
||||||
|
|
||||||
|
### Sprint 3 — Fornecedores e encomendas
|
||||||
|
- CRUD de fornecedores
|
||||||
|
- criação de encomendas
|
||||||
|
- listagem e detalhe de encomendas
|
||||||
|
|
||||||
|
### Sprint 4 — Receção
|
||||||
|
- receção parcial
|
||||||
|
- receção total
|
||||||
|
- discrepâncias
|
||||||
|
- atualização de estados da encomenda
|
||||||
|
|
||||||
|
### Sprint 5 — Inventário
|
||||||
|
- unidades
|
||||||
|
- estados
|
||||||
|
- registo operacional
|
||||||
|
- filtros
|
||||||
|
|
||||||
|
### Sprint 6 — Vendas e envios
|
||||||
|
- registo de venda
|
||||||
|
- comprador
|
||||||
|
- pendentes de envio
|
||||||
|
- envio concluído
|
||||||
|
|
||||||
|
### Sprint 7 — Dashboard
|
||||||
|
- tarefas do dia
|
||||||
|
- indicadores
|
||||||
|
- ações rápidas
|
||||||
|
|
||||||
|
### Sprint 8 — Qualidade e lançamento
|
||||||
|
- testes
|
||||||
|
- correções
|
||||||
|
- preparação de produção
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependências entre fases
|
||||||
|
|
||||||
|
- inventário depende de receção;
|
||||||
|
- venda depende de inventário;
|
||||||
|
- envio depende de venda;
|
||||||
|
- dashboard depende dos módulos principais já estarem implementados;
|
||||||
|
- automações dependem da estabilidade do MVP.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Riscos principais
|
||||||
|
|
||||||
|
### 1. Começar a desenvolver cedo demais
|
||||||
|
Sem estados e regras fechadas, o risco de retrabalho é elevado.
|
||||||
|
|
||||||
|
### 2. Complicar demasiado a V1
|
||||||
|
A V1 deve focar-se em controlo operacional simples e eficaz.
|
||||||
|
|
||||||
|
### 3. UX lenta ou demasiado pesada
|
||||||
|
Se as operações do dia a dia exigirem muitos passos, a aplicação perde valor.
|
||||||
|
|
||||||
|
### 4. Falta de disciplina documental
|
||||||
|
Se `DECISIONS_LOG`, `PROGRESS` e `AGENT_HANDOFF` não forem atualizados, os agentes vão divergir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Instruções para o agente
|
||||||
|
|
||||||
|
Ao usar este roadmap:
|
||||||
|
1. Ler primeiro a documentação base do projeto.
|
||||||
|
2. Trabalhar apenas na fase atual ou na subfase indicada.
|
||||||
|
3. Não saltar dependências.
|
||||||
|
4. Não introduzir funcionalidades fora do MVP sem sinalização explícita.
|
||||||
|
5. No final de cada entrega relevante:
|
||||||
|
- atualizar `16_DECISIONS_LOG.md`;
|
||||||
|
- atualizar `17_PROGRESS.md`;
|
||||||
|
- atualizar `18_AGENT_HANDOFF.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estado atual esperado
|
||||||
|
Este documento assume que o projeto está entre a fase de consolidação funcional e a fase de preparação técnica.
|
||||||
|
|
||||||
|
O próximo passo recomendado é confirmar que os documentos de domínio, estados, MVP e regras de dados estão suficientemente sólidos para iniciar a fundação técnica do projeto.
|
||||||
24
docs/12_UI_UX_PRINCIPLES.md
Normal file
24
docs/12_UI_UX_PRINCIPLES.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# UI/UX Principles
|
||||||
|
|
||||||
|
## Princípios gerais
|
||||||
|
- Priorizar rapidez operacional
|
||||||
|
- Mostrar sempre o estado atual de forma clara
|
||||||
|
- Reduzir o número de cliques
|
||||||
|
- Evitar ecrãs demasiado densos
|
||||||
|
|
||||||
|
## Dashboard
|
||||||
|
- O dashboard deve ser orientado a tarefas
|
||||||
|
- Deve destacar pendentes, faltas, vendas por enviar e stock por estado
|
||||||
|
|
||||||
|
## Formulários
|
||||||
|
- Devem ser curtos e diretos
|
||||||
|
- Devem evitar campos desnecessários
|
||||||
|
- Devem validar rapidamente erros óbvios
|
||||||
|
|
||||||
|
## Listagens
|
||||||
|
- Devem permitir filtros rápidos
|
||||||
|
- Devem ter estados visuais claros
|
||||||
|
- Devem facilitar ações em contexto
|
||||||
|
|
||||||
|
## Experiência desejada
|
||||||
|
A app deve parecer uma ferramenta de trabalho diária e não um ERP pesado.
|
||||||
16
docs/13_DATA_RULES.md
Normal file
16
docs/13_DATA_RULES.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Data Rules
|
||||||
|
|
||||||
|
## Regras de integridade
|
||||||
|
- Uma receção não deve ultrapassar a quantidade encomendada sem sinalização
|
||||||
|
- Uma encomenda parcialmente recebida mantém-se aberta
|
||||||
|
- Um artigo vendido não pode aparecer como disponível
|
||||||
|
- Uma venda deve estar associada a um artigo ou unidade concreta
|
||||||
|
- Um envio deve estar associado a uma venda
|
||||||
|
|
||||||
|
## Regras de rastreabilidade
|
||||||
|
- Transições relevantes de estado devem ser registadas
|
||||||
|
- Alterações críticas devem deixar histórico
|
||||||
|
|
||||||
|
## Regras de consistência
|
||||||
|
- O stock disponível deve refletir apenas artigos aptos para venda
|
||||||
|
- O sistema deve distinguir stock físico de stock vendável
|
||||||
16
docs/14_AUTOMATION_OPPORTUNITIES.md
Normal file
16
docs/14_AUTOMATION_OPPORTUNITIES.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Automation Opportunities
|
||||||
|
|
||||||
|
## Curto prazo
|
||||||
|
- Alertas de encomendas parcialmente recebidas
|
||||||
|
- Lista automática de vendas por enviar
|
||||||
|
- Dashboard com tarefas pendentes do dia
|
||||||
|
|
||||||
|
## Médio prazo
|
||||||
|
- Sugestão automática do que falta receber por encomenda
|
||||||
|
- Sinalização de discrepâncias recorrentes por fornecedor
|
||||||
|
- Fluxo guiado de preparação de artigos
|
||||||
|
|
||||||
|
## Longo prazo
|
||||||
|
- Possível integração ou importação de dados de plataformas de venda
|
||||||
|
- Regras automáticas de priorização operacional
|
||||||
|
- Apoio por IA para deteção de anomalias no processo
|
||||||
16
docs/15_OPEN_QUESTIONS.md
Normal file
16
docs/15_OPEN_QUESTIONS.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Open Questions
|
||||||
|
|
||||||
|
## Produto e operação
|
||||||
|
- O inventário será gerido por unidade individual em todos os cenários ou haverá stock agregado nalguns casos?
|
||||||
|
- Será necessário guardar custo por artigo?
|
||||||
|
- Será necessário guardar preço de venda e margem?
|
||||||
|
- A app será usada por um único utilizador ou poderá haver mais utilizadores?
|
||||||
|
- Haverá necessidade de anexar fotografias dentro da app?
|
||||||
|
- O anúncio Vinted ficará apenas como referência manual ou haverá integração futura?
|
||||||
|
- Será necessário controlar devoluções numa fase seguinte?
|
||||||
|
|
||||||
|
## Técnica e implementação
|
||||||
|
- As imagens devem ser guardadas logo no Supabase Storage ou adiadas para uma fase posterior?
|
||||||
|
- O primeiro deploy será feito em Vercel + Supabase ou noutro ambiente?
|
||||||
|
- Haverá necessidade de ambientes distintos de dev, staging e produção logo no início?
|
||||||
|
- Será necessário seed inicial com dados reais ou dados fictícios?
|
||||||
133
docs/16_DECISIONS_LOG.md
Normal file
133
docs/16_DECISIONS_LOG.md
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
# Decisions Log
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Posicionar a solução como app de gestão operacional de revenda de roupa e não apenas como app de inventário.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
O principal valor está no controlo do fluxo completo: encomenda, receção, registo, preparação, venda e envio.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
A arquitetura funcional será orientada a estados e workflows operacionais.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Excluir integração automática com Vinted da V1.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
A prioridade é resolver as dores operacionais principais sem aumentar complexidade técnica inicial.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
As vendas serão registadas manualmente na primeira versão.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Documentar o projeto em múltiplos ficheiros Markdown curtos e temáticos.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Facilitar continuidade entre sessões e colaboração com agentes de IA.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
A documentação passa a ser a fonte de verdade do projeto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Adotar uma stack full-stack baseada em Next.js 16, TypeScript, PostgreSQL, Prisma ORM, Supabase, Tailwind CSS, shadcn/ui, React Hook Form e Zod.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Esta combinação maximiza velocidade de desenvolvimento, simplicidade arquitetural, boa compatibilidade com agentes de IA e capacidade de crescimento sem infraestrutura excessiva.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
O MVP será desenvolvido numa única codebase full-stack com frontend e backend no mesmo projeto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Não criar backend separado na V1.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
A operação inicial não justifica microserviços nem uma API separada. O foco é reduzir complexidade e acelerar entrega.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
As rotas, ações no servidor, serviços e acesso à base de dados ficam dentro do projeto Next.js.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Usar PostgreSQL como base de dados principal e Prisma ORM como camada de acesso aos dados.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
É uma combinação robusta, legível, type-safe e adequada ao domínio operacional da aplicação.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
O schema do domínio será modelado em Prisma e evoluído por migrations.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Implementar rastreabilidade por unidade de inventário em vez de stock agregado.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
A documentação do domínio especifica que a V1 deve favorecer rastreabilidade por unidade sempre que possível para dar visibilidade operacional completa.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
O schema Prisma foi modelado com InventoryUnit como entidade principal, permitindo rastrear cada artigo individualmente desde a receção até à venda.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Criar DOC_INDEX.md como registo centralizado da documentação do projeto.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Facilitar a navegação e continuidade entre sessões de desenvolvimento com agentes de IA, garantindo que todos os documentos nucleares são facilmente encontráveis.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
O projeto tem agora um índice completo com 27 ficheiros documentais, todos classificados por status e função.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Modelar todos os estados definidos na documentação como enums no schema Prisma.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Garantir consistência entre a documentação de estados e a implementação técnica, evitando ambiguidades nos ciclos de vida das entidades.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
Os enums PurchaseOrderStatus, ReceiptStatus, InventoryStatus, ListingStatus, SaleStatus e ShipmentStatus foram implementados exatamente conforme definido em `09_STATES_AND_LIFECYCLES.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Corrigir problemas de integridade relacional no schema Prisma.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Validação do schema revelou relações em falta e inconsistências que poderiam causar problemas de integridade de dados.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
- Adicionada relação User.createdReceipts para Receipt.created_by
|
||||||
|
- Corrigida relação StatusHistory com índices para performance
|
||||||
|
- Mantida integridade referencial em todas as relações
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-04-21
|
||||||
|
### Decisão
|
||||||
|
Criar estrutura completa do projeto Next.js com stack aprovada.
|
||||||
|
|
||||||
|
### Motivo
|
||||||
|
Estabelecer base técnica sólida para desenvolvimento do MVP seguindo exatamente a stack definida na documentação.
|
||||||
|
|
||||||
|
### Impacto
|
||||||
|
Projeto configurado com Next.js 16, TypeScript, Tailwind CSS, Prisma, estrutura de pastas conforme `20_PROJECT_STRUCTURE.md`, pronto para instalação de dependências e início de desenvolvimento.
|
||||||
57
docs/17_PROGRESS.md
Normal file
57
docs/17_PROGRESS.md
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Progress
|
||||||
|
|
||||||
|
## Estado atual
|
||||||
|
Fase de scaffolding técnico concluída. Schema Prisma validado e estrutura base do projeto criada com stack aprovada.
|
||||||
|
|
||||||
|
## Já concluído
|
||||||
|
- Reflexão inicial sobre o problema
|
||||||
|
- Definição do posicionamento da app como sistema operacional
|
||||||
|
- Definição da estrutura documental base
|
||||||
|
- Criação da primeira versão dos ficheiros nucleares
|
||||||
|
- Seleção da stack tecnológica principal
|
||||||
|
- Decisão de manter arquitetura full-stack numa única codebase
|
||||||
|
- Criação do DOC_INDEX.md com registo completo da documentação
|
||||||
|
- Análise completa da documentação existente
|
||||||
|
- Criação do schema Prisma inicial baseado no modelo de domínio
|
||||||
|
- Validação e correção do schema Prisma contra documentação
|
||||||
|
- Criação da estrutura completa do projeto Next.js
|
||||||
|
- Configuração de package.json com todas as dependências necessárias
|
||||||
|
- Criação de ficheiros de configuração (next.config.js, tsconfig.json, tailwind.config.ts)
|
||||||
|
- Configuração de ambiente (.env.example)
|
||||||
|
- Estrutura de pastas conforme documentação técnica
|
||||||
|
- Ficheiros base da aplicação (layout, page, globals.css)
|
||||||
|
- Configuração inicial do cliente Prisma
|
||||||
|
|
||||||
|
## Em curso
|
||||||
|
- Preparação para instalação de dependências
|
||||||
|
- Validação final da estrutura técnica
|
||||||
|
|
||||||
|
## Próximos passos
|
||||||
|
1. Instalar dependências do projeto
|
||||||
|
2. Configurar ambiente Supabase
|
||||||
|
3. Implementar primeira migration Prisma
|
||||||
|
4. Testar configuração base da aplicação
|
||||||
|
5. Iniciar desenvolvimento das funcionalidades do MVP
|
||||||
|
|
||||||
|
## Bloqueios
|
||||||
|
- Dependências precisam de ser instaladas para resolver erros TypeScript
|
||||||
|
- Ambiente Supabase precisa de configuração
|
||||||
|
- Ainda não está decidida a modelação futura de integração com plataformas
|
||||||
|
- Ainda não está decidido o fluxo exato de imagens e storage
|
||||||
|
|
||||||
|
## Ficheiros criados/alterados nesta iteração
|
||||||
|
- `/prisma/schema.prisma` (corrigido e validado)
|
||||||
|
- `/package.json` (criado)
|
||||||
|
- `/next.config.js` (criado)
|
||||||
|
- `/tsconfig.json` (criado)
|
||||||
|
- `/tailwind.config.ts` (criado)
|
||||||
|
- `/.env.example` (criado)
|
||||||
|
- `/src/app/layout.tsx` (criado)
|
||||||
|
- `/src/app/page.tsx` (criado)
|
||||||
|
- `/src/app/globals.css` (criado)
|
||||||
|
- `/src/server/db/client.ts` (criado)
|
||||||
|
- Estrutura completa de pastas em `/src/` (criada)
|
||||||
|
- `/docs/16_DECISIONS_LOG.md` (atualizado)
|
||||||
|
|
||||||
|
## Última atualização
|
||||||
|
2026-04-21 - Schema Prisma validado, estrutura técnica completa criada, projeto pronto para instalação de dependências e início de desenvolvimento do MVP.
|
||||||
91
docs/18_AGENT_HANDOFF.md
Normal file
91
docs/18_AGENT_HANDOFF.md
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# Agent Handoff
|
||||||
|
|
||||||
|
## Ler primeiro
|
||||||
|
Antes de produzir qualquer código ou proposta, ler obrigatoriamente:
|
||||||
|
1. `00_PROJECT_BRIEF.md`
|
||||||
|
2. `03_PROBLEM_STATEMENT.md`
|
||||||
|
3. `04_PRODUCT_GOALS.md`
|
||||||
|
4. `05_USER_WORKFLOWS.md`
|
||||||
|
5. `08_DOMAIN_MODEL.md`
|
||||||
|
6. `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
7. `10_MVP_DEFINITION.md`
|
||||||
|
8. `16_DECISIONS_LOG.md`
|
||||||
|
9. `17_PROGRESS.md`
|
||||||
|
10. `19_TECH_STACK.md`
|
||||||
|
11. `20_PROJECT_STRUCTURE.md`
|
||||||
|
12. `21_ENGINEERING_GUIDELINES.md`
|
||||||
|
13. `DOC_INDEX.md` (índice completo da documentação)
|
||||||
|
|
||||||
|
## Fonte de verdade
|
||||||
|
As decisões do projeto estão documentadas em:
|
||||||
|
- `16_DECISIONS_LOG.md`
|
||||||
|
- `10_MVP_DEFINITION.md`
|
||||||
|
- `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
- `19_TECH_STACK.md`
|
||||||
|
- `20_PROJECT_STRUCTURE.md`
|
||||||
|
- `prisma/schema.prisma` (schema inicial criado)
|
||||||
|
|
||||||
|
## Regras para o agente
|
||||||
|
- Não inventar funcionalidades fora do MVP sem sinalização explícita
|
||||||
|
- Não alterar estados do sistema sem registo em `16_DECISIONS_LOG.md`
|
||||||
|
- Não introduzir complexidade desnecessária
|
||||||
|
- Priorizar rapidez operacional e simplicidade de uso
|
||||||
|
- Respeitar a stack escolhida
|
||||||
|
- Não propor backend separado, microserviços ou GraphQL para a V1
|
||||||
|
- Manter separação entre UI, validação, serviços e acesso a dados
|
||||||
|
|
||||||
|
## Objetivo da última iteração
|
||||||
|
Validar tecnicamente o schema.prisma contra a documentação e preparar a base real do projeto para desenvolvimento.
|
||||||
|
|
||||||
|
## O que foi feito
|
||||||
|
- Validado schema Prisma contra documentação completa (domínio, estados, MVP, regras de dados)
|
||||||
|
- Corrigidos problemas de integridade relacional no schema (relação User.createdReceipts, índices StatusHistory)
|
||||||
|
- Criada estrutura completa do projeto Next.js com stack aprovada
|
||||||
|
- Configurado package.json com todas as dependências necessárias
|
||||||
|
- Criados ficheiros de configuração (next.config.js, tsconfig.json, tailwind.config.ts)
|
||||||
|
- Configurado ambiente (.env.example)
|
||||||
|
- Criada estrutura de pastas conforme `20_PROJECT_STRUCTURE.md`
|
||||||
|
- Implementados ficheiros base da aplicação (layout, page, globals.css)
|
||||||
|
- Configurado cliente Prisma inicial
|
||||||
|
|
||||||
|
## Ficheiros alterados nesta iteração
|
||||||
|
- `/prisma/schema.prisma` (validado e corrigido)
|
||||||
|
- `/package.json` (criado)
|
||||||
|
- `/next.config.js` (criado)
|
||||||
|
- `/tsconfig.json` (criado)
|
||||||
|
- `/tailwind.config.ts` (criado)
|
||||||
|
- `/.env.example` (criado)
|
||||||
|
- `/src/app/layout.tsx` (criado)
|
||||||
|
- `/src/app/page.tsx` (criado)
|
||||||
|
- `/src/app/globals.css` (criado)
|
||||||
|
- `/src/server/db/client.ts` (criado)
|
||||||
|
- Estrutura completa de pastas em `/src/` (criada)
|
||||||
|
- `/docs/16_DECISIONS_LOG.md` (atualizado)
|
||||||
|
- `/docs/17_PROGRESS.md` (atualizado)
|
||||||
|
|
||||||
|
## Decisões tomadas
|
||||||
|
- Schema Prisma validado e corrigido para garantir integridade relacional
|
||||||
|
- Estrutura técnica criada seguindo exatamente a stack e convenções definidas
|
||||||
|
- Mantida abordagem de rastreabilidade por unidade conforme documentação
|
||||||
|
- Configurado projeto para desenvolvimento com Next.js 16, TypeScript, Tailwind CSS
|
||||||
|
|
||||||
|
## Limitações e dúvidas
|
||||||
|
- Dependências precisam de ser instaladas para resolver erros TypeScript
|
||||||
|
- Ambiente Supabase precisa de configuração
|
||||||
|
- Fluxo de imagens e storage ainda não definido
|
||||||
|
- Modelação futura de integração com plataformas pendente
|
||||||
|
|
||||||
|
## Próxima missão sugerida
|
||||||
|
Finalizar setup técnico e iniciar desenvolvimento:
|
||||||
|
1. Instalar dependências do projeto (npm install)
|
||||||
|
2. Configurar ambiente Supabase
|
||||||
|
3. Implementar primeira migration Prisma
|
||||||
|
4. Testar configuração base da aplicação
|
||||||
|
5. Iniciar desenvolvimento da primeira feature (suppliers)
|
||||||
|
|
||||||
|
## Riscos e cuidados especiais
|
||||||
|
- Instalar dependências antes de prosseguir com desenvolvimento
|
||||||
|
- Configurar Supabase corretamente para evitar problemas de conexão
|
||||||
|
- Manter foco no MVP definido, evitar funcionalidades fora do âmbito
|
||||||
|
- Seguir rigorosamente a estrutura de pastas e convenções estabelecidas
|
||||||
|
- Testar migrations Prisma antes de implementar funcionalidades
|
||||||
103
docs/19_TECH_STACK.md
Normal file
103
docs/19_TECH_STACK.md
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
# Tech Stack
|
||||||
|
|
||||||
|
## Stack selecionada
|
||||||
|
|
||||||
|
### Aplicação
|
||||||
|
- Next.js 16
|
||||||
|
- React
|
||||||
|
- TypeScript
|
||||||
|
|
||||||
|
### Estilo e UI
|
||||||
|
- Tailwind CSS
|
||||||
|
- shadcn/ui
|
||||||
|
- Lucide Icons
|
||||||
|
|
||||||
|
### Dados e backend
|
||||||
|
- PostgreSQL
|
||||||
|
- Prisma ORM
|
||||||
|
- Zod
|
||||||
|
- React Hook Form
|
||||||
|
|
||||||
|
### Plataforma e serviços
|
||||||
|
- Supabase Database
|
||||||
|
- Supabase Auth
|
||||||
|
- Supabase Storage
|
||||||
|
|
||||||
|
### Deploy recomendado
|
||||||
|
- Vercel para a aplicação web
|
||||||
|
- Supabase para base de dados, autenticação e ficheiros
|
||||||
|
|
||||||
|
## Justificação da stack
|
||||||
|
A stack foi escolhida para maximizar:
|
||||||
|
- rapidez de desenvolvimento
|
||||||
|
- simplicidade arquitetural
|
||||||
|
- boa legibilidade para agentes de IA
|
||||||
|
- facilidade de manutenção
|
||||||
|
- boa experiência para construir dashboards, formulários, listagens e workflows operacionais
|
||||||
|
|
||||||
|
## Princípios da arquitetura técnica
|
||||||
|
- Uma única codebase full-stack
|
||||||
|
- Frontend e backend no mesmo projeto
|
||||||
|
- Regras de negócio isoladas da camada visual
|
||||||
|
- Base de dados relacional como fonte de verdade
|
||||||
|
- Validação partilhada e explícita
|
||||||
|
- Preparação para crescer sem reescrever a base
|
||||||
|
|
||||||
|
## Decisões associadas
|
||||||
|
- Não usar backend separado na V1
|
||||||
|
- Não usar microserviços na V1
|
||||||
|
- Não usar GraphQL na V1
|
||||||
|
- Não desenvolver app mobile nativa na V1
|
||||||
|
|
||||||
|
## Componentes por responsabilidade
|
||||||
|
|
||||||
|
### Next.js
|
||||||
|
Responsável por:
|
||||||
|
- interface da aplicação
|
||||||
|
- routing
|
||||||
|
- páginas
|
||||||
|
- server components
|
||||||
|
- route handlers
|
||||||
|
- server actions, quando fizer sentido
|
||||||
|
|
||||||
|
### Prisma
|
||||||
|
Responsável por:
|
||||||
|
- schema de dados
|
||||||
|
- migrations
|
||||||
|
- acesso type-safe à base de dados
|
||||||
|
|
||||||
|
### PostgreSQL
|
||||||
|
Responsável por:
|
||||||
|
- persistência principal
|
||||||
|
- integridade relacional
|
||||||
|
- consultas operacionais e relatórios simples
|
||||||
|
|
||||||
|
### Supabase
|
||||||
|
Responsável por:
|
||||||
|
- alojamento da base de dados PostgreSQL
|
||||||
|
- autenticação base
|
||||||
|
- storage para ficheiros e imagens, quando ativado
|
||||||
|
|
||||||
|
### Tailwind + shadcn/ui
|
||||||
|
Responsáveis por:
|
||||||
|
- consistência visual
|
||||||
|
- rapidez na criação de UI
|
||||||
|
- componentes reutilizáveis
|
||||||
|
|
||||||
|
### Zod + React Hook Form
|
||||||
|
Responsáveis por:
|
||||||
|
- validação
|
||||||
|
- formulários previsíveis
|
||||||
|
- redução de erros de input
|
||||||
|
|
||||||
|
## Dependências candidatas adicionais
|
||||||
|
- TanStack Table para tabelas operacionais
|
||||||
|
- date-fns para datas
|
||||||
|
- clsx / tailwind-merge para composição de classes
|
||||||
|
|
||||||
|
## Itens adiados
|
||||||
|
- filas assíncronas
|
||||||
|
- Redis
|
||||||
|
- serviços de eventos
|
||||||
|
- arquitetura multi-tenant
|
||||||
|
- monitorização avançada
|
||||||
162
docs/20_PROJECT_STRUCTURE.md
Normal file
162
docs/20_PROJECT_STRUCTURE.md
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
# Project Structure
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
Definir uma estrutura de projeto clara, previsível e adequada a desenvolvimento assistido por agentes de IA.
|
||||||
|
|
||||||
|
## Estrutura de alto nível
|
||||||
|
|
||||||
|
```text
|
||||||
|
app/
|
||||||
|
components/
|
||||||
|
features/
|
||||||
|
lib/
|
||||||
|
server/
|
||||||
|
prisma/
|
||||||
|
docs/
|
||||||
|
public/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Estrutura recomendada detalhada
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/
|
||||||
|
app/
|
||||||
|
(dashboard)/
|
||||||
|
api/
|
||||||
|
login/
|
||||||
|
layout.tsx
|
||||||
|
page.tsx
|
||||||
|
|
||||||
|
components/
|
||||||
|
ui/
|
||||||
|
shared/
|
||||||
|
layout/
|
||||||
|
tables/
|
||||||
|
forms/
|
||||||
|
status/
|
||||||
|
|
||||||
|
features/
|
||||||
|
suppliers/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
purchase-orders/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
receipts/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
inventory/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
listings/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
sales/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
shipments/
|
||||||
|
components/
|
||||||
|
actions/
|
||||||
|
schemas/
|
||||||
|
utils/
|
||||||
|
dashboard/
|
||||||
|
components/
|
||||||
|
queries/
|
||||||
|
utils/
|
||||||
|
|
||||||
|
lib/
|
||||||
|
auth/
|
||||||
|
utils/
|
||||||
|
constants/
|
||||||
|
validators/
|
||||||
|
|
||||||
|
server/
|
||||||
|
db/
|
||||||
|
client.ts
|
||||||
|
repositories/
|
||||||
|
services/
|
||||||
|
queries/
|
||||||
|
permissions/
|
||||||
|
audit/
|
||||||
|
|
||||||
|
prisma/
|
||||||
|
schema.prisma
|
||||||
|
migrations/
|
||||||
|
seeds/
|
||||||
|
|
||||||
|
docs/
|
||||||
|
*.md
|
||||||
|
|
||||||
|
public/
|
||||||
|
images/
|
||||||
|
icons/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras de organização
|
||||||
|
- `app/` contém rotas, layouts e entry points do Next.js
|
||||||
|
- `components/` contém componentes reutilizáveis sem lógica de negócio forte
|
||||||
|
- `features/` organiza a aplicação por domínio funcional
|
||||||
|
- `server/` concentra lógica do lado do servidor
|
||||||
|
- `prisma/` concentra schema, migrations e seeds
|
||||||
|
- `docs/` contém a documentação do projeto
|
||||||
|
|
||||||
|
## Padrão por feature
|
||||||
|
Cada feature deve, idealmente, conter:
|
||||||
|
- `components/`
|
||||||
|
- `actions/`
|
||||||
|
- `schemas/`
|
||||||
|
- `utils/`
|
||||||
|
|
||||||
|
Opcionalmente:
|
||||||
|
- `queries/`
|
||||||
|
- `types/`
|
||||||
|
- `tests/`
|
||||||
|
|
||||||
|
## Separação recomendada de responsabilidades
|
||||||
|
|
||||||
|
### UI
|
||||||
|
Componentes visuais, tabelas, formulários, badges, cards, filtros.
|
||||||
|
|
||||||
|
### Actions / handlers
|
||||||
|
Entradas da aplicação para mutações e operações ligadas ao utilizador.
|
||||||
|
|
||||||
|
### Schemas
|
||||||
|
Validação com Zod.
|
||||||
|
|
||||||
|
### Services
|
||||||
|
Regras de negócio e fluxos operacionais.
|
||||||
|
|
||||||
|
### Repositories
|
||||||
|
Acesso aos dados e queries Prisma.
|
||||||
|
|
||||||
|
### Queries
|
||||||
|
Leituras complexas e agregações para dashboard e listagens.
|
||||||
|
|
||||||
|
## Convenções de naming
|
||||||
|
- kebab-case para nomes de pastas de features
|
||||||
|
- PascalCase para componentes React
|
||||||
|
- camelCase para funções e variáveis
|
||||||
|
- nomes explícitos e orientados ao domínio
|
||||||
|
- evitar abreviações ambíguas
|
||||||
|
|
||||||
|
## Estrutura inicial mínima da V1
|
||||||
|
- auth
|
||||||
|
- suppliers
|
||||||
|
- purchase-orders
|
||||||
|
- receipts
|
||||||
|
- inventory
|
||||||
|
- sales
|
||||||
|
- shipments
|
||||||
|
- dashboard
|
||||||
66
docs/21_ENGINEERING_GUIDELINES.md
Normal file
66
docs/21_ENGINEERING_GUIDELINES.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Engineering Guidelines
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
Garantir consistência técnica no desenvolvimento com agentes de IA e reduzir deriva arquitetural entre sessões.
|
||||||
|
|
||||||
|
## Regras gerais
|
||||||
|
- Usar TypeScript em todo o projeto
|
||||||
|
- Preferir server-side validation para mutações críticas
|
||||||
|
- Manter regras de negócio fora dos componentes visuais
|
||||||
|
- Manter o domínio explícito e nomeado
|
||||||
|
- Evitar abstrações prematuras
|
||||||
|
|
||||||
|
## Backend dentro do Next.js
|
||||||
|
Na V1, o backend deve viver dentro do projeto Next.js.
|
||||||
|
|
||||||
|
Usar:
|
||||||
|
- Route Handlers quando for necessário expor endpoints
|
||||||
|
- Server Actions quando fizer sentido para mutações simples ligadas à UI
|
||||||
|
- camada `server/services` para regras de negócio
|
||||||
|
- camada `server/repositories` para acesso aos dados
|
||||||
|
|
||||||
|
## Prisma
|
||||||
|
- Modelar entidades do domínio com nomes claros
|
||||||
|
- Usar migrations versionadas
|
||||||
|
- Evitar queries complexas diretamente em componentes
|
||||||
|
- Centralizar acesso à base de dados em repositórios ou queries server-side
|
||||||
|
|
||||||
|
## Validação
|
||||||
|
- Usar Zod para validar inputs e payloads
|
||||||
|
- Reutilizar schemas entre UI e servidor quando fizer sentido
|
||||||
|
- Nunca confiar apenas na validação do cliente
|
||||||
|
|
||||||
|
## UI
|
||||||
|
- Usar Tailwind CSS
|
||||||
|
- Usar shadcn/ui como base de componentes
|
||||||
|
- Criar componentes reutilizáveis para estados, tabelas, filtros e formulários
|
||||||
|
- Priorizar rapidez operacional sobre efeitos visuais
|
||||||
|
|
||||||
|
## Estado e dados
|
||||||
|
- Preferir dados carregados no servidor
|
||||||
|
- Evitar estado global desnecessário na V1
|
||||||
|
- Só introduzir state management adicional se surgir necessidade clara
|
||||||
|
|
||||||
|
## Segurança
|
||||||
|
- Usar Supabase Auth para autenticação base
|
||||||
|
- Proteger rotas privadas
|
||||||
|
- Gerir segredos por `.env`
|
||||||
|
- Não expor chaves sensíveis no cliente
|
||||||
|
|
||||||
|
## Storage
|
||||||
|
- Usar Supabase Storage apenas quando a funcionalidade de imagens/anexos estiver confirmada
|
||||||
|
- Definir políticas mínimas de acesso antes de ativar uploads reais
|
||||||
|
|
||||||
|
## Qualidade de código
|
||||||
|
- Cada feature deve ser desenvolvida com documentação mínima
|
||||||
|
- Atualizar `16_DECISIONS_LOG.md` quando houver decisões relevantes
|
||||||
|
- Atualizar `17_PROGRESS.md` no fim de marcos importantes
|
||||||
|
- Atualizar `18_AGENT_HANDOFF.md` no fim de cada sessão relevante
|
||||||
|
|
||||||
|
## O que evitar
|
||||||
|
- microserviços
|
||||||
|
- backend separado na V1
|
||||||
|
- GraphQL
|
||||||
|
- lógica de negócio espalhada por componentes
|
||||||
|
- modelos demasiado genéricos
|
||||||
|
- dependências pesadas sem necessidade clara
|
||||||
64
docs/DOC_INDEX.md
Normal file
64
docs/DOC_INDEX.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# Documentation Index
|
||||||
|
|
||||||
|
## Core Project Documentation
|
||||||
|
|
||||||
|
| File | Path | Purpose | Status |
|
||||||
|
|------|------|---------|---------|
|
||||||
|
| Project Brief | `00_PROJECT_BRIEF.md` | High-level project overview | **Active** |
|
||||||
|
| Vision and Scope | `01_VISION_AND_SCOPE.md` | Product vision and boundaries | **Active** |
|
||||||
|
| Business Context | `02_BUSINESS_CONTEXT.md` | Business environment and constraints | **Active** |
|
||||||
|
| Problem Statement | `03_PROBLEM_STATEMENT.md` | Core problem being solved | **Active** |
|
||||||
|
| Product Goals | `04_PRODUCT_GOALS.md` | Success criteria and objectives | **Active** |
|
||||||
|
| User Workflows | `05_USER_WORKFLOWS.md` | User journey and interactions | **Active** |
|
||||||
|
| Functional Requirements | `06_FUNCTIONAL_REQUIREMENTS.md` | System functionality specifications | **Active** |
|
||||||
|
| Non-Functional Requirements | `07_NON_FUNCTIONAL_REQUIREMENTS.md` | Performance, security, etc. | **Active** |
|
||||||
|
| Domain Model | `08_DOMAIN_MODEL.md` | Core entities and relationships | **Active** |
|
||||||
|
| States and Lifecycles | `09_STATES_AND_LIFECYCLES.md` | System states and transitions | **Active** |
|
||||||
|
| MVP Definition | `10_MVP_DEFINITION.md` | Minimum viable product scope | **Active** |
|
||||||
|
| Roadmap | `11_ROADMAP.md` | Development timeline and phases | **Active** |
|
||||||
|
| UI/UX Principles | `12_UI_UX_PRINCIPLES.md` | Design guidelines and principles | **Active** |
|
||||||
|
| Data Rules | `13_DATA_RULES.md` | Data validation and constraints | **Active** |
|
||||||
|
| Automation Opportunities | `14_AUTOMATION_OPPORTUNITIES.md` | Potential automation areas | **Active** |
|
||||||
|
| Open Questions | `15_OPEN_QUESTIONS.md` | Unresolved issues and decisions | **Active** |
|
||||||
|
| Decisions Log | `16_DECISIONS_LOG.md` | Historical decisions and rationale | **Active** |
|
||||||
|
| Progress | `17_PROGRESS.md` | Current project status and achievements | **Active** |
|
||||||
|
| Agent Handoff | `18_AGENT_HANDOFF.md` | Session handoff information | **Active** |
|
||||||
|
| Tech Stack | `19_TECH_STACK.md` | Technology choices and architecture | **Active** |
|
||||||
|
| Project Structure | `20_PROJECT_STRUCTURE.md` | Code organization and layout | **Active** |
|
||||||
|
| Engineering Guidelines | `21_ENGINEERING_GUIDELINES.md` | Development standards and practices | **Active** |
|
||||||
|
|
||||||
|
## Agent Prompts
|
||||||
|
|
||||||
|
| File | Path | Purpose | Status |
|
||||||
|
|------|------|---------|---------|
|
||||||
|
| Master Prompt | `prompts/master_prompt.md` | Primary agent instructions | **Active** |
|
||||||
|
| Backend Prompt | `prompts/prompt_backend.md` | Backend development guidelines | **Active** |
|
||||||
|
| Database Prompt | `prompts/prompt_database.md` | Database development guidelines | **Active** |
|
||||||
|
| Frontend Prompt | `prompts/prompt_frontend.md` | Frontend development guidelines | **Active** |
|
||||||
|
| Testing Prompt | `prompts/prompt_testing.md` | Testing strategy and guidelines | **Active** |
|
||||||
|
|
||||||
|
## Required Reading Before Implementation
|
||||||
|
|
||||||
|
The following files are **mandatory** reading before any implementation:
|
||||||
|
|
||||||
|
1. `00_PROJECT_BRIEF.md`
|
||||||
|
2. `01_VISION_AND_SCOPE.md`
|
||||||
|
3. `03_PROBLEM_STATEMENT.md`
|
||||||
|
4. `04_PRODUCT_GOALS.md`
|
||||||
|
5. `05_USER_WORKFLOWS.md`
|
||||||
|
6. `08_DOMAIN_MODEL.md`
|
||||||
|
7. `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
8. `10_MVP_DEFINITION.md`
|
||||||
|
9. `11_ROADMAP.md`
|
||||||
|
10. `13_DATA_RULES.md`
|
||||||
|
11. `16_DECISIONS_LOG.md`
|
||||||
|
12. `17_PROGRESS.md`
|
||||||
|
13. `18_AGENT_HANDOFF.md`
|
||||||
|
14. `19_TECH_STACK.md`
|
||||||
|
15. `20_PROJECT_STRUCTURE.md`
|
||||||
|
16. `21_ENGINEERING_GUIDELINES.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Last updated: 2025-06-17*
|
||||||
|
*Total documentation files: 27*
|
||||||
51
docs/prompts/master_prompt.md
Normal file
51
docs/prompts/master_prompt.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# Master Prompt
|
||||||
|
|
||||||
|
És um agente de desenvolvimento a trabalhar numa aplicação de gestão operacional para revenda de roupa.
|
||||||
|
|
||||||
|
## Objetivo do produto
|
||||||
|
Construir uma aplicação web para gerir:
|
||||||
|
- encomendas ao fornecedor
|
||||||
|
- receção de mercadoria
|
||||||
|
- inventário por estado
|
||||||
|
- preparação para venda
|
||||||
|
- registo manual de vendas
|
||||||
|
- envios pendentes
|
||||||
|
|
||||||
|
## Stack obrigatória
|
||||||
|
- Next.js 16
|
||||||
|
- TypeScript
|
||||||
|
- PostgreSQL
|
||||||
|
- Prisma ORM
|
||||||
|
- Supabase Auth / Database / Storage
|
||||||
|
- Tailwind CSS
|
||||||
|
- shadcn/ui
|
||||||
|
- React Hook Form
|
||||||
|
- Zod
|
||||||
|
|
||||||
|
## Restrições
|
||||||
|
- Não criar backend separado
|
||||||
|
- Não usar microserviços
|
||||||
|
- Não introduzir GraphQL
|
||||||
|
- Não sair do MVP sem sinalização explícita
|
||||||
|
- Priorizar rapidez operacional e simplicidade de uso
|
||||||
|
|
||||||
|
## Documentos fonte de verdade
|
||||||
|
Ler antes de agir:
|
||||||
|
1. `00_PROJECT_BRIEF.md`
|
||||||
|
2. `05_USER_WORKFLOWS.md`
|
||||||
|
3. `08_DOMAIN_MODEL.md`
|
||||||
|
4. `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
5. `10_MVP_DEFINITION.md`
|
||||||
|
6. `16_DECISIONS_LOG.md`
|
||||||
|
7. `17_PROGRESS.md`
|
||||||
|
8. `18_AGENT_HANDOFF.md`
|
||||||
|
9. `19_TECH_STACK.md`
|
||||||
|
10. `20_PROJECT_STRUCTURE.md`
|
||||||
|
11. `21_ENGINEERING_GUIDELINES.md`
|
||||||
|
|
||||||
|
## Forma de trabalhar
|
||||||
|
- Explica o que vais alterar
|
||||||
|
- Faz alterações pequenas e consistentes
|
||||||
|
- Mantém naming claro e orientado ao domínio
|
||||||
|
- Não inventes requisitos
|
||||||
|
- Atualiza documentação relevante quando necessário
|
||||||
19
docs/prompts/prompt_backend.md
Normal file
19
docs/prompts/prompt_backend.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Prompt Backend
|
||||||
|
|
||||||
|
Usa a documentação do projeto como fonte de verdade. O backend deve refletir fielmente:
|
||||||
|
- workflows operacionais
|
||||||
|
- estados definidos
|
||||||
|
- regras de dados
|
||||||
|
- âmbito do MVP
|
||||||
|
|
||||||
|
Prioridades:
|
||||||
|
1. integridade dos estados
|
||||||
|
2. simplicidade do modelo
|
||||||
|
3. rastreabilidade mínima
|
||||||
|
4. API clara para frontend operacional
|
||||||
|
|
||||||
|
Evitar:
|
||||||
|
- abstrações excessivas
|
||||||
|
- microserviços
|
||||||
|
- complexidade desnecessária
|
||||||
|
- funcionalidades fora do MVP
|
||||||
13
docs/prompts/prompt_database.md
Normal file
13
docs/prompts/prompt_database.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Prompt Database
|
||||||
|
|
||||||
|
Modela a base de dados de acordo com:
|
||||||
|
- `08_DOMAIN_MODEL.md`
|
||||||
|
- `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
- `13_DATA_RULES.md`
|
||||||
|
- `10_MVP_DEFINITION.md`
|
||||||
|
|
||||||
|
Prioridades:
|
||||||
|
- integridade referencial
|
||||||
|
- consistência entre encomendas, receções, inventário, vendas e envios
|
||||||
|
- suporte a histórico mínimo de estados
|
||||||
|
- modelo simples e sustentável para MVP
|
||||||
15
docs/prompts/prompt_frontend.md
Normal file
15
docs/prompts/prompt_frontend.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Prompt Frontend
|
||||||
|
|
||||||
|
Usa a documentação do projeto como fonte de verdade. O frontend deve ser extremamente simples, rápido e orientado a tarefas.
|
||||||
|
|
||||||
|
Prioridades:
|
||||||
|
1. dashboard claro
|
||||||
|
2. fluxos operacionais com poucos cliques
|
||||||
|
3. estados visuais evidentes
|
||||||
|
4. formulários curtos
|
||||||
|
5. filtros rápidos
|
||||||
|
|
||||||
|
Evitar:
|
||||||
|
- interfaces demasiado densas
|
||||||
|
- navegação complexa
|
||||||
|
- elementos decorativos sem valor operacional
|
||||||
16
docs/prompts/prompt_testing.md
Normal file
16
docs/prompts/prompt_testing.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Prompt Testing
|
||||||
|
|
||||||
|
Cria testes com base nos workflows e regras do projeto.
|
||||||
|
|
||||||
|
Prioridades:
|
||||||
|
- receção parcial de encomendas
|
||||||
|
- controlo de stock por estado
|
||||||
|
- prevenção de dupla disponibilidade
|
||||||
|
- transições de estado válidas
|
||||||
|
- vendas pendentes de envio
|
||||||
|
- consistência entre venda e envio
|
||||||
|
|
||||||
|
Fonte de verdade:
|
||||||
|
- `05_USER_WORKFLOWS.md`
|
||||||
|
- `09_STATES_AND_LIFECYCLES.md`
|
||||||
|
- `13_DATA_RULES.md`
|
||||||
17
next.config.js
Normal file
17
next.config.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {
|
||||||
|
experimental: {
|
||||||
|
serverComponentsExternalPackages: ['@supabase/supabase-js'],
|
||||||
|
},
|
||||||
|
images: {
|
||||||
|
domains: ['localhost'],
|
||||||
|
remotePatterns: [
|
||||||
|
{
|
||||||
|
protocol: 'https',
|
||||||
|
hostname: '**.supabase.co',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = nextConfig
|
||||||
51
package.json
Normal file
51
package.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"name": "millions",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start",
|
||||||
|
"lint": "next lint",
|
||||||
|
"db:generate": "prisma generate",
|
||||||
|
"db:push": "prisma db push",
|
||||||
|
"db:migrate": "prisma migrate dev",
|
||||||
|
"db:studio": "prisma studio",
|
||||||
|
"db:seed": "tsx prisma/seed.ts"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"next": "16.2.4",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-dom": "^18.3.1",
|
||||||
|
"@prisma/client": "^6.2.1",
|
||||||
|
"prisma": "^6.2.1",
|
||||||
|
"@supabase/supabase-js": "^2.48.0",
|
||||||
|
"@supabase/auth-helpers-nextjs": "^0.10.0",
|
||||||
|
"react-hook-form": "^7.54.2",
|
||||||
|
"@hookform/resolvers": "^3.10.0",
|
||||||
|
"zod": "^3.24.1",
|
||||||
|
"clsx": "^2.1.1",
|
||||||
|
"tailwind-merge": "^2.6.0",
|
||||||
|
"class-variance-authority": "^0.7.1",
|
||||||
|
"lucide-react": "^0.468.0",
|
||||||
|
"@radix-ui/react-dialog": "^1.1.3",
|
||||||
|
"@radix-ui/react-dropdown-menu": "^2.1.3",
|
||||||
|
"@radix-ui/react-label": "^2.1.1",
|
||||||
|
"@radix-ui/react-select": "^2.1.3",
|
||||||
|
"@radix-ui/react-slot": "^1.1.1",
|
||||||
|
"@radix-ui/react-toast": "^1.2.3",
|
||||||
|
"@radix-ui/react-table": "^1.1.1",
|
||||||
|
"date-fns": "^4.1.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^5.7.2",
|
||||||
|
"@types/node": "^22.10.5",
|
||||||
|
"@types/react": "^18.3.17",
|
||||||
|
"@types/react-dom": "^18.3.5",
|
||||||
|
"postcss": "^8.5.1",
|
||||||
|
"tailwindcss": "^3.4.17",
|
||||||
|
"eslint": "^8.57.1",
|
||||||
|
"eslint-config-next": "16.2.4",
|
||||||
|
"tsx": "^4.19.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
317
prisma/schema.prisma
Normal file
317
prisma/schema.prisma
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
// This is your Prisma schema file,
|
||||||
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||||||
|
|
||||||
|
generator client {
|
||||||
|
provider = "prisma-client-js"
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource db {
|
||||||
|
provider = "postgresql"
|
||||||
|
url = env("DATABASE_URL")
|
||||||
|
}
|
||||||
|
|
||||||
|
// User represents the authenticated user of the application
|
||||||
|
// In V1 there may be only one admin user, but the model allows for future growth
|
||||||
|
model User {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
email String @unique
|
||||||
|
name String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
receipts Receipt[]
|
||||||
|
createdReceipts Receipt[] @relation("ReceiptCreatedBy")
|
||||||
|
statusHistories StatusHistory[]
|
||||||
|
|
||||||
|
@@map("users")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Supplier represents a clothing supplier
|
||||||
|
model Supplier {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String
|
||||||
|
contactName String? @map("contact_name")
|
||||||
|
email String?
|
||||||
|
phone String?
|
||||||
|
notes String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
purchaseOrders PurchaseOrder[]
|
||||||
|
|
||||||
|
@@map("suppliers")
|
||||||
|
}
|
||||||
|
|
||||||
|
// PurchaseOrder represents an order placed with a supplier
|
||||||
|
model PurchaseOrder {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
supplierId String @map("supplier_id")
|
||||||
|
externalReference String? @map("external_reference")
|
||||||
|
status PurchaseOrderStatus @default(DRAFT)
|
||||||
|
orderedAt DateTime @map("ordered_at")
|
||||||
|
expectedAt DateTime? @map("expected_at")
|
||||||
|
notes String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
supplier Supplier @relation(fields: [supplierId], references: [id], onDelete: RESTRICT)
|
||||||
|
purchaseOrderItems PurchaseOrderItem[]
|
||||||
|
receipts Receipt[]
|
||||||
|
inventoryUnits InventoryUnit[]
|
||||||
|
|
||||||
|
@@map("purchase_orders")
|
||||||
|
}
|
||||||
|
|
||||||
|
// PurchaseOrderItem represents a line item in a purchase order
|
||||||
|
model PurchaseOrderItem {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
purchaseOrderId String @map("purchase_order_id")
|
||||||
|
productModelId String @map("product_model_id")
|
||||||
|
variantLabel String? @map("variant_label")
|
||||||
|
size String?
|
||||||
|
color String?
|
||||||
|
skuSupplier String? @map("sku_supplier")
|
||||||
|
quantityOrdered Int @map("quantity_ordered")
|
||||||
|
unitCost Decimal @map("unit_cost") @db.Decimal(10, 2)
|
||||||
|
notes String?
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
purchaseOrder PurchaseOrder @relation(fields: [purchaseOrderId], references: [id], onDelete: CASCADE)
|
||||||
|
productModel ProductModel @relation(fields: [productModelId], references: [id], onDelete: RESTRICT)
|
||||||
|
receiptItems ReceiptItem[]
|
||||||
|
|
||||||
|
@@map("purchase_order_items")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Receipt represents a merchandise receipt event related to a purchase order
|
||||||
|
model Receipt {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
purchaseOrderId String @map("purchase_order_id")
|
||||||
|
receiptDate DateTime @map("receipt_date")
|
||||||
|
status ReceiptStatus @default(PENDING)
|
||||||
|
notes String?
|
||||||
|
createdBy String @map("created_by")
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
purchaseOrder PurchaseOrder @relation(fields: [purchaseOrderId], references: [id], onDelete: CASCADE)
|
||||||
|
createdByUser User @relation(fields: [createdBy], references: [id], onDelete: RESTRICT)
|
||||||
|
receiptItems ReceiptItem[]
|
||||||
|
inventoryUnits InventoryUnit[]
|
||||||
|
|
||||||
|
@@map("receipts")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReceiptItem represents the quantity received of each purchase order line
|
||||||
|
model ReceiptItem {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
receiptId String @map("receipt_id")
|
||||||
|
purchaseOrderItemId String @map("purchase_order_item_id")
|
||||||
|
quantityReceived Int @map("quantity_received")
|
||||||
|
quantityRejected Int @default(0) @map("quantity_rejected")
|
||||||
|
discrepancyNote String? @map("discrepancy_note")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
receipt Receipt @relation(fields: [receiptId], references: [id], onDelete: CASCADE)
|
||||||
|
purchaseOrderItem PurchaseOrderItem @relation(fields: [purchaseOrderItemId], references: [id], onDelete: CASCADE)
|
||||||
|
inventoryUnits InventoryUnit[]
|
||||||
|
|
||||||
|
@@map("receipt_items")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProductModel represents the commercial article or model
|
||||||
|
model ProductModel {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String
|
||||||
|
brand String?
|
||||||
|
category String?
|
||||||
|
defaultSize String? @map("default_size")
|
||||||
|
defaultColor String? @map("default_color")
|
||||||
|
internalSku String? @map("internal_sku")
|
||||||
|
supplierSku String? @map("supplier_sku")
|
||||||
|
notes String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
purchaseOrderItems PurchaseOrderItem[]
|
||||||
|
inventoryUnits InventoryUnit[]
|
||||||
|
|
||||||
|
@@map("product_models")
|
||||||
|
}
|
||||||
|
|
||||||
|
// InventoryUnit represents a concrete or logical traceable unit in inventory
|
||||||
|
// V1 should favor unit-level traceability whenever possible
|
||||||
|
model InventoryUnit {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
productModelId String @map("product_model_id")
|
||||||
|
purchaseOrderId String @map("purchase_order_id")
|
||||||
|
receiptItemId String? @map("receipt_item_id")
|
||||||
|
inventoryStatus InventoryStatus @default(RECEIVED)
|
||||||
|
condition String?
|
||||||
|
storageLocation String? @map("storage_location")
|
||||||
|
costPrice Decimal @map("cost_price") @db.Decimal(10, 2)
|
||||||
|
readyForListingAt DateTime? @map("ready_for_listing_at")
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
productModel ProductModel @relation(fields: [productModelId], references: [id], onDelete: RESTRICT)
|
||||||
|
purchaseOrder PurchaseOrder @relation(fields: [purchaseOrderId], references: [id], onDelete: RESTRICT)
|
||||||
|
receiptItem ReceiptItem? @relation(fields: [receiptItemId], references: [id], onDelete: SET NULL)
|
||||||
|
listing Listing?
|
||||||
|
sale Sale?
|
||||||
|
|
||||||
|
@@map("inventory_units")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listing represents a published or prepared advertisement
|
||||||
|
model Listing {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
inventoryUnitId String @map("inventory_unit_id")
|
||||||
|
platform String?
|
||||||
|
externalReference String? @map("external_reference")
|
||||||
|
listingStatus ListingStatus @default(DRAFT)
|
||||||
|
listedPrice Decimal? @map("listed_price") @db.Decimal(10, 2)
|
||||||
|
listedAt DateTime? @map("listed_at")
|
||||||
|
url String?
|
||||||
|
notes String?
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
inventoryUnit InventoryUnit @relation(fields: [inventoryUnitId], references: [id], onDelete: CASCADE)
|
||||||
|
|
||||||
|
@@map("listings")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Customer represents the buyer associated with a sale
|
||||||
|
model Customer {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String
|
||||||
|
platformUsername String? @map("platform_username")
|
||||||
|
shippingName String? @map("shipping_name")
|
||||||
|
shippingAddress String? @map("shipping_address")
|
||||||
|
phone String?
|
||||||
|
email String?
|
||||||
|
notes String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
sales Sale[]
|
||||||
|
|
||||||
|
@@map("customers")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sale represents the sale of a unit or article
|
||||||
|
model Sale {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
inventoryUnitId String @map("inventory_unit_id")
|
||||||
|
customerId String @map("customer_id")
|
||||||
|
saleChannel String? @map("sale_channel")
|
||||||
|
saleStatus SaleStatus @default(DRAFT)
|
||||||
|
salePrice Decimal @map("sale_price") @db.Decimal(10, 2)
|
||||||
|
soldAt DateTime @map("sold_at")
|
||||||
|
notes String?
|
||||||
|
createdAt DateTime @default(now()) @map("created_at")
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
inventoryUnit InventoryUnit @relation(fields: [inventoryUnitId], references: [id], onDelete: RESTRICT)
|
||||||
|
customer Customer @relation(fields: [customerId], references: [id], onDelete: RESTRICT)
|
||||||
|
shipment Shipment?
|
||||||
|
|
||||||
|
@@map("sales")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shipment represents the shipping associated with a sale
|
||||||
|
model Shipment {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
saleId String @map("sale_id")
|
||||||
|
shipmentStatus ShipmentStatus @default(NOT_STARTED)
|
||||||
|
shippedAt DateTime? @map("shipped_at")
|
||||||
|
trackingCode String? @map("tracking_code")
|
||||||
|
carrier String?
|
||||||
|
labelReference String? @map("label_reference")
|
||||||
|
notes String?
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
sale Sale @relation(fields: [saleId], references: [id], onDelete: CASCADE)
|
||||||
|
|
||||||
|
@@map("shipments")
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatusHistory represents the history of relevant status transitions
|
||||||
|
model StatusHistory {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
entityType String @map("entity_type")
|
||||||
|
entityId String @map("entity_id")
|
||||||
|
fromStatus String? @map("from_status")
|
||||||
|
toStatus String @map("to_status")
|
||||||
|
changedBy String @map("changed_by")
|
||||||
|
changedAt DateTime @default(now()) @map("changed_at")
|
||||||
|
note String?
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
user User @relation(fields: [changedBy], references: [id], onDelete: RESTRICT)
|
||||||
|
|
||||||
|
@@index([entityType, entityId])
|
||||||
|
@@index([changedAt])
|
||||||
|
@@map("status_histories")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enums for status fields
|
||||||
|
enum PurchaseOrderStatus {
|
||||||
|
DRAFT
|
||||||
|
ORDERED
|
||||||
|
PARTIALLY_RECEIVED
|
||||||
|
RECEIVED
|
||||||
|
CLOSED
|
||||||
|
CANCELLED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ReceiptStatus {
|
||||||
|
PENDING
|
||||||
|
IN_PROGRESS
|
||||||
|
COMPLETED
|
||||||
|
COMPLETED_WITH_DISCREPANCIES
|
||||||
|
}
|
||||||
|
|
||||||
|
enum InventoryStatus {
|
||||||
|
ORDERED
|
||||||
|
RECEIVED
|
||||||
|
REGISTERED
|
||||||
|
READY_FOR_LISTING
|
||||||
|
LISTED
|
||||||
|
RESERVED
|
||||||
|
SOLD
|
||||||
|
PENDING_SHIPMENT
|
||||||
|
SHIPPED
|
||||||
|
COMPLETED
|
||||||
|
BLOCKED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ListingStatus {
|
||||||
|
DRAFT
|
||||||
|
PUBLISHED
|
||||||
|
SOLD
|
||||||
|
REMOVED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SaleStatus {
|
||||||
|
DRAFT
|
||||||
|
CONFIRMED
|
||||||
|
PENDING_SHIPMENT
|
||||||
|
SHIPPED
|
||||||
|
COMPLETED
|
||||||
|
CANCELLED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ShipmentStatus {
|
||||||
|
NOT_STARTED
|
||||||
|
PENDING
|
||||||
|
SHIPPED
|
||||||
|
DELIVERED
|
||||||
|
ISSUE
|
||||||
|
}
|
||||||
59
src/app/globals.css
Normal file
59
src/app/globals.css
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
:root {
|
||||||
|
--background: 0 0% 100%;
|
||||||
|
--foreground: 222.2 84% 4.9%;
|
||||||
|
--card: 0 0% 100%;
|
||||||
|
--card-foreground: 222.2 84% 4.9%;
|
||||||
|
--popover: 0 0% 100%;
|
||||||
|
--popover-foreground: 222.2 84% 4.9%;
|
||||||
|
--primary: 222.2 47.4% 11.2%;
|
||||||
|
--primary-foreground: 210 40% 98%;
|
||||||
|
--secondary: 210 40% 96%;
|
||||||
|
--secondary-foreground: 222.2 84% 4.9%;
|
||||||
|
--muted: 210 40% 96%;
|
||||||
|
--muted-foreground: 215.4 16.3% 46.9%;
|
||||||
|
--accent: 210 40% 96%;
|
||||||
|
--accent-foreground: 222.2 84% 4.9%;
|
||||||
|
--destructive: 0 84.2% 60.2%;
|
||||||
|
--destructive-foreground: 210 40% 98%;
|
||||||
|
--border: 214.3 31.8% 91.4%;
|
||||||
|
--input: 214.3 31.8% 91.4%;
|
||||||
|
--ring: 222.2 84% 4.9%;
|
||||||
|
--radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--background: 222.2 84% 4.9%;
|
||||||
|
--foreground: 210 40% 98%;
|
||||||
|
--card: 222.2 84% 4.9%;
|
||||||
|
--card-foreground: 210 40% 98%;
|
||||||
|
--popover: 222.2 84% 4.9%;
|
||||||
|
--popover-foreground: 210 40% 98%;
|
||||||
|
--primary: 210 40% 98%;
|
||||||
|
--primary-foreground: 222.2 47.4% 11.2%;
|
||||||
|
--secondary: 217.2 32.6% 17.5%;
|
||||||
|
--secondary-foreground: 210 40% 98%;
|
||||||
|
--muted: 217.2 32.6% 17.5%;
|
||||||
|
--muted-foreground: 215 20.2% 65.1%;
|
||||||
|
--accent: 217.2 32.6% 17.5%;
|
||||||
|
--accent-foreground: 210 40% 98%;
|
||||||
|
--destructive: 0 62.8% 30.6%;
|
||||||
|
--destructive-foreground: 210 40% 98%;
|
||||||
|
--border: 217.2 32.6% 17.5%;
|
||||||
|
--input: 217.2 32.6% 17.5%;
|
||||||
|
--ring: 212.7 26.8% 83.9%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
* {
|
||||||
|
@apply border-border;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
@apply bg-background text-foreground;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/app/layout.tsx
Normal file
22
src/app/layout.tsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import type { Metadata } from 'next'
|
||||||
|
import { Inter } from 'next/font/google'
|
||||||
|
import './globals.css'
|
||||||
|
|
||||||
|
const inter = Inter({ subsets: ['latin'] })
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'Millions - Gestão Operacional de Revenda',
|
||||||
|
description: 'Aplicação de gestão operacional para revenda de roupa',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html lang="pt">
|
||||||
|
<body className={inter.className}>{children}</body>
|
||||||
|
</html>
|
||||||
|
)
|
||||||
|
}
|
||||||
17
src/app/page.tsx
Normal file
17
src/app/page.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<main className="min-h-screen bg-background text-foreground">
|
||||||
|
<div className="container mx-auto px-4 py-8">
|
||||||
|
<h1 className="text-4xl font-bold mb-8">Millions</h1>
|
||||||
|
<p className="text-lg text-muted-foreground">
|
||||||
|
Gestão Operacional para Revenda de Roupa
|
||||||
|
</p>
|
||||||
|
<div className="mt-8">
|
||||||
|
<p className="text-sm">
|
||||||
|
Projeto em desenvolvimento - estrutura base configurada
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
||||||
9
src/server/db/client.ts
Normal file
9
src/server/db/client.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { PrismaClient } from '@prisma/client'
|
||||||
|
|
||||||
|
const globalForPrisma = globalThis as unknown as {
|
||||||
|
prisma: PrismaClient | undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
|
||||||
56
tailwind.config.ts
Normal file
56
tailwind.config.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import type { Config } from 'tailwindcss'
|
||||||
|
|
||||||
|
const config: Config = {
|
||||||
|
content: [
|
||||||
|
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
border: 'hsl(var(--border))',
|
||||||
|
input: 'hsl(var(--input))',
|
||||||
|
ring: 'hsl(var(--ring))',
|
||||||
|
background: 'hsl(var(--background))',
|
||||||
|
foreground: 'hsl(var(--foreground))',
|
||||||
|
primary: {
|
||||||
|
DEFAULT: 'hsl(var(--primary))',
|
||||||
|
foreground: 'hsl(var(--primary-foreground))',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
DEFAULT: 'hsl(var(--secondary))',
|
||||||
|
foreground: 'hsl(var(--secondary-foreground))',
|
||||||
|
},
|
||||||
|
destructive: {
|
||||||
|
DEFAULT: 'hsl(var(--destructive))',
|
||||||
|
foreground: 'hsl(var(--destructive-foreground))',
|
||||||
|
},
|
||||||
|
muted: {
|
||||||
|
DEFAULT: 'hsl(var(--muted))',
|
||||||
|
foreground: 'hsl(var(--muted-foreground))',
|
||||||
|
},
|
||||||
|
accent: {
|
||||||
|
DEFAULT: 'hsl(var(--accent))',
|
||||||
|
foreground: 'hsl(var(--accent-foreground))',
|
||||||
|
},
|
||||||
|
popover: {
|
||||||
|
DEFAULT: 'hsl(var(--popover))',
|
||||||
|
foreground: 'hsl(var(--popover-foreground))',
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
DEFAULT: 'hsl(var(--card))',
|
||||||
|
foreground: 'hsl(var(--card-foreground))',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
borderRadius: {
|
||||||
|
lg: 'var(--radius)',
|
||||||
|
md: 'calc(var(--radius) - 2px)',
|
||||||
|
sm: 'calc(var(--radius) - 4px)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
|
|
||||||
|
export default config
|
||||||
26
tsconfig.json
Normal file
26
tsconfig.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "next"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user