#!/usr/bin/env python3 """ Script para generar Requerimientos Funcionales (RF) del ERP Genérico Genera 70 RF organizados en 14 módulos (MGN-001 a MGN-014) """ import os from pathlib import Path # Definición de RF por módulo RF_DEFINITIONS = { "MGN-003": { "name": "Catálogos Maestros", "rfs": [ # RF-001 ya existe { "id": "002", "title": "Gestión de Países y Regiones", "priority": "P0", "sp": 3, "description": "Sistema debe gestionar catálogo de países (ISO 3166-1), estados/provincias y formatos de dirección por país.", "actors": "Administrador de Sistema", "entities": "core.countries, core.states", }, { "id": "003", "title": "Gestión de Monedas y Tasas de Cambio", "priority": "P0", "sp": 5, "description": "Sistema debe gestionar catálogo de monedas (ISO 4217) y tasas de cambio con vigencia temporal.", "actors": "Contador, Sistema (actualización tasas)", "entities": "core.currencies, core.currency_rates", }, { "id": "004", "title": "Gestión de Unidades de Medida (UoM)", "priority": "P0", "sp": 5, "description": "Sistema debe gestionar unidades de medida organizadas por categorías con conversiones automáticas.", "actors": "Usuario Inventario, Usuario Compras", "entities": "core.uom_categories, core.uoms", }, { "id": "005", "title": "Gestión de Categorías de Productos", "priority": "P0", "sp": 3, "description": "Sistema debe gestionar jerarquía de categorías de productos para clasificación y configuración contable.", "actors": "Usuario Inventario, Contador", "entities": "core.product_categories", }, { "id": "006", "title": "Condiciones de Pago (Payment Terms)", "priority": "P0", "sp": 5, "description": "Sistema debe gestionar términos de pago configurables (contado, 30 días, parcialidades) con cálculo automático de vencimientos.", "actors": "Contador, Usuario Ventas/Compras", "entities": "core.payment_terms, core.payment_term_lines", }, ], }, "MGN-004": { "name": "Financiero Básico", "rfs": [ { "id": "001", "title": "Gestión de Plan de Cuentas", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar plan de cuentas con jerarquía, tipos de cuenta y configuración por empresa.", "actors": "Contador, Administrador", "entities": "financial.accounts, financial.account_types", }, { "id": "002", "title": "Gestión de Journals Contables", "priority": "P0", "sp": 5, "description": "Sistema debe gestionar journals contables (ventas, compras, banco, misceláneos) con secuencias y configuración.", "actors": "Contador", "entities": "financial.journals, financial.sequences", }, { "id": "003", "title": "Registro de Asientos Contables", "priority": "P0", "sp": 13, "description": "Sistema debe permitir creación de asientos contables con validación débito=crédito, estados y cancelación.", "actors": "Contador, Sistema (asientos automáticos)", "entities": "financial.moves, financial.move_lines", }, { "id": "004", "title": "Gestión de Impuestos", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar impuestos (IVA, retenciones) con cálculo automático y configuración por país.", "actors": "Contador, Sistema", "entities": "financial.taxes, financial.tax_lines", }, { "id": "005", "title": "Gestión de Facturas de Cliente", "priority": "P0", "sp": 13, "description": "Sistema debe gestionar facturas de cliente con estados, líneas, impuestos y generación de asientos contables.", "actors": "Usuario Ventas, Contador", "entities": "financial.invoices, financial.invoice_lines", }, { "id": "006", "title": "Gestión de Facturas de Proveedor", "priority": "P0", "sp": 13, "description": "Sistema debe gestionar facturas de proveedor (bills) con validación 3-way match y asientos contables.", "actors": "Usuario Compras, Contador", "entities": "financial.bills, financial.bill_lines", }, { "id": "007", "title": "Gestión de Pagos y Conciliación", "priority": "P0", "sp": 13, "description": "Sistema debe gestionar pagos de clientes/proveedores con conciliación automática y pagos parciales.", "actors": "Usuario Tesorería, Sistema", "entities": "financial.payments, financial.payment_reconciliations", }, { "id": "008", "title": "Reportes Financieros (Balance y P&L)", "priority": "P0", "sp": 8, "description": "Sistema debe generar Balance General y Estado de Resultados con filtros y exportación PDF/Excel.", "actors": "Contador, Gerente", "entities": "financial.accounts, financial.move_lines", }, ], }, "MGN-005": { "name": "Inventario Básico", "rfs": [ { "id": "001", "title": "Gestión de Productos", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar productos (almacenables, consumibles, servicios) con categorías, UoM y variantes.", "actors": "Usuario Inventario, Usuario Compras/Ventas", "entities": "inventory.products, inventory.product_variants", }, { "id": "002", "title": "Gestión de Almacenes y Ubicaciones", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar almacenes con ubicaciones jerárquicas (físicas y virtuales).", "actors": "Usuario Inventario, Administrador", "entities": "inventory.warehouses, inventory.locations", }, { "id": "003", "title": "Movimientos de Stock", "priority": "P0", "sp": 13, "description": "Sistema debe registrar movimientos de stock (origen→destino) con estados y trazabilidad completa.", "actors": "Usuario Inventario, Sistema", "entities": "inventory.stock_moves, inventory.quants", }, { "id": "004", "title": "Pickings (Albaranes de Entrada/Salida)", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar pickings de recepción, entrega e internos con validación parcial/total.", "actors": "Usuario Almacén", "entities": "inventory.pickings, inventory.picking_lines", }, { "id": "005", "title": "Trazabilidad (Lotes y Números de Serie)", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar trazabilidad con lotes (batch) y números de serie (serial) por producto.", "actors": "Usuario Inventario, Usuario Calidad", "entities": "inventory.lots, inventory.serial_numbers", }, { "id": "006", "title": "Valoración de Inventario (FIFO, Promedio)", "priority": "P0", "sp": 13, "description": "Sistema debe calcular valoración de inventario con métodos FIFO y costo promedio, generando asientos contables.", "actors": "Contador, Sistema", "entities": "inventory.quants, inventory.valuations", }, { "id": "007", "title": "Inventario Físico y Ajustes", "priority": "P0", "sp": 8, "description": "Sistema debe permitir conteos de inventario físico con cálculo de diferencias y ajustes automáticos.", "actors": "Usuario Inventario", "entities": "inventory.adjustments, inventory.adjustment_lines", }, ], }, "MGN-006": { "name": "Compras Básico", "rfs": [ { "id": "001", "title": "Solicitudes de Cotización (RFQ)", "priority": "P1", "sp": 5, "description": "Sistema debe gestionar solicitudes de cotización a proveedores con envío por email.", "actors": "Usuario Compras", "entities": "purchase.rfqs, purchase.rfq_lines", }, { "id": "002", "title": "Gestión de Órdenes de Compra", "priority": "P0", "sp": 13, "description": "Sistema debe gestionar órdenes de compra con estados, líneas, impuestos y conversión desde RFQ.", "actors": "Usuario Compras, Aprobador", "entities": "purchase.orders, purchase.order_lines", }, { "id": "003", "title": "Workflow de Aprobación de Compras", "priority": "P1", "sp": 5, "description": "Sistema debe implementar workflow de aprobación de órdenes de compra según monto umbral.", "actors": "Usuario Compras, Aprobador, Gerente", "entities": "purchase.approvals, purchase.approval_history", }, { "id": "004", "title": "Recepciones de Compras", "priority": "P0", "sp": 8, "description": "Sistema debe generar pickings de recepción automáticamente desde órdenes de compra con validación parcial/total.", "actors": "Usuario Almacén, Usuario Compras", "entities": "inventory.pickings (tipo recepción)", }, { "id": "005", "title": "Facturación de Proveedores desde Compras", "priority": "P0", "sp": 8, "description": "Sistema debe permitir crear facturas de proveedor desde órdenes de compra con validación 3-way match.", "actors": "Usuario Compras, Contador", "entities": "financial.bills (vinculadas a purchase.orders)", }, { "id": "006", "title": "Reportes de Compras", "priority": "P1", "sp": 3, "description": "Sistema debe generar reportes de compras por proveedor, producto y órdenes pendientes.", "actors": "Usuario Compras, Gerente", "entities": "purchase.orders, purchase.order_lines", }, ], }, "MGN-007": { "name": "Ventas Básico", "rfs": [ { "id": "001", "title": "Gestión de Cotizaciones", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar cotizaciones con líneas, descuentos, impuestos y envío por email/PDF.", "actors": "Usuario Ventas", "entities": "sales.quotations, sales.quotation_lines", }, { "id": "002", "title": "Conversión a Órdenes de Venta", "priority": "P0", "sp": 5, "description": "Sistema debe convertir cotizaciones a órdenes de venta con estados y workflow.", "actors": "Usuario Ventas, Cliente (Portal)", "entities": "sales.orders (conversión desde quotations)", }, { "id": "003", "title": "Gestión de Órdenes de Venta", "priority": "P0", "sp": 13, "description": "Sistema debe gestionar órdenes de venta con estados, líneas, impuestos y tracking de entregas/facturas.", "actors": "Usuario Ventas", "entities": "sales.orders, sales.order_lines", }, { "id": "004", "title": "Entregas de Ventas", "priority": "P0", "sp": 8, "description": "Sistema debe generar pickings de entrega automáticamente desde órdenes de venta con validación parcial/total.", "actors": "Usuario Almacén, Usuario Ventas", "entities": "inventory.pickings (tipo entrega)", }, { "id": "005", "title": "Facturación de Clientes desde Ventas", "priority": "P0", "sp": 8, "description": "Sistema debe permitir crear facturas de cliente desde órdenes de venta con control de cantidades.", "actors": "Usuario Ventas, Contador", "entities": "financial.invoices (vinculadas a sales.orders)", }, { "id": "006", "title": "Reportes de Ventas", "priority": "P1", "sp": 3, "description": "Sistema debe generar reportes de ventas por cliente, producto y órdenes pendientes.", "actors": "Usuario Ventas, Gerente", "entities": "sales.orders, sales.order_lines", }, ], }, "MGN-008": { "name": "Contabilidad Analítica", "rfs": [ { "id": "001", "title": "Gestión de Cuentas Analíticas", "priority": "P0", "sp": 8, "description": "Sistema debe gestionar cuentas analíticas (proyectos, departamentos, centros de costo) con jerarquía.", "actors": "Gerente de Proyecto, Contador", "entities": "analytics.accounts, analytics.account_hierarchy", }, { "id": "002", "title": "Registro de Líneas Analíticas", "priority": "P0", "sp": 8, "description": "Sistema debe registrar automáticamente líneas analíticas desde transacciones (facturas, órdenes, timesheet).", "actors": "Sistema (automático)", "entities": "analytics.lines", }, { "id": "003", "title": "Distribución Analítica Multi-Cuenta", "priority": "P1", "sp": 8, "description": "Sistema debe permitir distribuir costos/ingresos a múltiples cuentas analíticas con porcentajes.", "actors": "Contador, Gerente", "entities": "analytics.distributions", }, { "id": "004", "title": "Tags Analíticos", "priority": "P1", "sp": 3, "description": "Sistema debe gestionar tags analíticos adicionales para clasificación cruzada (torre, etapa, fase).", "actors": "Usuario Proyectos", "entities": "analytics.tags, analytics.line_tags", }, { "id": "005", "title": "Reportes Analíticos (P&L por Proyecto)", "priority": "P0", "sp": 8, "description": "Sistema debe generar reportes analíticos con balance por cuenta, P&L por proyecto y comparación presupuesto vs real.", "actors": "Gerente de Proyecto, Contador", "entities": "analytics.lines, analytics.accounts", }, ], }, "MGN-009": { "name": "CRM Básico", "rfs": [ { "id": "001", "title": "Gestión de Leads y Oportunidades", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar leads y oportunidades con datos de contacto, monto estimado y probabilidad de cierre.", "actors": "Vendedor", "entities": "crm.leads, crm.opportunities", }, { "id": "002", "title": "Pipeline de Ventas (Kanban)", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar pipeline de ventas con stages configurables y drag-and-drop entre etapas.", "actors": "Vendedor, Gerente de Ventas", "entities": "crm.stages, crm.opportunities", }, { "id": "003", "title": "Actividades y Seguimiento", "priority": "P1", "sp": 5, "description": "Sistema debe gestionar actividades de CRM (llamadas, reuniones, emails) con recordatorios y seguimiento.", "actors": "Vendedor", "entities": "crm.activities, system.activities (MGN-014)", }, { "id": "004", "title": "Lead Scoring y Calificación", "priority": "P2", "sp": 5, "description": "Sistema debe calcular scoring automático de leads basado en criterios configurables (hot, warm, cold).", "actors": "Sistema, Vendedor", "entities": "crm.scoring_rules, crm.leads", }, { "id": "005", "title": "Conversión a Cotización", "priority": "P1", "sp": 5, "description": "Sistema debe permitir convertir oportunidades a cotizaciones con datos pre-llenados y vínculo.", "actors": "Vendedor", "entities": "crm.opportunities, sales.quotations", }, ], }, "MGN-010": { "name": "RRHH Básico", "rfs": [ { "id": "001", "title": "Gestión de Empleados", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar empleados con datos personales, laborales y vinculación con users/partners.", "actors": "Usuario RRHH", "entities": "hr.employees, core.partners", }, { "id": "002", "title": "Departamentos y Puestos", "priority": "P1", "sp": 3, "description": "Sistema debe gestionar departamentos con jerarquía y puestos de trabajo con descripción.", "actors": "Usuario RRHH", "entities": "hr.departments, hr.job_positions", }, { "id": "003", "title": "Contratos Laborales", "priority": "P1", "sp": 5, "description": "Sistema debe gestionar contratos laborales con tipos, salario, fechas y estados.", "actors": "Usuario RRHH", "entities": "hr.contracts", }, { "id": "004", "title": "Asistencias (Check-in/Check-out)", "priority": "P1", "sp": 5, "description": "Sistema debe registrar asistencias de empleados con check-in/check-out y cálculo de horas trabajadas.", "actors": "Empleado, Usuario RRHH", "entities": "hr.attendances", }, { "id": "005", "title": "Ausencias y Permisos", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar solicitudes de ausencias con workflow de aprobación y saldo de vacaciones.", "actors": "Empleado, Manager", "entities": "hr.leave_types, hr.leaves, hr.leave_allocations", }, ], }, "MGN-011": { "name": "Proyectos Genéricos", "rfs": [ { "id": "001", "title": "Gestión de Proyectos", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar proyectos con datos generales, cliente, manager, fechas y vinculación con cuenta analítica.", "actors": "Manager de Proyecto", "entities": "projects.projects, analytics.accounts", }, { "id": "002", "title": "Gestión de Tareas (Kanban)", "priority": "P1", "sp": 13, "description": "Sistema debe gestionar tareas con stages configurables, drag-and-drop, subtareas y dependencias.", "actors": "Usuario Asignado, Manager", "entities": "projects.tasks, projects.task_stages", }, { "id": "003", "title": "Milestones (Hitos)", "priority": "P1", "sp": 3, "description": "Sistema debe gestionar milestones con fechas y tareas asociadas para tracking de avance.", "actors": "Manager de Proyecto", "entities": "projects.milestones", }, { "id": "004", "title": "Timesheet de Proyectos", "priority": "P1", "sp": 8, "description": "Sistema debe registrar horas trabajadas por tarea con generación de líneas analíticas y aprobación.", "actors": "Empleado, Manager", "entities": "hr.timesheet_entries, analytics.lines", }, { "id": "005", "title": "Vista Gantt de Proyectos", "priority": "P2", "sp": 8, "description": "Sistema debe mostrar timeline de tareas en vista Gantt con dependencias y reprogramación drag-and-drop.", "actors": "Manager de Proyecto", "entities": "projects.tasks", }, ], }, "MGN-012": { "name": "Reportes y Analytics", "rfs": [ { "id": "001", "title": "Dashboards Configurables", "priority": "P1", "sp": 13, "description": "Sistema debe proveer dashboards con widgets configurables (KPIs, gráficos, tablas) por rol.", "actors": "Gerente, Usuario", "entities": "system.dashboards, system.widgets", }, { "id": "002", "title": "Query Builder y Reportes Personalizados", "priority": "P2", "sp": 13, "description": "Sistema debe proveer query builder visual para crear reportes personalizados sin SQL.", "actors": "Usuario Avanzado, Administrador", "entities": "system.custom_reports", }, { "id": "003", "title": "Exportación de Datos (PDF, Excel, CSV)", "priority": "P1", "sp": 5, "description": "Sistema debe permitir exportar cualquier reporte a PDF, Excel y CSV con formato.", "actors": "Usuario", "entities": "N/A (funcionalidad transversal)", }, { "id": "004", "title": "Gráficos y Visualizaciones", "priority": "P1", "sp": 8, "description": "Sistema debe proveer librería de gráficos interactivos (línea, barra, pie, área) con zoom y tooltips.", "actors": "Usuario", "entities": "N/A (componentes frontend)", }, ], }, "MGN-013": { "name": "Portal de Usuarios", "rfs": [ { "id": "001", "title": "Acceso Portal para Clientes", "priority": "P1", "sp": 8, "description": "Sistema debe proveer portal de clientes con autenticación separada y permisos read-only.", "actors": "Cliente (Portal User)", "entities": "auth.users (is_portal=true)", }, { "id": "002", "title": "Vista de Documentos en Portal", "priority": "P1", "sp": 8, "description": "Sistema debe permitir a clientes ver sus cotizaciones, órdenes, facturas y proyectos en portal.", "actors": "Cliente (Portal User)", "entities": "sales.orders, financial.invoices, projects.projects", }, { "id": "003", "title": "Aprobación y Firma Electrónica", "priority": "P1", "sp": 8, "description": "Sistema debe permitir aprobar y firmar cotizaciones en portal con canvas HTML5 y timestamp.", "actors": "Cliente (Portal User)", "entities": "sales.quotations, system.signatures", }, { "id": "004", "title": "Mensajería en Portal", "priority": "P1", "sp": 5, "description": "Sistema debe permitir a clientes comentar en documentos y enviar mensajes desde portal.", "actors": "Cliente (Portal User)", "entities": "system.messages (MGN-014)", }, ], }, "MGN-014": { "name": "Mensajería y Notificaciones", "rfs": [ { "id": "001", "title": "Sistema de Mensajes (Chatter)", "priority": "P0", "sp": 13, "description": "Sistema debe implementar chatter por registro (patrón mail.thread) con comentarios internos/públicos y adjuntos.", "actors": "Usuario", "entities": "system.messages, system.message_attachments", }, { "id": "002", "title": "Notificaciones In-App y Email", "priority": "P0", "sp": 8, "description": "Sistema debe enviar notificaciones in-app (campana con badge) y por email según preferencias de usuario.", "actors": "Usuario, Sistema", "entities": "system.notifications, system.notification_preferences", }, { "id": "003", "title": "Tracking Automático de Cambios", "priority": "P0", "sp": 8, "description": "Sistema debe registrar automáticamente cambios en campos configurados con decorador @TrackChanges.", "actors": "Sistema (automático)", "entities": "system.change_log, system.tracked_fields", }, { "id": "004", "title": "Actividades Programadas", "priority": "P1", "sp": 8, "description": "Sistema debe gestionar actividades (llamadas, reuniones, tareas) con recordatorios y seguimiento.", "actors": "Usuario", "entities": "system.activities, system.activity_types", }, { "id": "005", "title": "Followers (Seguidores)", "priority": "P1", "sp": 5, "description": "Sistema debe permitir seguir registros con notificaciones automáticas de cambios a followers.", "actors": "Usuario", "entities": "system.followers", }, { "id": "006", "title": "Templates de Email", "priority": "P1", "sp": 5, "description": "Sistema debe gestionar templates de email configurables con variables y envío automático.", "actors": "Administrador, Sistema", "entities": "system.email_templates", }, ], }, } def generate_rf(module_id, module_name, rf): """Genera contenido de un RF""" rf_id = f"{module_id}-{rf['id']}" filename_slug = rf['title'].lower().replace(' ', '-').replace('(', '').replace(')', '').replace('/', '-') content = f"""# RF-{rf_id}: {rf['title']} **Módulo:** {module_id} - {module_name} **Prioridad:** {rf['priority']} **Story Points:** {rf['sp']} **Estado:** Definido **Fecha:** 2025-11-23 ## Descripción {rf['description']} ## Actores - **Actor Principal:** {rf['actors']} - **Actores Secundarios:** Sistema ## Precondiciones 1. Usuario debe estar autenticado 2. Tenant y empresa deben estar activos 3. Permisos necesarios deben estar asignados ## Flujo Principal 1. Usuario accede a módulo correspondiente 2. Usuario ejecuta acción principal del requerimiento 3. Sistema valida datos de entrada 4. Sistema procesa lógica de negocio 5. Sistema persiste cambios en base de datos 6. Sistema registra auditoría (MGN-014) 7. Sistema notifica a usuarios relevantes (si aplica) 8. Sistema retorna resultado exitoso ## Flujos Alternativos ### FA-1: Validación Fallida 1. Si datos de entrada son inválidos 2. Sistema retorna error 400 con detalles 3. Usuario corrige datos y reintenta ### FA-2: Sin Permisos 1. Si usuario no tiene permisos necesarios 2. Sistema retorna error 403 3. Sistema registra intento en audit log ### FA-3: Registro No Encontrado 1. Si registro solicitado no existe 2. Sistema retorna error 404 ## Reglas de Negocio - **RN-1:** Validaciones de integridad según modelo de datos - **RN-2:** RLS filtra registros por tenant y empresa - **RN-3:** Cambios quedan registrados en audit log - **RN-4:** Notificaciones según configuración de usuario ## Criterios de Aceptación - [ ] Usuario puede ejecutar funcionalidad principal - [ ] Sistema valida datos correctamente - [ ] Cambios persisten en base de datos - [ ] RLS aplica filtros correctamente - [ ] Permisos RBAC se validan - [ ] Auditoría queda registrada - [ ] Notificaciones se envían (si aplica) ## Entidades Involucradas - **Principales:** {rf['entities']} - **Relacionadas:** auth.users, core.companies ## Referencias - [ALCANCE-POR-MODULO.md - {module_id}](../../01-definicion-modulos/ALCANCE-POR-MODULO.md#{module_id.lower()}) - [Database Schema DDL](../database-design/schemas/) - [Gap Analysis {module_id}](../../01-definicion-modulos/gaps/GAP-ANALYSIS-{module_id}.md) ## Notas Técnicas - **Patrón Odoo:** Análisis de módulos equivalentes en Odoo - **Backend:** NestJS Service + Repository Pattern - **Frontend:** React Component + Hooks - **Validación:** Class Validator + Custom Validators - **Testing:** Unit tests + E2E tests ## Dependencias - **RF Dependientes:** - RF-MGN-001-001 (Autenticación) - RF-MGN-001-002 (Roles y Permisos) - **Bloqueante para:** Módulos que consumen esta funcionalidad """ return filename_slug, content def main(): """Genera todos los RF faltantes""" # Ruta actualizada al nuevo workspace de ERP-SUITE base_path = Path("/home/isem/workspace/projects/erp-suite/apps/erp-core/docs/04-modelado/requerimientos-funcionales") total_rfs = 0 total_sp = 0 for module_id, module_data in RF_DEFINITIONS.items(): module_name = module_data["name"] module_folder = base_path / module_id.lower() module_folder.mkdir(exist_ok=True) module_rfs = 0 module_sp = 0 for rf in module_data["rfs"]: filename_slug, content = generate_rf(module_id, module_name, rf) filepath = module_folder / f"RF-{module_id}-{rf['id']}-{filename_slug}.md" # Solo crear si no existe if not filepath.exists(): with open(filepath, 'w', encoding='utf-8') as f: f.write(content) print(f"✅ Creado: {filepath.name}") else: print(f"⏭️ Ya existe: {filepath.name}") module_rfs += 1 module_sp += rf['sp'] total_rfs += module_rfs total_sp += module_sp print(f"📦 {module_id}: {module_rfs} RF ({module_sp} SP)") print(f"\n🎉 TOTAL: {total_rfs} RF generados ({total_sp} SP)") if __name__ == "__main__": main()