- Removido README.md padrão do Laravel (backend) - Removidos scripts de deploy (não mais necessários) - Atualizado copilot-instructions.md para novo fluxo - Adicionada documentação de auditoria do servidor - Sincronizado código de produção com repositório Novo workflow: - Trabalhamos diretamente em /root/webmoney (symlink para /var/www/webmoney) - Mudanças PHP são instantâneas - Mudanças React requerem 'npm run build' - Commit após validação funcional
332 lines
12 KiB
Markdown
Executable File
332 lines
12 KiB
Markdown
Executable File
# ESTRUTURA DO PROJETO WEBMONEY
|
||
|
||
**Versão:** 1.27.1
|
||
**Última atualização:** 13 de Dezembro de 2025
|
||
|
||
---
|
||
|
||
## 📁 Estrutura Geral
|
||
|
||
```
|
||
webmoney/
|
||
├── backend/ # Laravel 12 API
|
||
├── frontend/ # React 18 SPA
|
||
├── VERSION # Versão atual
|
||
├── CHANGELOG.md # Histórico de versões
|
||
├── README.md # Documentação principal
|
||
├── ESTRUTURA_PROJETO.md # Este arquivo
|
||
├── CREDENCIAIS_SERVIDOR.md # Acessos (confidencial)
|
||
├── ESPECIFICACIONES_WEBMONEY.md # Especificação funcional
|
||
├── APRENDIZADOS_TECNICOS.md # Soluções de problemas
|
||
└── .DIRETRIZES_DESENVOLVIMENTO_v3 # Regras de dev
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Backend (Laravel 12)
|
||
|
||
```
|
||
backend/
|
||
├── app/
|
||
│ ├── Http/
|
||
│ │ ├── Controllers/Api/
|
||
│ │ │ ├── AccountController.php
|
||
│ │ │ ├── AuthController.php
|
||
│ │ │ ├── CategoryController.php
|
||
│ │ │ ├── CostCenterController.php
|
||
│ │ │ ├── DashboardController.php
|
||
│ │ │ ├── EmailTestController.php
|
||
│ │ │ ├── ImportController.php
|
||
│ │ │ ├── LiabilityAccountController.php
|
||
│ │ │ ├── RecurringTemplateController.php # Transações recorrentes
|
||
│ │ │ ├── TransactionController.php
|
||
│ │ │ └── TransferDetectionController.php # Inclui RefundDetection
|
||
│ │ │
|
||
│ │ └── Middleware/
|
||
│ │ └── SecurityHeaders.php # Headers de segurança
|
||
│ │
|
||
│ ├── Models/
|
||
│ │ ├── Account.php
|
||
│ │ ├── Category.php
|
||
│ │ ├── CategoryKeyword.php
|
||
│ │ ├── CostCenter.php
|
||
│ │ ├── CostCenterKeyword.php
|
||
│ │ ├── ImportLog.php
|
||
│ │ ├── ImportMapping.php
|
||
│ │ ├── LiabilityAccount.php
|
||
│ │ ├── LiabilityInstallment.php
|
||
│ │ ├── RecurringInstance.php # Parcelas de recorrência
|
||
│ │ ├── RecurringTemplate.php # Templates de recorrência
|
||
│ │ ├── Transaction.php
|
||
│ │ └── User.php
|
||
│ │
|
||
│ ├── Services/
|
||
│ │ ├── Import/
|
||
│ │ │ ├── ImportService.php
|
||
│ │ │ ├── ExcelParser.php
|
||
│ │ │ ├── CsvParser.php
|
||
│ │ │ ├── OfxParser.php
|
||
│ │ │ └── PdfParser.php
|
||
│ │ └── RecurringService.php # Lógica de recorrências
|
||
│ │
|
||
│ ├── Policies/
|
||
│ │ └── RecurringTemplatePolicy.php # Autorização
|
||
│ │
|
||
│ └── Providers/
|
||
│ └── AppServiceProvider.php # Rate limiting config
|
||
│
|
||
├── config/
|
||
│ ├── cors.php # CORS configuration
|
||
│ ├── sanctum.php # Token expiration
|
||
│ └── session.php # Cookie settings
|
||
│
|
||
├── database/migrations/ # 30+ migrations
|
||
│
|
||
├── routes/
|
||
│ └── api.php # Todas as rotas da API
|
||
│
|
||
└── deploy.sh # Script de deploy
|
||
```
|
||
|
||
---
|
||
|
||
## 🎨 Frontend (React 18)
|
||
|
||
```
|
||
frontend/
|
||
├── src/
|
||
│ ├── components/
|
||
│ │ ├── CookieConsent.jsx # Banner LGPD/GDPR
|
||
│ │ ├── CreateRecurrenceModal.jsx # Modal criar recorrência
|
||
│ │ ├── CurrencySelector.jsx
|
||
│ │ ├── Footer.jsx # Rodapé
|
||
│ │ ├── IconSelector.jsx
|
||
│ │ ├── LanguageSelector.jsx
|
||
│ │ ├── Layout.jsx # Menu com grupos colapsáveis
|
||
│ │ ├── Modal.jsx
|
||
│ │ ├── ProtectedRoute.jsx
|
||
│ │ ├── Toast.jsx
|
||
│ │ └── dashboard/
|
||
│ │ ├── CalendarWidget.jsx # Calendário interativo
|
||
│ │ ├── CashflowChart.jsx # Gráfico fluxo de caixa
|
||
│ │ ├── OverdueWidget.jsx # Widget de vencidos
|
||
│ │ ├── OverpaymentsAnalysis.jsx # Análise sobrepagamentos
|
||
│ │ ├── PaymentVariancesChart.jsx # Variações de pagamento
|
||
│ │ └── UpcomingWidget.jsx # Próximos 7 dias
|
||
│ │
|
||
│ ├── pages/
|
||
│ │ ├── Accounts.jsx
|
||
│ │ ├── Categories.jsx
|
||
│ │ ├── CostCenters.jsx
|
||
│ │ ├── Dashboard.jsx # Inclui todos os widgets
|
||
│ │ ├── ImportTransactions.jsx
|
||
│ │ ├── LiabilityAccounts.jsx
|
||
│ │ ├── Login.jsx
|
||
│ │ ├── RecurringTransactions.jsx # Página de recorrentes
|
||
│ │ ├── RefundDetection.jsx # Detecção de reembolsos
|
||
│ │ ├── Register.jsx
|
||
│ │ ├── TransactionsByWeek.jsx
|
||
│ │ └── TransferDetection.jsx
|
||
│ │
|
||
│ ├── services/
|
||
│ │ └── api.js # Axios + todos services
|
||
│ │
|
||
│ ├── i18n/
|
||
│ │ ├── index.js # Config i18next + detecção país
|
||
│ │ └── locales/
|
||
│ │ ├── es.json
|
||
│ │ ├── en.json
|
||
│ │ └── pt-BR.json
|
||
│ │
|
||
│ ├── context/
|
||
│ │ └── AuthContext.jsx
|
||
│ │
|
||
│ └── App.jsx
|
||
│
|
||
├── dist/ # Build de produção
|
||
└── deploy.sh # Script de deploy
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 Endpoints da API
|
||
|
||
### Autenticação
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| POST | `/api/register` | Criar conta |
|
||
| POST | `/api/login` | Login (retorna token) |
|
||
| POST | `/api/logout` | Logout |
|
||
| GET | `/api/user` | Usuário autenticado |
|
||
|
||
### Contas Bancárias
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/accounts` | Listar contas |
|
||
| POST | `/api/accounts` | Criar conta |
|
||
| PUT | `/api/accounts/{id}` | Atualizar conta |
|
||
| DELETE | `/api/accounts/{id}` | Excluir conta |
|
||
| POST | `/api/accounts/{id}/recalculate-balance` | Recalcular saldo |
|
||
|
||
### Transações
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/transactions` | Listar (com filtros) |
|
||
| GET | `/api/transactions/by-week` | Agrupadas por semana |
|
||
| POST | `/api/transactions` | Criar |
|
||
| PUT | `/api/transactions/{id}` | Atualizar |
|
||
| DELETE | `/api/transactions/{id}` | Excluir |
|
||
| POST | `/api/transactions/{id}/toggle-status` | Alternar status |
|
||
| POST | `/api/transactions/{id}/split` | Dividir transação |
|
||
|
||
### Dashboard
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/dashboard/stats` | Estatísticas gerais |
|
||
| GET | `/api/dashboard/cashflow` | Fluxo de caixa mensal |
|
||
| GET | `/api/dashboard/overpayments` | Análise de sobrepagamentos |
|
||
| GET | `/api/dashboard/calendar` | Dados do calendário (mês) |
|
||
| GET | `/api/dashboard/calendar-day` | Transações de um dia |
|
||
| GET | `/api/dashboard/upcoming` | Próximos N dias pendentes |
|
||
| GET | `/api/dashboard/overdue` | Transações vencidas pendentes |
|
||
|
||
### Transações Recorrentes
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/recurring` | Listar templates |
|
||
| POST | `/api/recurring` | Criar template |
|
||
| POST | `/api/recurring/from-transaction` | Criar de transação |
|
||
| GET | `/api/recurring/{id}` | Detalhe do template |
|
||
| PUT | `/api/recurring/{id}` | Atualizar template |
|
||
| DELETE | `/api/recurring/{id}` | Excluir template |
|
||
| POST | `/api/recurring/{id}/pause` | Pausar template |
|
||
| POST | `/api/recurring/{id}/resume` | Retomar template |
|
||
| GET | `/api/recurring/{id}/instances` | Listar parcelas |
|
||
| GET | `/api/recurring/pending` | Todas pendentes |
|
||
| GET | `/api/recurring/overdue` | Vencidas |
|
||
| GET | `/api/recurring/due-soon` | Próximas do vencimento |
|
||
| GET | `/api/recurring/frequencies` | Frequências disponíveis |
|
||
| POST | `/api/recurring-instances/{id}/pay` | Pagar (cria transação) |
|
||
| POST | `/api/recurring-instances/{id}/reconcile` | Conciliar |
|
||
| POST | `/api/recurring-instances/{id}/skip` | Pular |
|
||
| POST | `/api/recurring-instances/{id}/cancel` | Cancelar |
|
||
| GET | `/api/recurring-instances/{id}/candidates` | Transações candidatas |
|
||
|
||
### Duplicatas
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/duplicates` | Listar grupos |
|
||
| POST | `/api/duplicates/{id}/ignore` | Ignorar par |
|
||
| DELETE | `/api/duplicates/{id}/auto-delete` | Auto-delete grupo |
|
||
| POST | `/api/duplicates/batch-ignore` | Ignorar em lote |
|
||
| DELETE | `/api/duplicates/batch-auto-delete` | Auto-delete em lote |
|
||
|
||
### Transferências
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/transfers/potential` | Transferências potenciais |
|
||
| POST | `/api/transfers/confirm` | Confirmar transferência |
|
||
| POST | `/api/transfers/ignore` | Ignorar par |
|
||
|
||
### Detecção de Reembolsos
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| GET | `/api/refund-detection/potential` | Pares despesa/reembolso potenciais |
|
||
| POST | `/api/refund-detection/confirm` | Confirmar par de reembolso |
|
||
| POST | `/api/refund-detection/ignore` | Ignorar par |
|
||
|
||
### Importação
|
||
| Método | Endpoint | Descrição |
|
||
|--------|----------|-----------|
|
||
| POST | `/api/import/parse` | Parsear arquivo |
|
||
| POST | `/api/import/execute` | Executar importação |
|
||
|
||
---
|
||
|
||
## <20><>️ Banco de Dados
|
||
|
||
### Tabelas Principais
|
||
|
||
| Tabela | Descrição |
|
||
|--------|-----------|
|
||
| `users` | Usuários do sistema |
|
||
| `accounts` | Contas bancárias |
|
||
| `transactions` | Transações financeiras |
|
||
| `categories` | Categorias (175 pré-configuradas) |
|
||
| `category_keywords` | Keywords para auto-classificação |
|
||
| `cost_centers` | Centros de custo |
|
||
| `cost_center_keywords` | Keywords de centros de custo |
|
||
| `liability_accounts` | Contas passivo (financiamentos) |
|
||
| `liability_installments` | Parcelas de financiamentos |
|
||
| `recurring_templates` | Templates de transações recorrentes |
|
||
| `recurring_instances` | Parcelas/instâncias de recorrências |
|
||
| `import_logs` | Log de importações |
|
||
| `import_mappings` | Mapeamentos salvos |
|
||
| `ignored_duplicate_pairs` | Pares de duplicatas ignorados |
|
||
| `ignored_transfer_pairs` | Pares de transferências ignorados |
|
||
| `ignored_refund_pairs` | Pares de reembolso ignorados |
|
||
|
||
### Campos Especiais de Transações
|
||
|
||
| Campo | Tipo | Descrição |
|
||
|-------|------|-----------|
|
||
| `is_transfer` | boolean | É uma transferência |
|
||
| `transfer_pair_id` | int | ID da transação par |
|
||
| `is_refund_pair` | boolean | É parte de par reembolso |
|
||
| `refund_linked_id` | int | ID da transação vinculada (reembolso) |
|
||
| `is_split` | boolean | Foi dividida |
|
||
| `split_from_id` | int | ID da transação original |
|
||
| `recurring_instance_id` | int | ID da instância recorrente vinculada |
|
||
| `import_hash` | string | Hash SHA-256 para duplicidade |
|
||
| `original_description` | string | Descrição original do banco |
|
||
|
||
---
|
||
|
||
## 🖥️ Servidor de Produção
|
||
|
||
| Item | Valor |
|
||
|------|-------|
|
||
| **IP** | 213.165.93.60 |
|
||
| **Domínio** | webmoney.cnxifly.com |
|
||
| **Backend** | /var/www/webmoney/backend |
|
||
| **Frontend** | /var/www/webmoney/frontend/dist |
|
||
| **PHP** | 8.4-FPM |
|
||
| **Web Server** | Nginx |
|
||
| **SSL** | Let's Encrypt |
|
||
| **Sessões** | Redis |
|
||
|
||
---
|
||
|
||
## 🔐 Segurança Implementada
|
||
|
||
| Recurso | Configuração |
|
||
|---------|--------------|
|
||
| **Rate Limiting** | Login: 5/min, Register: 10/hour, API: 60/min |
|
||
| **CORS** | Restrito a webmoney.cnxifly.com |
|
||
| **Token Expiration** | 7 dias |
|
||
| **Cookies** | HttpOnly, Secure, SameSite=lax, Encrypt=true |
|
||
| **Headers** | X-XSS-Protection, X-Content-Type-Options, X-Frame-Options, CSP |
|
||
|
||
---
|
||
|
||
## 📝 Comandos Úteis
|
||
|
||
### Deploy
|
||
```bash
|
||
# Frontend
|
||
cd frontend && ./deploy.sh
|
||
|
||
# Backend
|
||
cd backend && ./deploy.sh
|
||
```
|
||
|
||
### Conectar ao Servidor
|
||
```bash
|
||
sshpass -p 'Master9354' ssh root@213.165.93.60
|
||
```
|
||
|
||
### Artisan no Servidor
|
||
```bash
|
||
cd /var/www/webmoney/backend && php artisan [comando]
|
||
```
|