arcadiasuite/RELATORIO_TECNICO_RETAIL.md

1262 lines
46 KiB
Markdown

# Relatório Técnico Completo - Módulo Retail (Arcádia Suite)
## Versão 1.0 - Fevereiro 2026
---
## SUMÁRIO
1. [Visão Geral do Módulo](#1-visão-geral)
2. [Banco de Dados - Schema Completo](#2-banco-de-dados)
3. [Dashboard - Painel Principal](#3-dashboard)
4. [PDV - Ponto de Venda](#4-pdv)
5. [Trade-In - Gestão de Troca](#5-trade-in)
6. [Checklist de Avaliação](#6-checklist)
7. [Ordens de Serviço](#7-ordens-de-serviço)
8. [Devoluções e Trocas](#8-devoluções-e-trocas)
9. [Estoque e Depósitos](#9-estoque-e-depósitos)
10. [Comissões e Metas](#10-comissões-e-metas)
11. [Relatórios](#11-relatórios)
12. [Cadastros](#12-cadastros)
13. [Compras e Aquisições](#13-compras-e-aquisições)
14. [Créditos de Cliente](#14-créditos-de-cliente)
15. [Integração com Plus (Laravel)](#15-integração-plus)
16. [API - Endpoints Completos](#16-api-endpoints)
17. [Segurança e Multi-Tenant](#17-segurança)
---
## 1. VISÃO GERAL
### 1.1 Propósito
O módulo **Arcádia Retail** é o **front-office** da Suite, projetado especificamente para o segmento de **Loja de Celulares e Assistência Técnica**. Ele cobre todo o ciclo operacional: venda de dispositivos, avaliação de trade-in, ordens de serviço, gestão de estoque por IMEI, comissões de vendedores, e fechamento de caixa diário.
### 1.2 Métricas do Módulo
| Métrica | Valor |
|---------|-------|
| **Frontend** | 10.067 linhas (ArcadiaRetail.tsx) |
| **Backend** | 5.218 linhas (routes.ts) |
| **Sync Plus** | 542 linhas (plus-sync.ts) |
| **TradeIn Form** | 988 linhas (TradeInForm.tsx) |
| **Total** | ~16.815 linhas de código |
| **Tabelas no banco** | 40+ tabelas |
| **Endpoints de API** | ~130 endpoints REST |
| **Abas da interface** | 11 abas principais |
### 1.3 Abas da Interface
| # | Aba | Descrição |
|---|-----|-----------|
| 1 | **Dashboard** | Visão geral com KPIs, feed de atividades e alertas |
| 2 | **PDV** | Ponto de Venda com carrinho, pagamento múltiplo e trade-in |
| 3 | **Pessoas** | Cadastro unificado (clientes, fornecedores, técnicos) |
| 4 | **Estoque** | Depósitos, saldos, movimentações, inventários e séries |
| 5 | **Serviços** | Ordens de Serviço (externas e internas) |
| 6 | **Trade-In** | Avaliações de dispositivos usados |
| 7 | **Compras** | Pedidos de compra e recebimento de mercadoria |
| 8 | **Cadastros** | Formas de pagamento, vendedores, planos, promoções, tipos |
| 9 | **Relatórios** | 6 relatórios operacionais + detalhamento de vendas |
| 10 | **Comissões** | Dashboard de comissões, metas e fechamento |
| 11 | **Configuração** | Integração Plus, empresas, sincronização |
---
## 2. BANCO DE DADOS - SCHEMA COMPLETO
### 2.1 Tabelas do Módulo Retail (40 tabelas)
#### Estrutura de Lojas e Depósitos
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `retail_stores` | id, tenantId, code, name, storeType (holding/distributor/store), parentStoreId, cnpj, posEnabled, serviceEnabled, leaseEnabled | Lojas e filiais na rede |
| `retail_warehouses` | id, tenantId, storeId, code, name, type (store/central/transit/virtual), isMainWarehouse, isDefault, allowNegativeStock, visibleToAllCompanies | Depósitos por loja ou central |
| `retail_warehouse_stock` | warehouseId, productId, quantity, reservedQuantity, availableQuantity, minStock, maxStock | Saldos por produto/depósito |
| `retail_stock_movements` | warehouseId, productId, movementType (entry/exit/transfer/adjustment/return), operationType, quantity, previousStock, newStock, unitCost | Movimentações detalhadas |
| `retail_stock_transfers` | sourceWarehouseId, destinationWarehouseId, status (pending/in_transit/completed/cancelled) | Transferências entre depósitos |
| `retail_stock_transfer_items` | transferId, productId, requestedQuantity, transferredQuantity, receivedQuantity | Itens da transferência |
| `retail_transfer_serials` | transferItemId, serialId | Séries/IMEIs vinculados |
| `retail_product_serials` | productId, warehouseId, serialNumber, imei, imei2, status (in_stock/reserved/sold/returned/defective/in_transit), acquisitionCost, salePrice | Números de série e IMEI |
| `retail_inventories` | warehouseId, inventoryNumber, type (full/partial/cyclic), status (open/counting/adjusting/completed) | Inventários |
| `retail_inventory_items` | inventoryId, productId, systemQuantity, countedQuantity, difference, adjustmentApplied | Itens do inventário |
#### Dispositivos Móveis
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `mobile_devices` | imei, imei2, brand, model, color, storage, ram, condition (new/refurbished/used), purchasePrice, sellingPrice, acquisitionType (trade_in/purchase/consignment), relatedEvaluationId, relatedServiceOrderId, personId, suggestedPrice, profitMargin, status (in_stock/sold/in_service/returned/damaged/leased) | Celulares com IMEI |
| `device_history` | deviceId, imei, eventType (received/transferred/sold/returned/service_in/service_out/leased/purchased), fromLocation, toLocation, referenceType, referenceId | Histórico de movimentação por IMEI |
#### PDV e Vendas
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `pos_sessions` | storeId, cashierId, cashierName, openingBalance, closingBalance, totalSales, totalRefunds, netSales, cashPayments, cardPayments, pixPayments, otherPayments, transactionCount, status (open/closed/reconciled) | Sessões de caixa |
| `pos_sales` | saleNumber, saleType (direct_sale/lease_to_own), customerId, customerName, subtotal, discountAmount, discountPercent, tradeInValue, tradeInEvaluationId, totalAmount, paymentMethod (cash/debit/credit/pix/combined), paymentDetails (JSONB), soldBy, plusVendaId, plusSyncStatus, empresaId | Vendas no PDV |
| `pos_sale_items` | saleId, itemType (product/device/accessory/service), itemName, imei, deviceId, quantity, unitPrice, discountAmount, totalPrice | Itens da venda |
| `pos_cash_movements` | sessionId, storeId, type (withdrawal/reinforcement), amount, reason, performedBy, authorizedBy | Sangria e reforço de caixa |
#### Pagamentos e Parcelamento
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `payment_plans` | saleId, customerId, totalAmount, downPayment, remainingAmount, numberOfInstallments, installmentAmount, interestRate, firstInstallmentDate, paidInstallments, status (active/completed/defaulted/cancelled) | Planos de parcelamento |
| `payment_plan_installments` | planId, installmentNumber, dueDate, amount, paidAmount, paidDate, paymentMethod, status (pending/paid/overdue/cancelled) | Parcelas do plano |
#### Locação com Opção de Compra
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `lease_agreements` | agreementNumber, deviceId, imei, leaseStartDate, leaseEndDate, monthlyPayment, totalLeaseCost, purchaseOptionAvailable, purchasePrice, rentCreditPercent | Contratos de locação |
| `lease_payments` | leaseId, paymentNumber, dueDate, amount, paidAmount, status (pending/paid/overdue) | Pagamentos da locação |
#### Trade-In e Avaliações
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `device_evaluations` | imei, brand, model, personId, 19 campos de checklist booleano (cada com campo de notas), batteryHealth, estimatedValue, acquisitionValue, status (pending/analyzing/approved/rejected), linkedServiceOrderId, maintenanceOrderId, creditGenerated, creditId | Avaliações de Trade-In |
| `trade_in_checklist_templates` | name, deviceCategory (smartphone/tablet/laptop/smartwatch), isActive | Templates de checklist customizáveis |
| `trade_in_checklist_items` | templateId, category (visual/funcional/acessorios/documentacao), itemName, evaluationType (condition/boolean/percentage/text), options (JSON), impactOnValue (% impacto), isRequired, displayOrder | Itens do template |
| `trade_in_evaluation_results` | evaluationId, checklistItemId, result, percentValue, notes | Resultados por item |
| `trade_in_transfer_documents` | evaluationId, documentNumber, customerName/CPF/RG/address, deviceBrand/Model/IMEI/IMEI2, agreedValue, customerSignature (Base64), termsAccepted, status (draft/pending_signature/signed/completed) | Documento de transferência de posse |
| `retail_acquisitions` | type (trade_in/purchase/consignment), sourceEvaluationId, sourceServiceOrderId, deviceId, acquisitionCost, repairCost, totalCost, suggestedPrice, finalPrice, status (pending/ready_for_stock/in_stock/sold) | Aquisições processadas |
#### Ordens de Serviço
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `service_orders` | orderNumber, deviceId, imei, customerName, serviceType (repair/maintenance/internal_review/diagnostic), origin (customer_request/device_acquisition/warranty), assignedTo, technicianName, partsCost, laborCost, totalCost, isInternal, internalType (revision/cleaning/maintenance/quality_check/trade_in_diagnosis/trade_in_maintenance), sourceEvaluationId, checklistData (JSONB), status (12 estados) | Ordens de Serviço |
| `service_order_items` | serviceOrderId, productId, itemType (part/labor/accessory), itemName, quantity, unitPrice, totalPrice | Peças e serviços da O.S. |
| `service_warranties` | serviceOrderId, deviceId, imei, serviceType, warrantyDays, startDate, endDate, status (active/expired/claimed/voided) | Garantias vinculadas |
#### Devoluções
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `return_exchanges` | returnNumber, originalSaleId, returnType (return/exchange), reason, refundAmount, refundMethod, status (pending/approved/rejected/processed) | Devoluções e trocas |
| `return_exchange_items` | returnId, itemName, imei, deviceId, reason, refundAmount | Itens devolvidos |
#### Cadastros e Configurações
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `retail_payment_methods` | name, type (cash/debit/credit/pix/boleto/financing), brand (visa/mastercard/elo/amex/hipercard), feePercent, fixedFee, installmentsMax, installmentFees (JSONB), daysToReceive | Formas de pagamento |
| `retail_sellers` | personId, code, name, storeId, commissionPlanId, hireDate, isActive | Vendedores |
| `retail_commission_plans` | name, type (fixed/percent/tiered/per_product), baseValue, basePercent, rules (JSONB) | Planos de comissão |
| `retail_seller_goals` | sellerId, month, year, goalAmount, goalType (sales/units/margin), achievedAmount, achievedPercent, bonus | Metas de vendedor |
| `retail_store_goals` | storeId, month, year, goalAmount, achievedAmount, achievedPercent | Metas da loja |
| `retail_commission_closures` | sellerId, periodType (daily/monthly/custom), periodStart, periodEnd, totalSales, totalReturns, netSales, commissionRate, commissionAmount, bonusAmount, status (open/closed/paid) | Fechamento de comissão |
| `retail_commission_closure_items` | closureId, saleId, returnId, itemType (sale/return), amount, commission | Vendas do fechamento |
| `retail_price_tables` | name, customerType (retail/wholesale/vip/employee), discountPercent, markupPercent, validFrom, validTo | Tabelas de preço |
| `retail_price_table_items` | priceTableId, productId, deviceId, customPrice, discountPercent | Preços por produto |
| `retail_promotions` | name, type (percent_off/fixed_off/buy_x_get_y/bundle), discountValue, discountPercent, applyTo (all/category/product/brand), validFrom, validTo | Promoções |
| `retail_product_types` | name, category (device/accessory/part/service), requiresImei, requiresSerial, ncm, cest, origem, cstIcms, csosn, cfops (4 tipos), alíquotas (ICMS/PIS/COFINS/IPI), aliqIbs, aliqCbs | Tipos com atributos fiscais |
| `retail_activity_feed` | activityType, entityType, entityId, title, description, metadata (JSONB), severity (info/success/warning/error) | Feed de atividades |
| `retail_reports` | name, type (sales/inventory/commissions/financial/custom), query, filters (JSONB), columns (JSONB) | Relatórios customizáveis |
#### Créditos
| Tabela | Campos-chave | Descrição |
|--------|-------------|-----------|
| `customer_credits` | personId, customerName, amount, remainingAmount, origin (trade_in/return/manual/promotion), status (active/used/expired/cancelled), expiresAt | Créditos de cliente |
---
## 3. DASHBOARD - PAINEL PRINCIPAL
### 3.1 KPIs em Tempo Real (5 Cards)
| Card | Fonte de Dados | Cálculo |
|------|---------------|---------|
| **Dispositivos em Estoque** | `mobile_devices` WHERE status = 'in_stock' | COUNT total |
| **Vendas Hoje** | `pos_sales` WHERE DATE(created_at) = hoje AND status = 'completed' | SUM(total_amount) + COUNT |
| **OS Abertas** | `service_orders` WHERE status NOT IN ('completed','cancelled') | COUNT |
| **Trade-In Pendentes** | `device_evaluations` WHERE status = 'pending' | COUNT |
| **Ticket Médio** | Derivado | todaySalesTotal / todaySalesCount |
### 3.2 Componentes do Dashboard
| Componente | Descrição |
|------------|-----------|
| **Últimas Ordens de Serviço** | Lista das 5 O.S. mais recentes com número, dispositivo, cliente, status e valor |
| **Avaliações de Trade-In** | Lista das 5 avaliações mais recentes com IMEI, dispositivo, cliente, condição, valor e status |
| **Produtos com Estoque Baixo** | Alertas de produtos com `stockQty < minStock`, exibidos com badge vermelho |
| **Feed de Atividades** | Timeline em tempo real (atualiza a cada 30s) com ícones por tipo (venda/serviço/avaliação), severidade colorida (info/success/warning/error), indicador de não-lido |
### 3.3 Endpoint do Dashboard Stats
```
GET /api/retail/dashboard-stats
```
**Queries executadas:**
1. COUNT de dispositivos em estoque
2. SUM e COUNT de vendas do dia
3. COUNT de O.S. abertas
4. COUNT de avaliações pendentes
---
## 4. PDV - PONTO DE VENDA
### 4.1 Pré-requisitos para Usar o PDV
1. **Sessão de Caixa ativa** (abertura obrigatória com saldo inicial)
2. **Empresa selecionada** (seletor de empresa na barra superior)
3. **Vendedor selecionado** (obrigatório para registrar vendas)
### 4.2 Layout do PDV (Grid 5 Colunas)
```
┌─────────────────────────────────────────┬───────────────────────┐
│ CATÁLOGO DE ITENS (3 colunas) │ CARRINHO (2 colunas)│
│ │ │
│ [Dispositivos] [Produtos] [Faturar OS]│ Lista de itens │
│ │ Subtotal │
│ Busca + Filtro │ - Desconto │
│ Lista de itens disponíveis │ - Trade-In │
│ com preço e botão "Adicionar" │ - Crédito │
│ │ = TOTAL │
│ │ │
│ │ [Trade-In] │
│ │ [FINALIZAR VENDA] │
└─────────────────────────────────────────┴───────────────────────┘
```
### 4.3 Três Abas de Catálogo
#### 4.3.1 Dispositivos (Celulares)
- **Busca:** IMEI, marca, modelo, cor, armazenamento, preço
- **Filtro:** Somente status "in_stock"
- **Exibição:** Marca + Modelo, Storage | Cor | IMEI, Badge de condição (new/refurbished/used), Badge do depósito, Preço de venda
- **Ação:** Botão "Adicionar" (desabilitado se IMEI já está no carrinho)
- **Tipo no carrinho:** `device` com IMEI vinculado
#### 4.3.2 Produtos (Acessórios, Peças)
- **Busca:** Nome, código, descrição, código de barras, NCM
- **Filtro:** Somente status "active"
- **Exibição:** Nome, Código | Categoria, Badge de estoque (quantidade + unidade), Preço de venda
- **Ação:** Botão "Adicionar" com quantidade editável
- **Tipo no carrinho:** `product`
#### 4.3.3 Faturar O.S. (Ordens de Serviço)
- **Busca:** Número da O.S. ou nome do cliente
- **Filtro:** O.S. com status "ready_pickup" (aguardando faturamento)
- **Exibição:** Número da O.S., Cliente, Marca + Modelo, Descrição, Valor total
- **Ação:** Botão "Faturar" (vincula a O.S. à venda)
- **Tipo no carrinho:** `service` com serviceOrderId vinculado
### 4.4 Carrinho de Compras
| Campo | Descrição |
|-------|-----------|
| **Itens** | Lista com nome, descrição, badge de tipo (Celular/Serviço), preço unitário, botão remover |
| **Subtotal** | Soma de todos os itens |
| **Desconto** | Desconto em R$ ou % (configurável) |
| **Trade-In** | Valor de abatimento de avaliação aprovada |
| **Crédito** | Crédito disponível do cliente (trade-in anterior, devolução) |
| **Total** | Subtotal - Desconto - TradeIn - Crédito |
### 4.5 Ações do PDV
| Botão | Função |
|-------|--------|
| **Sangria** | Retirada de dinheiro do caixa (exige motivo) |
| **Reforço** | Adição de dinheiro ao caixa (exige motivo) |
| **Devolução** | Abre fluxo de devolução/troca |
| **Selecionar Cliente** | Busca/cadastro de pessoa unificada |
| **Limpar** | Remove todos os itens do carrinho |
| **Trade-In** | Inicia avaliação de dispositivo do cliente |
| **Finalizar Venda** | Abre modal de pagamento |
### 4.6 Fluxo de Finalização de Venda
```
1. Usuário clica "Finalizar Venda"
2. Modal de pagamento abre com:
- Forma de pagamento padrão: Dinheiro (valor total)
- Opções: Cash, Débito, Crédito, PIX, Combinado
- Para Crédito: campo de parcelas
- Para Combinado: múltiplas linhas de pagamento
- Desconto: campo de % e R$
3. Ao confirmar:
a. Cria registro em pos_sales
b. Cria registros em pos_sale_items
c. Atualiza status dos dispositivos para "sold"
d. Atualiza estoque dos produtos
e. Registra no activity_feed
f. Gera impressão da venda (PDF A4)
g. Sincroniza com Plus (se configurado)
h. Limpa o carrinho
```
### 4.7 Impressão da Venda (PDF A4)
A impressão é chamada **ANTES** de limpar o carrinho para preservar os dados:
- Formato: A4 (595 x 842pt)
- Conteúdo: Número da venda, data/hora, dados da empresa, cliente, vendedor, lista de itens (produto, quantidade, unitário, total), subtotal, desconto, trade-in, total, forma de pagamento
- Dispositivos: exibe IMEI
- Produtos: exibe NCM (quando disponível)
- Geração: via `jspdf` no navegador
### 4.8 Formas de Pagamento Suportadas
| Método | Campos |
|--------|--------|
| **Dinheiro (cash)** | Valor |
| **Débito (debit)** | Valor |
| **Crédito (credit)** | Valor + Parcelas |
| **PIX (pix)** | Valor |
| **Combinado (combined)** | Múltiplas linhas (ex: R$ 500 PIX + R$ 300 Crédito 3x) |
---
## 5. TRADE-IN - GESTÃO DE TROCA
### 5.1 Fluxo Completo do Trade-In (4 Etapas)
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ ETAPA 1 │ │ ETAPA 2 │ │ ETAPA 3 │ │ ETAPA 4 │
│ Avaliação │───>│ Aprovação │───>│ Revisão │───>│ Estoque │
│ │ │ │ │ (O.S. Int.) │ │ │
│ Checklist │ │ Gera crédito │ │ Manutenção │ │ Cria device │
│ IMEI/Cliente │ │ Cria O.S. │ │ Checklist │ │ Preço suger. │
│ Valor estim. │ │ Registro │ │ Peças/custos │ │ Disponível │
│ │ │ IMEI history │ │ │ │ para venda │
│ Status: │ │ Status: │ │ Status: │ │ Status: │
│ pending │ │ approved │ │ completed │ │ in_stock │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
```
### 5.2 Etapa 1 - Avaliação
Dois modos de criação:
#### Avaliação Rápida (Dialog simples)
- Campos: IMEI, Marca, Modelo, Cor, Cliente, Condição Geral, Valor Estimado
- Uso: avaliação expressa sem checklist detalhado
#### Formulário Completo (TradeInForm - 988 linhas)
- **Dados do Cliente:** Busca por nome/CPF na base de pessoas, cadastro rápido
- **Dados do Dispositivo:** IMEI, Marca, Modelo, Cor, Armazenamento
- **Checklist Completo:** 19 itens de verificação (ver seção 6)
- **Peças Necessárias:** Lista de peças com valores
- **Valor de Avaliação:** Calculado ou manual
- **Assinatura Digital:** Canvas para assinatura do cliente (touchscreen/mouse)
- **Ações:** Salvar, Imprimir PDF, Limpar
### 5.3 Etapa 2 - Aprovação
**Endpoint:** `POST /api/retail/evaluations/:id/approve-and-process`
O que acontece na aprovação:
1. Status da avaliação muda para `approved`
2. **Cria O.S. Interna** (`INT${YYMM}RANDOM`) com:
- `serviceType: "internal_review"`
- `isInternal: true`
- `internalType: "revision"`
- `sourceEvaluationId: evaluationId`
3. **Registra no IMEI History** (ação: `trade_in_approved`, status: `in_revision`)
4. **Gera Crédito para o Cliente:**
- Busca pessoa pelo `personId`
- Cria registro em `customer_credits`
- Origem: `trade_in`
- Status: `active`
- Valor = estimatedValue da avaliação
### 5.4 Etapa 3 - Revisão (O.S. Interna)
A O.S. Interna segue o mesmo fluxo de uma O.S. normal mas com marcação `isInternal = true`:
- Técnico pode preencher checklist de revisão
- Adicionar peças utilizadas (custo de reparo)
- Registrar mão de obra
- Preencher diagnóstico
**Endpoint de finalização:** `POST /api/retail/service-orders/:id/finalize-internal`
### 5.5 Etapa 4 - Entrada no Estoque
Ao finalizar a O.S. Interna:
1. **Cria dispositivo** em `mobile_devices`:
- `condition: "refurbished"` (ou conforme avaliação)
- `acquisitionType: "trade_in"`
- `acquisitionCost: estimatedValue + repairCost`
- `relatedEvaluationId: evaluationId`
- `relatedServiceOrderId: serviceOrderId`
- `suggestedPrice: totalCost * (1 + profitMargin/100)`
- `profitMargin: margem configurada (padrão 30%)`
- `status: "in_stock"`
2. **Registra no IMEI History** (ação: `entered_stock`)
3. **Registra no Activity Feed** (tipo: `stock_in`)
### 5.6 Consulta do Fluxo Completo
**Endpoint:** `GET /api/retail/evaluations/:id/full-flow`
Retorna:
```json
{
"evaluation": { ... },
"serviceOrder": { ... },
"device": { ... },
"history": [ ... ],
"flowStatus": "in_stock",
"flowStep": 4,
"steps": [
{ "step": 1, "name": "Avaliação", "status": "completed" },
{ "step": 2, "name": "Aprovação", "status": "completed" },
{ "step": 3, "name": "Revisão (O.S.)", "status": "completed" },
{ "step": 4, "name": "Estoque", "status": "completed" }
]
}
```
### 5.7 Uso do Crédito Trade-In no PDV
Quando o cliente com crédito ativo é selecionado no PDV:
- Um banner azul aparece: "Crédito disponível: R$ X.XXX,XX"
- O operador pode ativar "Usar crédito" como abatimento na compra
- O crédito é deduzido automaticamente do total
- Múltiplos créditos são somados (trade-in + devolução + manual)
---
## 6. CHECKLIST DE AVALIAÇÃO
### 6.1 Checklist Fixo (19 Itens Built-in)
O `deviceEvaluations` possui 19 campos booleanos fixos (cada um com campo de notas/observações):
| # | Campo | Pergunta | Tipo | Impacto |
|---|-------|----------|------|---------|
| 1 | `powerOn` | Aparelho liga corretamente? | Sim/Não | Crítico |
| 2 | `screenIssues` | Avarias, travamentos ou toque fantasma? | Sim/Não | Alto |
| 3 | `screenSpots` | Manchas na tela? | Sim/Não | Médio |
| 4 | `buttonsWorking` | Botões funcionando? | Sim/Não | Médio |
| 5 | `wearMarks` | Marcas de uso? | Sim/Não | Baixo |
| 6 | `wifiWorking` | Wi-Fi funcionando? | Sim/Não | Alto |
| 7 | `simWorking` | Chip funcionando? | Sim/Não | Alto |
| 8 | `mobileDataWorking` | 4G/5G funcionando? | Sim/Não | Alto |
| 9 | `sensorsNfcWorking` | Sensores funcionando / NFC? | Sim/Não | Médio |
| 10 | `biometricWorking` | Face ID / Touch ID funcionando? | Sim/Não | Alto |
| 11 | `microphonesWorking` | Microfones funcionando? | Sim/Não | Alto |
| 12 | `earSpeakerWorking` | Áudio auricular funcionando? | Sim/Não | Médio |
| 13 | `loudspeakerWorking` | Áudio alto-falante funcionando? | Sim/Não | Médio |
| 14 | `chargingPortWorking` | Entrada de carregamento funcionando? | Sim/Não | Alto |
| 15 | `camerasWorking` | Câmeras funcionando / Manchas? | Sim/Não | Alto |
| 16 | `flashWorking` | Flash funcionando? | Sim/Não | Baixo |
| 17 | `hasCharger` | Possui carregador? | Sim/Não | Baixo |
| 18 | `toolsAnalysisOk` | Análise pelo 3uTools OK? | Sim/Não | Alto |
| 19 | `batteryHealth` | Saúde da Bateria | 0-100% | Alto |
Cada campo possui um campo paralelo `*Notes` (texto) para observações adicionais.
### 6.2 Checklist do TradeInForm (Frontend - 19 Itens)
O componente `TradeInForm.tsx` implementa o checklist como array com:
- **ID único** por item
- **Descrição** da verificação
- **Valor:** `"sim"` | `"nao"` | `""` (não avaliado)
- **Observação:** campo de texto livre
```
DEFAULT_CHECKLIST = [
"Aparelho liga corretamente"
"Avarias, travamentos ou toque fantasma"
"Manchas na tela"
"Botões funcionando"
"Marcas de uso"
"Wi-Fi funcionando"
"Chip funcionando"
"4G/5G funcionando"
"Sensores funcionando / NFC"
"Face ID / Touch ID funcionando"
"Microfones funcionando"
"Áudio auricular funcionando"
"Áudio alto-falante funcionando"
"Entrada de carregamento funcionando"
"Câmeras funcionando / Manchas"
"Flash funcionando"
"Possui carregador"
"Análise pelo 3uTools OK"
"Saúde da Bateria (%)"
]
```
### 6.3 Sistema de Templates Customizáveis
Para além do checklist fixo, existe um sistema de templates:
| Tabela | Função |
|--------|--------|
| `trade_in_checklist_templates` | Templates por categoria (smartphone, tablet, laptop, smartwatch) |
| `trade_in_checklist_items` | Itens do template com: categoria (visual/funcional/acessorios/documentacao), tipo de avaliação (condition/boolean/percentage/text), opções JSON, % de impacto no valor, ordenação |
| `trade_in_evaluation_results` | Resultados vinculados à avaliação e item do checklist |
**Tipos de avaliação:**
- `condition`: opções pré-definidas (ex: "perfeito", "bom", "regular", "ruim")
- `boolean`: sim/não
- `percentage`: valor de 0 a 100
- `text`: texto livre
### 6.4 Checklist na O.S. (Diagnóstico)
As Ordens de Serviço possuem campo `checklistData` (JSONB) que armazena dados de checklist de forma flexível:
- Preenchido pelo técnico durante diagnóstico
- Endpoint: `PUT /api/retail/service-orders/:id/checklist`
- Timestamp de conclusão: `checklistCompletedAt`
- Autor: `checklistCompletedBy`
---
## 7. ORDENS DE SERVIÇO
### 7.1 Tipos de O.S.
| Tipo | serviceType | Origem | Descrição |
|------|------------|--------|-----------|
| **Reparo (cliente)** | `repair` | `customer_request` | Cliente traz dispositivo para conserto |
| **Manutenção** | `maintenance` | `customer_request` | Manutenção preventiva |
| **Diagnóstico** | `diagnostic` | `customer_request` | Apenas diagnóstico/orçamento |
| **Revisão Interna** | `internal_review` | `device_acquisition` | Revisão de dispositivo Trade-In |
| **Garantia** | `repair` | `warranty` | Reparo coberto por garantia |
### 7.2 Fluxo de Status da O.S. (12 Estados)
```
open → diagnosis → quote → pending_approval → approved → in_repair → waiting_parts → quality_check → ready_pickup → completed
↓ ↓
rejected cancelled
```
| Status | Descrição |
|--------|-----------|
| `open` | Recém-criada, aguardando atendimento |
| `diagnosis` | Em diagnóstico pelo técnico |
| `quote` | Orçamento elaborado, aguardando aprovação |
| `pending_approval` | Enviado para aprovação do cliente |
| `approved` | Cliente aprovou o orçamento |
| `rejected` | Cliente rejeitou o orçamento |
| `in_repair` | Em reparo ativo |
| `waiting_parts` | Aguardando peças/componentes |
| `quality_check` | Verificação de qualidade pós-reparo |
| `ready_pickup` | Pronto para retirada pelo cliente |
| `completed` | Concluída e entregue |
| `cancelled` | Cancelada |
### 7.3 Campos da O.S.
- **Identificação:** Número (auto-gerado), Loja, Prioridade (low/normal/high/urgent)
- **Dispositivo:** IMEI, Marca, Modelo, deviceId
- **Cliente:** Nome, Telefone, Email, personId (pessoa unificada)
- **Técnico:** Nome, personId do técnico
- **Custos:** Peças (partsCost), Mão de obra (laborCost), Total (totalCost)
- **Datas:** Data esperada, Data real de conclusão
- **Pagamento:** Status (pending/paid/partial)
- **O.S. Interna:** isInternal, internalType, sourceEvaluationId
### 7.4 Itens da O.S.
Cada O.S. pode ter múltiplos itens:
- **Peça (part):** Componente utilizado no reparo
- **Mão de obra (labor):** Serviço técnico
- **Acessório (accessory):** Acessório incluído
### 7.5 Garantias de Serviço
Ao concluir uma O.S., pode-se criar uma garantia vinculada:
- Vincula à O.S. e ao IMEI
- Define prazo em dias (ex: 90 dias)
- Status: active → expired (automático) ou claimed (cliente acionou)
- Consulta de garantia por IMEI: `GET /api/retail/warranties/check/:imei`
### 7.6 Faturamento de O.S. no PDV
Quando uma O.S. está com status `ready_pickup`:
1. Aparece na aba "Faturar O.S." do PDV
2. O operador adiciona ao carrinho como item de serviço
3. A venda é registrada normalmente
4. A O.S. é marcada como `completed`
---
## 8. DEVOLUÇÕES E TROCAS
### 8.1 Fluxo de Devolução
```
1. Operador clica "Devolução" no PDV
2. Busca venda original por número ou cliente
3. Seleciona itens para devolver
4. Define motivo e método de reembolso
5. Verificação de senha do gerente (MANAGER_PASSWORD)
6. Processamento:
a. Cria registro em return_exchanges
b. Cria itens em return_exchange_items
c. Para dispositivos: reverte status do mobile_device para "returned"
d. Para produtos: ajusta estoque
e. Gera crédito para o cliente (customer_credits)
f. Registra no IMEI history (para dispositivos)
g. Registra no activity feed
```
### 8.2 Tipos
| Tipo | Descrição |
|------|-----------|
| `return` | Devolução pura (reembolso) |
| `exchange` | Troca por outro produto |
### 8.3 Métodos de Reembolso
- Crédito na loja (gera `customer_credits`)
- Dinheiro
- Estorno no cartão
- PIX
### 8.4 Busca de Vendas para Devolução
**Endpoint:** `GET /api/retail/sales-for-return?search=...`
Busca por:
- Número da venda (saleNumber)
- Nome do cliente
- CPF do cliente
Retorna vendas com status "completed" + itens detalhados.
### 8.5 Segurança
A devolução exige **senha do gerente** (`MANAGER_PASSWORD`) para ser processada. Endpoint de verificação: `POST /api/retail/verify-manager-password`.
---
## 9. ESTOQUE E DEPÓSITOS
### 9.1 Tipos de Depósito
| Tipo | Descrição |
|------|-----------|
| `store` | Depósito vinculado a uma loja |
| `central` | Depósito central (distribuição) |
| `transit` | Em trânsito entre depósitos |
| `virtual` | Depósito virtual (ex: consignação) |
### 9.2 Movimentações de Estoque
| Tipo de Movimento | Operação | Descrição |
|-------------------|----------|-----------|
| `entry` | `purchase` | Entrada por compra |
| `entry` | `trade_in` | Entrada por trade-in |
| `entry` | `manual_entry` | Entrada manual |
| `entry` | `devolution` | Entrada por devolução |
| `exit` | `sale` | Saída por venda |
| `transfer_in` | - | Recebimento de transferência |
| `transfer_out` | - | Envio para transferência |
| `adjustment` | `inventory_adjustment` | Ajuste de inventário |
| `return` | - | Retorno (devolução) |
### 9.3 Transferências entre Depósitos
Fluxo: `pending → in_transit → completed`
Cada transferência registra:
- Depósito de origem e destino
- Itens com quantidade solicitada, transferida e recebida
- Números de série/IMEI vinculados
- Responsáveis (solicitante, aprovador, recebedor)
### 9.4 Inventário
Tipos: `full` (completo), `partial` (parcial), `cyclic` (cíclico)
Fluxo: `open → counting → adjusting → completed`
Para cada item do inventário:
- Sistema mostra quantidade no sistema
- Operador informa quantidade contada
- Sistema calcula diferença
- Ao aplicar ajuste: cria movimentação automática
---
## 10. COMISSÕES E METAS
### 10.1 Dashboard de Comissões
O dashboard exibe para cada vendedor:
- Total de vendas no período
- Número de vendas
- Ticket médio
- Comissão calculada
- Meta vs Realizado (progress bar)
- Comparativo entre vendedores
### 10.2 Planos de Comissão
| Tipo | Descrição |
|------|-----------|
| `fixed` | Valor fixo por venda |
| `percent` | Percentual sobre o valor da venda |
| `tiered` | Faixas progressivas (rules JSONB) |
| `per_product` | Comissão específica por produto/categoria |
### 10.3 Metas
- **Por Vendedor:** goalAmount, goalType (sales/units/margin), achievedAmount, achievedPercent, bonus
- **Por Loja:** goalAmount, achievedAmount, achievedPercent
### 10.4 Fechamento de Comissão
O fechamento consolida vendas e devoluções em um período:
```
POST /api/retail/commission-closures/calculate
Input: sellerId, periodStart, periodEnd, commissionRate
Output: {
totalSales,
totalReturns (devoluções deduzidas),
netSales (vendas líquidas),
salesCount,
returnsCount,
commissionAmount,
items: [ { saleId, amount, commission } ]
}
```
Status do fechamento: `open → closed → paid`
---
## 11. RELATÓRIOS
### 11.1 Relatórios Disponíveis (6 + 1)
| # | Relatório | Endpoint | Descrição |
|---|-----------|----------|-----------|
| 1 | **OS por Status** | `GET /reports/os-by-status` | Quantidade e valor total por status |
| 2 | **OS por Técnico** | `GET /reports/os-by-technician` | Total de O.S., concluídas, em andamento, receita por técnico |
| 3 | **Vendas por Vendedor** | `GET /reports/sales-by-seller` | Total vendas, receita, ticket médio, dias ativos |
| 4 | **Margem por IMEI** | `GET /reports/margin-by-imei` | Custo, venda, margem absoluta e %, status |
| 5 | **Caixa Diário** | `GET /reports/daily-cash` | Fechamento completo do dia |
| 6 | **Giro de Estoque** | `GET /reports/stock-turnover` | Estoque atual, vendas 30d, turnover ratio |
| 7 | **Detalhamento de Vendas** | `GET /sales?detailed=true` | Lista completa com filtros |
### 11.2 Caixa Diário (Detalhamento)
O relatório de caixa diário é o mais completo, executando **4 queries:**
**Query 1 - Resumo:**
- Total de vendas (R$)
- Quantidade de vendas
- Total em dinheiro
- Total em cartão (débito + crédito)
- Total em PIX
- Total combinado
**Query 2 - Movimentações:**
- Total de sangrias
- Total de reforços
**Query 3 - Listagem de Vendas:**
- Cada venda com: número, hora, cliente, vendedor, subtotal, desconto, total, forma de pagamento
**Query 4 - Vendas por Vendedor:**
Para cada vendedor, breakdown completo:
| Coluna | Descrição |
|--------|-----------|
| Vendedor | Nome |
| Vendas | Quantidade |
| Dinheiro | Total em cash |
| Débito | Total em débito |
| Crédito | Total em crédito |
| PIX | Total em PIX |
| Combinado | Total combinado |
| Descontos | Total de descontos concedidos |
| **Total** | **Receita líquida** |
Linha de rodapé com totalizadores gerais.
**Cálculo do Saldo do Caixa:**
```
Saldo = Dinheiro + Reforços - Sangrias
```
---
## 12. CADASTROS
### 12.1 Formas de Pagamento
CRUD completo com campos:
- Nome, Tipo (cash/debit/credit/pix/boleto/financing)
- Bandeira (visa/mastercard/elo/amex/hipercard)
- Taxa (%), Taxa fixa (R$)
- Máximo de parcelas
- Taxas por parcela (JSONB: [{installments, feePercent}])
- Dias para recebimento
### 12.2 Vendedores
CRUD com vínculo a:
- Pessoa unificada (personId)
- Loja (storeId)
- Plano de comissão (commissionPlanId)
- Data de contratação
### 12.3 Planos de Comissão
Tipos: fixed, percent, tiered, per_product
Regras customizáveis via JSONB
### 12.4 Tabelas de Preço
- Tipos de cliente: retail, wholesale, vip, employee
- Desconto ou markup percentual
- Validade (de/até)
- Itens específicos com preço customizado
### 12.5 Promoções
- Tipos: percent_off, fixed_off, buy_x_get_y, bundle
- Aplicação: all, category, product, brand
- Quantidade mínima/máxima
- Período de validade
### 12.6 Tipos de Produto
Com atributos fiscais completos:
- Categoria: device, accessory, part, service
- Controle: requiresImei, requiresSerial
- Fiscal: NCM, CEST, Origem, CST ICMS, CSOSN, CFOPs (4 tipos), Alíquotas (ICMS, PIS, COFINS, IPI)
- Reforma Tributária: IBS e CBS (preparado)
- Unidade de medida
---
## 13. COMPRAS E AQUISIÇÕES
### 13.1 Pedidos de Compra
Fluxo: `draft → submitted → approved → partially_received → received → cancelled`
Campos: fornecedor, depósito destino, itens (produto, quantidade, preço), condições de pagamento, frete, desconto, totais.
### 13.2 Recebimento de Mercadoria
**Endpoint:** `POST /api/retail/purchase-orders/:id/receive`
Ao receber:
1. Atualiza quantidades recebidas por item
2. Cria movimentações de estoque (entry/purchase)
3. Atualiza saldos no depósito destino
4. Registra números de série quando aplicável
5. Atualiza status do pedido
---
## 14. CRÉDITOS DE CLIENTE
### 14.1 Origens de Crédito
| Origem | Quando é gerado |
|--------|----------------|
| `trade_in` | Aprovação de avaliação de Trade-In |
| `return` | Devolução com reembolso em crédito |
| `manual` | Criação manual pelo operador |
| `promotion` | Promoção que gera crédito |
### 14.2 Ciclo de Vida
```
active → used (parcial ou total) → expired → cancelled
```
### 14.3 Uso no PDV
Quando o cliente é selecionado:
1. Sistema busca `customer_credits` com status `active` e `remainingAmount > 0`
2. Soma total de créditos disponíveis
3. Exibe banner: "Crédito disponível: R$ X.XXX,XX"
4. Operador pode ativar abatimento
5. Na finalização, deduz do crédito mais antigo primeiro (FIFO)
6. Registra uso parcial (atualiza remainingAmount) ou total (status → used)
### 14.4 Recibo de Crédito
**Endpoint:** `GET /api/retail/customer-credits/:creditId/receipt`
Gera dados para impressão do comprovante de crédito.
---
## 15. INTEGRAÇÃO COM PLUS (LARAVEL)
### 15.1 Componentes da Integração
| Arquivo | Função |
|---------|--------|
| `server/plus/proxy.ts` | Proxy reverso `/plus/*` → Laravel :8080 |
| `server/plus/sso.ts` | SSO via token HMAC-SHA256 |
| `server/plus/launcher.ts` | Auto-start do Laravel (php artisan serve) |
| `server/plus/client.ts` | Cliente REST para API do Plus |
| `server/retail/plus-sync.ts` | Sincronização Retail → Plus |
### 15.2 Sincronização Retail → Plus
| Entidade Suite | Entidade Plus | Endpoint |
|---------------|--------------|----------|
| Persons (clientes) | Clientes | `POST /api/retail/plus/sync/customers` |
| POS Sales + Items | Vendas + Itens + Faturamento | `POST /api/retail/plus/sync/sales` |
| POS Sales | NF-e/NFC-e | `POST /api/retail/plus/sync/nfe` |
### 15.3 Campos de Sync na pos_sales
| Campo | Descrição |
|-------|-----------|
| `plusVendaId` | ID da venda criada no Plus |
| `plusNfeChave` | Chave de acesso da NF-e emitida |
| `plusSyncStatus` | pending → synced → error → not_applicable |
| `plusSyncError` | Mensagem de erro (se houver) |
| `plusSyncedAt` | Timestamp da sincronização |
| `empresaId` | ID da empresa (tenant_empresas) vinculada |
---
## 16. API - ENDPOINTS COMPLETOS
### 16.1 Listagem por Domínio
Todos os endpoints estão sob `/api/retail/*` e requerem autenticação.
#### Activity Feed (2)
```
GET /activity-feed
POST /activity-feed/mark-read
```
#### Formas de Pagamento (4)
```
GET /payment-methods
POST /payment-methods
PUT /payment-methods/:id
DELETE /payment-methods/:id
```
#### Vendedores (4)
```
GET /sellers
POST /sellers
PUT /sellers/:id
DELETE /sellers/:id
```
#### Planos de Comissão (4)
```
GET /commission-plans
POST /commission-plans
PUT /commission-plans/:id
DELETE /commission-plans/:id
```
#### Tabelas de Preço (4)
```
GET /price-tables
POST /price-tables
PUT /price-tables/:id
DELETE /price-tables/:id
```
#### Promoções (4)
```
GET /promotions
POST /promotions
PUT /promotions/:id
DELETE /promotions/:id
```
#### Tipos de Produto (5)
```
GET /product-types
GET /product-types/:id
POST /product-types
PUT /product-types/:id
DELETE /product-types/:id
```
#### Lojas (3)
```
GET /stores
POST /stores
PUT /stores/:id
```
#### Depósitos (4)
```
GET /warehouses
POST /warehouses
PUT /warehouses/:id
DELETE /warehouses/:id
```
#### Saldos de Estoque (2)
```
GET /warehouse-stock
GET /warehouse-stock/:warehouseId/summary
```
#### Movimentações de Estoque (2)
```
GET /stock-movements
POST /stock-movements
```
#### Números de Série (3)
```
GET /product-serials
POST /product-serials
PUT /product-serials/:id
```
#### Transferências (4)
```
GET /stock-transfers
GET /stock-transfers/:id
POST /stock-transfers
PUT /stock-transfers/:id/status
```
#### Inventários (5)
```
GET /inventories
POST /inventories
GET /inventories/:id
PUT /inventories/:id/count
PUT /inventories/:id/apply
```
#### Dispositivos (5)
```
GET /devices
GET /devices/:id
GET /devices/imei/:imei
POST /devices
PUT /devices/:id
```
#### Avaliações / Trade-In (10)
```
GET /evaluations
GET /evaluations/:id
POST /evaluations
PUT /evaluations/:id
PUT /evaluations/:id/approve
PUT /evaluations/:id/reject
PUT /evaluations/:id/start-analysis
POST /evaluations/:id/approve-and-process
GET /evaluations/:id/full-flow
GET /evaluations/:id/service-order
```
#### Ordens de Serviço (8)
```
GET /service-orders
GET /service-orders/:id
POST /service-orders
PUT /service-orders/:id
PUT /service-orders/:id/complete-preparation
POST /service-orders/:id/items
GET /service-orders/:id/items
DELETE /service-orders/:id/items/:itemId
PUT /service-orders/:id/checklist
POST /service-orders/:id/finalize-internal
```
#### Sessões de Caixa (3)
```
GET /pos-sessions
POST /pos-sessions/open
PUT /pos-sessions/:id/close
```
#### Movimentações de Caixa (2)
```
GET /cash-movements
POST /cash-movements
```
#### Garantias (4)
```
GET /warranties
POST /warranties
GET /warranties/check/:imei
PUT /warranties/:id/claim
```
#### Alertas de Estoque (1)
```
GET /stock-alerts
```
#### Relatórios (7)
```
GET /reports/os-by-status
GET /reports/os-by-technician
GET /reports/sales-by-seller
GET /reports/margin-by-imei
GET /reports/daily-cash
GET /reports/stock-turnover
GET /dashboard-stats
```
#### Vendas (1)
```
GET /sales
```
#### Pessoas (7)
```
GET /persons
GET /persons/:id
POST /persons
PUT /persons/:id
POST /persons/:id/roles
PUT /persons/:id/roles/:roleId
DELETE /persons/:id/roles/:roleType
```
#### Histórico por Pessoa (4)
```
GET /persons/:id/sales
GET /persons/:id/services
GET /persons/:id/trade-ins
GET /persons/:id/credits
```
#### Histórico por IMEI (3)
```
GET /devices/:imei/history
GET /devices/by-origin/:originType
GET /inventory/by-origin
```
#### Trade-In Workflow (2)
```
GET /customer-trade-ins/:personId
```
#### Segurança (1)
```
POST /verify-manager-password
```
#### Devoluções (5)
```
GET /sales-for-return
GET /returns
POST /returns
GET /customer-credits/:personId
GET /customer-credits/:creditId/receipt
POST /customer-credits/:creditId/use
```
#### Metas de Vendedor (4)
```
GET /seller-goals
POST /seller-goals
PUT /seller-goals/:id
DELETE /seller-goals/:id
```
#### Metas da Loja (3)
```
GET /store-goals
POST /store-goals
PUT /store-goals/:id
```
#### Fechamento de Comissão (4)
```
GET /commission-closures
POST /commission-closures
PUT /commission-closures/:id
POST /commission-closures/calculate
GET /commission-dashboard
```
#### Compras (5)
```
GET /purchase-orders
GET /purchase-orders/:id
POST /purchase-orders
PATCH /purchase-orders/:id/status
POST /purchase-orders/:id/receive
DELETE /purchase-orders/:id
```
#### Plus Sync (8)
```
GET /plus/status
POST /plus/sync/customers
POST /plus/sync/sales
POST /plus/sync/nfe
POST /plus/import/customers
POST /plus/import/products
GET /plus/empresas
POST /plus/empresas
POST /plus/empresas/:id/bind
```
#### ERPNext Sync (8)
```
GET /sync/status
POST /sync/persons/:id
POST /sync/persons
POST /sync/devices/:id
POST /sync/service-orders/:id
POST /sync/import/customers
POST /sync/import/suppliers
POST /sync/full
POST /sync/stock-entry
POST /sync/sales-invoice
```
**Total: ~130 endpoints**
---
## 17. SEGURANÇA E MULTI-TENANT
### 17.1 Autenticação
- Todas as rotas exigem `requireAuth` (Passport.js session)
- Verificação: `req.isAuthenticated()`
### 17.2 Tenant Scoping
- Todos os relatórios e consultas filtram por `tenantId`
- Se `tenantId` estiver ausente, retorna 403
- Dados de um tenant nunca vazam para outro
### 17.3 Module Gating
- Middleware `requireModule(key)` verifica se módulo está ativo no tenant
- Verifica campo JSONB `tenants.features[key]`
- Retorna 403 com ação sugerida se módulo inativo
### 17.4 Operações Sensíveis
- Devoluções exigem senha do gerente (MANAGER_PASSWORD)
- Verificação via endpoint dedicado
- Sangrias de caixa registram responsável e autorizador
### 17.5 Auditoria
- Todas as operações relevantes registram no `retail_activity_feed`
- IMEI history rastreia toda movimentação de dispositivos
- Device history registra eventos por IMEI
---
## CONCLUSÃO
O módulo Retail da Arcádia Suite é uma solução completa e verticalmente integrada para lojas de celulares e assistência técnica, com **~16.800 linhas de código**, **40+ tabelas**, e **~130 endpoints REST**. Ele cobre todo o ciclo operacional desde a aquisição de dispositivos (compra ou trade-in), passando pela gestão de estoque por IMEI, ordens de serviço com checklist detalhado, PDV com múltiplas formas de pagamento, até o fechamento de caixa com breakdown por vendedor e tipo de pagamento. A integração com o Plus (Laravel) permite emissão de NF-e/NFC-e e sincronização completa de dados fiscais.