# Credify Go! — Hallazgos de Auditoría Integral
**Fecha:** 15 de abril de 2026  
**Metodología:** 4 agentes especializados en paralelo (negocio, backend, PWA, discrepancias)

---

## 1. IDEA DE NEGOCIO

**Credify Go!** es una plataforma SaaS multi-tenant para gestión de microcréditos y cobranza en campo, dirigida a cooperativas, financieras informales y empresas de cobranza en Latinoamérica. Su propuesta de valor central es:

> **Permitir que equipos de cobradores en campo registren pagos, visitas y compromisos de pago sin conexión a internet**, sincronizando automáticamente al recuperarla.

### Actores del sistema

| Rol | Panel | Responsabilidad |
|-----|-------|-----------------|
| super_admin | Filament | Gestión de planes SaaS, todas las empresas |
| admin | Filament + PWA | Gestión de créditos, reportes financieros, aprobaciones |
| supervisor | PWA | Supervisión del equipo de cobradores, aprobaciones menores |
| collector | PWA (offline-first) | Registro de pagos y visitas en campo |
| client | Portal (incompleto) | Ver saldo e historial propio |

### Ciclo de vida del crédito

```
ACTIVE ←→ DELAYED ←→ OVERDUE → DEFAULTED
  ↓ (operaciones)
EXTENDED | REFINANCED | RESTRUCTURED | RENEWED | PAID | CANCELED
  ↓ (crédito hijo)
ACTIVE (nuevo ciclo)
```

**Regla fundamental:** Solo créditos hoja (sin hijos) son operacionales. Los padres nunca cambian estado automáticamente.

---

## 2. PUNTUACIÓN GLOBAL

| Dimensión | Score | Veredicto |
|-----------|-------|-----------|
| Seguridad | 5/10 | 🔴 NO apto para producción |
| Arquitectura | 8/10 | ✅ Sólida |
| Completitud backend | 6/10 | 🟠 Funciones críticas faltantes |
| Completitud PWA | 7/10 | 🟠 Race conditions y rollback ausente |
| Discrepancias PWA↔API | 5/10 | 🔴 8 discrepancias, gastos offline rotos |
| Performance | 6/10 | 🟠 11+ índices faltantes |
| Testing | 4/10 | 🔴 0% cobertura de controllers |
| **TOTAL** | **6.1/10** | Funcional pero no production-ready |

---

## 3. VULNERABILIDADES DE SEGURIDAD

### 🔴 CRÍTICAS

| ID | Descripción | Archivo | Fix |
|----|-------------|---------|-----|
| S-01 | IDOR en PaymentController::receipt() — collector ve recibos ajenos | PaymentController.php:350 | Filtrar por registered_by_user_id |
| S-02 | IDOR en ReorderCollectorCreditsRequest — no valida propiedad de credit_ids | ReorderCollectorCreditsRequest.php | Añadir Rule::exists con where(collector_user_id) |
| S-03 | Tokens Sanctum sin expiración — acceso permanente si token extraído | config/sanctum.php | expiration = 1440 |
| S-04 | Rate limiting ausente en POST /payments, /credits, /clients | routes/api.php | Añadir throttle:pwa-write |
| S-05 | APP_DEBUG potencialmente true en producción | .env | APP_DEBUG=false |

---

## 4. BUGS CRÍTICOS DE LÓGICA

| ID | Descripción | Archivo | Fix |
|----|-------------|---------|-----|
| B-01 | getFrequencyDisplay() usa due_day_1 (1-31) como índice día semana (1-7) — labels rotos | RoleAwareQueries.php:193 | Devolver label por periodicity directamente |
| B-02 | DashboardController: 4/7 métodos son stubs vacíos | DashboardController.php | Implementar con CollectionMetricsService |
| B-03 | CollectionController::index() y stats() vacíos | CollectionController.php | Implementar con queries rol-aware |
| B-04 | Supervisores no pueden ver pagos/visitas de su equipo | PaymentController.php, CollectionVisitController.php | Añadir lógica rol-aware usando CollectorVisibilityResolver |
| B-05 | CompanyCollectorGoal nunca implementado — siempre retorna 'no_goal' | CollectionMetricsService.php:136 | Implementar getGoalForCollector() |
| B-06 | CollectorSyncListener sin try/catch — fallo silencioso | CollectorSyncListener.php | Añadir error handling |

---

## 5. DISCREPANCIAS PWA ↔ BACKEND

| ID | Tipo | Descripción | Impacto |
|----|------|-------------|---------|
| D-01 | Lógica rota | ExpenseCreateView envía directo a API en lugar de encolar offline | Gastos se pierden offline |
| D-02 | Nomenclatura | offline_created_at (StorePaymentRequest) vs created_at_local (sync.js) | Inconsistencia, difícil de mantener |
| D-03 | Validación | SyncPaymentsRequest no valida antigüedad de pago (StorePaymentRequest sí) | Inconsistencia de validación |
| D-04 | Esquema | IndexedDB falta: start_date, total_receivable, principal_amount, interest_amount en credits | Vista detalle falla offline |
| D-05 | Esquema | balance_due (backend) ≠ remaining_amount (IndexedDB) — nombres distintos para mismo campo | Bugs visuales offline |
| D-06 | Esquema | paid_date existe en IndexedDB pero backend no lo devuelve en sync | Inconsistencia de datos |
| D-07 | Código muerto | POST /pwa/sync/confirm existe en backend, nunca llamado desde PWA | Confusión, deuda técnica |
| D-08 | Índice faltante | pendingVisits sin índice permanent_error (v6 olvidó añadirlo) | Full table scan en cada sync |

---

## 6. BUGS CRÍTICOS DE PWA

| ID | Descripción | Archivo | Fix |
|----|-------------|---------|-----|
| P-01 | Race condition en queuePayment() — Pinia state inconsistente si falla deductCreditBalance | sync.js:46-74 | Mover push después de try-catch |
| P-02 | Optimistic balance update sin rollback — saldo incorrecto si servidor rechaza pago | sync.js + db/index.js | Guardar _original_balance y restaurar en permanent_error |
| P-03 | Background Sync SW no actualiza retry_count en errores | pwa-sw.js | Añadir .modify() en errores del SW |
| P-04 | MessageChannel timeout 1s muy corto — sync silencioso fallido | pwa-sw.js | Aumentar a 3-5s, añadir logging |
| P-05 | visits.js duplica lógica de sync.js — riesgo de divergencia | visits.js | Eliminar visits.js, unificar en sync.js |
| P-06 | Dashboard sin persistencia — offline ve error, no datos cacheados | dashboard.js | Añadir persist con localStorage |
| P-07 | collections.calculateLocalStats() nunca llamada offline | collections.js | Llamar cuando !navigator.onLine |

---

## 7. PERFORMANCE

| Problema | Impacto | Fix |
|----------|---------|-----|
| 11+ columnas sin índice (credits.status, installments.due_date, payments.idempotency_key...) | Queries lentas bajo carga | Migración con índices |
| N+1 en CollectionMetricsService — 1 query por cobrador | Timeout con 100+ cobradores | Reescribir con groupBy |
| Sync siempre descarga 7 días completos | Lento en redes móviles | Delta sync con last_sync timestamp |
| HomeView importa 3 componentes estáticamente (solo usa 1 por rol) | Bundle innecesariamente grande | defineAsyncComponent() dinámico |
| getCreditsForList() hace Promise.all(n joins) | O(n²) con muchos créditos | Batch join o Dexie multi-index |

---

## 8. ENTIDADES SIN COBERTURA FILAMENT

| Entidad | Modelo | Prioridad | Justificación |
|---------|--------|-----------|---------------|
| Plans | Plan.php | 🔴 ALTA | super_admin no puede crear planes sin resource |
| CollectionVisit | CollectionVisit.php | 🟠 MEDIA | Admin no puede auditar visitas desde panel |
| CompanyFinancialSettings | CompanyFinancialSettings.php | 🟠 MEDIA | Settings solo editables desde PWA |
| Installments | Installment.php | 🟡 BAJA | Solo RelationManager, suficiente para ahora |

---

## 9. OPORTUNIDADES ESTRATÉGICAS DE NEGOCIO

| Iniciativa | Descripción | Ingresos potenciales | Esfuerzo |
|------------|-------------|----------------------|----------|
| Portal de cliente autoservicio | Clientes ven saldo, historial, registran promesas | Reduce work del cobrador +15% | 3 sprints |
| Reportes contables exportables | PDF/Excel de Balance, P&L, Flujo de Caja | Feature premium diferenciador | 2 sprints |
| API pública con OAuth 2 | Integraciones con terceros via webhooks | Canal B2B, comisión por API calls | 4 sprints |
| Análisis predictivo de morosidad | Score de riesgo por cliente | Plan Enterprise premium | 3 sprints |
| Geofencing y rutas inteligentes | Optimización de rutas del cobrador | Plan Growth+, retención | 3 sprints |

---

## 10. PLAN DE REMEDIACIÓN — CRONOGRAMA

```
Semanas 1-1:   [FASE 1] Seguridad crítica — 4 tareas (IDOR, tokens, rate limit)
Semanas 2-3:   [FASE 2] Bugs lógica — 3 tareas (labels, dashboard, supervisores)
Semanas 4-5:   [FASE 3] Discrepancias PWA↔Backend — 5 tareas
Semana  6:     [FASE 4] Performance — índices + N+1
Semanas 7-9:   [FASE 5] Features faltantes — CollectionController, Plans, Goals
Semanas 10-13: [FASE 6] Mejoras producto — offline fallback, delta sync, tests
Semanas 14+:   [FASE 7] Oportunidades estratégicas (post-estabilización)
```

**→ Ver plan detallado con tareas, código y tests:**
`docs/superpowers/plans/2026-04-15-credify-audit-work-plan.md`
