a0a1874ac2
test(frontend): apretar match exacto del title en CategoryTree (CAT-002 W2)
2026-04-19 08:52:34 -03:00
4f25233bab
feat(frontend): tieneAvisos en RubroTreeNode + disable btn subrubro (CAT-002)
2026-04-19 08:35:42 -03:00
bb5dde6e24
feat(api): ExceptionFilter 409 para regla de oro + DTO delta (CAT-002)
2026-04-19 08:31:39 -03:00
f861dfa826
feat(application): RubroTreeBuilder + GetRubroTree con tieneAvisos (CAT-002)
2026-04-19 08:25:13 -03:00
c03aad8c5a
feat(application): guard avisos en MoveRubroCommandHandler (CAT-002)
2026-04-19 08:24:07 -03:00
216983623a
feat(application): guard avisos en CreateRubroCommandHandler (CAT-002)
2026-04-19 08:22:55 -03:00
9e50a929ae
feat(application): RubroTreeBuilder + GetRubroTree con tieneAvisos (CAT-002)
2026-04-19 08:20:36 -03:00
673194e249
feat(application): IAvisoQueryRepository + NullAvisoQueryRepository (CAT-002)
2026-04-19 08:18:56 -03:00
ddd28ea4d5
feat(domain): excepciones regla de oro rama/hoja (CAT-002)
2026-04-19 08:17:45 -03:00
bd2febf411
fix(frontend): MoveRubroDialog type cast para zodResolver output (CAT-001)
2026-04-19 07:42:56 -03:00
46ef3878de
feat(frontend): MoveRubroDialog + wire en RubrosPage + aria-describedby (CAT-001)
...
Implementa MoveRubroDialog con flattenExcludingSubtree para prevenir ciclos en UI,
lo conecta en RubrosPage y agrega DialogDescription en RubroFormDialog.
2026-04-19 07:42:55 -03:00
f07802f769
fix(frontend): corregir tipos zodResolver en RubroFormDialog (CAT-001)
...
- Reemplaza z.union([z.coerce.number(), z.literal('')]) por z.string().transform+pipe para evitar inferencia unknown en zodResolver
- Simplifica RubroFormValues a {nombre: string, tarifarioBaseId?: number | null}
- Actualiza RubrosPage: tarifarioId ya llega como number|null del schema transform
2026-04-19 07:42:55 -03:00
b22e9fe59a
feat(frontend): rubros feature + CategoryTree + CRUD dialogs (CAT-001)
...
Co-Authored-By: none
2026-04-19 07:42:54 -03:00
5e2323e0bc
feat(api): RubrosController + integration tests e2e + audit verification (CAT-001)
2026-04-19 07:42:54 -03:00
f8e9d18379
feat(infrastructure): RubroRepository Dapper + DI + integration tests (CAT-001)
2026-04-19 07:42:53 -03:00
d9fc9a2867
feat(application): Rubros commands/queries + RubroTreeBuilder + audit (CAT-001)
2026-04-19 07:42:26 -03:00
dcb2e5ada6
feat(domain): Rubro entity + domain exceptions (CAT-001)
2026-04-19 07:42:26 -03:00
0d50d4f3cc
feat(bd): V016 create Rubro table con SYSTEM_VERSIONING (CAT-001)
...
- dbo.Rubro: adjacency list, self-FK, soft-delete, temporal retention 10y
- Filtered unique index UQ_Rubro_ParentId_Nombre_Activo + covering IX_Rubro_ParentId_Activo
- Permission catalogo:rubros:gestionar seeded + assigned to admin role
- V016_ROLLBACK.sql: full reversal script
- RubrosOptions class (MaxDepth=10) + appsettings.json Rubros section
- services.Configure<RubrosOptions> registered in Infrastructure DI
- database/README.md updated with V013-V016 entries
2026-04-19 07:42:25 -03:00
bcbba2c012
Merge pull request 'chore(frontend): limpiar lint errors pre-existentes' ( #33 ) from chore/frontend-lint-preexisting into main
2026-04-19 10:41:16 +00:00
3cb89f80a3
Merge pull request 'chore(tests): dotnet format sobre archivos pre-existentes' ( #32 ) from chore/dotnet-format-testfixtures into main
2026-04-19 10:41:14 +00:00
50a3c87b14
chore(frontend): limpiar lint errors pre-existentes
...
11 errores en archivos pre-existentes (0 en rubros/). Categorización:
2 bugs reales removidos, 1 FP con disable comentado, 8 FPs suprimidos con eslint-disable-next-line.
Files:
- src/web/src/components/ui/badge.tsx — react-refresh/only-export-components (FP: shadcn/ui co-ubica badgeVariants con el componente por diseño)
- src/web/src/components/ui/button.tsx — react-refresh/only-export-components (FP: ídem, buttonVariants)
- src/web/src/components/ui/form.tsx — react-refresh/only-export-components (FP: shadcn/ui co-ubica useFormField hook)
- src/web/src/pages/admin/audit/AuditFilters.tsx — react-refresh/only-export-components x2 (FP: EMPTY_FILTERS y toApiFilter co-ubicados con el componente que los consume)
- src/web/src/features/permisos/components/RolPermisosEditor.tsx — react-hooks/set-state-in-effect (FP: patrón válido de derived state desde prop externa asignados)
- src/web/src/features/users/components/PermisosEditor.tsx — react-hooks/set-state-in-effect (FP: ídem, permisoData → mapa local de overrides)
- src/web/src/pages/admin/audit/AuditPage.tsx — react-hooks/set-state-in-effect (FP: acumulación de páginas paginadas desde query externa)
- src/web/src/features/users/pages/CreateUserPage.tsx — @typescript-eslint/no-unused-vars (FP: _created existe por contrato de callback, no se necesita el valor)
- src/web/src/lib/dateFormat.ts — @typescript-eslint/no-unused-vars (FP: _opts reservado para extensibilidad futura; formato hardcodeado por compatibilidad Intl)
- src/web/src/tests/api/axiosClient.test.ts — @typescript-eslint/no-unused-vars (bug real: requestCount incrementado en mock handler pero nunca asercionado; variable eliminada)
2026-04-18 21:00:00 -03:00
9957724c40
chore(tests): dotnet format sobre archivos pre-existentes (surfaced durante CAT-001)
...
Fix mecánico de whitespace detectado por dotnet format --verify-no-changes durante la verify phase de CAT-001 (PR #30 ). Sin cambios funcionales.
2026-04-18 20:56:23 -03:00
1cb69cbaf3
chore(frontend): DialogDescription en dialogs para a11y (silencia Radix warning)
2026-04-18 20:55:36 -03:00
67da544bb4
refactor(udt-011): AuditRetentionEnforcerJob usa TimeProvider inyectado
2026-04-18 11:07:43 -03:00
b79dfb2f34
refactor(udt-011): AuditPartitionManagerJob usa TimeProvider inyectado
2026-04-18 11:07:40 -03:00
ff912cc6a9
refactor(udt-011): AuditIntegrityCheckJob usa TimeProvider inyectado
2026-04-18 11:07:36 -03:00
a5fd3e90fb
Merge branch 'main' into feature/UDT-011
2026-04-18 10:56:09 -03:00
b5ec0c25a9
fix(web/tests): alinear updateUserPermisosOverrides mock con UsuarioPermisos shape (TS2339)
2026-04-18 10:54:44 -03:00
a39427865f
fix(web/tests): eliminar imports no usados en tests (TS6133)
2026-04-18 10:54:40 -03:00
202d267e16
fix(web): migrar SeccionForm a sintaxis Zod v4 (errorMap → error, coerce.number<number>())
2026-04-18 10:54:28 -03:00
8b369b69ee
fix(web): migrar MedioForm a sintaxis Zod v4 (TS2322 — coerce.number<number>())
2026-04-18 10:54:23 -03:00
d16da502f4
fix(web): corregir import type-only de ButtonProps en pagination.tsx (TS1484)
2026-04-18 10:54:19 -03:00
ef4b02be3b
fix(web/udt-011): AuditFilters datetime-local usa parseArgentinaDateTimeToUtc (fix BUG-FE-05)
2026-04-18 10:26:56 -03:00
03a02c63d5
refactor(web/udt-011): eliminar 4 funciones formatDate duplicadas y formatOccurredAt, usar dateFormat utility (fix BUG-FE-01, BUG-FE-02)
2026-04-18 10:26:29 -03:00
71d0928389
fix(web/udt-011): NuevaVigenciaModal preview usa prevCivilDate+formatCivilDate sin Date() (fix BUG-FE-04)
2026-04-18 10:24:15 -03:00
20b5863908
fix(web/udt-011): IngresosBrutosFormModal default vigenciaDesde usa todayArgentina
2026-04-18 10:22:47 -03:00
7e23a16062
fix(web/udt-011): TipoDeIvaFormModal default vigenciaDesde usa todayArgentina (fix BUG-FE-03)
2026-04-18 10:22:43 -03:00
2ea7678129
feat(web/udt-011): dateFormat.ts utility (formatInstant, formatCivilDate, todayArgentina, etc.)
2026-04-18 10:17:47 -03:00
bc3e5d99a1
test(web/udt-011): dateFormat.ts utility tests (Red — 6 funciones + edge cases)
2026-04-18 10:17:43 -03:00
a9838427a4
feat(udt-011): T400.30 — inject TimeProvider into Infrastructure critical services
...
AuditLogger, SecurityEventLogger: inject TimeProvider and use
_timeProvider.GetUtcNow().UtcDateTime for occurredAt timestamps.
JwtService: inject TimeProvider; use GetUtcNow() for token IssuedAt/Expires.
DI: update JwtService factory to pass sp.GetRequiredService<TimeProvider>().
Repositories: remove ?? DateTime.UtcNow fallback in UpdateAsync since callers
always provide FechaModificacion via domain mutators.
2026-04-18 10:12:24 -03:00
d69da5ff4c
feat(udt-011): T400.10 — inject TimeProvider into all Application handlers
...
All command handlers that call domain mutators now inject TimeProvider
via constructor and use _timeProvider.GetUtcNow().UtcDateTime as the
explicit 'now' argument. Replaces previous direct DateTime.UtcNow usage.
2026-04-18 10:12:17 -03:00
4e1d8f69ab
feat(udt-011): T400.20 — domain mutators accept explicit DateTime now param
...
Remove DateTime.UtcNow calls from all With*/Deactivate/Reactivate/
CerrarVigencia/NuevaVersion domain methods. Caller (Application layer)
is now responsible for passing the UTC timestamp obtained via
_timeProvider.GetUtcNow().UtcDateTime.
2026-04-18 10:12:03 -03:00
3c264aa7a1
chore(udt-011): register DateOnlyJsonConverter in Program.cs AddJsonOptions
2026-04-18 09:47:19 -03:00
a75d2f75a0
feat(udt-011): DateOnlyJsonConverter as yyyy-MM-dd
2026-04-18 09:47:16 -03:00
54d2340bb9
feat(udt-011): register TimeProvider.System in AddApplication DI
2026-04-18 09:44:21 -03:00
4e70b0f847
feat(udt-011): TimeProviderArgentinaExtensions.GetArgentinaToday cross-platform
2026-04-18 09:43:35 -03:00
0863ed8682
fix(web/adm-008): migrar PuntoDeVentaForm a sintaxis Zod v4 ( closes #21 )
2026-04-18 08:47:20 -03:00
30b55e60ea
fix(web/adm-009): migrar componentes fiscales a sintaxis Zod v4
2026-04-18 08:37:10 -03:00
600ff52dd2
refactor(infra): eliminar LegacySeedMap/NormalizeUpperSnakeToPascal de IngresosBrutosRepository
2026-04-17 19:11:51 -03:00
4739e5cd46
chore(web): routes /admin/fiscal/iva y /admin/fiscal/iibb con permiso
...
Ambas rutas protegidas con requiredPermissions=['administracion:fiscal:gestionar'].
Integradas en ProtectedPage con MustChangePasswordGate y ProtectedLayout.
2026-04-17 18:56:02 -03:00