# ACTIVO FARO NECESARIO # Fórmulas FARO por KPI ## Versión V1 — 1.000 fórmulas iniciales diseñadas --- ## 1. Objetivo del activo Definir la biblioteca de fórmulas que FARO utiliza para calcular KPIs por: * Empresa. * Unidad de negocio. * Sucursal. * Área. * Módulo. * Responsable. * Vendedor. * Cliente. * Producto. * Rubro. * Subrubro. * Canal. * Proveedor. * Proyecto. * Centro de costo. * Industria. * Período. Este activo permite que FARO ejecute fórmulas simples, compuestas, comparativas, contextuales y ponderadas para alimentar: * KPIs. * Alertas. * Tensiones. * Diagnósticos. * Recomendaciones. * Acciones. * Reportes. * FARO Score. --- # 2. Tesis FARO FARO no debe tener KPIs escritos a mano como fórmulas sueltas. Debe tener un **motor de fórmulas gobernado**, donde cada KPI tenga: * Código. * Nombre. * Fórmula. * Fuente de datos. * Dimensiones de cálculo. * Frecuencia. * Responsable. * Umbral. * Contexto. * Calidad mínima del dato. * Impacto en alertas. * Impacto en tensiones. * Impacto en Score. La regla madre: > Todo KPI FARO debe tener fórmula trazable, ejecutable, versionada y auditable. Si no hay fórmula clara, el KPI es opinión con porcentaje. Y de eso las empresas ya tienen bastante. --- # 3. Diferencia entre métrica, KPI, fórmula, alerta y tensión | Concepto | Qué es | Ejemplo | | -------- | ------------------------------------- | ----------------------- | | Métrica | Dato medible simple | Venta neta | | Fórmula | Cálculo que produce una métrica o KPI | Venta - descuentos | | KPI | Indicador con propósito ejecutivo | Margen bruto | | Alerta | Desvío contra umbral | Margen menor al 24% | | Tensión | Contradicción entre KPIs | Venta sube, margen baja | | Acción | Respuesta ejecutiva | Revisar descuentos | --- # 4. Tipos de fórmulas FARO | Tipo | Descripción | Ejemplo | | ----------------- | ------------------------------------- | ------------------------------------- | | Simple | Cálculo directo | Venta neta = venta bruta - descuentos | | Porcentual | Relación entre dos variables | Margen % = margen / venta neta | | Promedio | Media simple o ponderada | Ticket promedio | | Acumulada | Suma por período | Venta mensual | | Comparativa | Actual vs anterior | Variación mensual | | Ponderada | Usa pesos por contexto | FARO Score | | Condicional | Depende de regla | Comisión si margen supera mínimo | | Compuesta | Combina varias fórmulas | Rentabilidad por cliente | | Temporal | Usa días, vencimientos o aging | DSO | | Contextual | Cambia según industria, canal o rubro | Margen esperado por rubro | | Predictiva básica | Proyecta con histórico | Forecast de ventas | | De confianza | Ajusta por calidad del dato | KPI con confianza reducida | --- # 5. Convenciones de fórmula FARO Para estandarizar, FARO debería usar una sintaxis interna. ## Funciones base | Función | Uso | | ------------------------------ | ------------------------------ | | `SUM()` | Suma valores | | `COUNT()` | Cuenta registros | | `AVG()` | Promedio | | `MAX()` | Máximo | | `MIN()` | Mínimo | | `SAFE_DIVIDE(a,b)` | Divide evitando error por cero | | `DATEDIFF(a,b)` | Diferencia de fechas | | `IF(condition,a,b)` | Condición | | `COALESCE(a,b)` | Valor alternativo si es nulo | | `WEIGHTED_AVG(value,weight)` | Promedio ponderado | | `PERIOD_PREVIOUS(value)` | Valor del período anterior | | `VAR_PCT(current,previous)` | Variación porcentual | | `SCORE_BAND(value,thresholds)` | Clasificación por rango | --- # 6. Dimensiones obligatorias de ejecución Cada fórmula debe poder ejecutarse con filtros o agrupaciones. | Dimensión | Ejemplo | | ------------------- | --------------------------- | | company_id | Empresa | | branch_id | Sucursal | | area_code | Comercial, Finanzas, Stock | | module_code | Ventas, Cobranza, Compras | | responsible_user_id | Responsable | | seller_id | Vendedor | | customer_id | Cliente | | product_id | Producto | | supplier_id | Proveedor | | project_id | Proyecto | | cost_center_id | Centro de costo | | channel_code | Canal | | rubro_code | Rubro | | subrubro_code | Subrubro | | industry_code | Industria | | period_id | Semana, mes, trimestre, año | --- # 7. Estructura técnica de cada fórmula Cada fórmula FARO debe tener esta ficha. | Campo | Descripción | | -------------------- | ----------------------------------------- | | formula_id | Identificador | | formula_code | Código único | | kpi_code | KPI asociado | | formula_name | Nombre | | formula_type | Simple, compuesta, ponderada, condicional | | expression | Fórmula ejecutable | | data_sources | Fuentes requeridas | | input_fields | Campos necesarios | | output_type | Monto, porcentaje, cantidad, score, días | | aggregation_level | Empresa, sucursal, área, responsable | | dimensions | Dimensiones permitidas | | frequency | Frecuencia de cálculo | | minimum_data_quality | Calidad mínima requerida | | threshold_rules | Umbrales | | alert_codes | Alertas vinculadas | | tension_codes | Tensiones vinculadas | | action_codes | Acciones sugeridas | | score_impact | Impacto en FARO Score | | industry_scope | Industrias donde aplica | | version | Versión | | active_status | Activa/inactiva | --- # 8. Volumen recomendado | Nivel | Cantidad de fórmulas | | ----------------------- | -------------------: | | MVP mínimo | 120 a 180 | | MVP sólido | 200 a 300 | | Business | 400 a 600 | | Enterprise | 800 a 1.000 | | Neural / Multiindustria | 1.000 a 1.500+ | ## Decisión recomendada ```text Diseñar 1.000 fórmulas iniciales. Activar 180 en MVP. Activar 450 en Business. Activar 800 en Enterprise. Usar 1.000+ en Neural. ``` --- # 9. Familias de fórmulas FARO La biblioteca V1 se organiza en **25 familias**, con **40 fórmulas por familia**. | Nº | Familia de fórmulas | Cantidad | | -----------: | -------------------------------- | --------: | | 1 | Comercial / Ventas | 40 | | 2 | Margen / Rentabilidad comercial | 40 | | 3 | Clientes / CRM | 40 | | 4 | Cotizaciones / Conversión | 40 | | 5 | Descuentos / Bonificaciones | 40 | | 6 | Comisiones / Incentivos | 40 | | 7 | Caja / Bancos | 40 | | 8 | Cobranza / Cuentas por cobrar | 40 | | 9 | Pagos / Cuentas por pagar | 40 | | 10 | Gastos / Administración | 40 | | 11 | Compras | 40 | | 12 | Proveedores | 40 | | 13 | Stock / Inventario | 40 | | 14 | Reposición / Abastecimiento | 40 | | 15 | Logística / Entregas | 40 | | 16 | Operaciones / Productividad | 40 | | 17 | RRHH / Personas | 40 | | 18 | Sueldos / Costo laboral | 40 | | 19 | Proyectos / Obras / Servicios | 40 | | 20 | Contratos / Abonos | 40 | | 21 | Calidad / Reclamos / SLA | 40 | | 22 | Datos / Calidad / Auditoría | 40 | | 23 | Workflow / Acciones / Evidencia | 40 | | 24 | FARO Score / Dirección | 40 | | 25 | Industria / Contexto / Benchmark | 40 | | **Total V1** | | **1.000** | --- # 10. Núcleo MVP — 180 fórmulas prioritarias Para el MVP, FARO debe activar primero fórmulas que demuestren la cadena completa: ```text dato → KPI → alerta → tensión → acción → Score ``` --- ## 10.1 Comercial / Ventas ### 15 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------------ | ------------------------------------------------------------------------ | | FML-COM-001 | Venta bruta | `SUM(sales.gross_amount)` | | FML-COM-002 | Venta neta | `SUM(sales.gross_amount - sales.discount_amount - sales.returns_amount)` | | FML-COM-003 | Cantidad vendida | `SUM(sales.quantity)` | | FML-COM-004 | Tickets / operaciones | `COUNT(DISTINCT sales.transaction_id)` | | FML-COM-005 | Ticket promedio | `SAFE_DIVIDE(venta_neta, tickets)` | | FML-COM-006 | Venta por sucursal | `SUM(sales.net_amount) GROUP BY branch_id` | | FML-COM-007 | Venta por vendedor | `SUM(sales.net_amount) GROUP BY seller_id` | | FML-COM-008 | Venta por cliente | `SUM(sales.net_amount) GROUP BY customer_id` | | FML-COM-009 | Venta por producto | `SUM(sales.net_amount) GROUP BY product_id` | | FML-COM-010 | Venta por rubro | `SUM(sales.net_amount) GROUP BY rubro_code` | | FML-COM-011 | Venta por canal | `SUM(sales.net_amount) GROUP BY channel_code` | | FML-COM-012 | Variación venta vs período anterior | `VAR_PCT(venta_neta, PERIOD_PREVIOUS(venta_neta))` | | FML-COM-013 | Cumplimiento objetivo ventas | `SAFE_DIVIDE(venta_neta, sales_target)` | | FML-COM-014 | Participación de sucursal en ventas | `SAFE_DIVIDE(venta_sucursal, venta_total_empresa)` | | FML-COM-015 | Concentración de ventas top clientes | `SAFE_DIVIDE(SUM(top_10_customers.sales), venta_total)` | --- ## 10.2 Margen / Rentabilidad Comercial ### 15 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------------ | ---------------------------------------------------------------------------------------- | | FML-MAR-001 | Costo de mercadería vendida | `SUM(sales.quantity * sales.unit_cost)` | | FML-MAR-002 | Margen bruto monto | `SUM(sales.net_amount - sales.cost_amount)` | | FML-MAR-003 | Margen bruto % | `SAFE_DIVIDE(margen_bruto_monto, venta_neta)` | | FML-MAR-004 | Margen por producto | `SAFE_DIVIDE(SUM(product.net_amount - product.cost_amount), SUM(product.net_amount))` | | FML-MAR-005 | Margen por rubro | `SAFE_DIVIDE(SUM(rubro.net_amount - rubro.cost_amount), SUM(rubro.net_amount))` | | FML-MAR-006 | Margen por vendedor | `SAFE_DIVIDE(SUM(seller.net_amount - seller.cost_amount), SUM(seller.net_amount))` | | FML-MAR-007 | Margen por cliente | `SAFE_DIVIDE(SUM(customer.net_amount - customer.cost_amount), SUM(customer.net_amount))` | | FML-MAR-008 | Margen por canal | `SAFE_DIVIDE(SUM(channel.net_amount - channel.cost_amount), SUM(channel.net_amount))` | | FML-MAR-009 | Margen esperado vs real | `actual_margin_pct - expected_margin_pct` | | FML-MAR-010 | Venta bajo margen mínimo | `SUM(IF(actual_margin_pct < minimum_margin_pct, sales.net_amount, 0))` | | FML-MAR-011 | % venta bajo margen mínimo | `SAFE_DIVIDE(venta_bajo_margen_minimo, venta_neta)` | | FML-MAR-012 | Margen perdido por descuento | `SUM(discount_amount * expected_margin_pct)` | | FML-MAR-013 | Rentabilidad neta comercial estimada | `margen_bruto_monto - commercial_variable_costs` | | FML-MAR-014 | Variación margen vs período anterior | `VAR_PCT(margen_bruto_pct, PERIOD_PREVIOUS(margen_bruto_pct))` | | FML-MAR-015 | Aporte al margen por rubro | `SAFE_DIVIDE(margen_rubro_monto, margen_total_monto)` | --- ## 10.3 Descuentos / Bonificaciones ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | -------------------------------------------- | ------------------------------------------------------------------------- | | FML-DES-001 | Descuento total | `SUM(sales.discount_amount)` | | FML-DES-002 | Descuento promedio % | `SAFE_DIVIDE(SUM(discount_amount), SUM(gross_amount))` | | FML-DES-003 | Descuento por vendedor | `SAFE_DIVIDE(SUM(seller.discount_amount), SUM(seller.gross_amount))` | | FML-DES-004 | Descuento por cliente | `SAFE_DIVIDE(SUM(customer.discount_amount), SUM(customer.gross_amount))` | | FML-DES-005 | Descuento por rubro | `SAFE_DIVIDE(SUM(rubro.discount_amount), SUM(rubro.gross_amount))` | | FML-DES-006 | Operaciones con descuento superior al límite | `COUNT(IF(discount_pct > authorized_discount_pct, transaction_id, NULL))` | | FML-DES-007 | Venta con descuento no autorizado | `SUM(IF(discount_authorized = false, net_amount, 0))` | | FML-DES-008 | Impacto descuento en margen | `SUM(discount_amount * gross_margin_pct_before_discount)` | | FML-DES-009 | Variación descuento promedio | `VAR_PCT(discount_avg_pct, PERIOD_PREVIOUS(discount_avg_pct))` | | FML-DES-010 | Descuento crítico ponderado | `discount_pct * product_criticality_weight * margin_gap_weight` | --- ## 10.4 Clientes / CRM ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------- | ---------------------------------------------------------------------------------- | | FML-CLI-001 | Clientes activos | `COUNT(DISTINCT customer_id WHERE sales_in_period > 0)` | | FML-CLI-002 | Clientes nuevos | `COUNT(customer_id WHERE first_purchase_date BETWEEN period_start AND period_end)` | | FML-CLI-003 | Clientes inactivos | `COUNT(customer_id WHERE days_since_last_purchase > inactivity_threshold)` | | FML-CLI-004 | Venta promedio por cliente | `SAFE_DIVIDE(venta_neta, clientes_activos)` | | FML-CLI-005 | Margen promedio por cliente | `SAFE_DIVIDE(margen_total, clientes_activos)` | | FML-CLI-006 | Rentabilidad por cliente | `SUM(customer.margin_amount - customer.service_cost - customer.logistics_cost)` | | FML-CLI-007 | Concentración cliente principal | `SAFE_DIVIDE(sales_top_customer, venta_total)` | | FML-CLI-008 | Frecuencia de compra | `SAFE_DIVIDE(COUNT(transactions), COUNT(DISTINCT customer_id))` | | FML-CLI-009 | Recencia promedio | `AVG(DATEDIFF(period_end, customer.last_purchase_date))` | | FML-CLI-010 | Riesgo cliente ponderado | `credit_risk_score * exposure_amount * overdue_weight` | --- ## 10.5 Cotizaciones / Conversión ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------- | ------------------------------------------------------------------------- | | FML-COT-001 | Cotizaciones emitidas | `COUNT(quote_id)` | | FML-COT-002 | Monto cotizado | `SUM(quote.total_amount)` | | FML-COT-003 | Cotizaciones ganadas | `COUNT(quote_id WHERE status='WON')` | | FML-COT-004 | Cotizaciones perdidas | `COUNT(quote_id WHERE status='LOST')` | | FML-COT-005 | Tasa de conversión | `SAFE_DIVIDE(cotizaciones_ganadas, cotizaciones_emitidas)` | | FML-COT-006 | Monto convertido | `SUM(quote.total_amount WHERE status='WON')` | | FML-COT-007 | Conversión por vendedor | `SAFE_DIVIDE(won_quotes_seller, total_quotes_seller)` | | FML-COT-008 | Cotizaciones vencidas | `COUNT(quote_id WHERE valid_until < today AND status='OPEN')` | | FML-COT-009 | Tiempo promedio de cierre | `AVG(DATEDIFF(close_date, quote_date))` | | FML-COT-010 | Margen esperado cotizado | `SAFE_DIVIDE(SUM(quote.expected_margin_amount), SUM(quote.total_amount))` | --- ## 10.6 Caja / Bancos ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ---------------------------------- | ------------------------------------------------------------------- | | FML-CAJ-001 | Caja disponible | `SUM(bank_accounts.available_balance) + SUM(cash_register.balance)` | | FML-CAJ-002 | Ingresos del período | `SUM(cash_movements.amount WHERE movement_type='IN')` | | FML-CAJ-003 | Egresos del período | `SUM(cash_movements.amount WHERE movement_type='OUT')` | | FML-CAJ-004 | Flujo neto | `ingresos_periodo - egresos_periodo` | | FML-CAJ-005 | Saldo proyectado | `caja_disponible + projected_collections - projected_payments` | | FML-CAJ-006 | Cobertura de caja en días | `SAFE_DIVIDE(caja_disponible, avg_daily_outflows)` | | FML-CAJ-007 | % ingresos conciliados | `SAFE_DIVIDE(reconciled_inflows, total_inflows)` | | FML-CAJ-008 | % egresos conciliados | `SAFE_DIVIDE(reconciled_outflows, total_outflows)` | | FML-CAJ-009 | Caja por sucursal | `SUM(cash_balance) GROUP BY branch_id` | | FML-CAJ-010 | Variación caja vs período anterior | `VAR_PCT(caja_disponible, PERIOD_PREVIOUS(caja_disponible))` | --- ## 10.7 Cobranza / Cuentas por Cobrar ### 15 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ----------------------------- | -------------------------------------------------------------- | | FML-COB-001 | Cuentas por cobrar total | `SUM(receivables.open_amount)` | | FML-COB-002 | Saldo vencido | `SUM(open_amount WHERE due_date < today)` | | FML-COB-003 | Saldo no vencido | `SUM(open_amount WHERE due_date >= today)` | | FML-COB-004 | % cartera vencida | `SAFE_DIVIDE(saldo_vencido, cuentas_por_cobrar_total)` | | FML-COB-005 | Días promedio de mora | `AVG(DATEDIFF(today, due_date) WHERE due_date < today)` | | FML-COB-006 | DSO | `SAFE_DIVIDE(accounts_receivable, avg_daily_credit_sales)` | | FML-COB-007 | Cobranza del período | `SUM(collections.amount)` | | FML-COB-008 | Efectividad de cobranza | `SAFE_DIVIDE(collections.amount, receivables_due_in_period)` | | FML-COB-009 | Mora por cliente | `SUM(open_amount WHERE due_date < today) GROUP BY customer_id` | | FML-COB-010 | Mora por vendedor | `SUM(overdue_amount) GROUP BY seller_id` | | FML-COB-011 | Exposición crediticia cliente | `open_amount + uninvoiced_orders_amount` | | FML-COB-012 | Uso de límite de crédito | `SAFE_DIVIDE(credit_exposure, credit_limit)` | | FML-COB-013 | Clientes con crédito excedido | `COUNT(customer_id WHERE credit_exposure > credit_limit)` | | FML-COB-014 | Promesas de pago incumplidas | `COUNT(promise_id WHERE promise_date < today AND paid=false)` | | FML-COB-015 | Riesgo de cobranza ponderado | `overdue_amount * risk_score * days_overdue_weight` | --- ## 10.8 Pagos / Cuentas por Pagar ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ----------------------------- | ------------------------------------------------------------------- | | FML-PAG-001 | Cuentas por pagar total | `SUM(payables.open_amount)` | | FML-PAG-002 | Pagos vencidos | `SUM(open_amount WHERE due_date < today)` | | FML-PAG-003 | Pagos próximos 7 días | `SUM(open_amount WHERE due_date BETWEEN today AND today+7)` | | FML-PAG-004 | Pagos críticos | `SUM(open_amount WHERE supplier_criticality='HIGH')` | | FML-PAG-005 | Días promedio pago proveedor | `AVG(DATEDIFF(payment_date, invoice_date))` | | FML-PAG-006 | % pagos vencidos | `SAFE_DIVIDE(pagos_vencidos, cuentas_por_pagar_total)` | | FML-PAG-007 | Concentración deuda proveedor | `SAFE_DIVIDE(payable_top_supplier, cuentas_por_pagar_total)` | | FML-PAG-008 | Pagos sin comprobante | `SUM(payment.amount WHERE document_id IS NULL)` | | FML-PAG-009 | Pagos fuera de política | `COUNT(payment_id WHERE approval_required=true AND approved=false)` | | FML-PAG-010 | Presión de pagos sobre caja | `SAFE_DIVIDE(payments_due_7_days, caja_disponible)` | --- ## 10.9 Gastos / Administración ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ----------------------------------- | ---------------------------------------------------- | | FML-GAS-001 | Gasto total | `SUM(expenses.amount)` | | FML-GAS-002 | Gasto por área | `SUM(expenses.amount) GROUP BY area_code` | | FML-GAS-003 | Gasto por sucursal | `SUM(expenses.amount) GROUP BY branch_id` | | FML-GAS-004 | Gasto por centro de costo | `SUM(expenses.amount) GROUP BY cost_center_id` | | FML-GAS-005 | Gasto sobre ventas | `SAFE_DIVIDE(gasto_total, venta_neta)` | | FML-GAS-006 | Gasto fijo total | `SUM(expenses.amount WHERE expense_type='FIXED')` | | FML-GAS-007 | Gasto variable total | `SUM(expenses.amount WHERE expense_type='VARIABLE')` | | FML-GAS-008 | Variación gasto vs período anterior | `VAR_PCT(gasto_total, PERIOD_PREVIOUS(gasto_total))` | | FML-GAS-009 | Gasto sin comprobante | `SUM(expenses.amount WHERE document_id IS NULL)` | | FML-GAS-010 | Desvío contra presupuesto | `gasto_real - gasto_presupuestado` | --- ## 10.10 Compras ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ----------------------------- | ------------------------------------------------------------ | | FML-CMP-001 | Compra total | `SUM(purchases.total_amount)` | | FML-CMP-002 | Compras por proveedor | `SUM(purchases.total_amount) GROUP BY supplier_id` | | FML-CMP-003 | Compras por producto | `SUM(purchases.total_amount) GROUP BY product_id` | | FML-CMP-004 | Variación costo compra | `VAR_PCT(current_unit_cost, previous_unit_cost)` | | FML-CMP-005 | Órdenes de compra emitidas | `COUNT(purchase_order_id)` | | FML-CMP-006 | Órdenes pendientes | `COUNT(po_id WHERE status IN ('OPEN','PARTIAL'))` | | FML-CMP-007 | Recepción completa % | `SAFE_DIVIDE(received_quantity, ordered_quantity)` | | FML-CMP-008 | Compra urgente % | `SAFE_DIVIDE(urgent_purchase_amount, total_purchase_amount)` | | FML-CMP-009 | Ahorro por negociación | `SUM(reference_price - actual_price) * quantity` | | FML-CMP-010 | Sobrecosto por compra urgente | `SUM((urgent_price - standard_price) * quantity)` | --- ## 10.11 Proveedores ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------------ | ------------------------------------------------------------------------- | | FML-PRV-001 | Proveedores activos | `COUNT(DISTINCT supplier_id WHERE purchases_in_period > 0)` | | FML-PRV-002 | Cumplimiento proveedor | `SAFE_DIVIDE(on_time_deliveries, total_deliveries)` | | FML-PRV-003 | Lead time promedio proveedor | `AVG(DATEDIFF(receipt_date, purchase_order_date))` | | FML-PRV-004 | Variación precio proveedor | `VAR_PCT(current_supplier_price, previous_supplier_price)` | | FML-PRV-005 | Dependencia proveedor | `SAFE_DIVIDE(purchase_amount_supplier, total_purchase_amount)` | | FML-PRV-006 | Proveedores críticos sin alternativa | `COUNT(supplier_id WHERE critical=true AND alternative_supplier=false)` | | FML-PRV-007 | Calidad proveedor | `SAFE_DIVIDE(accepted_quantity, received_quantity)` | | FML-PRV-008 | Reclamos a proveedor | `COUNT(supplier_claim_id)` | | FML-PRV-009 | Condición promedio de pago proveedor | `AVG(payment_term_days)` | | FML-PRV-010 | Score proveedor | `reliability*0.35 + price_score*0.25 + quality*0.25 + payment_terms*0.15` | --- ## 10.12 Stock / Inventario ### 15 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------- | -------------------------------------------------------------------- | | FML-STK-001 | Stock disponible | `SUM(stock.on_hand - stock.reserved)` | | FML-STK-002 | Stock valorizado | `SUM(stock.quantity * product.unit_cost)` | | FML-STK-003 | Stock por producto | `SUM(stock.quantity) GROUP BY product_id` | | FML-STK-004 | Stock por sucursal | `SUM(stock.quantity) GROUP BY branch_id` | | FML-STK-005 | Stock por depósito | `SUM(stock.quantity) GROUP BY warehouse_id` | | FML-STK-006 | Productos bajo mínimo | `COUNT(product_id WHERE stock_available < min_stock)` | | FML-STK-007 | Productos con stock crítico | `COUNT(product_id WHERE stock_status='CRITICAL')` | | FML-STK-008 | Productos con sobrestock | `COUNT(product_id WHERE stock_available > max_stock)` | | FML-STK-009 | Rotación de stock | `SAFE_DIVIDE(cost_of_goods_sold, avg_inventory_value)` | | FML-STK-010 | Días de inventario | `SAFE_DIVIDE(avg_inventory_value, avg_daily_cogs)` | | FML-STK-011 | Quiebre de stock | `COUNT(product_id WHERE stock_available <= 0 AND demand_recent > 0)` | | FML-STK-012 | Stock inmovilizado | `SUM(stock_value WHERE days_without_sale > threshold)` | | FML-STK-013 | % stock inmovilizado | `SAFE_DIVIDE(stock_inmovilizado, stock_valorizado)` | | FML-STK-014 | Diferencia inventario | `physical_count - system_stock` | | FML-STK-015 | Valor de stock crítico rentable | `SUM(stockout_risk_value WHERE margin_profile='HIGH')` | --- ## 10.13 Reposición / Abastecimiento ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ------------------------------- | ------------------------------------------------------------------------------------ | | FML-REP-001 | Punto de pedido sugerido | `avg_daily_sales * supplier_lead_time_days + safety_stock` | | FML-REP-002 | Cantidad sugerida de reposición | `max_stock - stock_available` | | FML-REP-003 | Cobertura de stock días | `SAFE_DIVIDE(stock_available, avg_daily_sales)` | | FML-REP-004 | Riesgo de quiebre | `SCORE_BAND(stock_coverage_days, thresholds)` | | FML-REP-005 | Prioridad de reposición | `margin_weight * rotation_weight * stockout_risk_weight * supplier_lead_time_weight` | | FML-REP-006 | Necesidad de compra crítica | `SUM(IF(stock_status='CRITICAL', reorder_quantity, 0))` | | FML-REP-007 | Compra sugerida valorizada | `SUM(reorder_quantity * unit_cost)` | | FML-REP-008 | Reposición atrasada | `COUNT(product_id WHERE reorder_required=true AND purchase_order_open=false)` | | FML-REP-009 | Demanda promedio diaria | `SAFE_DIVIDE(quantity_sold_last_n_days, n_days)` | | FML-REP-010 | Stock de seguridad | `demand_std_dev * service_level_factor * SQRT(lead_time_days)` | --- ## 10.14 Logística / Entregas ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ----------- | ---------------------------- | ---------------------------------------------------------------------------- | | FML-LOG-001 | Entregas totales | `COUNT(delivery_id)` | | FML-LOG-002 | Entregas a tiempo | `COUNT(delivery_id WHERE delivered_at <= promised_at)` | | FML-LOG-003 | % entrega a tiempo | `SAFE_DIVIDE(entregas_a_tiempo, entregas_totales)` | | FML-LOG-004 | Entregas fallidas | `COUNT(delivery_id WHERE status='FAILED')` | | FML-LOG-005 | % entregas fallidas | `SAFE_DIVIDE(entregas_fallidas, entregas_totales)` | | FML-LOG-006 | Costo logístico total | `SUM(delivery.logistics_cost)` | | FML-LOG-007 | Costo logístico por entrega | `SAFE_DIVIDE(costo_logistico_total, entregas_totales)` | | FML-LOG-008 | Costo logístico sobre ventas | `SAFE_DIVIDE(costo_logistico_total, venta_neta)` | | FML-LOG-009 | Demora promedio entrega | `AVG(DATEDIFF(delivered_at, promised_at) WHERE delivered_at > promised_at)` | | FML-LOG-010 | Entregas críticas demoradas | `COUNT(delivery_id WHERE criticality='HIGH' AND delivered_at > promised_at)` | --- ## 10.15 RRHH / Personas ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ------------ | ------------------------------------ | ----------------------------------------------------------------------------------- | | FML-RRHH-001 | Dotación total | `COUNT(employee_id WHERE status='ACTIVE')` | | FML-RRHH-002 | Dotación por área | `COUNT(employee_id) GROUP BY area_code` | | FML-RRHH-003 | Dotación por sucursal | `COUNT(employee_id) GROUP BY branch_id` | | FML-RRHH-004 | Costo laboral total | `SUM(payroll.gross_salary + payroll.employer_contributions + payroll.variable_pay)` | | FML-RRHH-005 | Costo laboral sobre ventas | `SAFE_DIVIDE(costo_laboral_total, venta_neta)` | | FML-RRHH-006 | Venta por empleado | `SAFE_DIVIDE(venta_neta, dotacion_total)` | | FML-RRHH-007 | Margen por empleado | `SAFE_DIVIDE(margen_bruto_monto, dotacion_total)` | | FML-RRHH-008 | Ausentismo % | `SAFE_DIVIDE(absent_days, scheduled_work_days)` | | FML-RRHH-009 | Rotación de personal | `SAFE_DIVIDE(employee_terminations, avg_headcount)` | | FML-RRHH-010 | Productividad comercial por vendedor | `SAFE_DIVIDE(venta_vendedor, vendedor_active_days)` | --- ## 10.16 Comisiones ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ------------- | ---------------------------------- | ---------------------------------------------------------------------- | | FML-COMIS-001 | Comisión por venta bruta | `sales.gross_amount * commission_rate` | | FML-COMIS-002 | Comisión por venta neta | `sales.net_amount * commission_rate` | | FML-COMIS-003 | Comisión por margen | `margin_amount * commission_rate` | | FML-COMIS-004 | Comisión por margen cobrado | `collected_margin_amount * commission_rate` | | FML-COMIS-005 | Comisión bloqueada por mora | `IF(customer_overdue=true, 0, calculated_commission)` | | FML-COMIS-006 | Comisión bloqueada por margen bajo | `IF(actual_margin_pct < minimum_margin_pct, 0, calculated_commission)` | | FML-COMIS-007 | Comisión ajustada por descuento | `base_commission * (1 - discount_penalty_factor)` | | FML-COMIS-008 | Comisión total vendedor | `SUM(commission_amount) GROUP BY seller_id` | | FML-COMIS-009 | Comisión sobre margen generado | `SAFE_DIVIDE(commission_amount, margin_amount)` | | FML-COMIS-010 | Comisión sana FARO | `collected_margin * rate * quality_factor * no_overdue_factor` | --- ## 10.17 Proyectos / Obras / Servicios ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ------------ | ----------------------------- | ------------------------------------------------------------------- | | FML-PROY-001 | Presupuesto proyecto | `SUM(project.budget_amount)` | | FML-PROY-002 | Costo real proyecto | `SUM(project_costs.amount)` | | FML-PROY-003 | Ingreso facturado proyecto | `SUM(project_invoices.amount)` | | FML-PROY-004 | Margen proyecto monto | `ingreso_facturado_proyecto - costo_real_proyecto` | | FML-PROY-005 | Margen proyecto % | `SAFE_DIVIDE(margen_proyecto_monto, ingreso_facturado_proyecto)` | | FML-PROY-006 | Avance físico % | `SAFE_DIVIDE(completed_milestones_weight, total_milestones_weight)` | | FML-PROY-007 | Avance financiero % | `SAFE_DIVIDE(invoiced_amount, contract_amount)` | | FML-PROY-008 | Desvío de costo | `costo_real_proyecto - costo_presupuestado` | | FML-PROY-009 | Desvío plazo | `DATEDIFF(actual_finish_date, planned_finish_date)` | | FML-PROY-010 | Rentabilidad esperada vs real | `actual_project_margin_pct - expected_project_margin_pct` | --- ## 10.18 Workflow / Acciones ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ---------- | -------------------------- | ------------------------------------------------------------------------------------------------ | | FML-WF-001 | Acciones creadas | `COUNT(action_id)` | | FML-WF-002 | Acciones abiertas | `COUNT(action_id WHERE status='OPEN')` | | FML-WF-003 | Acciones cerradas | `COUNT(action_id WHERE status='CLOSED')` | | FML-WF-004 | Acciones vencidas | `COUNT(action_id WHERE due_date < today AND status!='CLOSED')` | | FML-WF-005 | % acciones vencidas | `SAFE_DIVIDE(acciones_vencidas, acciones_abiertas)` | | FML-WF-006 | Cumplimiento de acciones | `SAFE_DIVIDE(acciones_cerradas_a_tiempo, acciones_vencidas_periodo + acciones_cerradas_periodo)` | | FML-WF-007 | Acciones críticas vencidas | `COUNT(action_id WHERE priority='CRITICAL' AND due_date < today AND status!='CLOSED')` | | FML-WF-008 | Acciones con evidencia | `SAFE_DIVIDE(actions_with_evidence, closed_actions)` | | FML-WF-009 | Tiempo promedio de cierre | `AVG(DATEDIFF(closed_at, created_at))` | | FML-WF-010 | Score de ejecución | `on_time_rate*0.40 + evidence_rate*0.30 + critical_resolution_rate*0.30` | --- ## 10.19 Calidad de Datos / Auditoría ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ---------- | --------------------------- | -------------------------------------------------------------------------- | | FML-DQ-001 | Completitud de datos | `SAFE_DIVIDE(required_fields_completed, required_fields_total)` | | FML-DQ-002 | Consistencia de datos | `SAFE_DIVIDE(validation_rules_passed, validation_rules_total)` | | FML-DQ-003 | Factor sin errores críticos | `100 - critical_error_penalty` | | FML-DQ-004 | Score calidad de datos | `completeness*0.40 + consistency*0.35 + critical_error_factor*0.25` | | FML-DQ-005 | % registros rechazados | `SAFE_DIVIDE(records_rejected, records_received)` | | FML-DQ-006 | % registros observados | `SAFE_DIVIDE(records_observed, records_received)` | | FML-DQ-007 | % cargas con RAW | `SAFE_DIVIDE(loads_with_raw, total_loads)` | | FML-DQ-008 | % KPIs trazables | `SAFE_DIVIDE(kpis_with_lineage, total_kpis)` | | FML-DQ-009 | Fuentes vencidas | `COUNT(source_id WHERE freshness_status='EXPIRED')` | | FML-DQ-010 | Confianza auditada | `data_quality_score*0.50 + traceability_score*0.30 + freshness_score*0.20` | --- ## 10.20 FARO Score / Dirección ### 10 fórmulas MVP | Código | KPI / Fórmula | Expresión | | ------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | FML-SCORE-001 | Score comercial | `sales_score*0.30 + margin_score*0.35 + customer_score*0.15 + action_score*0.20` | | FML-SCORE-002 | Score financiero | `cash_score*0.30 + collection_score*0.30 + payable_score*0.15 + debt_score*0.10 + action_score*0.15` | | FML-SCORE-003 | Score stock | `stock_availability_score*0.30 + rotation_score*0.25 + overstock_score*0.20 + data_quality_score*0.10 + action_score*0.15` | | FML-SCORE-004 | Score operaciones | `delivery_score*0.30 + quality_score*0.25 + capacity_score*0.20 + incident_score*0.10 + action_score*0.15` | | FML-SCORE-005 | Score RRHH | `productivity_score*0.30 + cost_labor_score*0.25 + attendance_score*0.20 + structure_score*0.10 + action_score*0.15` | | FML-SCORE-006 | Score calidad de datos | `data_quality_score*0.50 + traceability_score*0.30 + freshness_score*0.20` | | FML-SCORE-007 | FARO Score empresa | `SUM(module_score * module_weight)` | | FML-SCORE-008 | Confianza FARO Score | `SUM(module_data_confidence * module_weight)` | | FML-SCORE-009 | Variación FARO Score | `faro_score_current - faro_score_previous` | | FML-SCORE-010 | Score ajustado por ejecución | `faro_score_base + execution_delta - overdue_critical_penalty` | --- # 11. Fórmulas compuestas críticas Estas fórmulas son las que hacen que FARO deje de ser tablero. --- ## 11.1 Crecimiento no rentable ```text crecimiento_no_rentable_score = sales_growth_score * 0.25 + margin_decline_score * 0.35 + discount_increase_score * 0.20 + collection_risk_score * 0.10 + stock_pressure_score * 0.10 ``` ## Lectura Si ventas suben, margen baja, descuentos suben, cobranza empeora y stock se presiona, FARO detecta tensión de crecimiento no rentable. --- ## 11.2 Venta sin caja ```text venta_sin_caja_score = sales_growth_score * 0.25 + accounts_receivable_growth_score * 0.25 + dso_increase_score * 0.25 + cash_decline_score * 0.25 ``` --- ## 11.3 Stock rentable en riesgo ```text stock_rentable_en_riesgo = product_margin_score * 0.30 + product_rotation_score * 0.30 + stockout_risk_score * 0.30 + supplier_lead_time_risk * 0.10 ``` --- ## 11.4 Cliente grande riesgoso ```text cliente_grande_riesgoso = customer_sales_concentration_score * 0.25 + overdue_score * 0.30 + margin_low_score * 0.20 + credit_exposure_score * 0.25 ``` --- ## 11.5 Comisión mal alineada ```text comision_mal_alineada = commission_growth_score * 0.25 + margin_decline_score * 0.30 + discount_increase_score * 0.25 + collection_delay_score * 0.20 ``` --- ## 11.6 Diagnóstico sin ejecución ```text diagnostico_sin_ejecucion = critical_alerts_open_score * 0.25 + overdue_actions_score * 0.30 + repeated_tensions_score * 0.25 + evidence_missing_score * 0.20 ``` --- # 12. Reglas de ejecución por alcance La misma fórmula debe poder ejecutarse por distintos alcances. ## Ejemplo: margen bruto % ```text margen_bruto_pct = SAFE_DIVIDE(SUM(net_amount - cost_amount), SUM(net_amount)) ``` ## Puede calcularse por: | Alcance | Resultado | | -------- | ------------------------------ | | Empresa | Margen total empresa | | Sucursal | Margen por sucursal | | Área | Margen comercial por área | | Vendedor | Margen por vendedor | | Cliente | Margen por cliente | | Producto | Margen por producto | | Rubro | Margen por rubro | | Canal | Margen por canal | | Período | Margen mensual, semanal, anual | --- # 13. Reglas de calidad mínima No toda fórmula puede ejecutarse con cualquier dato. | Tipo de fórmula | Calidad mínima sugerida | | ------------------------ | ----------------------: | | KPI informativo | 60 | | KPI operativo | 70 | | KPI ejecutivo | 75 | | Alerta crítica | 80 | | Tensión | 80 | | FARO Score | 85 | | Recomendación automática | 85 | | Simulación | 90 | ## Regla ```text Si la calidad de datos es menor al mínimo requerido, FARO debe calcular con advertencia o bloquear la fórmula. ``` --- # 14. Fórmulas por industria Algunas fórmulas cambian según industria. ## Retail ```text venta_por_m2 = venta_neta / superficie_m2 ``` ```text rotacion_stock_retail = costo_mercaderia_vendida / inventario_promedio ``` ## Construcción / obras ```text margen_por_obra = (ingreso_certificado - costo_real_obra) / ingreso_certificado ``` ```text avance_fisico_vs_financiero = avance_fisico_pct - avance_financiero_pct ``` ## Salud ```text ocupacion_camas = camas_ocupadas / camas_disponibles ``` ```text ausentismo_turnos = turnos_no_asistidos / turnos_programados ``` ## Hotelería ```text revpar = ingreso_habitaciones / habitaciones_disponibles ``` ```text adr = ingreso_habitaciones / habitaciones_ocupadas ``` ## SaaS ```text mrr = SUM(active_subscription_monthly_amount) ``` ```text churn_rate = customers_lost / customers_start_period ``` ## Logística ```text costo_por_km = costo_total_flota / kilometros_recorridos ``` ```text entrega_a_tiempo_pct = entregas_a_tiempo / entregas_totales ``` --- # 15. Tabla SQL sugerida: biblioteca de fórmulas ```sql CREATE TABLE faro_kpi_formulas ( formula_id UUID PRIMARY KEY, formula_code VARCHAR(80) UNIQUE NOT NULL, kpi_code VARCHAR(80) NOT NULL, formula_name VARCHAR(240) NOT NULL, formula_type VARCHAR(80) NOT NULL, expression TEXT NOT NULL, expression_language VARCHAR(40) DEFAULT 'FARO_DSL', output_type VARCHAR(60), aggregation_level VARCHAR(80), allowed_dimensions JSONB, required_tables JSONB, required_fields JSONB, required_data_quality_score NUMERIC(5,2), frequency_code VARCHAR(40), module_code VARCHAR(80), area_code VARCHAR(80), applies_to_industries JSONB, applies_to_company_types JSONB, threshold_rules JSONB, alert_codes JSONB, tension_codes JSONB, action_codes JSONB, score_impact_direction VARCHAR(40), score_impact_weight NUMERIC(6,4), formula_status VARCHAR(40) DEFAULT 'ACTIVE', version VARCHAR(40) DEFAULT 'V1', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- # 16. Tabla SQL sugerida: ejecuciones de fórmulas ```sql CREATE TABLE faro_formula_executions ( formula_execution_id UUID PRIMARY KEY, company_id UUID NOT NULL, formula_code VARCHAR(80) NOT NULL, kpi_code VARCHAR(80), period_id VARCHAR(80) NOT NULL, execution_scope JSONB, result_value NUMERIC(18,6), result_text TEXT, result_status VARCHAR(40), data_quality_score NUMERIC(5,2), confidence_score NUMERIC(5,2), records_used INTEGER, source_batches JSONB, alerts_triggered JSONB, tensions_triggered JSONB, actions_suggested JSONB, executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- # 17. Tabla SQL sugerida: dependencias de fórmulas ```sql CREATE TABLE faro_formula_dependencies ( dependency_id UUID PRIMARY KEY, formula_code VARCHAR(80) NOT NULL, depends_on_formula_code VARCHAR(80) NOT NULL, dependency_type VARCHAR(60), required BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- # 18. Reglas FARO para fórmulas | Código | Regla | | -------- | -------------------------------------------------------------- | | FML-R001 | Toda fórmula debe tener código único | | FML-R002 | Toda fórmula debe estar vinculada a un KPI | | FML-R003 | Toda fórmula debe declarar fuentes y campos requeridos | | FML-R004 | Toda fórmula debe declarar dimensiones permitidas | | FML-R005 | Toda fórmula ejecutiva debe tener calidad mínima de datos | | FML-R006 | Toda fórmula debe ser versionada | | FML-R007 | Toda fórmula compuesta debe declarar dependencias | | FML-R008 | Toda fórmula que active alerta debe tener umbral | | FML-R009 | Toda fórmula que active tensión debe conectarse al mapa causal | | FML-R010 | Toda fórmula que impacte Score debe tener peso | | FML-R011 | Toda fórmula debe poder auditar registros usados | | FML-R012 | Toda fórmula específica por industria debe declarar industria | | FML-R013 | Toda fórmula con división debe usar `SAFE_DIVIDE` | | FML-R014 | Fórmulas con datos débiles deben mostrar confianza reducida | | FML-R015 | Fórmulas críticas no deben ejecutarse sin RAW trazable | --- # 19. Output esperado en FARO FARO debe poder mostrar el resultado así: ```text KPI: Margen bruto % Resultado: 21% Alcance: Sucursal San Juan / Rubro Cemento / Mayo 2026 Fórmula: SUM(venta_neta - costo) / SUM(venta_neta) Datos usados: 1.248 líneas de venta Fuente: Excel ventas + maestro productos + costos ERP Calidad del dato: 92% Comparación: Período anterior: 28% Alerta: Margen cayó 7 puntos. Tensión: Crecimiento no rentable. Acción sugerida: Revisar descuentos por vendedor y bloquear operaciones bajo margen mínimo. ``` --- # 20. Relación con alertas, tensiones y acciones | Fórmula | Alerta | Tensión | Acción | | --------------------- | --------------- | --------------------------- | ------------------- | | Margen bruto % | Margen bajo | Crecimiento no rentable | Revisar descuentos | | DSO | Cobranza lenta | Venta sin caja | Priorizar cobranza | | Stock crítico | Quiebre | Producto rentable sin stock | Reponer | | Gasto sobre ventas | Gasto alto | Rentabilidad invisible | Revisar gastos | | Comisión sobre margen | Comisión alta | Incentivo roto | Ajustar comisión | | Acciones vencidas | Ejecución débil | Diagnóstico sin ejecución | Escalar responsable | --- # 21. Definición oficial del activo ## Nombre **Fórmulas FARO por KPI** ## Objetivo Definir una biblioteca gobernada de fórmulas ejecutables por empresa, sucursal, área, módulo, responsable, cliente, producto, proveedor, canal, rubro, industria y período, permitiendo calcular KPIs simples, compuestos, contextuales y ponderados para alimentar alertas, tensiones, acciones, reportes y FARO Score. ## Volumen estimado V1 | Elemento | Cantidad | | ------------------------- | -------: | | Fórmulas diseñadas | 1.000 | | Familias de fórmulas | 25 | | Fórmulas por familia | 40 | | Fórmulas MVP | 180 | | Fórmulas Business | 450 | | Fórmulas Enterprise | 800 | | Fórmulas Neural | 1.000+ | | Tablas técnicas sugeridas | 3 | | Reglas base | 15 | --- # 22. Frase para explicar > FARO tiene una biblioteca de fórmulas por KPI. Cada fórmula puede ejecutarse por empresa, sucursal, área, responsable, cliente, producto, canal, rubro, industria y período. Así calcula indicadores simples y compuestos, detecta alertas, activa tensiones, recomienda acciones y actualiza FARO Score con trazabilidad. --- # 23. Decisión recomendada Para MVP: ```text Diseñar 1.000 fórmulas. Activar 180 fórmulas críticas. Priorizar ventas, margen, descuentos, cobranza, caja, stock, compras, gastos, RRHH, logística, acciones, calidad de datos y Score. ``` Para Business: ```text Activar 450 fórmulas. Sumar comisiones avanzadas, clientes, proveedores, centros de costo, sucursales, flujo financiero, proyectos y calidad. ``` Para Enterprise: ```text Activar 800 fórmulas. Sumar presupuesto, contratos, producción, mantenimiento, industria, benchmark, riesgo y auditoría avanzada. ``` Para Neural: ```text Usar 1.000+ fórmulas con pesos dinámicos por industria, contexto, confianza de datos, aprendizaje y simulación. ``` --- # 24. Cadena correcta dentro de FARO ```text Dato validado → maestro → contexto → fórmula KPI → resultado → umbral → alerta → relación causal → tensión → recomendación → acción → evidencia → impacto FARO Score ``` La fórmula es el puente entre el dato y la dirección. Si la fórmula está mal, todo lo demás queda elegante pero torcido.