# Sinka SaaS de inteligência logística. Cada operação simula frete, compara transportadoras e acompanha custo, com os dados de uma empresa isolados dos das outras. ## O que faz - Cotação de frete (peso cubado, distância, ad valorem) a partir de CEP (ViaCEP) e coordenadas (Nominatim) - Ranking de transportadoras da própria empresa - Clientes, equipe e papéis (Administrador, Manager, Operador) - Dashboard de custo - Chat interno (admin da plataforma ↔ empresa) - Arquivos de operação (CSV/XLSX) por empresa Dois produtos no mesmo sistema: o **admin da Sinka** (`/admin`) cria e suspende empresas; cada empresa entra pelo slug na URL (`/demo`, `/outra-empresa`). ## Isolamento Um database MySQL por empresa (`sinka_t_`). O catálogo fica em `sinka_platform`. O JWT carrega o tenant. As queries de operação usam o PrismaClient daquele banco: um `WHERE` errado não cruza empresa. Backup, restore e exclusão também são por tenant. ## Stack | Camada | Tecnologia | | --- | --- | | API | NestJS, Prisma, JWT em cookie httpOnly | | Web | Next.js (App Router) | | Dados | MySQL 8, Redis | | Infra | Docker Compose | ``` Next.js → NestJS /api → sinka_platform ↓ ↓ Redis sinka_t_ … ``` ## Estrutura ``` api/ REST, auth, regras, Prisma web/ landing, login, painéis docs/ arquitetura, decisões, testes ``` ## Como rodar ```bash cp .env.example .env docker compose up -d cd api && npm install && npm run prisma:setup && npm run start:dev cd web && npm install && npm run dev ``` MySQL e Redis sobem no Docker; API e web no Node da máquina. Tudo em containers: ```bash cp .env.example .env docker compose --profile full up -d --build ``` - App: http://localhost:3000 - API: http://localhost:3001/api/health ## Contas | Área | URL | E-mail | Senha | | --- | --- | --- | --- | | Plataforma | `/admin/login` | tina.r@example.net | SinkaPlatform!1 | | Empresa (admin) | `/demo/login` | xena.w@example.org | SinkaAdmin!1 | | Empresa (manager) | `/demo/login` | james.b@example.com | SinkaManager!1 | | Empresa (operador) | `/demo/login` | ursula.b@example.com | SinkaOperador!1 | ## Testes ```bash npm test npm run test:cov ``` Jest na API: frete, papéis, tenancy, chat, dashboard. A cobertura mede regra de negócio. Detalhes em [docs/TESTING.md](docs/TESTING.md). ## Documentação - [Arquitetura](docs/ARCHITECTURE.md) - [Decisões](docs/DECISIONS.md) - [Testes](docs/TESTING.md) - [Entrega e CI](docs/CI.md) ## Entrega Push em `main` sobe a demo na hora. Neste desafio isso basta; em produção o caminho é **merge request → pipeline (testes e build) → merge → deploy**. Detalhes em [docs/CI.md](docs/CI.md).