16 - Estudio Profundo de Validación
Fecha: 2026-04-07
Alcance: Validacion profunda de docs/audit/01-15 contra el codigo real del repo
Metodo: lectura estatica de rutas, controladores, middleware, modelos, migraciones, servicios, jobs, listeners, config y frontend; contraste documento por documento; verificacion adicional de los puntos mas riesgosos detectados durante la auditoria
Resumen Ejecutivo
La documentacion de auditoria tiene una base buena, pero no puede tratarse como completamente confiable en su estado actual.
Mi veredicto despues de la validacion profunda es:
- Los documentos son utiles para entender el sistema, pero varios mezclan arquitectura deseada con arquitectura realmente ejecutada.
- El mayor desfase aparece en:
- flujos de venta / pagaré / credito
- auth / autorizacion / protecciones efectivas
- contratos frontend-backend
- matriz de variables de entorno
- request lifecycle y manejo real de errores API
- El repo contiene bugs reales de aplicacion y riesgos de seguridad que van mas alla de errores de documentacion.
- El reporte
00-validation-report.mdapunta en varias direcciones correctas, pero tambien contiene afirmaciones que necesitan matiz o correccion.
En corto:
01,04,07,10,12,13,15: utiles y en varias partes acertados, pero con correcciones importantes02,05,06,08,09,11,14: utiles, pero con desalineaciones materiales frente al runtime real03: el mas incompleto respecto a cobertura y precision de configuracion
Hallazgos Confirmados de Alta Prioridad
Estos puntos quedaron sustentados directamente en el codigo y son mas importantes que cualquier correccion cosmética de docs.
Seguridad / control de acceso
-
Bypass de checkout por POST directo
GET /checkoutusacliente_registro_completoyverificar_cliente_presenta_mora, peroPOST /mis-comprasyPOST /mis-compras/procesar-carritono.- Impacto: un usuario autenticado puede intentar comprar sin pasar por esos controles de negocio.
- Evidencia:
routes/web.php,app/Http/Controllers/Market/VentaController.php
-
Endpoint publico de historial crediticio
GET /api/v1/datacredito/historiales publico.- Impacto: exposicion de una consulta sensible sin autenticacion.
- Evidencia:
routes/api.php,app/Http/Controllers/Api/DataCreditoController.php
-
Registro aliado no atado realmente al link firmado
- El
GET /aliados/postulacion/{postulacion}/registrosi essigned, pero elPOST /aliados/postulacion/registrono lo es ni recibe{postulacion}. - Impacto: el flujo de invitacion firmada no queda realmente garantizado en el alta.
- Evidencia:
routes/ally/auth.php,app/Http/Controllers/AliadoAuth/RegisteredUserController.php
- El
-
CRUD publico de marcas
POST /marcas,PUT /marcas/{marca}yDELETE /marcas/{marca}estan expuestos sin auth.- Impacto: escritura publica sobre catalogo.
- Evidencia:
routes/web.php,app/Http/Controllers/Market/MarcaController.php
-
Login aliado sin rate limiting
- El login cliente si tiene limitacion de intentos; el login aliado no.
- Evidencia:
app/Http/Requests/Auth/LoginRequest.php,app/Http/Controllers/AliadoAuth/AuthenticatedSessionController.php
Flujo de ventas / credito / pagare
-
ApiExceptionHandlerno retorna su respuesta- Se invoca el handler custom pero no se hace
return. - Impacto: la respuesta JSON estructurada pretendida no se usa.
- Evidencia:
bootstrap/app.php
- Se invoca el handler custom pero no se hace
-
registrarEnCerticamara()siempre retornafalse- Aunque cree el pagaré y actualice
certicamara_uuid, el metodo retornafalse. - Impacto: la rama que despacha credito inmediato al crear la venta nunca se comporta como parece indicar el codigo.
- Evidencia:
app/Services/VentaService.php
- Aunque cree el pagaré y actualice
-
Generacion duplicada de cuotas
VentaServicegenera cuotas al crear la compra yProcesarPagareDigitalvuelve a generarlas despues de la firma del pagaré.- Impacto: riesgo real de cuotas duplicadas.
- Evidencia:
app/Services/VentaService.php,app/Jobs/ProcesarPagareDigital.php
-
Calculo de vencimientos usando
created_aten modelos concreado_enVentayOrdenCompraheredan deModelo, peroVentaServicecalcula cuotas contracreated_at.- Impacto: las fechas se calculan desde
now()en vez de desde la fecha real del registro. - Evidencia:
app/Models/Modelo.php,app/Services/VentaService.php
-
GenerarCreditoDeVentamarca la orden comoPROCESADApor cada venta- No espera a que toda la orden quede consistente.
- Impacto: una orden multi-venta puede quedar
PROCESADAaunque otra venta falle o quede pendiente. - Evidencia:
app/Jobs/GenerarCreditoDeVenta.php
-
GenerarCreditoDeVentano tienefailed()ni guardas de obsolescencia- Si falla por excepcion, la venta puede quedar
PENDIENTE; tampoco valida que la venta siga en un estado procesable antes de aprobarla. - Evidencia:
app/Jobs/GenerarCreditoDeVenta.php
- Si falla por excepcion, la venta puede quedar
-
Descuento de cupo no atomico
- Se usa
$cliente->cupo_disponible - totalyupdate(), nodecrement(). - Impacto: riesgo de lost update con jobs concurrentes del mismo cliente.
- Evidencia:
app/Jobs/GenerarCreditoDeVenta.php
- Se usa
-
procesarCarrito()calcula mal el monto- Arma
monto = precio * cantidady luegoVentaService::crearVenta()vuelve a multiplicarcantidad * monto. - Impacto: subtotal inflado para cantidades mayores a 1.
- Evidencia:
app/Http/Controllers/Market/VentaController.php,app/Services/VentaService.php
- Arma
-
procesarCarrito()fuerzanumero_cuotas = 6- Se salta el request tipado del flujo principal y no respeta el rango por linea.
- Evidencia:
app/Http/Controllers/Market/VentaController.php
-
Cache de DataCredito insuficiente
- La cache del historial usa solo
numero_documento + tipo, ignorandoapellido. - Impacto: fuga/reuso incorrecto de respuesta cacheada.
- Evidencia:
app/Services/DataCreditoService.php
- La cache del historial usa solo
-
DataCreditoServiceusarequestUUIDfijo- Evidencia:
app/Services/DataCreditoService.php
- Evidencia:
Contratos frontend-backend
-
settings/Profile.vueno coincide con el backend- Frontend usa
name; backend exigenombresyapellidos. - Evidencia:
resources/js/pages/settings/Profile.vue,app/Http/Requests/Settings/ProfileUpdateRequest.php
- Frontend usa
-
useWishlist()espera array plano, pero el backend devuelve paginador- Impacto: el preload del estado de wishlist queda roto o vacio.
- Evidencia:
resources/js/composables/useWishlist.ts,app/Http/Controllers/Market/ListaDeseoController.php
-
UI aliado colorea estados que ya no son los reales
ally/ventas/Page.vuemanejacancelada, pero el backend usarechazadayabandonada.- Evidencia:
resources/js/pages/ally/ventas/Page.vue,app/Enum/Facturacion/EstadoVenta.php
Veredicto por Documento
01 - ER Diagram
Estado: mayormente correcto, con omisiones y varias simplificaciones peligrosas.
Correcto:
- La columna central
personas -> users -> clientesesta bien representada. - Las entidades de aliados, catalogo y facturacion principal existen y las relaciones base coinciden.
aprobar_cupo_eventossi usa UUID.- La nota sobre timestamps en español y soft delete en
precioses correcta.
Corregir:
- El documento mezcla relacion de esquema con relacion implementada en Eloquent.
orden_compras -> cuotasexiste a nivel FK, pero no esta expuesto como relacion Eloquent real.- La cardinalidad de
beneficiarioesta sobreafirmada: el modelo eshasOne, pero el esquema no fuerza unicidad sobrecompra_id.
Falta:
postulacion_aliados_lineasdescontable_descuento- matiz sobre relaciones que existen en DB pero no en modelo
02 - Route Inventory
Estado: util pero incompleto e insuficiente como documento operativo.
Correcto:
- La separacion general por archivos de rutas y dominios esta bien.
- La nota de
/simulador-cuotasconwithoutMiddleware('auth')es correcta. - La mayoria del inventario ally/auth/api coincide.
Corregir:
- Falta
GET /health. - Rutas de
lineasde escritura existen en el router pero no son funcionales porque el controlador no implementa esos metodos. carritoylista-deseosestan listadas como publicas, pero operativamente fallan para invitados.
Falta:
- resaltar la gravedad de las rutas publicas de escritura sobre
marcas - distinguir entre “route registrada” y “route funcional”
03 - Env Config Matrix
Estado: el documento mas flojo en cobertura y precision.
Correcto:
- El mismatch de TransUnion esta bien detectado.
- Los duplicados de
.env.exampleestan bien detectados. - La mayoria de mappings basicos de
config/app.php,auth.php,database.php,queue.php,mail.php,filesystems.phpyservices.phpson utiles.
Corregir:
DB_DATABASEyDB_URLestan documentados demasiado pegados a SQLite.BROADCAST_CONNECTIONno tiene respaldo real en este repo.- La nota de locales esta incompleta.
- Se mezclan variables reales omitidas con otras que no tienen evidencia suficiente en el repo.
Falta:
- varias variables de
cache.php - variables de
queue.php,logging.php,database.php,filesystems.php - bloque de
config/log-viewer.php
04 - Notification Catalog
Estado: bastante bueno.
Correcto:
- Las 7 notificaciones custom existen.
- Todas son
mail. - Ninguna esta realmente queueada.
- El flujo de postulaciones hacia notificaciones esta bien trazado.
VerifyEmailbuilt-in yTicketSoporteexisten.
Corregir:
InformarDePostulacionAprobadano es simplemente “duplicado”; su intencion funcional no coincide exactamente con lo que hoy hacen las otras notificaciones.
Falta:
- detallar mejor los disparadores reales de
VerifyEmail - resaltar el riesgo operativo del fan-out sincrono a administradores
05 - Queue Catalog
Estado: bueno como mapa base, pero insuficiente para explicar el comportamiento real.
Correcto:
- Inventario de jobs
- scheduler cada 15 minutos
- cadena
ValidarPagareDigital -> ProcesarPagareDigital -> GenerarCreditoDeVenta - ausencia de
failed()enGenerarCreditoDeVenta
Corregir:
ProcesarPagareDigitalno valida de verdad consistencia de cuotas en multi-venta; solo loguea warning.- faltan riesgos de idempotencia y replay de webhook
- el flujo de batch de carga masiva necesita mas cautela documental
Falta:
- duplicidad de cuotas
- carrera potencial en procesamiento masivo
- aclarar que varios fallos “de negocio” y fallos “por excepcion” no se comportan igual
06 - Architecture Diagram
Estado: bueno para orientarse, pero materialmente desfasado en la parte de billing y request flow.
Correcto:
- estructura de directorios
- conteos generales de servicios/DTOs/modelos/jobs/listeners
- stack frontend base
- shared props y cache global
- soporte SSR
Corregir:
- la parte de middleware mezcla
webyapicomo si compartieran el mismo pipeline - el flujo de compra documentado no coincide con el runtime real
- la arquitectura de ventas esta descrita como event-driven de facturacion, pero el camino vivo es job/webhook-driven
- se sobredimensiona el rol de Spatie Permission en autorizacion efectiva
Falta:
- EMCALI y Core Credito dentro del bloque de integraciones
- logging frontend/backend a BD
- protagonismo real del webhook de Certicamara
07 - Auth / Authorization Map
Estado: bastante bueno en guards y middleware, pero incompleto en bypasses y garantias reales.
Correcto:
- guards
webyapp - aliases en
bootstrap/app.php - middleware global del grupo
web Spatie Permissioninstalado pero no cableado en runtime- login cliente con rate limit y filtro
guard='web' - login aliado con filtro
guard='app',activoy empresa activa
Corregir:
- la aprobacion de cupo no exige realmente una secuencia dura de fases
- el flujo firmado del registro aliado esta sobreafirmado
- falta distinguir proteccion de
GETversusPOST
Falta:
- bypass de checkout por POST directo
- riesgo del endpoint DataCredito publico
- no obligatoriedad real de OTP verificado antes del cuestionario
08 - Sale Lifecycle State Machine
Estado: buen esqueleto, pero desalineado con los edge cases reales.
Correcto:
- enums de estado
- transiciones principales
pendiente -> aprobada,pendiente -> rechazada/abandonada,aprobada -> entregada - timeout de 60 minutos
- estados sin trigger explicito (
LEGALIZADA,COMPLETADA,DEVUELTA)
Corregir:
- subestima la generacion duplicada de cuotas
- usa parcialmente evidencia incorrecta del importador CSV
- simplifica mal la semantica de algunos estados de orden
- la narrativa de
PlanCreditonecesita mas fuerza: hoy es una pieza no operativa
Falta:
- cuotas maestras de orden
- desfase entre estados viejos/nuevos de orden/pedido
- falta de idempotencia del webhook
09 - Event & Job Dependency Graph
Estado: bastante acertado en eventos muertos y listeners sincronicos.
Correcto:
- eventos de postulacion
ValidationLog- listeners sincronicos
- dead code de
VentaCompletadayVentaCancelada - bug de
VentaCanceladaListener
Corregir:
- necesita explicitar mejor que el billing vivo ya no depende de esos eventos de facturacion
Falta:
- riesgo de persistir payloads sensibles en
aprobar_cupo_eventos - impacto operativo de que
ValidationLogeste en la ruta critica
10 - External Integrations Map
Estado: bueno en inventario, corto en riesgo.
Correcto:
- TransUnion
- Experian CrossCore
- DataCredito
- Certicamara
- Core Credito
- EMCALI
- headers, timeouts y auth principales
Corregir:
- Slack no debe presentarse como integracion activa
- el endpoint DataCredito publico requiere tratamiento de riesgo, no solo descripcion
- el webhook de Certicamara esta subdocumentado en seguridad
Falta:
- uso real o no uso de
verificarPagare() - enforcement comentado de score minimo del cuestionario
requestUUIDfijo
11 - Data Flow Diagram
Estado: util para nivel macro, pero con varios contratos errados.
Correcto:
- patrones generales Inertia vs axios
- papel central de
HandleInertiaRequests - capa de servicios, cache, cola y APIs externas
Corregir:
- checkout/purchase flow no coincide del todo con el request real
user_statsno es verdaderamente “por usuario” como el nombre sugiere- varios contratos frontend-backend estan simplificados o mal shapeados
Falta:
- bug real del wishlist paginado
- diferencia entre props compartidas y props de controlador en varias paginas
12 - Credit Approval Workflow Diagram
Estado: uno de los mejores documentos, pero no debe leerse como garantia exacta de enforcement.
Correcto:
- fases, servicios e integraciones principales
- eventos
ValidationLog - caches intermedias
- daily limit basado en
LEGAL_CHECK / START
Corregir:
- el backend no obliga realmente que el cuestionario ocurra solo despues de OTP verificado
- aprobar cupo no exige “todas las fases”, sino
>= 5process types exitosos del mes - varias degradaciones de error estan sobreexplicadas respecto a lo que el codigo garantiza
Falta:
- explicitar que el enforcement real es mas debil que el diagrama ideal
13 - Frontend Page Map
Estado: bueno para inventario, flojo en contratos.
Correcto:
- layouts principales
- gran parte del inventario de paginas
- patrones de comunicacion frontend
Corregir:
- props de varias paginas no coinciden con lo que realmente entrega backend
settings/Profile.vuerompe el contrato actualally/ventas/Page.vuemaneja mal estados actuales
Falta:
- bug de wishlist
- distincion precisa entre shared props y props del controlador
14 - Request Lifecycle Flowchart
Estado: didactico, pero mezcla comportamiento pretendido con comportamiento real.
Correcto:
- entrada por
public/index.php - pipeline general web
- SSR/CSR a gran nivel
- deteccion del bug de
ApiExceptionHandler
Corregir:
- el diagrama mezcla
webyapicomo si compartieran middleware global - algunos bloques reflejan comportamiento “intencionado”, no necesariamente el runtime real
- el mapeo de errores HTTP custom necesita mas cuidado
Falta:
- resaltar que varias respuestas API custom hoy no salen por el bug del missing
return
15 - Glossary
Estado: muy util, con pocas correcciones de concepto.
Correcto:
- terminologia de negocio
- estados principales
- servicios e integraciones
- buena parte de la nomenclatura financiera y de aprobacion de cupo
Corregir:
PlanCreditodebe quedar explicitamente marcado como no operativo- algunas descripciones de estados/trigger son mas suposicion de negocio que evidencia de codigo
- la referencia a
canceladaen facturacion no coincide con enums vivos
Correcciones Mas Importantes para la Documentacion
Si hubiera que priorizar correcciones documentales antes de una presentacion o entrega, haria esto:
-
Reescribir
06,08,11y14- Son los documentos donde mas se mezcla flujo ideal con flujo real.
-
Corregir
03con cobertura real de config- Hoy la matriz transmite mas confianza de la que merece.
-
Actualizar
07y12con las garantias reales- Importante para no vender un modelo de seguridad o de workflow mas fuerte de lo que el backend aplica.
-
Ajustar
13con contratos reales de props y endpoints- Sobre todo por bugs ya visibles entre frontend y backend.
-
Mantener
01,04,10,15como base, pero con addendum- No necesitan una reescritura total; si necesitan precision.
Recomendacion Final
La conclusion tecnica no es que la auditoria original este mal hecha, sino que el sistema tiene suficientes desajustes entre documentacion, intencion arquitectonica y comportamiento real como para exigir una segunda pasada de consolidacion.
Mi recomendacion es:
- usar estos documentos como base exploratoria
- no usarlos aun como fuente final de verdad
- consolidar una version corregida enfocada en:
- seguridad efectiva
- flujo real de ventas/pagaré/credito
- contratos frontend-backend
- configuracion e infraestructura real
Archivos Clave Revalidados Directamente
bootstrap/app.phproutes/web.phproutes/ally/auth.phproutes/api.phpapp/Http/Middleware/HandleInertiaRequests.phpapp/Http/Controllers/Market/VentaController.phpapp/Http/Controllers/Market/ListaDeseoController.phpapp/Http/Controllers/Api/DataCreditoController.phpapp/Http/Controllers/AliadoAuth/RegisteredUserController.phpapp/Services/AprobarCupoService.phpapp/Services/IdentityValidationService.phpapp/Services/DataCreditoService.phpapp/Services/VentaService.phpapp/Jobs/GenerarCreditoDeVenta.phpapp/Jobs/ProcesarPagareDigital.phpresources/js/pages/settings/Profile.vueresources/js/composables/useWishlist.tsresources/js/pages/ally/ventas/Page.vue
Estado del Estudio
Este documento no reemplaza automaticamente cada uno de los docs 01-15; los valida, corrige y prioriza.
En esta pasada ya se incorporaron correcciones prioritarias dentro de 01-15, principalmente como bloques de Validated Corrections en cada archivo.
El siguiente paso natural seria producir una version v2 mas profunda de los documentos mas desalineados, empezando por 06, 08, 11, 12, 13 y 14.