feature-entrega1-CMCMP - #272
Conversation
📝 WalkthroughWalkthroughThe PR replaces placeholder content in ChangesGastOS documentation
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (1)
prompts.md (1)
21-21: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAñade identificadores de lenguaje a todos los bloques cercados.
Todos estos bloques presentan la misma omisión de Markdown:
prompts.mddebe etiquetar sus cinco bloques yreadme.mddebe etiquetar el árbol de directorios, por ejemplo context,jsonogherkinsegún el contenido.
prompts.md#L21-L21: etiqueta el bloque del brainstorming.prompts.md#L67-L67: etiqueta la especificación técnica.prompts.md#L147-L147: etiqueta el prompt de extracción.prompts.md#L179-L179: etiqueta el prompt de validación.prompts.md#L201-L201: etiqueta el prompt de duplicados.readme.md#L208-L208: etiqueta el árbol del monorepo.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@prompts.md` at line 21, Añade identificadores de lenguaje a los seis bloques Markdown cercados: prompts.md, líneas 21-21, 67-67, 147-147, 179-179 y 201-201, usando text, json o gherkin según el contenido; etiqueta también el árbol del monorepo en readme.md, líneas 208-208, con text.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@prompts.md`:
- Around line 148-166: Actualiza el prompt alrededor de la declaración del
módulo para que defina un esquema de salida específico para COMBUSTIBLE,
incluyendo los campos requeridos como kilómetros, vehículo y tarjeta, o
restrinja explícitamente la entrada permitida a GASTOS GENERALES. Asegura que el
contrato JSON corresponda al módulo recibido y que los campos ausentes sigan
devolviendo null.
- Around line 183-196: Actualiza las reglas de validación y el esquema de
respuesta para definir explícitamente el tratamiento de valores nulos o de baja
confianza en base_imponible, iva_importe, fecha e importe_total: indica cuándo
generan un error bloqueante, una advertencia o un campo en campos_pendientes.
Asegura que la comprobación matemática solo se ejecute cuando ambos importes
necesarios estén presentes y sean confiables; en caso contrario, aplica la
política definida sin producir resultados inconsistentes.
In `@readme.md`:
- Line 47: Actualiza la descripción de GastOS para no presentar la retención de
justificantes como una capacidad garantizada del alcance actual; reformula
“retención garantizada para auditoría” como objetivo del producto completo o
alinea explícitamente la frase con la capacidad MVP documentada en la tabla.
- Around line 250-251: Haz opcional PERIODO_LIQUIDACION en el alcance MVP:
actualiza la relación Mermaid y la definición de periodo_id/FK en las secciones
relacionadas para permitir gastos sin período asignado. Mantén la creación o
asignación de períodos fuera del flujo obligatorio de alta MVP, salvo que las
historias y tickets correspondientes se incorporen explícitamente.
- Around line 267-281: Unifica el contrato de extracción definiendo un esquema
canónico entre REGISTRO_GASTO en readme.md (líneas 267-281) y el JSON de salida
de prompts.md (líneas 151-171). En readme.md añade los campos fiscales,
proveedor, NIF y confianza por campo que el prompt requiere, o documenta
explícitamente su no persistencia; después ajusta el JSON para coincidir
exactamente con el modelo persistente y conservar todos los datos necesarios
para captura, revisión y auditoría.
- Around line 5-7: Actualiza la leyenda del documento para definir
explícitamente el estado “[MVP parcial]” usado en otras secciones, indicando qué
significa respecto a la implementación; alternativamente, reemplaza todas sus
apariciones por uno de los estados ya definidos “[MVP]” o “[DOCUMENTADO]”.
Mantén consistencia entre la leyenda y las etiquetas existentes.
- Around line 316-324: Amplía la documentación de EVENTO_AUDITORIA para
especificar el mecanismo que garantiza su inmutabilidad en el MVP: operaciones
append-only, permisos de base de datos restringiendo UPDATE/DELETE y triggers o
mecanismo equivalente. Describe también cómo se aplican estos controles a los
eventos de auditoría.
---
Nitpick comments:
In `@prompts.md`:
- Line 21: Añade identificadores de lenguaje a los seis bloques Markdown
cercados: prompts.md, líneas 21-21, 67-67, 147-147, 179-179 y 201-201, usando
text, json o gherkin según el contenido; etiqueta también el árbol del monorepo
en readme.md, líneas 208-208, con text.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
| Eres un sistema de extracción de datos de documentos financieros. | ||
| El usuario ha indicado que este documento pertenece al módulo: [COMBUSTIBLE / GASTOS GENERALES]. | ||
|
|
||
| Analiza la imagen adjunta y extrae los siguientes campos en formato JSON estricto. | ||
| Si un campo no está presente en el documento, devuelve null para ese campo. | ||
| Indica el nivel de confianza de cada campo extraído: alto / medio / bajo. | ||
|
|
||
| Para el módulo GASTOS GENERALES, extrae: | ||
| { | ||
| "fecha": "", | ||
| "concepto": "", | ||
| "importe_total": "", | ||
| "base_imponible": "", | ||
| "iva_porcentaje": "", | ||
| "iva_importe": "", | ||
| "forma_pago": "", // "visa" | "efectivo" | null | ||
| "proveedor": "", | ||
| "nif_proveedor": "", | ||
| "area_sugerida": "", // "comida" | "estancia" | "vuelo" | "parking" | "otros" | null |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Define un esquema específico para COMBUSTIBLE o limita explícitamente el prompt a GASTOS GENERALES.
El prompt acepta ambos módulos en la entrada, pero solo define campos de gastos generales. Si recibe un ticket de combustible, el modelo no tiene un contrato de salida para kilómetros, vehículo o tarjeta y puede devolver datos incorrectos o incompletos.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@prompts.md` around lines 148 - 166, Actualiza el prompt alrededor de la
declaración del módulo para que defina un esquema de salida específico para
COMBUSTIBLE, incluyendo los campos requeridos como kilómetros, vehículo y
tarjeta, o restrinja explícitamente la entrada permitida a GASTOS GENERALES.
Asegura que el contrato JSON corresponda al módulo recibido y que los campos
ausentes sigan devolviendo null.
| Reglas de validación: | ||
| 1. base_imponible + iva_importe debe ser igual a importe_total (tolerancia: ±0.02 €). | ||
| 2. La fecha no puede ser futura ni anterior a 5 años desde hoy. | ||
| 3. El importe_total debe ser un número positivo mayor que 0. | ||
| 4. Si forma_pago es null, marca el campo como pendiente de revisión humana. | ||
| 5. Si area_sugerida es null, marca el campo como pendiente de selección por el usuario. | ||
|
|
||
| Devuelve: | ||
| { | ||
| "valido": true | false, | ||
| "errores": [], // lista de errores bloqueantes | ||
| "advertencias": [], // lista de avisos no bloqueantes | ||
| "campos_pendientes": [] // campos que requieren revisión o completado por el usuario | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Especifica cómo se validan los campos nulos o de baja confianza.
La regla matemática usa base_imponible e iva_importe, pero ambos pueden ser null; además, no se define si una fecha, importe o impuesto ausente debe bloquear el registro, generar una advertencia o entrar en campos_pendientes. El validador necesita una política explícita para evitar resultados inconsistentes.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@prompts.md` around lines 183 - 196, Actualiza las reglas de validación y el
esquema de respuesta para definir explícitamente el tratamiento de valores nulos
o de baja confianza en base_imponible, iva_importe, fecha e importe_total:
indica cuándo generan un error bloqueante, una advertencia o un campo en
campos_pendientes. Asegura que la comprobación matemática solo se ejecute cuando
ambos importes necesarios estén presentes y sean confiables; en caso contrario,
aplica la política definida sin producir resultados inconsistentes.
| **Leyenda usada en este documento:** | ||
| - **[MVP]** → se documenta y **se implementa** en este proyecto. | ||
| - **[DOCUMENTADO]** → forma parte de la especificación completa del RFP y se documenta aquí para dar contexto de producto completo, pero **no se implementa** en el alcance de este proyecto (queda fuera, como referencia de lo que existiría en una versión completa). |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Define [MVP parcial] en la leyenda o sustitúyelo por estados ya definidos.
La documentación usa [MVP parcial], pero la leyenda solo define [MVP] y [DOCUMENTADO]. Esto impide interpretar de forma consistente qué capacidades están realmente implementadas.
Also applies to: 67-71
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@readme.md` around lines 5 - 7, Actualiza la leyenda del documento para
definir explícitamente el estado “[MVP parcial]” usado en otras secciones,
indicando qué significa respecto a la implementación; alternativamente,
reemplaza todas sus apariciones por uno de los estados ya definidos “[MVP]” o
“[DOCUMENTADO]”. Mantén consistencia entre la leyenda y las etiquetas
existentes.
| > Propósito del producto. Qué valor aporta, qué soluciona, y para quién. | ||
| La Empresa gestiona hoy el gasto interno (dietas, estancias, desplazamientos, combustible de flota) mediante plantillas Excel cumplimentadas manualmente por cada empleado. Esto genera falta de trazabilidad, riesgo de pérdida de justificantes, control solo reactivo y ninguna visibilidad agregada sin consolidar ficheros a mano. | ||
|
|
||
| GastOS automatiza la captura, clasificación, revisión y aprobación del gasto, y centraliza el archivo de justificantes con retención garantizada para auditoría, aportando valor a tres perfiles: |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
No presentes la retención como garantizada en el alcance actual.
La descripción afirma “retención garantizada para auditoría”, pero la tabla marca Retención documental ≥5 años como [DOCUMENTADO]. Cambia la frase para indicar que es un objetivo del producto completo o marca explícitamente la capacidad MVP real.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@readme.md` at line 47, Actualiza la descripción de GastOS para no presentar
la retención de justificantes como una capacidad garantizada del alcance actual;
reformula “retención garantizada para auditoría” como objetivo del producto
completo o alinea explícitamente la frase con la capacidad MVP documentada en la
tabla.
| REGISTRO_GASTO |o--o| APROBACION : requiere | ||
| REGISTRO_GASTO }o--|| PERIODO_LIQUIDACION : pertenece_a |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Haz opcional PERIODO_LIQUIDACION para el MVP.
La relación Mermaid y periodo_id modelan que todo gasto pertenece obligatoriamente a un período, pero el propio README declara PERIODO_LIQUIDACION fuera de las tres historias MVP. Un alta MVP podría quedar imposibilitada por una FK obligatoria sin período.
Marca la relación y la FK como opcionales para el MVP, o incorpora explícitamente la creación/asignación de períodos en las historias y tickets implementados.
Also applies to: 276-280, 327-328
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@readme.md` around lines 250 - 251, Haz opcional PERIODO_LIQUIDACION en el
alcance MVP: actualiza la relación Mermaid y la definición de periodo_id/FK en
las secciones relacionadas para permitir gastos sin período asignado. Mantén la
creación o asignación de períodos fuera del flujo obligatorio de alta MVP, salvo
que las historias y tickets correspondientes se incorporen explícitamente.
| REGISTRO_GASTO { | ||
| uuid id PK | ||
| enum tipo "combustible|general" | ||
| date fecha | ||
| decimal importe | ||
| string forma_pago | ||
| string concepto | ||
| string anotacion_textual | ||
| enum estado "borrador|pendiente_aprobacion|aprobado|rechazado|conciliado|fuera_de_periodo" | ||
| uuid autor_id FK | ||
| uuid periodo_id FK | ||
| uuid area_id FK | ||
| uuid vehiculo_id FK | ||
| uuid tarjeta_id FK | ||
| } |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Unifica el contrato de extracción entre prompts.md y readme.md.
El prompt declara campos fiscales, proveedor, NIF y confianza por campo, pero REGISTRO_GASTO no los incluye. Define un esquema canónico y persiste todos los datos necesarios para completar las historias de captura, revisión y auditoría.
readme.md#L267-L281: añade los campos extraídos/validados faltantes o documenta que no se almacenan.prompts.md#L151-L171: ajusta el JSON de salida para coincidir exactamente con el modelo persistente.
📍 Affects 2 files
readme.md#L267-L281(this comment)prompts.md#L151-L171
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@readme.md` around lines 267 - 281, Unifica el contrato de extracción
definiendo un esquema canónico entre REGISTRO_GASTO en readme.md (líneas
267-281) y el JSON de salida de prompts.md (líneas 151-171). En readme.md añade
los campos fiscales, proveedor, NIF y confianza por campo que el prompt
requiere, o documenta explícitamente su no persistencia; después ajusta el JSON
para coincidir exactamente con el modelo persistente y conservar todos los datos
necesarios para captura, revisión y auditoría.
| EVENTO_AUDITORIA { | ||
| uuid id PK | ||
| uuid registro_id FK | ||
| uuid usuario_id FK | ||
| string tipo_evento "ingesta|ocr|clasificacion_llm|edicion|aprobacion|rechazo|conciliacion" | ||
| json valor_anterior | ||
| json valor_nuevo | ||
| timestamp timestamp | ||
| } |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
Documenta el mecanismo que hace inmutable la auditoría.
EVENTO_AUDITORIA se describe como auditoría inmutable, pero el modelo solo muestra una tabla normal con operaciones de actualización/borrado no restringidas. Para respaldar esa garantía deben especificarse controles append-only, permisos de base de datos, triggers o un mecanismo equivalente, al menos para los eventos del MVP.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@readme.md` around lines 316 - 324, Amplía la documentación de
EVENTO_AUDITORIA para especificar el mecanismo que garantiza su inmutabilidad en
el MVP: operaciones append-only, permisos de base de datos restringiendo
UPDATE/DELETE y triggers o mecanismo equivalente. Describe también cómo se
aplican estos controles a los eventos de auditoría.
Summary by CodeRabbit