Plataforma técnica · Orchestrator
Common Data Service
Orchestrator Common Parametros
CommonDataService es la fachada única para acceder a los parámetros que viven en nostromo_common (el commonPool compartido por todos los tenants): indicadores económicos, tasas previsionales, AFP, AFC, topes, escalas tributarias, vacaciones, regímenes, vida útil de activos, corrección monetaria, giros, etc.
No extiende BaseService porque casi no necesita contexto de tenant — los parámetros son globales. Usa commonPool directamente vía su repository.
Por qué fachada
Section titled “Por qué fachada”CommonDataRepository (870 LOC) implementa unas ~50 queries específicas. CommonDataService (429 LOC) es la API estable que el resto del código consume — agrupa por preocupación, agrega lógica de mezcla (e.g. getSocialLawsParameters combina AFP + indicadores + topes en un solo SocialLawsRates), y oculta el detalle del SQL.
Si una tabla nueva entra al commonPool, va al repository; si una composición nueva agrega valor (e.g. “dame todo lo que necesito para liquidar nómina del período X”), va al service.
Mapa de Dominios
Section titled “Mapa de Dominios”flowchart LR
subgraph S["CommonDataService"]
IND["Indicadores económicos"]
LSS["Leyes Sociales"]
IMP["Impuestos"]
AFP["AFP / AFC"]
PAR["Parámetros generales"]
VAC["Vacaciones"]
REG["Regímenes y Normativa"]
LAB["Causales término"]
CM["Corrección monetaria"]
VIDA["Vida útil activos"]
OTR["Otros impuestos / Giros"]
end
POOL[("commonPool · nostromo_common")]
S --> POOL Lecturas — catálogo principal
Section titled “Lecturas — catálogo principal”Indicadores económicos
Section titled “Indicadores económicos”| Método | Devuelve |
|---|---|
getIndicators(periodDate) | { uf, utm, sueldoMinimo } (paralelo). |
getIndicador(periodDate, indicador) | Una fila o null. |
getIndicadores(periodDate) | Array completo del período. |
getUtm(periodDate) | Solo UTM (atajo común). |
Leyes sociales
Section titled “Leyes sociales”| Método | Devuelve |
|---|---|
getSocialLawsParameters(periodDate, afpCode?) | SocialLawsRates — composición de varias fuentes. |
Cómo compone getSocialLawsParameters (lógica significativa, no es passthrough):
- Si llega
afpCode: leetasayrecargodesdegetAfpTasa(afpCode, periodDate). - Lee
indicadoresAll(periodDate)y busca por nombre:SIS→sisRate. Sivalor > 1divide por 100 (los rows históricos guardan a veces %, a veces fracción).EXPECTATIVA_VIDA→socialSecurityRate(Sanna). Misma normalización + cap doble división sirate > 0.2.- Cualquier indicador con
MUTUALoACCIDen el nombre →mutualRate. Default0.0348.
- Lee
getTopes(periodDate).findTopebusca exacto y luego parcial (case-insensitive):TOPE AFPoTOPE INP→pensionCap.TOPE AFC→unemploymentCap.
- Retorna el objeto compuesto;
afcWorkerRateyafcEmployerRatequedan en 0 — se resuelven aparte víagetAfcByContract.
Impuestos
Section titled “Impuestos”| Método | Devuelve |
|---|---|
getTaxBrackets(periodDate, periodo='MENSUAL') | Tramos del impuesto (MENSUAL/ANUAL). |
getImpuesto2CatRows(periodDate, periodo?) | Tramos del Impuesto Segunda Categoría. |
getPpmScale(year, regimenId, incomeUF=0) | Escala PPM resuelta para el ingreso dado. |
getPpmScales(year, regimenId) | Todas las escalas PPM del régimen. |
AFP / AFC
Section titled “AFP / AFC”| Método | Devuelve |
|---|---|
getAfpTasas(periodDate, afpCode?) | Array (todas o una AFP específica). |
getAfcParameters(periodDate) | Parámetros AFC por contrato. |
getAfcByContract(periodDate, contractType, contractStartDate?) | Tasas worker/employer según tipo. |
getAfcByContract decisión por contrato:
contractType | Etiqueta resuelta |
|---|---|
CASA_PARTICULAR | 'Casa Particular' |
PLAZO_FIJO | 'Plazo Fijo' |
INDEFINIDO (default) | 'Plazo Indefinido' |
INDEFINIDO con contractStartDate y antigüedad ≥ 11 años | 'Plazo Indef 11' (tasa diferenciada) |
| Otro | 'Otros' |
El cálculo de antigüedad usa (now - start) / (1000 * 60 * 60 * 24 * 365.25).
Parámetros generales
Section titled “Parámetros generales”| Método | Devuelve |
|---|---|
getTopes(periodDate) | Todos los topes del período. |
getRentaMinima(periodDate) | Renta mínima por tipo de trabajador. |
getAsignacionFamiliar(periodDate) | Tramos de asignación familiar. |
getHolidays(from, to) | Feriados en rango. |
getMonedaSeries(codigo, toDate) | Serie histórica de una moneda. |
getMonedasByPeriod(periodDate, codigoMoneda?) | Conversión $/moneda por período. |
Vacaciones, regímenes, normativa
Section titled “Vacaciones, regímenes, normativa”| Método | Devuelve |
|---|---|
getRegions() / getCommunes(code) | Regiones y comunas (vacaciones). |
getTaxRegimes() | Catálogo de regímenes tributarios. |
getNormativa(tipoFuente?) | Normativa fiscal. |
getNormativaForRegimen(regimenId) | Normativa aplicable a un régimen. |
Causales término, corrección, vida útil, otros
Section titled “Causales término, corrección, vida útil, otros”| Método | Devuelve |
|---|---|
getCausal(code) / getAllCausales() | Causales de término de contrato. |
getCorreccionMonetaria(year) | Factores de corrección monetaria anual. |
getVidaUtilActivos(seccion?, soloActivos=true) | Tabla SII de vida útil de activos fijos. |
getOtrosImpuestosCodigos(soloActivos=true) | Códigos SII de otros impuestos. |
getGirosComerciales(soloActivos=true) | Catálogo de giros. |
Escrituras — upsert/delete
Section titled “Escrituras — upsert/delete”El service también permite mantener el commonPool. Cada bloque sigue el patrón upsertX(data) + deleteX(...):
| Recurso | Métodos |
|---|---|
| AFP tasas | upsertAfpTasa, updateAfpTasa(id, data), deleteAfpTasa(id) |
| AFC | upsertAfc, deleteAfc(periodo_mes, contrato) |
| Topes | upsertTope, deleteTope(periodo_mes, tope) |
| Renta mínima | upsertRentaMinima, deleteRentaMinima(periodo_mes, tipo_trabajador) |
| Indicadores | upsertIndicador, deleteIndicador(periodo_mes, indicador) |
| Asignación familiar | upsertAsignacionFamiliar, deleteAsignacionFamiliar(id) |
| Corrección monetaria | upsertCorreccionMonetaria, deleteCorreccionMonetaria(año, mes_origen, mes_destino) |
Los delete lanzan Error con statusCode: 404 adjunto si la fila no existió.
Por qué no extiende BaseService
Section titled “Por qué no extiende BaseService”- Casi todos los datos son globales (commonPool), no tenant-specific.
ServiceContext.tenantDbsería irrelevante. - No hay
withTransactionen este service — todas las operaciones son single-statement. - No emite eventos al
DomainEventBus— cambios en parámetros se reflejan en la próxima lectura sin intermediarios.
Si en el futuro se quiere notificar (e.g. “TOPE AFP cambió, invalida cache de leyes sociales”), agregar evento common_data:updated y migrar a BaseService.
Consumidores típicos
Section titled “Consumidores típicos”| Consumidor | Para qué |
|---|---|
PayrollEngine (cálculo nómina) | getSocialLawsParameters, getAfcByContract, getTaxBrackets, getIndicadores. |
HonorariosService | getIndicador('TASA_RETENCION_HONORARIOS', ...). |
DepreciacionService | getVidaUtilActivos, getCorreccionMonetaria. |
F29Service | getTaxBrackets, getImpuesto2CatRows, getPpmScale. |
VacationsService | getHolidays. |
CompanyService (frontend) | getTaxRegimes, getNormativa. |
ContractsService | getCausal, getAfcByContract. |