Cierre de Períodos

Cierre anual y arrastre de saldos

Contabilidad → Cierre de Períodos consulta AY-100
Menú Ayuda

Enviarle este manual a un usuario

El enlace abre solo este manual, sin el menú del sistema. El usuario no necesita clave ni entrar a FactuPOS: se ve en cualquier navegador y en el celular.

El WhatsApp sale del número de Soporte Real y el correo de info@soportereal.com. Con Compartir desde este teléfono sale de su propio WhatsApp y elige el contacto de su lista, sin escribir el número.

Cierre de Períodos Contables

Proceso que archiva definitivamente un año fiscal: mueve todos los asientos y movimientos del período a las tablas históricas y genera un asiento de arrastre con los saldos iniciales del nuevo período.

Ruta: /modules/contabilidad/cierre_periodos/cierre_periodos.php

Orden cronológico obligatorio Solo se puede cerrar el año más antiguo con movimientos. No se puede cerrar 2025 si aún hay asientos de 2024 en las tablas activas.

Pasos del cierre (AJAX streaming)

  1. Limpieza de asientos huérfanos (Paso 0)
    Elimina cabeceras de ContaAsiento que no tienen ninguna línea en ContaDiario:
    DELETE FROM ContaAsiento
    WHERE Asiento NOT IN (SELECT Asiento FROM ContaDiario)
    Esto previene que cabeceras vacías bloqueen la validación del año más antiguo.
  2. Validación del año
    Confirma que el año seleccionado sea MIN(YEAR(FechaContable)) de ContaAsiento.
  3. Validación de balance
    Verifica que débitos == créditos del año con tolerancia de 0.02.
  4. Cálculo de saldos por cuenta
    Usando cuentas.Naturaleza (1 = deudora, otras = acreedora).
  5. Asiento de arrastre
    Creado con TipoAsiento='99', Estado='2', fecha {año+1}-01-01, período {año+1}01, documento 'ARRASTRE', tipo documento '99', referencia 'SALDO_INICIAL', CC '00000', oficina '001'.
    Creado con contabilidad_insertar_lineas() (nunca INSERT directo).
  6. Archivado a histórico
    Mueve en lotes de 100 filas: ContaAsientoContaAsientoHistorico (con FechaCierre=GETDATE())
    ContaDiarioContaDiarioHistorico (con FechaCierre=GETDATE())
    Elimina de las tablas activas después de confirmar la copia.
  7. Bitácora
    Registra el evento en la bitácora del sistema.
Tablas históricas ContaDiarioHistorico y ContaAsientoHistorico tienen la misma estructura que sus equivalentes activos más el campo FechaCierre. Son consultables desde el Conta Diario (CT-016) con el toggle "Histórico".

Ver saldos de un período cerrado

En el panel izquierdo, debajo de "Períodos activos", aparece la lista de Períodos cerrados. Al hacer clic en uno se muestran —de solo lectura, leídos del histórico— sus saldos por asiento y sus saldos por cuenta, igual que con un período activo. El encabezado muestra una etiqueta Histórico.

Reabrir un período (operación inversa)

Deshace un cierre: devuelve los asientos del año desde el histórico a las tablas activas y elimina el asiento de arrastre que ese cierre había generado en el año siguiente (porque al volver los movimientos, ese saldo ya estaría representado dos veces).

  • Solo el más reciente: se reabre en orden inverso al cierre. Solo el último año cerrado tiene el botón Reabrir habilitado; los demás aparecen deshabilitados.
  • Arrastre encadenado: al volver el año, regresa también su propio asiento de arrastre del año anterior (el saldo se acumula en cadena).
  • Renumeración automática: si algún número de asiento del histórico ya existe en lo activo, se le asigna un número nuevo (cabecera + líneas juntas) para no chocar.
  • Fusión: si el año a reabrir ya tiene movimientos en activo (se cerró pero después se registraron asientos nuevos), la reapertura fusiona el histórico con lo activo en vez de bloquearse.
  • Al terminar se recalculan los saldos de las cuentas afectadas y se registra en bitácora.
Recomendación Evite ciclos repetidos de cerrar/reabrir sobre el mismo año. Si nota saldos de cuentas inflados tras varios ciclos, ejecute el recálculo de saldos contables: los movimientos no se pierden, pero el saldo acumulado de cada cuenta puede requerir refrescarse.