Servicio de Contabilización de Activo Fijo
Orchestrator Services
Activo fijoOrchestratorServicio
Propósito
Section titled “Propósito”El servicio de contabilización de activo fijo administra el reconocimiento inicial del bien: el alta de las categorías que parametrizan la contabilidad, el alta de cada activo con su snapshot de cuentas y vida útil, y la contabilización de la compra de origen que evita que el documento se impute además como gasto.
Esta página describe el flujo técnico actual de forma pública. No incluye rutas locales, credenciales, nombres de bases de datos de clientes ni detalles operativos que dependan de un entorno privado.
El cálculo y la contabilización de la cuota periódica se documentan aparte en el Servicio de Depreciación de Activo Fijo.
Responsabilidades del Servicio
Section titled “Responsabilidades del Servicio”El servicio (ActivoFijoService) concentra cuatro responsabilidades:
- administrar las categorías de activo fijo, que definen cuentas contables y vida útil;
- exponer los proveedores y las compras disponibles clasificadas como generadoras de activo fijo;
- dar de alta el activo, copiando como snapshot la parametrización de su categoría;
- contabilizar la compra de origen y administrar la baja del activo.
El alta de un activo no inserta asientos en el módulo de activo fijo. El asiento de reconocimiento proviene del flujo de Operaciones SII; el servicio solo marca la línea de compra como contabilizada con referencia a activo fijo.
Dependencias Conceptuales
Section titled “Dependencias Conceptuales”DirectoryOrchestrator
- ActivoFijoService
- ActivoFijoRepository
DirectoryMother
- activo_fijo.categorias_activo
- activo_fijo.activos
- activo_fijo.v_activos_estado_actual
- administracion.plan_contable
- operaciones_sii.compras_ventas_detalle
- inventario.proveedores_clasificacion
Flujo de Alta de Categoría
Section titled “Flujo de Alta de Categoría”La categoría es el contrato contable del activo: fija qué cuentas usar y qué vida útil aplicar. Se da de alta antes que el activo.
-
Validar los campos obligatorios del DTO de categoría.
this.validateRequired(data, ['nombre','vida_util_anos','dep_acelerada_anos','cuenta_activo_codigo','cuenta_dep_acumulada_codigo','cuenta_gasto_dep_codigo',]); -
Exigir que las vidas útiles sean positivas.
if (data.vida_util_anos <= 0)throw new ValidationError('vida_util_anos debe ser mayor a 0');if (data.dep_acelerada_anos <= 0)throw new ValidationError('dep_acelerada_anos debe ser mayor a 0'); -
Persistir la categoría dentro de una transacción.
return this.withTransaction(ctx, async (client) => {const cat = await ActivoFijoRepository.createCategoria(client,data,ctx.userId,);return this.success(cat);});
Las consultas de categorías hacen LEFT JOIN con administracion.plan_contable para devolver el nombre legible de las cuentas de activo, depreciación acumulada y gasto.
Flujo de Alta de Activo
Section titled “Flujo de Alta de Activo”El alta del activo (activo_fijo.activos) fija los datos sobre los que opera todo el ciclo posterior. El servicio carga la categoría y copia su parametrización como snapshot.
-
Validar los campos obligatorios del DTO de alta.
this.validateRequired(data, ['categoria_id','nombre','rut_proveedor','monto_neto','fecha_compra','fecha_inicio_dep',]); -
Validar montos: el monto neto debe ser positivo y el valor residual menor al monto neto.
if (data.monto_neto <= 0)throw new ValidationError('monto_neto debe ser mayor a 0');const valorResidual = data.valor_residual ?? 0;if (valorResidual < 0)throw new ValidationError('valor_residual no puede ser negativo');if (valorResidual >= data.monto_neto)throw new ValidationError('valor_residual debe ser menor a monto_neto'); -
Validar que la fecha de inicio de depreciación no sea anterior a la fecha de compra.
const fechaCompra = new Date(data.fecha_compra);const fechaInicio = new Date(data.fecha_inicio_dep);if (fechaInicio < fechaCompra)throw new ValidationError('fecha_inicio_dep debe ser >= fecha_compra'); -
Abrir una transacción y exigir que la categoría exista.
return this.withTransaction(ctx, async (client) => {const categoria = await ActivoFijoRepository.findCategoriaById(pool,data.categoria_id,);this.assertExists(categoria,'CategoriaActivo',String(data.categoria_id),);}); -
Crear el activo. El repositorio copia la vida útil de la categoría y calcula las fechas de fin de depreciación.
const fechaFinNormal = new Date(fechaInicio);fechaFinNormal.setMonth(fechaFinNormal.getMonth() + categoria.vida_util_anos * 12,);let fechaFinAcelerada: string | null = null;if (categoria.dep_acelerada_anos) {const d = new Date(fechaInicio);d.setMonth(d.getMonth() + categoria.dep_acelerada_anos * 12);fechaFinAcelerada = d.toISOString().split('T')[0];} -
Si el DTO indica la compra de origen, marcar el detalle de compra como contabilizado dentro de la misma transacción.
if (data.compra_id) {await ActivoFijoRepository.contabilizarCompraDetalle(client,data.compra_id,data.fecha_inicio_dep,ctx.userId,);}return this.success(activo);
El campo monto_depreciable no se inserta: es una columna generada en la tabla, igual a monto_neto - valor_residual. La vida útil normal y acelerada se persisten como snapshot en el activo, de modo que un cambio posterior de la categoría no reescribe la contabilidad de los activos ya registrados.
Origen del Activo: Compras Disponibles
Section titled “Origen del Activo: Compras Disponibles”Un activo nace de una línea de compra ya sincronizada desde el SII. getComprasDisponibles lista las líneas candidatas: documentos de tipo COMPRA con concepto_id = 1, en estado PENDIENTE, de un proveedor clasificado como generador de activo fijo.
INNER JOIN inventario.proveedores_clasificacion pc ON regexp_replace(lower(pc.rut_proveedor), '[^0-9k]', '', 'g') = regexp_replace(lower(cvd.rut_emisor), '[^0-9k]', '', 'g') AND pc.genera_activo_fijo = true AND pc.activo = trueEl identificador relevante es compras_ventas_detalle.id (UUID de la línea de detalle), no el documento_id de la compra. Ese UUID es el que se envía como compra_id en el alta del activo.
Contabilización de la Compra de Origen
Section titled “Contabilización de la Compra de Origen”Cuando el alta indica la compra de origen, contabilizarCompraDetalle marca la línea de detalle. Si la fila ya no está PENDIENTE, la operación no hace nada.
UPDATE operaciones_sii.compras_ventas_detalle cvdSET estado = 'CONTABILIZADO', referencia = 'ACTIVO_FIJO', fecha_contabilizacion = $2, updated_by = $3, updated_at = CURRENT_TIMESTAMPWHERE cvd.id = $1 AND cvd.tipo_documento = 'COMPRA' AND cvd.concepto_id = 1 AND cvd.estado = 'PENDIENTE'Marcar la compra con referencia = 'ACTIVO_FIJO' impide que el mismo documento se contabilice además como gasto. Como la marca ocurre dentro de la transacción del alta, el activo y la contabilización de su compra se confirman o se revierten juntos.
Entradas
Section titled “Entradas”| Entrada | Descripción |
|---|---|
ctx | Contexto de servicio con base tenant y usuario ejecutor. |
categoria_id | Categoría que parametriza cuentas y vida útil del activo. |
nombre | Nombre del activo o de la categoría. |
rut_proveedor | RUT del proveedor del bien. |
monto_neto | Costo capitalizado del bien, sin IVA. |
valor_residual | Valor estimado al final de la vida útil; opcional, por defecto 0. |
fecha_compra | Fecha de la factura, en formato YYYY-MM-DD. |
fecha_inicio_dep | Fecha desde la cual el bien se deprecia, en formato YYYY-MM-DD. |
compra_id | UUID opcional de la línea de compra de origen a contabilizar. |
Los identificadores reales deben tratarse como datos de entorno. En documentación pública, usar placeholders como $TENANT_ID, $CATEGORIA_ID o $COMPRA_ID.
Persistencia
Section titled “Persistencia”activo_fijo.categorias_activo
Section titled “activo_fijo.categorias_activo”Define la parametrización contable de un grupo de activos.
| Campo conceptual | Uso |
|---|---|
cuenta_activo_codigo | Cuenta de activo donde se capitaliza el bien. |
cuenta_dep_acumulada_codigo | Cuenta de depreciación acumulada. |
cuenta_gasto_dep_codigo | Cuenta de gasto por depreciación. |
vida_util_anos | Vida útil normal, en años. |
dep_acelerada_anos | Vida útil acelerada, en años. |
seccion_sii, grupo_sii, numero_item_sii | Clasificación según la tabla de vida útil del SII. |
activo_fijo.activos
Section titled “activo_fijo.activos”Registra cada bien con el snapshot de su categoría.
| Campo conceptual | Uso |
|---|---|
categoria_id | Categoría de origen del snapshot. |
monto_neto | Costo capitalizado del bien. |
iva | IVA de la compra, reconocido como crédito fiscal. |
valor_residual | Valor estimado al final de la vida útil. |
monto_depreciable | Columna generada: monto_neto - valor_residual. |
fecha_compra | Fecha de la factura de adquisición. |
fecha_inicio_dep | Fecha desde la cual el bien se deprecia. |
fecha_fin_dep_normal | fecha_inicio_dep más la vida útil normal. |
fecha_fin_dep_acelerada | fecha_inicio_dep más la vida útil acelerada. |
vida_util_anos, dep_acelerada_anos | Snapshot de vida útil copiado de la categoría. |
estado | ACTIVO, DADO_DE_BAJA o VENDIDO. |
Estados del Activo
Section titled “Estados del Activo”| Operación | Estado esperado | Resultado |
|---|---|---|
createActivo | Categoría existente | Crea el activo en estado ACTIVO. |
updateActivo | Activo existente | Actualiza datos descriptivos del activo. |
darDeBaja | ACTIVO | Cambia a DADO_DE_BAJA o VENDIDO con fecha y motivo. |
La baja solo procede sobre activos en estado ACTIVO; el UPDATE filtra por estado = 'ACTIVO' y, si no afecta filas, el servicio lo reporta como activo no encontrado o ya dado de baja.
Endpoints
Section titled “Endpoints”| Método | Ruta | Operación |
|---|---|---|
GET | /api/activo-fijo/categorias | Lista categorías. |
POST | /api/activo-fijo/categorias | Crea una categoría. |
PUT | /api/activo-fijo/categorias/:id | Actualiza una categoría. |
GET | /api/activo-fijo/proveedores | Lista proveedores de activo fijo. |
GET | /api/activo-fijo/compras | Lista compras disponibles para alta. |
GET | /api/activo-fijo/activos | Lista activos, filtrable por estado. |
POST | /api/activo-fijo/activos | Da de alta un activo. |
PUT | /api/activo-fijo/activos/:id/baja | Da de baja un activo. |
GET | /api/activo-fijo/estado | Vista de estado actual de los activos. |
Reglas de Diseño
Section titled “Reglas de Diseño”| Regla | Motivo |
|---|---|
| Copiar la categoría como snapshot en el alta | Un cambio futuro de la categoría no reescribe activos ya registrados. |
Validar valor_residual < monto_neto | Garantiza una base depreciable positiva. |
Validar fecha_inicio_dep >= fecha_compra | El bien no puede depreciarse antes de adquirirse. |
| Marcar la compra de origen en la misma transacción | El activo y la contabilización de su compra se confirman juntos. |
Usar referencia = 'ACTIVO_FIJO' | Impide la doble contabilización del documento como gasto. |
Consideraciones Públicas
Section titled “Consideraciones Públicas”Esta documentación nombra servicios, schemas, tablas y conceptos de dominio porque forman parte del contrato técnico del sistema. No publica rutas locales de desarrollo, credenciales, endpoints internos protegidos ni datos reales de empresas.