Índice Maestro de Flujogramas & Pseudocódigo del Motor
Formalización matemática de la lógica de absorción de los 3 elementos del costo (Materia Prima + Mano de Obra + CIF) e integración con el Plan Contable General Empresarial (PCGE).
Pseudocódigo del Motor de Cálculo
Lógica algorítmica de 5 fases: Precondiciones, Explosión BOM con mermas, Liquidación MOD HH, Absorción CIF por drivers, Divisor unitario $CU$ y Asientos PCGE.
Macro-Arquitectura Cloud & .NET
Mapeo de binarios legacy CIL (.NET WinForms) hacia 67 tablas en Supabase y el frontend modular React 19 APEFAC.
Motor Matemático de Costeo
Formulación de los 3 vectores ($MP + MOD + CIF$), matriz de absorción, evaluación de mermas y divisor unitario por lote.
Gobernanza Operativa & Ciclo de Vida
Secuencia obligatoria de planta: Parámetros Drivers (02) y BOM (06) ➔ Liquidación OP (05) ➔ Cierre Contable (07).
Cierre Contable & Asientos PCGE
Generación automática de asientos de diario, enlace con cuentas 21, 71, 69 y 79, cuadre 100% y bloqueo inmutable de Kardex.
Análisis Técnico del Motor de Costos Industriales (Algoritmo Ramos)
Documentación exhaustiva de los fundamentos matemáticos, fórmulas de absorción, reglas contables y flujo de ejecución en Supabase.
Materia Prima (MP) & Mermas Técnicas
La cantidad de materia prima requerida no es lineal. Cada insumo en la estructura BOM tiene un factor de merma técnica inherente al proceso físico o químico de transformación:
La valorización se conecta en tiempo real al costo estándar/promedio del Kardex valorizado registrado en public.articulo_costo_estandar.
Mano de Obra Directa (MOD) & Tarifa HH Real
Se calcula la tarifa horaria ponderada por Centro de Costo, consolidando la planilla obrera bruta más las cargas sociales de ley peruana (EsSalud 9%, Gratificaciones, CTS, Vacaciones, SCTR):
Los partes de trabajo diarios imputan las horas hombre consumidas a cada orden registrada en public.utilizacion_horas_hombre.
Gastos de Fabricación (CIF) & Cost Drivers
Los gastos indirectos (clase 63 servicios, 65 suministros, 68 depreciación) se clasifican en Fijos y Variables. Se aplican inductores de actividad (Cost Drivers) con capacidad técnica:
Garantiza una distribución equitativa de energía, matricería, supervisión y mantenimiento industrial (public.determinacion_cost_drivers).
Costo Total de Fabricación & Costo Unitario ($CU$)
Consolidación exacta de los 3 elementos en la Hoja de Costos de la Orden de Producción. Si la orden está terminada, el divisor determina el costo por unidad de producto terminado:
Si la orden sigue en taller al cierre de mes, se clasifica como Producto en Proceso (WIP) sin aplicar divisor unitario hasta su liquidación.
Generación Automática de Asientos PCGE & Bloqueo de Kardex
Al ejecutar el cierre del periodo fiscal, el motor genera automáticamente los asientos de diario en formato contable oficial del Plan Contable General Empresarial (PCGE):
FUNCTION ExecuteCostEngine(periodo_fiscal: Periodo, tenant_id: UUID): Result // ========================================================================= // 1. PRECONDICIONES & CARGA DE CATÁLOGOS RELACIONALES (67 TABLAS SUPABASE) // ========================================================================= OPs = SELECT * FROM orden_produccion WHERE periodo = periodo_fiscal AND estado != 'CANCELADA' BOM = SELECT * FROM formula_insumos_detalle JOIN formula_insumos_cabecera KARDEX = SELECT * FROM articulo_costo_estandar NOMINA = SELECT * FROM utilizacion_horas_hombre WHERE periodo = periodo_fiscal CIF = SELECT * FROM comprobante_gastos_fabricacion WHERE periodo = periodo_fiscal DRIVERS = SELECT * FROM determinacion_cost_drivers ASSERT (COUNT(OPs) > 0 AND COUNT(BOM) > 0) ELSE THROW 'Catálogo maestro incompleto' // ========================================================================= // 2. PASO 1: ABSORCIÓN DE MATERIA PRIMA (MP) CON FACTOR DE MERMA // ========================================================================= FOR EACH op IN OPs: op.total_mp = 0.0 FOR EACH insumo IN BOM[op.codigo_producto]: q_bruta = insumo.cantidad_neta * (1.0 + (insumo.merma_porcentaje / 100.0)) cu_std = KARDEX[insumo.codigo_insumo].costo_unitario costo_linea = q_bruta * cu_std * op.cantidad_programada op.total_mp += costo_linea END FOR END FOR // ========================================================================= // 3. PASO 2: LIQUIDACIÓN DE NÓMINA MOD & TARIFA EFECTIVA POR CENTRO // ========================================================================= FOR EACH cc IN CentrosDeCosto: total_hh_cc = SUM(NOMINA[cc].horas_efectivas) total_mod_cc = SUM(NOMINA[cc].costo_bruto_con_cargas) // Sueldos + EsSalud 9% + CTS + Grat tarifa_hh[cc] = (total_hh_cc > 0) ? (total_mod_cc / total_hh_cc) : 0.0 END FOR FOR EACH op IN OPs: op.total_mod = 0.0 FOR EACH parte IN NOMINA[op.numero_op]: hh_efectiva = parte.horas + (parte.minutos / 60.0) op.total_mod += hh_efectiva * tarifa_hh[parte.centro_costo] END FOR END FOR // ========================================================================= // 4. PASO 3: PRORRATEO & ABSORCIÓN DE CIF SEGÚN COST DRIVERS E INDUCTORES // ========================================================================= FOR EACH drv IN DRIVERS: tasa_driver[drv.codigo] = drv.costo_total_asignado / drv.total_capacidad END FOR total_cif_incurrido = SUM(CIF.monto_real) total_hh_planta = SUM(NOMINA.horas_efectivas) FOR EACH op IN OPs: factor_op = (total_hh_planta > 0) ? (op.total_hh_consumidas / total_hh_planta) : 0.0 op.total_cif = total_cif_incurrido * factor_op END FOR // ========================================================================= // 5. PASO 4: CONSOLIDACIÓN DE COSTO TOTAL & DIVISOR UNITARIO DETERMINISTA // ========================================================================= FOR EACH op IN OPs: op.costo_total_produccion = op.total_mp + op.total_mod + op.total_cif IF op.cantidad_terminada > 0 THEN: op.costo_unitario_calculado = op.costo_total_produccion / op.cantidad_terminada op.md_unitario = op.total_mp / op.cantidad_terminada op.mod_unitario = op.total_mod / op.cantidad_terminada op.cif_unitario = op.total_cif / op.cantidad_terminada op.estado = 'LIQUIDADA' ELSE: op.costo_unitario_calculado = 0.0 op.estado = 'EN_PROCESO_WIP' END IF END FOR // ========================================================================= // 6. PASO 5: GENERACIÓN DE COMPROBANTES DE DIARIO PCGE & CUADRE BALANCE // ========================================================================= total_pt_liquidado = SUM(OPs[estado='LIQUIDADA'].costo_total_produccion) asiento_pt = { numero: 'AST-2026-001', tipo: 'TRANSFERENCIA_EXISTENCIAS_PT', lineas: [ { cuenta: '211101', denominacion: 'Productos Manufacturados - PT', debe: total_pt_liquidado, haber: 0.0 }, { cuenta: '711101', denominacion: 'Variación de la Producción Almacenada', debe: 0.0, haber: total_pt_liquidado } ] } ASSERT (SUM(asiento_pt.lineas.debe) == SUM(asiento_pt.lineas.haber)) // 7. Persistencia Inmutable en Supabase BEGIN TRANSACTION; UPDATE orden_produccion SET ... WHERE id = op.id; INSERT INTO asiento_contable (lineas) VALUES (...); UPDATE cierre_kardex SET cerrado = TRUE, fecha_cierre = NOW(); COMMIT; RETURN { status: 200, mensaje: 'Cierre y Liquidación de Costos Ejecutada Exitosamente', total_liquidado: total_pt_liquidado, ordenes_procesadas: COUNT(OPs), balance_cuadrado: TRUE } END FUNCTION