# SaveInMed

**Plataforma B2B de Marketplace Farmacêutico**

SaveInMed é uma plataforma completa de marketplace B2B que conecta farmácias e distribuidoras farmacêuticas, facilitando a compra e venda de medicamentos e produtos farmacêuticos com eficiência, segurança e transparência.

---

## 📋 Índice

- [Visão Geral](#-visão-geral)
- [Arquitetura do Sistema](#-arquitetura-do-sistema)
- [Componentes do Projeto](#-componentes-do-projeto)
- [Tecnologias Utilizadas](#-tecnologias-utilizadas)
- [Setup Completo](#-setup-completo)
- [Fluxo de Desenvolvimento](#-fluxo-de-desenvolvimento)
- [Deploy](#-deploy)
- [Contribuindo](#-contribuindo)
- [Licença](#-licença)

---

## 🎯 Visão Geral

SaveInMed é uma solução completa que oferece:

- ✅ **Marketplace B2B**: Conecta farmácias compradoras com distribuidoras vendedoras
- ✅ **Gestão de Catálogo**: Controle completo de produtos, lotes e validades
- ✅ **Processamento de Pedidos**: Fluxo completo desde o carrinho até a entrega
- ✅ **Pagamentos Integrados**: Mercado Pago com split automático de comissões
- ✅ **Dashboard Administrativo**: Métricas, relatórios e gestão completa
- ✅ **Multi-tenant**: Suporte para múltiplas empresas e usuários
- ✅ **Alta Performance**: APIs otimizadas em Go para operações críticas
- ✅ **Escalabilidade**: Arquitetura moderna e cloud-native

---

## 🏗️ Arquitetura do Sistema

```mermaid
graph TB
    subgraph "Frontend Layer"
        WEB[Website<br/>Fresh/Deno<br/>:8000]
        MKT[Marketplace Frontend<br/>React/Vite<br/>:5173]
        MAIN[SaveInMed Frontend<br/>Next.js 15<br/>:3000]
    end

    subgraph "Backend Layer"
        BFF[SaveInMed BFF<br/>Python/FastAPI<br/>:8000]
        API[Backend API<br/>Go 1.24<br/>:8080]
        BACK[Backoffice<br/>NestJS/Fastify<br/>:3000]
    end

    subgraph "Data Layer"
        PG[(PostgreSQL<br/>Database)]
        AW[(Appwrite<br/>BaaS)]
    end

    subgraph "External Services"
        MP[Mercado Pago<br/>Payments]
        MB[Mapbox<br/>Geocoding]
    end

    WEB -->|Landing Pages| BFF
    MKT -->|Marketplace| API
    MAIN -->|Main App| AW
    MAIN -->|Admin| BACK
    
    BFF --> AW
    API --> PG
    BACK --> PG
    
    API --> MP
    BFF --> MB
    BACK --> MP

    style WEB fill:#4ade80
    style MKT fill:#60a5fa
    style MAIN fill:#a78bfa
    style BFF fill:#fbbf24
    style API fill:#f87171
    style BACK fill:#fb923c
    style PG fill:#94a3b8
    style AW fill:#94a3b8
```

---

## 📦 Componentes do Projeto

### 1. **backend** - API de Alta Performance (Go)

**Propósito**: Núcleo de performance para operações críticas

**Tecnologias**: Go 1.24, PostgreSQL, Swagger

**Porta**: 8080

**Principais Funcionalidades**:
- Gestão de empresas (farmácias, distribuidoras)
- Catálogo de produtos com lote e validade
- Processamento de pedidos
- Integração Mercado Pago com split de pagamento
- Respostas JSON otimizadas com compressão gzip

**Documentação**: [backend/README.md](./backend/README.md)

**Como executar**:
```bash
cd backend
export DATABASE_URL=postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable
go run ./cmd/api
```

---

### 2. **backoffice** - Sistema Administrativo (NestJS)

**Propósito**: Interface de gestão e administração

**Tecnologias**: NestJS 10, Fastify, Prisma, PostgreSQL

**Porta**: 3000

**Principais Funcionalidades**:
- Autenticação JWT (access + refresh tokens)
- Gestão de usuários e permissões
- Controle de inventário
- Processamento de webhooks Mercado Pago
- Dashboard administrativo

**Documentação**: [backoffice/README.md](./backoffice/README.md)

**Como executar**:
```bash
cd backoffice
pnpm install
pnpm prisma:generate
pnpm start:dev
```

---

### 3. **marketplace** - Frontend do Marketplace (React)

**Propósito**: Interface do marketplace B2B

**Tecnologias**: React 18, Vite 5, TailwindCSS, Zustand

**Porta**: 5173

**Principais Funcionalidades**:
- Catálogo de produtos com virtualização
- Carrinho de compras
- Checkout com Mercado Pago
- Dashboard de pedidos
- Autenticação e rotas protegidas

**Documentação**: [marketplace/README.md](./marketplace/README.md)

**Como executar**:
```bash
cd marketplace
npm install
npm run dev
```

---

### 4. **saveinmed-bff** - Backend For Frontend (Python)

**Propósito**: Agregação de dados e proxy para frontends

**Tecnologias**: Python 3.12, FastAPI, Appwrite

**Porta**: 8000

**Principais Funcionalidades**:
- Integração com Appwrite (Databases)
- Autenticação JWT com cookies httpOnly
- CRUD de categorias, produtos, pedidos
- Geocodificação automática (Mapbox)
- Cálculo de frete dinâmico
- API key protection

**Documentação**: [saveinmed-bff/README.md](./saveinmed-bff/README.md)

**Como executar**:
```bash
cd saveinmed-bff
pip install -r requirements.txt
uvicorn src.main:app --reload
```

---

### 5. **saveinmed-frontend** - Frontend Principal (Next.js)

**Propósito**: Aplicação frontend completa e principal

**Tecnologias**: Next.js 15, React 19, TailwindCSS 4, Appwrite

**Porta**: 3000

**Principais Funcionalidades**:
- Interface completa para farmácias e distribuidoras
- Gestão de catálogo de produtos
- Sistema de pedidos e pagamentos
- Dashboard com gráficos (Chart.js)
- Integração Appwrite para backend
- Checkout Mercado Pago
- Envio de emails (Nodemailer)

**Documentação**: [saveinmed-frontend/README.md](./saveinmed-frontend/README.md)

**Como executar**:
```bash
cd saveinmed-frontend
npm install
npm run dev
```

---

### 6. **website** - Site Institucional (Fresh/Deno)

**Propósito**: Landing pages e marketing

**Tecnologias**: Fresh v2, Deno 2, Preact, TailwindCSS

**Porta**: 8000

**Principais Funcionalidades**:
- Landing pages institucionais
- Captura de leads
- Blog e conteúdo educacional
- SEO otimizado
- Islands Architecture (hidratação parcial)

**Documentação**: [website/README.md](./website/README.md)

**Como executar**:
```bash
cd website
deno task dev
```

---

## 🛠️ Tecnologias Utilizadas

### Backend
| Componente | Linguagem | Framework | Banco de Dados |
|------------|-----------|-----------|----------------|
| **backend** | Go 1.24 | - | PostgreSQL |
| **backoffice** | TypeScript | NestJS 10 + Fastify | PostgreSQL (Prisma) |
| **saveinmed-bff** | Python 3.12 | FastAPI | Appwrite |

### Frontend
| Componente | Framework | Versão | Estilização |
|------------|-----------|--------|-------------|
| **marketplace** | React + Vite | 18 + 5 | TailwindCSS 3 |
| **saveinmed-frontend** | Next.js | 15 | TailwindCSS 4 |
| **website** | Fresh (Deno) | v2 | TailwindCSS |

### Infraestrutura e Serviços
- **Banco de Dados**: PostgreSQL 14+
- **BaaS**: Appwrite 18
- **Pagamentos**: Mercado Pago SDK
- **Geocoding**: Mapbox API
- **Email**: Nodemailer
- **Containerização**: Docker
- **Documentação**: Swagger/OpenAPI

---

## 🚀 Setup Completo

### Pré-requisitos

- **Go** 1.24+
- **Node.js** 20+
- **Python** 3.12+
- **Deno** 2.0+
- **PostgreSQL** 14+
- **pnpm** 8+ (para backoffice)
- **Docker** (opcional)

### 1. Clonar o Repositório

```bash
git clone https://github.com/rede5/saveinmed.git
cd saveinmed
```

### 2. Configurar Banco de Dados

```bash
# Criar banco de dados PostgreSQL
createdb saveinmed

# Ou via Docker
docker run --name saveinmed-postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=saveinmed \
  -p 5432:5432 \
  -d postgres:14
```

### 3. Configurar Variáveis de Ambiente

Cada componente possui um arquivo `.env.example`. Copie e configure:

```bash
# Backend Go
cd backend
cp .env.example .env
# Edite .env com suas configurações

# Backoffice NestJS
cd ../backoffice
cp .env.example .env
# Edite .env com suas configurações

# E assim por diante para cada componente...
```

### 4. Instalar Dependências

```bash
# Backend Go
cd backend
go mod download

# Backoffice NestJS
cd ../backoffice
pnpm install
pnpm prisma:generate
pnpm prisma migrate dev

# Marketplace React
cd ../marketplace
npm install

# SaveInMed BFF Python
cd ../saveinmed-bff
python -m venv venv
source venv/bin/activate  # ou `venv\Scripts\activate` no Windows
pip install -r requirements.txt

# SaveInMed Frontend Next.js
cd ../saveinmed-frontend
npm install

# Website Fresh/Deno
cd ../website
# Deno não requer instalação de dependências
```

### 5. Executar Todos os Serviços

**Opção 1: Manualmente (em terminais separados)**

```bash
# Terminal 1 - Backend Go
cd backend && go run ./cmd/api

# Terminal 2 - Backoffice NestJS
cd backoffice && pnpm start:dev

# Terminal 3 - Marketplace React
cd marketplace && npm run dev

# Terminal 4 - SaveInMed BFF
cd saveinmed-bff && uvicorn src.main:app --reload

# Terminal 5 - SaveInMed Frontend
cd saveinmed-frontend && npm run dev

# Terminal 6 - Website
cd website && deno task dev
```

**Opção 2: Docker Compose (em desenvolvimento)**

```bash
docker-compose up
```

### 6. Acessar as Aplicações

| Serviço | URL | Descrição |
|---------|-----|-----------|
| Backend API | http://localhost:8080 | API Go |
| Backend Swagger | http://localhost:8080/swagger/index.html | Docs API Go |
| Backoffice | http://localhost:3000 | Admin NestJS |
| Backoffice Swagger | http://localhost:3000/api | Docs NestJS |
| Marketplace | http://localhost:5173 | Frontend React |
| SaveInMed BFF | http://localhost:8000 | BFF Python |
| SaveInMed BFF Docs | http://localhost:8000/docs | Docs FastAPI |
| SaveInMed Frontend | http://localhost:3000 | Frontend Next.js |
| Website | http://localhost:8000 | Site Fresh/Deno |

---

## 💻 Fluxo de Desenvolvimento

### 1. Criar Nova Feature

```bash
# Criar branch
git checkout -b feature/nome-da-feature

# Desenvolver...
# Testar...

# Commit
git add .
git commit -m "feat: adiciona nova funcionalidade X"

# Push
git push origin feature/nome-da-feature

# Criar Pull Request no GitHub
```

### 2. Padrões de Commit

Seguimos [Conventional Commits](https://www.conventionalcommits.org/):

- `feat:` - Nova funcionalidade
- `fix:` - Correção de bug
- `docs:` - Documentação
- `style:` - Formatação
- `refactor:` - Refatoração
- `test:` - Testes
- `chore:` - Tarefas de build/config

### 3. Testes

```bash
# Backend Go
cd backend && go test ./...

# Backoffice NestJS
cd backoffice && pnpm test

# SaveInMed BFF Python
cd saveinmed-bff && pytest

# Frontend Next.js
cd saveinmed-frontend && npm test
```

### 4. Linting

```bash
# Backend Go
cd backend && golangci-lint run

# Backoffice NestJS
cd backoffice && pnpm lint

# Marketplace React
cd marketplace && npm run lint

# Frontend Next.js
cd saveinmed-frontend && npm run lint
```

---

## 🚢 Deploy

### Backend (Go)

```bash
# Build
cd backend
go build -o bin/api ./cmd/api

# Docker
docker build -t saveinmed-api:latest .
docker push registry.example.com/saveinmed-api:latest
```

### Backoffice (NestJS)

```bash
# Build
cd backoffice
pnpm build

# Docker
docker build -t saveinmed-backoffice:latest .
docker push registry.example.com/saveinmed-backoffice:latest
```

### Marketplace (React)

```bash
# Build
cd marketplace
npm run build

# Deploy para Vercel/Netlify
vercel --prod
```

### SaveInMed BFF (Python)

```bash
# Docker
cd saveinmed-bff
docker build -t saveinmed-bff:latest .
docker push registry.example.com/saveinmed-bff:latest
```

### SaveInMed Frontend (Next.js)

```bash
# Build
cd saveinmed-frontend
npm run build

# Deploy para Vercel
vercel --prod
```

### Website (Fresh/Deno)

```bash
# Deploy para Deno Deploy
cd website
deployctl deploy --project=saveinmed-website
```

---

## 🤝 Contribuindo

1. Fork o projeto
2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
3. Commit suas mudanças (`git commit -m 'feat: Add some AmazingFeature'`)
4. Push para a branch (`git push origin feature/AmazingFeature`)
5. Abra um Pull Request

### Diretrizes

- Escreva testes para novas funcionalidades
- Mantenha a documentação atualizada
- Siga os padrões de código de cada linguagem
- Use Conventional Commits
- Revise seu próprio código antes de submeter PR

---

## 📄 Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.

---

## 📞 Contato

**SaveInMed Team**

- Website: https://saveinmed.com
- Email: contato@saveinmed.com
- GitHub: https://github.com/rede5/saveinmed

---

## 🙏 Agradecimentos

- Equipe de desenvolvimento
- Contribuidores open source
- Comunidades Go, NestJS, React, Python, e Deno

---

**Desenvolvido com ❤️ pela equipe SaveInMed**
