Skip to content

Depreciación de Activo Fijo en Sevastopol

Sevastopol · Activo Fijo

Activo fijoSevastopolDepreciación

La pestaña Depreciación de ActivosFijosIsland permite consultar las cuotas del periodo activo, generar depreciación por categoría, contabilizar cuotas pendientes, reversar cuotas contabilizadas y eliminar cuotas pendientes.

Esta página documenta el flujo frontend actual. La fórmula y la persistencia del cálculo viven en Orchestrator; Sevastopol actúa como interfaz operativa y proxy hacia /api/activo-fijo.

  • Directorysevastopol/src/components/islands/contabilidad/
    • ActivosFijosIsland.tsx
  • Directorysevastopol/src/pages/api/activo-fijo/
    • index.ts
    • […path].ts

ActivosFijosIsland contiene tres pestañas:

PestañaFunción
activosConsulta activos, estado, valor libro y porcentaje depreciado.
categoriasAdministra categorías tributarias, vida útil y cuentas contables.
depreciacionConsulta, genera, contabiliza, reversa o elimina cuotas de depreciación.

La pestaña de depreciación depende del tenant activo y del periodo activo global.

const [tab, setTab] = createSignal<'activos' | 'categorias' | 'depreciacion'>(
'activos',
);
const [depRows, setDepRows] = createSignal<DepreciacionEntry[]>([]);
const [loadingDep, setLoadingDep] = createSignal(false);
const [showGenerar, setShowGenerar] = createSignal(false);
const [generarForm, setGenerarForm] = createSignal({
categoria_id: '',
periodo_mes: '',
tipo_depreciacion: 'NORMAL',
notas: '',
});
  1. Construir el periodo mensual desde el contexto activo.

    function activeDepPeriodoMes() {
    const now = new Date();
    const ano = String(period().year ?? now.getFullYear());
    const mes = String(period().month ?? (now.getMonth() + 1)).padStart(2, '0');
    return `${ano}-${mes}-01`;
    }
  2. Cargar las cuotas del periodo cuando la pestaña activa es depreciacion.

    const { period } = useActivePeriod(() => {
    if (tab() !== 'depreciacion') return;
    const tid = tenantId();
    if (!tid) return;
    void loadDepreciacion(tid);
    });
  3. Consultar el proxy local de activo fijo.

    async function loadDepreciacion(tid: string) {
    const periodoMes = activeDepPeriodoMes();
    const r = await authenticatedFetch(
    `${AF_API}/depreciacion/periodo/${periodoMes}?tenant_id=${tid}`,
    );
    await handleAuthResponse(r);
    setDepRows(r.ok ? await r.json() : []);
    }

La generación se hace por categoría. La UI envía el periodo, el tipo de depreciación y notas opcionales; Orchestrator procesa cada activo elegible de la categoría.

  1. Abrir el modal con el periodo activo y tipo NORMAL.

    setGenerarForm({
    categoria_id: '',
    periodo_mes: activeDepPeriodoMes(),
    tipo_depreciacion: 'NORMAL',
    notas: '',
    });
    setShowGenerar(true);
  2. Validar categoría y periodo antes de enviar.

    const f = generarForm();
    if (!f.categoria_id || !f.periodo_mes) {
    toast.push('Selecciona categoría y período', 'error');
    return;
    }
  3. Enviar la solicitud de generación por categoría.

    const r = await authenticatedFetch(
    `${AF_API}/depreciacion/generar-categoria?tenant_id=${tid}`,
    {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
    categoria_id: Number(f.categoria_id),
    periodo_mes: f.periodo_mes,
    tipo_depreciacion: f.tipo_depreciacion,
    ...(f.notas ? { notas: f.notas } : {}),
    }),
    },
    );
  4. Mostrar resultado y recargar la pestaña.

    const { procesados, omitidos, errores } = await r.json();
    if (procesados > 0) {
    toast.push(`${procesados} activo(s) depreciado(s)`, 'success');
    } else if (omitidos > 0) {
    toast.push(`${omitidos} activo(s) ya tenían cuota para este período`, 'success');
    }
    for (const err of errores as string[]) {
    toast.push(err, 'error');
    }
    await loadDepreciacion(tid);
Estado de cuotaAcción visibleEndpoint
PENDIENTEContabilizarPUT /api/activo-fijo/depreciacion/:id/contabilizar
PENDIENTEEliminarDELETE /api/activo-fijo/depreciacion/:id
CONTABILIZADOReversarPUT /api/activo-fijo/depreciacion/:id/reversar-contabilizacion
async function handleContabilizar(depId: number) {
const r = await authenticatedFetch(
`${AF_API}/depreciacion/${depId}/contabilizar?tenant_id=${tid}`,
{ method: 'PUT' },
);
await handleAuthResponse(r);
if (r.ok) {
toast.push('Depreciación contabilizada', 'success');
await loadDepreciacion(tid);
}
}

La reversa pide confirmación explícita porque elimina las líneas contables y devuelve la cuota a PENDIENTE.

const ok = confirm(
'¿Reversar contabilización de esta depreciación? Se eliminarán sus líneas de movimiento y quedará en PENDIENTE.',
);
if (!ok) return;
const r = await authenticatedFetch(
`${AF_API}/depreciacion/${depId}/reversar-contabilizacion?tenant_id=${tid}`,
{ method: 'PUT' },
);

La eliminación usa un modal propio y aplica sobre cuotas pendientes.

const r = await authenticatedFetch(
`${AF_API}/depreciacion/${depId}?tenant_id=${tid}`,
{ method: 'DELETE' },
);
ColumnaOrigen
Activonombre_activo
Periodoperiodo_mes
Tipotipo_depreciacion
Númeroperiodo_numero
Cuotacuota_depreciacion
Depreciación acumuladadep_acumulada_posterior
Valor librovalor_libro
Estadoestado

Sevastopol no llama directamente a Orchestrator desde la island. La ruta src/pages/api/activo-fijo/[...path].ts reenvía método, query string, cookies, Authorization y cuerpo hacia Orchestrator.

let targetUrl = `${ORCHESTRATOR_BASE_URL}/api/activo-fijo/${restPath}`;
if (url.search) targetUrl += url.search;
const orchestratorRes = await fetch(targetUrl, {
method: request.method,
headers: getProxyHeaders(request),
body,
credentials: 'include',
});
ReglaMotivo
Usar tenant activoLas cuotas pertenecen a una base tenant.
Usar periodo activoLa consulta de depreciación se acota al mes contable global.
Generar por categoríaEl flujo actual procesa activos elegibles de una categoría completa.
Recargar después de cada acciónMantiene la tabla alineada con el estado de Orchestrator.
Mostrar acciones por estadoEvita acciones inválidas desde la UI.