From 091e8093c045f45b54275e314760db1d8c9e2d52 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Tue, 23 Dec 2025 17:01:16 -0300 Subject: [PATCH] feat: apply logo, document database schema, update docs - Move logo to marketplace/src/assets/ - Apply logo in Shell.tsx header - Add favicon and meta tags to index.html - Create docs/database-schema.md with ER diagram - Update README.md with database section - Update marketplace/README.md with assets section - Update seeder-api/README.md with new fields --- README.md | 13 ++ docs/database-schema.md | 278 ++++++++++++++++++++++++++++++ marketplace/README.md | 18 ++ marketplace/index.html | 5 +- marketplace/src/assets/logo.png | Bin 0 -> 15432 bytes marketplace/src/layouts/Shell.tsx | 6 +- seeder-api/README.md | 12 ++ 7 files changed, 327 insertions(+), 5 deletions(-) create mode 100644 docs/database-schema.md create mode 100644 marketplace/src/assets/logo.png diff --git a/README.md b/README.md index de34f9d..a49ba0b 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,19 @@ deno task dev | **saveinmed-frontend** | Next.js | 15 | TailwindCSS 4 | | **website** | Fresh (Deno) | v2 | TailwindCSS | +### Banco de Dados + +O schema completo do banco de dados está documentado em [docs/database-schema.md](./docs/database-schema.md). + +**Principais Tabelas**: +- `companies` - Farmácias e distribuidoras +- `users` - Usuários vinculados às empresas +- `products` - Catálogo de produtos +- `orders` / `order_items` - Pedidos e itens +- `cart_items` - Carrinho de compras +- `reviews` - Avaliações +- `shipments` - Envios + ### Infraestrutura e Serviços - **Banco de Dados**: PostgreSQL 14+ - **BaaS**: Appwrite 18 diff --git a/docs/database-schema.md b/docs/database-schema.md new file mode 100644 index 0000000..ebcf09d --- /dev/null +++ b/docs/database-schema.md @@ -0,0 +1,278 @@ +# Database Schema - SaveInMed + +Documentação do esquema de banco de dados PostgreSQL do SaveInMed. + +--- + +## Diagrama ER + +```mermaid +erDiagram + COMPANIES ||--o{ USERS : "emprega" + COMPANIES ||--o{ PRODUCTS : "vende" + COMPANIES ||--o{ ORDERS : "compra (buyer)" + COMPANIES ||--o{ ORDERS : "vende (seller)" + COMPANIES ||--o{ CART_ITEMS : "possui" + ORDERS ||--o{ ORDER_ITEMS : "contém" + PRODUCTS ||--o{ ORDER_ITEMS : "inclui" + PRODUCTS ||--o{ CART_ITEMS : "referencia" + ORDERS ||--o| REVIEWS : "avalia" + ORDERS ||--o| SHIPMENTS : "envia" + + COMPANIES { + uuid id PK + text cnpj UK + text corporate_name + text category + text license_number + boolean is_verified + float latitude + float longitude + text city + text state + text phone + text operating_hours + boolean is_24_hours + timestamptz created_at + timestamptz updated_at + } + + USERS { + uuid id PK + uuid company_id FK + text role + text name + text username UK + text email UK + boolean email_verified + text password_hash + timestamptz created_at + timestamptz updated_at + } + + PRODUCTS { + uuid id PK + uuid seller_id FK + text name + text description + text batch + date expires_at + bigint price_cents + bigint stock + timestamptz created_at + timestamptz updated_at + } + + ORDERS { + uuid id PK + uuid buyer_id FK + uuid seller_id FK + text status + bigint total_cents + text shipping_recipient_name + text shipping_street + text shipping_number + text shipping_complement + text shipping_district + text shipping_city + text shipping_state + text shipping_zip_code + text shipping_country + timestamptz created_at + timestamptz updated_at + } + + ORDER_ITEMS { + uuid id PK + uuid order_id FK + uuid product_id FK + bigint quantity + bigint unit_cents + text batch + date expires_at + } + + CART_ITEMS { + uuid id PK + uuid buyer_id FK + uuid product_id FK + bigint quantity + bigint unit_cents + text batch + date expires_at + timestamptz created_at + timestamptz updated_at + } + + REVIEWS { + uuid id PK + uuid order_id FK UK + uuid buyer_id FK + uuid seller_id FK + int rating + text comment + timestamptz created_at + } + + SHIPMENTS { + uuid id PK + uuid order_id FK UK + text carrier + text tracking_code + text external_tracking + text status + timestamptz created_at + timestamptz updated_at + } +``` + +--- + +## Tabelas + +### `companies` +Empresas (farmácias/distribuidoras) cadastradas na plataforma. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `cnpj` | TEXT | CNPJ (único) | +| `corporate_name` | TEXT | Razão social | +| `category` | TEXT | Categoria (farmacia, distribuidora) | +| `license_number` | TEXT | Número da licença sanitária | +| `is_verified` | BOOLEAN | Se a empresa foi verificada | +| `latitude` | FLOAT | Latitude da localização | +| `longitude` | FLOAT | Longitude da localização | +| `city` | TEXT | Cidade | +| `state` | TEXT | Estado (UF) | +| `phone` | TEXT | Telefone de contato | +| `operating_hours` | TEXT | Horário de funcionamento | +| `is_24_hours` | BOOLEAN | Funciona 24 horas | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +--- + +### `users` +Usuários vinculados às empresas. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `company_id` | UUID | FK para companies | +| `role` | TEXT | Perfil (Dono, Colaborador, Entregador, Admin) | +| `name` | TEXT | Nome completo | +| `username` | TEXT | Login único | +| `email` | TEXT | Email único | +| `email_verified` | BOOLEAN | Email verificado | +| `password_hash` | TEXT | Hash da senha (bcrypt) | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +--- + +### `products` +Produtos cadastrados para venda. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `seller_id` | UUID | FK para companies (vendedor) | +| `name` | TEXT | Nome do produto | +| `description` | TEXT | Descrição | +| `batch` | TEXT | Lote | +| `expires_at` | DATE | Data de validade | +| `price_cents` | BIGINT | Preço em centavos | +| `stock` | BIGINT | Quantidade em estoque | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +--- + +### `orders` +Pedidos de compra. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `buyer_id` | UUID | FK para companies (comprador) | +| `seller_id` | UUID | FK para companies (vendedor) | +| `status` | TEXT | Status (Pendente, Pago, Faturado, Entregue) | +| `total_cents` | BIGINT | Total em centavos | +| `shipping_*` | TEXT | Campos de endereço de entrega | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +--- + +### `order_items` +Itens de um pedido. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `order_id` | UUID | FK para orders | +| `product_id` | UUID | FK para products | +| `quantity` | BIGINT | Quantidade | +| `unit_cents` | BIGINT | Preço unitário em centavos | +| `batch` | TEXT | Lote do produto | +| `expires_at` | DATE | Validade do produto | + +--- + +### `cart_items` +Itens no carrinho de compras. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `buyer_id` | UUID | FK para companies | +| `product_id` | UUID | FK para products | +| `quantity` | BIGINT | Quantidade | +| `unit_cents` | BIGINT | Preço unitário | +| `batch` | TEXT | Lote | +| `expires_at` | DATE | Validade | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +> **UNIQUE**: (buyer_id, product_id) + +--- + +### `reviews` +Avaliações de pedidos. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `order_id` | UUID | FK para orders (único) | +| `buyer_id` | UUID | FK para companies | +| `seller_id` | UUID | FK para companies | +| `rating` | INT | Nota (1-5) | +| `comment` | TEXT | Comentário | +| `created_at` | TIMESTAMPTZ | Data de criação | + +--- + +### `shipments` +Envios de pedidos. + +| Coluna | Tipo | Descrição | +|--------|------|-----------| +| `id` | UUID | Chave primária | +| `order_id` | UUID | FK para orders (único) | +| `carrier` | TEXT | Transportadora | +| `tracking_code` | TEXT | Código de rastreio interno | +| `external_tracking` | TEXT | Código de rastreio externo | +| `status` | TEXT | Status (Enviado, Em Trânsito, Entregue) | +| `created_at` | TIMESTAMPTZ | Data de criação | +| `updated_at` | TIMESTAMPTZ | Data de atualização | + +--- + +## Convenções + +- **Valores monetários**: Sempre em centavos (BIGINT) +- **IDs**: UUID v4 ou v7 +- **Timestamps**: TIMESTAMPTZ (UTC) +- **Soft delete**: Não implementado (delete real) diff --git a/marketplace/README.md b/marketplace/README.md index 9bc41bb..57de733 100644 --- a/marketplace/README.md +++ b/marketplace/README.md @@ -102,6 +102,24 @@ marketplace/ └── README.md ``` +## 🎨 Assets + +Os arquivos de assets estão em `src/assets/`: + +| Arquivo | Descrição | +|---------|-----------| +| `logo.png` | Logo oficial SaveInMed | + +### Cores da Marca (Tailwind) + +```typescript +// tailwind.config.ts +colors: { + healthGreen: '#2D9CDB', // Azul claro + medicalBlue: '#0F4C81' // Azul escuro (cor principal) +} +``` + ## 🧪 Testes O projeto utiliza **Vitest** para testes unitários: diff --git a/marketplace/index.html b/marketplace/index.html index 2c9fcb6..97a57f8 100644 --- a/marketplace/index.html +++ b/marketplace/index.html @@ -2,9 +2,10 @@ - + - Marketplace Farmacêutico B2B + + SaveInMed - Marketplace Farmacêutico B2B
diff --git a/marketplace/src/assets/logo.png b/marketplace/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f360065ddad68af9f1ba29986dae7da29df8eaf GIT binary patch literal 15432 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
-
MP
+ SaveInMed
-

Marketplace Farmacêutico B2B

+

SaveInMed

- {isAdmin ? 'Painel Administrativo' : isOwner ? 'Painel do Dono' : 'Dashboard'} + {isAdmin ? 'Painel Administrativo' : isOwner ? 'Painel do Dono' : 'Marketplace B2B'}

diff --git a/seeder-api/README.md b/seeder-api/README.md index fe54738..d6650da 100644 --- a/seeder-api/README.md +++ b/seeder-api/README.md @@ -8,6 +8,18 @@ Microserviço utilitário para popular o banco de dados com dados de teste para 1. **REMOVE** todas as tabelas existentes (`companies`, `products`, `users`, etc.) 2. **RECRIA** as tabelas do zero. +### Campos da Tabela `companies` + +O seeder cria a tabela `companies` com os seguintes campos: + +| Campo | Tipo | Descrição | +|-------|------|-----------| +| `phone` | TEXT | Telefone de contato | +| `operating_hours` | TEXT | Horário de funcionamento | +| `is_24_hours` | BOOLEAN | Se funciona 24h | + +> Para schema completo, veja [docs/database-schema.md](../docs/database-schema.md) + --- ## 🎯 Modos de Operação