# Contabilidad: períodos

En **Contabilidad → Períodos contables**:

- **Nuevo período** permite registrar un intervalo sin superponer fechas con otros períodos de la misma empresa.
- **Crear períodos del año** genera los doce meses del año indicado, incluyendo febrero en años bisiestos. Si existe cualquier cruce, se cancela toda la operación, sin dejar meses ni auditorías parciales.
- **Cerrar período** requiere que no existan asientos en borrador. Registra el usuario, la fecha y un evento `PERIODO_CERRADO` en la auditoría.

La creación y el cierre se centralizan en `AccountingPeriodService`, con validación de acceso a la empresa y transacciones. La creación de borradores, contabilización y reverso mediante `AccountingEntryService` bloquean el período durante la operación y comprueban que esté abierto y que contenga la fecha del asiento.

El cierre mensual bloquea movimientos del período. El cierre anual y la apertura están disponibles en **Contabilidad → Gestión y cierre anual**. Mantenga abierto el último período del año hasta ejecutar ese proceso. No se incluye reapertura de ejercicios cerrados.

La ampliación, sus requisitos y el procedimiento de puesta en marcha se documentan en [contabilidad-implementacion.md](contabilidad-implementacion.md).

## Verificación

Ejecutar la suite contable con una base de pruebas SQLite en memoria:

```powershell
php -d extension=pdo_sqlite vendor/phpunit/phpunit/phpunit tests/Feature/Accounting tests/Unit/Accounting
```

Si `pdo_sqlite` ya está habilitado, omitir `-d extension=pdo_sqlite`. Las pruebas de períodos cubren creación anual, año bisiesto, reversión completa ante cruces, fechas inválidas, cierre auditado, borradores pendientes, movimientos en períodos cerrados y acceso entre empresas. Las pruebas SQLite no verifican concurrencia real de bloqueos en MySQL.
