# Database Schema - SaveInMed

## Status (pronto x faltando)

**Pronto**
- Conteúdo descrito neste documento.

**Faltando**
- Confirmar no código o estado real das funcionalidades e atualizar esta seção conforme necessário.

---


Documentação completa 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) |
| `ean_code` | TEXT | Código EAN/barras |
| `name` | TEXT | Nome do produto |
| `description` | TEXT | Descrição |
| `manufacturer` | TEXT | Laboratório/Fabricante |
| `category` | TEXT | Categoria (Analgésicos, Antibióticos, etc) |
| `subcategory` | TEXT | Subcategoria (opcional) |
| `batch` | TEXT | Lote |
| `expires_at` | DATE | Data de validade |
| `price_cents` | BIGINT | Preço em centavos |
| `stock` | BIGINT | Quantidade em estoque |
| `observations` | TEXT | Observações adicionais |
| `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)
