feat(contables): cierre mensual de cuenta corriente de distribuidor #1
Reference in New Issue
Block a user
Delete Branch "feat/cierre-cuenta-corriente-distribuidor"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
cue_Saldos, queda paralela para conciliación).PERIODO_CERRADO_BLOQUEO_OPERACION.Saldo Inicialreal (suma desde último cierre) y termina enSaldo Final(rename de "Total"). Acumulados encadenados, sección Excel de Resumen, atajo "Desde último cierre" en filtros._Hcon filtros por fecha/usuario/tipo.CC001(crear),CC002(reabrir — solo SuperAdmin),CC003(ver).CS002(ajuste manual) también pasa a exclusivo SuperAdmin. Ambos ocultos en la UI de asignación a perfiles.Cambios técnicos clave
cue_CierresCuentaCorriente+_H. Entregables SQL enBackend/SQL/cierre-cc-distribuidor/(fuera del repo por.gitignore).IsolationLevel.Serializable+ retry policy ante deadlock 1205 (3 intentos, backoff 50/150/400 ms).IPeriodoCerradoValidatorconIMemoryCacheSingleton (TTL 10 min) inyectado en 4 services existentes víaIServiceScopeFactorypara evitar captive dependency.ExceptionHandlerMiddlewareglobal que mapeaBloqueoPorPeriodoCerradoException→ 409 con shape{codigo, mensaje, idCierre, fechaCorte}.GetBalanceCuentaDistEntradaSalidaPorEmpresaAsyncpara el cálculo del saldo (single source of truth deCalcularMontoMovimiento).parseApiErrorcentralizado en frontend para errores semánticos del backend.Test plan
dotnet build)npm run build)cue_SaldossaldoInicial, sinsaldos[]legacyPlan de smoke tests detallado:
Backend/SQL/cierre-cc-distribuidor/SMOKE-TESTS.md(local, no commiteado).Out of scope
destino='Canillas'encue_Saldos/cue_CreditosDebitos— feature no se ejercita en práctica)dist_EntradasSalidasheap sin PK (mitigado parcialmente con índice nuevo, fix completo fuera de scope)⚠️ NO mergear todavía
PR abierta para revisión. Antes de mergear:
Recordá: push a
main= deploy automático a producción vía CI/CD.La reapertura de cierres ya se validaba con User.IsInRole('SuperAdmin') sin chequear CC002. Mantenerlo en gral_Permisos solo agregaba ruido — un permiso filtrado intencionalmente de la UI de asignación. Se quita del catálogo y se simplifica el set PERMISOS_SOLO_SUPERADMIN del frontend a {CS002} (legacy). CS002 se mantiene en el filtro porque ya existía en producción antes del feature.