811 lines
33 KiB
Python
811 lines
33 KiB
Python
#!/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()
|