Skip to content

Servicio de Contabilización de Activo Fijo

Orchestrator Services

Activo fijoOrchestratorServicio

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.

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.

  • 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

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.

  1. 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',
    ]);
  2. 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');
  3. 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.

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.

  1. Validar los campos obligatorios del DTO de alta.

    this.validateRequired(data, [
    'categoria_id',
    'nombre',
    'rut_proveedor',
    'monto_neto',
    'fecha_compra',
    'fecha_inicio_dep',
    ]);
  2. 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');
  3. 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');
  4. 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),
    );
    });
  5. 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];
    }
  6. 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.

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 = true

El 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.

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 cvd
SET estado = 'CONTABILIZADO',
referencia = 'ACTIVO_FIJO',
fecha_contabilizacion = $2,
updated_by = $3,
updated_at = CURRENT_TIMESTAMP
WHERE 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.

EntradaDescripción
ctxContexto de servicio con base tenant y usuario ejecutor.
categoria_idCategoría que parametriza cuentas y vida útil del activo.
nombreNombre del activo o de la categoría.
rut_proveedorRUT del proveedor del bien.
monto_netoCosto capitalizado del bien, sin IVA.
valor_residualValor estimado al final de la vida útil; opcional, por defecto 0.
fecha_compraFecha de la factura, en formato YYYY-MM-DD.
fecha_inicio_depFecha desde la cual el bien se deprecia, en formato YYYY-MM-DD.
compra_idUUID 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.

Define la parametrización contable de un grupo de activos.

Campo conceptualUso
cuenta_activo_codigoCuenta de activo donde se capitaliza el bien.
cuenta_dep_acumulada_codigoCuenta de depreciación acumulada.
cuenta_gasto_dep_codigoCuenta de gasto por depreciación.
vida_util_anosVida útil normal, en años.
dep_acelerada_anosVida útil acelerada, en años.
seccion_sii, grupo_sii, numero_item_siiClasificación según la tabla de vida útil del SII.

Registra cada bien con el snapshot de su categoría.

Campo conceptualUso
categoria_idCategoría de origen del snapshot.
monto_netoCosto capitalizado del bien.
ivaIVA de la compra, reconocido como crédito fiscal.
valor_residualValor estimado al final de la vida útil.
monto_depreciableColumna generada: monto_neto - valor_residual.
fecha_compraFecha de la factura de adquisición.
fecha_inicio_depFecha desde la cual el bien se deprecia.
fecha_fin_dep_normalfecha_inicio_dep más la vida útil normal.
fecha_fin_dep_aceleradafecha_inicio_dep más la vida útil acelerada.
vida_util_anos, dep_acelerada_anosSnapshot de vida útil copiado de la categoría.
estadoACTIVO, DADO_DE_BAJA o VENDIDO.
OperaciónEstado esperadoResultado
createActivoCategoría existenteCrea el activo en estado ACTIVO.
updateActivoActivo existenteActualiza datos descriptivos del activo.
darDeBajaACTIVOCambia 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.

MétodoRutaOperación
GET/api/activo-fijo/categoriasLista categorías.
POST/api/activo-fijo/categoriasCrea una categoría.
PUT/api/activo-fijo/categorias/:idActualiza una categoría.
GET/api/activo-fijo/proveedoresLista proveedores de activo fijo.
GET/api/activo-fijo/comprasLista compras disponibles para alta.
GET/api/activo-fijo/activosLista activos, filtrable por estado.
POST/api/activo-fijo/activosDa de alta un activo.
PUT/api/activo-fijo/activos/:id/bajaDa de baja un activo.
GET/api/activo-fijo/estadoVista de estado actual de los activos.
ReglaMotivo
Copiar la categoría como snapshot en el altaUn cambio futuro de la categoría no reescribe activos ya registrados.
Validar valor_residual < monto_netoGarantiza una base depreciable positiva.
Validar fecha_inicio_dep >= fecha_compraEl bien no puede depreciarse antes de adquirirse.
Marcar la compra de origen en la misma transacciónEl activo y la contabilización de su compra se confirman juntos.
Usar referencia = 'ACTIVO_FIJO'Impide la doble contabilización del documento como gasto.

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.