Skip to content

Plataforma técnica · Orchestrator

Liquidaciones e Imposiciones (services)

Orchestrator Remuneraciones Imposiciones

El subdominio Liquidaciones e Imposiciones es el motor de cálculo del módulo. PayrollService consume contexto del maestro laboral, parámetros previsionales y resumen de asistencia para producir la liquidación del periodo. PrevisionsService toma esos resultados individuales y los consolida por institución acreedora para sustentar el pago Previred y la administración de APV.

Es el subdominio con mayor peso técnico: PayrollEngine ~1.5K LOC, PayrollInputBuilder ~500 LOC, generación PDF, consolidación de descuentos y aportes, separación de bases imponibles y tributables. La lectura contable equivalente vive en accounting/remuneraciones/liquidaciones-e-imposiciones.

ServicioResponsabilidadDoc
PayrollServiceOrquestación del cálculo mensual. Delega motor a PayrollEngine, contexto a PayrollInputBuilder, persistencia a PayrollRepository y PDF al template.
PrevisionsServiceConsolidación post-liquidación por institución + administración del APV (régimen A/B).
flowchart TD
  subgraph PR["domain/payroll/"]
    PS["PayrollService<br/>(orquestación)"]
    PE["PayrollEngine<br/>(cálculo puro)"]
    PIB["PayrollInputBuilder<br/>(contexto)"]
    PRP["PayrollRepository<br/>(persistencia)"]
    PDF["pdf-template<br/>(documento)"]
  end

  subgraph IN["Entrada"]
    CON["ContractService"]
    EMP["EmployeeService"]
    ATT["AttendanceService"]
    AFP["AfpService"]
    ISA["IsapreService"]
    PARAM["parámetros legales<br/>(UF, UTM, topes, tramos)"]
  end

  CON & EMP & ATT --> PIB
  AFP & ISA & PARAM --> PIB
  PIB --> PE
  PS --> PE
  PE --> PRP
  PRP --> PDF
  PRP -.-> PRV["PrevisionsService"]
PatrónDónde
StrategyPayrollEngine aplica reglas distintas según tipo_contrato, categoria_trabajador y modalidad de gratificación.
BuilderPayrollInputBuilder arma el contexto de cálculo desde múltiples services antes de invocar al motor.
PipelineEl motor procesa haberes → base imponible → base tributable → descuentos → líquido en pasos secuenciales y trazables.
RepositoryPayrollRepository separa persistencia del cálculo; el motor es puro y testeable.
Template Method (PDF)pdf-template genera el documento a partir del resultado estructurado del motor.
  • Preview vs. definitivo: PayrollService.previewLiquidacion calcula sin persistir obligación; PayrollService.cerrarPeriodo persiste y emite los eventos para imposiciones y contabilización.
  • Parámetros del periodo: todos los parámetros (UF, UTM, topes imponibles, tramos de impuesto único, comisiones AFP, planes Isapre) se leen vigentes a la fecha del periodo liquidado. El motor no acepta parámetros del periodo actual si el liquidado es anterior.
  • APV régimen B: si el contrato declara APV régimen B, el motor calcula la base tributable después de descontar APV; régimen A no afecta la base.
  • Imputación por concepto: cada concepto en pago_conceptos declara su cuenta_debe/cuenta_haber; modificar la cuenta de un concepto no afecta el resto del motor.
  • AFC por tipo de contrato: tasas distintas para INDEFINIDO vs. PLAZO_FIJO; PayrollEngine selecciona la tasa según el contrato vigente.
EventoTriggerPayload mínimo
payroll:periodo_cerradoPayrollService.cerrarPeriodo (post-COMMIT){ periodo: { anio, mes }, totalLiquidaciones, totalLiquido }
payroll:liquidacion_reprocesadaPayrollService.reprocesarLiquidacion{ liquidacionId, motivo, version }
imposiciones:consolidadasPrevisionsService.consolidarPeriodo{ periodo: { anio, mes }, totalPorInstitucion }
ServiceQué consume
FiniquitoServiceLee última liquidación del trabajador para determinar base indemnizatoria.
DJ1887ServiceConsume liquidaciones definitivas anuales para sustentar la declaración.
F29GeneratorServiceConsume el total de impuesto único retenido del periodo.