# US-ADM-004: Gestionar Centros de Costo JerΓ‘rquicos **ID:** US-ADM-004 **MΓ³dulo:** MAI-013 **Relacionado con:** RF-ADM-003, ET-ADM-002 **Prioridad:** Alta **Story Points:** 8 --- ## πŸ“– Historia de Usuario **Como** Director General o Finanzas **Quiero** crear y organizar centros de costo en estructura jerΓ‘rquica ilimitada **Para** rastrear costos a nivel granular y obtener reportes consolidados por nivel --- ## βœ… Criterios de AceptaciΓ³n ### 1. Visualizar Árbol de Centros de Costo ```gherkin Given que soy Director o Finanzas When accedo a "AdministraciΓ³n > Centros de Costo" Then debo ver un Γ‘rbol expandible con: - Todos los centros de costo organizados jerΓ‘rquicamente - Iconos segΓΊn tipo (Directo, Indirecto, Servicio Compartido) - CΓ³digo y nombre de cada centro - Costos acumulados del mes actual - Estados: Activo / Inactivo - Acciones: Crear hijo, Editar, Desactivar ``` ### 2. Crear Centro de Costo RaΓ­z ```gherkin Given que no existen centros de costo o quiero crear uno nuevo en raΓ­z When hago clic en "+ Nuevo Centro de Costo" And completo el formulario: - CΓ³digo: "100" (ΓΊnico) - Nombre: "Operaciones" - Tipo: "Indirecto" - DescripciΓ³n: (opcional) And hago clic en "Guardar" Then el sistema debe: - Crear el centro con level = 0 - path = "100" - parentId = null - Mostrar en Γ‘rbol como raΓ­z - Registrar en audit log ``` ### 3. Crear Centro de Costo Hijo ```gherkin Given que existe un centro "100 - Operaciones" When hago clic derecho en "100" y selecciono "Crear Centro Hijo" And completo el formulario: - CΓ³digo: "101" - Nombre: "Proyecto Residencial" - Tipo: "Directo" And guardo Then el sistema debe: - Crear centro con parentId = "100" - path = "100/101" - level = 1 - Mostrarlo indentado bajo "100" en el Γ‘rbol - Permitir expandir/colapsar ``` ### 4. JerarquΓ­a Ilimitada ```gherkin Given esta estructura: 100 Operaciones (raΓ­z, level 0) └─ 101 Proyecto Res (level 1) └─ 101.1 Torre A (level 2) └─ 101.1.1 Pisos 1-5 (level 3) └─ 101.1.1.1 Acabados (level 4) When consulto el Γ‘rbol Then debo poder navegar todos los niveles sin lΓ­mite And cada nivel debe mostrar su path completo ``` ### 5. Tipos de Centro de Costo ```gherkin Given que estoy creando un centro de costo When selecciono el tipo: - "Directo": Costos imputables directamente a proyectos - "Indirecto": Gastos generales (admin, marketing) - "Servicio Compartido": Servicios internos (IT, RH) Then el sistema debe: - Aplicar reglas de imputaciΓ³n segΓΊn el tipo - Mostrar Γ­cono diferenciado en el Γ‘rbol - Permitir configurar mΓ©todo de asignaciΓ³n (solo Indirecto y Compartido) ``` ### 6. ImputaciΓ³n de Costos ```gherkin Given que tengo esta estructura: 100 Operaciones └─ 101 Proyecto A └─ 101.1 Materiales When imputo un costo de $10,000 a "101.1 Materiales" Then el sistema debe: - Crear registro en cost_imputations - Incrementar costo acumulado de: - 101.1 Materiales: +$10,000 - 101 Proyecto A: +$10,000 (consolidado) - 100 Operaciones: +$10,000 (consolidado) - Actualizar en tiempo real el Γ‘rbol ``` ### 7. DistribuciΓ³n de Overhead ```gherkin Given que tengo: - Centro "200 - AdministraciΓ³n" (Indirecto) con $50,000 en gastos - 3 proyectos directos activos When ejecuto "Distribuir Overhead" para el periodo "Nov 2025" And selecciono mΓ©todo: "Proporcional por Ingresos" Then el sistema debe: - Calcular proporciΓ³n de cada proyecto - Crear imputaciones de overhead en cada proyecto - Mostrar desglose en reporte - Registrar en audit log ``` ### 8. Reporte Consolidado ```gherkin Given que tengo mΓΊltiples niveles de centros de costo When genero "Reporte Consolidado" para "Q4 2025" Then debo ver: - Árbol completo con costos por nivel - Costos propios vs. consolidados (incluye hijos) - GrΓ‘fico de distribuciΓ³n por tipo - Opciones de exportar: PDF, Excel, CSV ``` ### 9. Buscar en Árbol ```gherkin Given que tengo 50+ centros de costo When escribo "Torre" en el buscador Then el sistema debe: - Filtrar Γ‘rbol mostrando solo coincidencias - Expandir automΓ‘ticamente la ruta de cada coincidencia - Resaltar el texto coincidente ``` ### 10. Desactivar Centro de Costo ```gherkin Given que un centro ya no se usa When hago clic en "Desactivar" Then el sistema debe: - Marcar isActive = false - Mantener histΓ³rico de costos - Ocultarlo del Γ‘rbol (con opciΓ³n "Mostrar Inactivos") - NO permitir nuevas imputaciones - NO permitir desactivar si tiene hijos activos ``` --- ## 🎨 Mockup / Wireframe ### Árbol de Centros de Costo ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Centros de Costo [+ Nuevo] [πŸ“Š Reportes] [βš™οΈ]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ” Buscar... ☐ Mostrar inactivos β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β–Ό πŸ“¦ 100 - Operaciones $250,000.00 β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β–Ό 🎯 101 - Proyecto Residencial A $180,000.00 β”‚ β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β–Ά πŸ—οΈ 101.1 - Torre A $120,000.00 β”‚ β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β–Ά πŸ—οΈ 101.2 - Torre B $60,000.00 β”‚ β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─▢ πŸ“‹ 101.3 - AdministraciΓ³n Obra $0.00 β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β–Ά 🎯 102 - Proyecto Comercial B $70,000.00 β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ └─▢ πŸ’Ό 103 - Servicios Compartidos $0.00 β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β–Ό πŸ“¦ 200 - AdministraciΓ³n $50,000.00 β”‚ β”‚ β”‚ [+][✏️][❌] β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β–Ά πŸ’Ό 201 - DirecciΓ³n General $20,000.00 β”‚ β”‚ β”œβ”€β–Ά πŸ’Ό 202 - Finanzas $15,000.00 β”‚ β”‚ └─▢ πŸ’Ό 203 - RH $15,000.00 β”‚ β”‚ β”‚ β”‚ β–Ά πŸ“¦ 300 - Marketing $30,000.00 β”‚ β”‚ [+][✏️][❌] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Leyenda: 🎯 Directo πŸ’Ό Indirecto πŸ—οΈ Servicio Compartido β–Ά Colapsado β–Ό Expandido ``` ### Modal Crear Centro de Costo ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Nuevo Centro de Costo [X]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Centro Padre (opcional) β”‚ β”‚ [v] 101 - Proyecto Residencial A β”‚ β”‚ β”‚ β”‚ CΓ³digo * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ 101.1 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ ℹ️ Path completo: 100/101/101.1 β”‚ β”‚ β”‚ β”‚ Nombre * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Torre A β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Tipo * β”‚ β”‚ β—‰ Directo β”‚ β”‚ β—‹ Indirecto β”‚ β”‚ β—‹ Servicio Compartido β”‚ β”‚ β”‚ β”‚ DescripciΓ³n β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Primera torre del proyecto, pisos 1-15 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Responsable β”‚ β”‚ [v] Juan PΓ©rez (Ingeniero) β”‚ β”‚ β”‚ β”‚ [Cancelar] [Crear Centro] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Modal Distribuir Overhead ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Distribuir Overhead [X]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Centro de Costo Indirecto β”‚ β”‚ [v] 200 - AdministraciΓ³n β”‚ β”‚ Costo acumulado: $50,000.00 β”‚ β”‚ β”‚ β”‚ Periodo β”‚ β”‚ [Noviembre 2025] πŸ“… β”‚ β”‚ β”‚ β”‚ MΓ©todo de DistribuciΓ³n * β”‚ β”‚ β—‰ Proporcional por Ingresos β”‚ β”‚ β—‹ Proporcional por Costos Directos β”‚ β”‚ β—‹ Partes Iguales β”‚ β”‚ β—‹ Porcentaje Manual β”‚ β”‚ β”‚ β”‚ Centros de Costo Receptores: β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β˜‘οΈ 101 - Proyecto Res A (60%) $30K β”‚ β”‚ β”‚ β”‚ β˜‘οΈ 102 - Proyecto Com B (40%) $20K β”‚ β”‚ β”‚ β”‚ ☐ 103 - Servicios (inactivo) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ [Cancelar] [Distribuir] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ§ͺ Casos de Prueba ### CP-001: Crear Centro RaΓ­z **Precondiciones:** - Usuario con rol "director" o "finance" **Pasos:** 1. Ir a "Centros de Costo" 2. Clic "+ Nuevo" 3. Dejar "Centro Padre" vacΓ­o 4. CΓ³digo: "100", Nombre: "Operaciones", Tipo: "Indirecto" 5. Guardar **Resultado Esperado:** - βœ… Centro creado con level=0, path="100", parentId=null - βœ… Aparece en Γ‘rbol como raΓ­z - βœ… Audit log: "cost_center_created" ### CP-002: Crear JerarquΓ­a de 5 Niveles **Pasos:** 1. Crear 100 (raΓ­z) 2. Crear 101 hijo de 100 3. Crear 101.1 hijo de 101 4. Crear 101.1.1 hijo de 101.1 5. Crear 101.1.1.1 hijo de 101.1.1 **Resultado Esperado:** - βœ… Todos los centros creados correctamente - βœ… Paths: "100", "100/101", "100/101/101.1", etc. - βœ… Levels: 0, 1, 2, 3, 4 - βœ… Árbol muestra correctamente la indentaciΓ³n ### CP-003: Imputar Costo y ConsolidaciΓ³n **Precondiciones:** - Estructura: 100 > 101 > 101.1 **Pasos:** 1. Imputar $10,000 a "101.1" 2. Verificar montos **Resultado Esperado:** - βœ… 101.1: $10,000 (propio) - βœ… 101: $10,000 (consolidado de hijos) - βœ… 100: $10,000 (consolidado de hijos) - βœ… Query recursiva funciona correctamente ### CP-004: Distribuir Overhead **Precondiciones:** - Centro "200 AdministraciΓ³n" (Indirecto) con $50,000 - 2 proyectos directos: A ($100K ingresos), B ($50K ingresos) **Pasos:** 1. Seleccionar "200 - AdministraciΓ³n" 2. MΓ©todo: "Proporcional por Ingresos" 3. Distribuir **Resultado Esperado:** - βœ… Proyecto A recibe: $33,333 (66.6%) - βœ… Proyecto B recibe: $16,667 (33.3%) - βœ… Imputaciones creadas con source_type="overhead" - βœ… Audit log registra distribuciΓ³n ### CP-005: Buscar en Árbol **Precondiciones:** - 50 centros de costo **Pasos:** 1. Escribir "Torre" en buscador **Resultado Esperado:** - βœ… Solo muestra centros con "Torre" en nombre/cΓ³digo - βœ… Expande automΓ‘ticamente la ruta completa - βœ… Resalta texto coincidente ### CP-006: No Desactivar con Hijos Activos **Precondiciones:** - Centro "100" tiene hijo "101" activo **Pasos:** 1. Intentar desactivar "100" **Resultado Esperado:** - βœ… Error: "No se puede desactivar. Tiene centros hijo activos." - βœ… Sugerencia: "Desactiva primero: 101" - βœ… Centro permanece activo --- ## πŸ”— Dependencias **Requisitos Previos:** - ET-ADM-002: Tabla `cost_centers` con triggers de path - ET-ADM-002: FunciΓ³n SQL `get_consolidated_costs()` - Backend: Servicio de distribuciΓ³n de overhead **APIs Necesarias:** - `GET /api/cost-centers/tree` - Árbol completo - `POST /api/cost-centers` - Crear - `PUT /api/cost-centers/:id` - Actualizar - `DELETE /api/cost-centers/:id` - Desactivar - `POST /api/cost-centers/:id/impute` - Imputar costo - `POST /api/cost-centers/:id/distribute-overhead` - Distribuir - `GET /api/cost-centers/:id/report` - Reporte consolidado **Componentes Frontend:** - CostCenterTree (Γ‘rbol recursivo) - CostCenterForm (crear/editar) - OverheadDistributionModal - CostCenterReports --- ## πŸ“Š MΓ©tricas de Γ‰xito - **Profundidad mΓ‘xima soportada:** β‰₯10 niveles sin degradaciΓ³n - **Tiempo de carga Γ‘rbol:** <1s para 1000 centros - **PrecisiΓ³n consolidaciΓ³n:** 100% (sin discrepancias) - **Tiempo distribuciΓ³n overhead:** <5s para 100 proyectos --- **Generado:** 2025-11-20 **Estado:** βœ… Listo para desarrollo