170789886b
feat(api): ProductTypesController + ExceptionFilter 4 casos PRD-001
...
CRUD endpoints con validación FluentValidation inline; 4 nuevas excepciones mapeadas
en ExceptionFilter; conteos de permisos 25→26 actualizados; 12 e2e tests nuevos.
2026-04-19 09:57:11 -03:00
936d1dc353
feat(infrastructure): ProductTypeRepository Dapper + DI wiring (PRD-001)
...
CRUD + paginado con filtros sobre dbo.ProductType; history temporal verificada en tests.
11 integration tests nuevos, suite total 935 GREEN.
2026-04-19 09:49:08 -03:00
5c8f19bf39
feat(application): CRUD handlers + validators + DI de ProductType (PRD-001)
...
Create/Update/Deactivate handlers con TransactionScope + audit; validators FluentValidation;
DI wiring NullProductQueryRepository + 5 handlers; SqlTestFixture V017 + permiso count 25→26.
2026-04-19 09:46:31 -03:00
3c9e852379
feat(application): IProductTypeRepository + IProductQueryRepository stub + queries (PRD-001)
2026-04-19 09:38:51 -03:00
132d17c99f
feat(domain): ProductType entity + domain exceptions (PRD-001)
2026-04-19 09:36:29 -03:00
de70152d3e
feat(bd): V017 crea dbo.ProductType con SYSTEM_VERSIONING + permiso catalogo:tipos:gestionar (PRD-001)
2026-04-19 09:34:23 -03:00
d8d1da8ea4
Merge pull request 'feat: CAT-002 Regla de Oro Rama vs Hoja + validaciones' ( #35 ) from feature/CAT-002 into main
2026-04-19 11:56:32 +00:00
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
205f9c76ad
Merge pull request 'feat: CAT-001 Árbol N-ario de Rubros' ( #30 ) from feature/CAT-001 into main
2026-04-19 10:49:37 +00:00
389dda6e5e
fix(tests): consolidar V016 en SqlTestFixture post issue #29
...
Rebase de CAT-001 sobre main (post #29 ) requiere:
- EnsureV016SchemaAsync en SqlTestFixture
- Rubro_History en TablesToIgnore central (el commit original b1be4a5 se skipeo por ser obsoleto post consolidacion)
- catalogo:rubros:gestionar en seed canonical de Permiso + RolPermiso admin
- RubroRepositoryTests refactorizado al patron [Collection] + SqlTestFixture
- RubrosControllerTests apunta a TestConnectionStrings.ApiTestDb
- Counts de permisos admin actualizados 24 -> 25 en 5 tests
Verify: App 819/819 + Api 251/251 + vitest 349/349 verde post-rebase.
2026-04-19 07:49:18 -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
022a36a90c
test(application): GetRubroByIdQueryHandlerTests dedicado (CAT-001)
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
9f78425a93
fix(bd): V016 COLLATE order — SQL Server requiere COLLATE antes de NOT NULL (CAT-001)
2026-04-19 07:42:25 -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
9886524645
Merge pull request 'fix: issue #29 — integration tests flakiness (DB split + SqlTestFixture consolidado)' ( #34 ) from fix/issue-29-flakiness into main
2026-04-19 10:41:27 +00: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
18ce4f6841
Merge pull request 'chore(frontend): DialogDescription en dialogs para a11y' ( #31 ) from chore/dialog-aria-describedby into main
2026-04-19 10:41:09 +00:00
8daadc8a77
fix(tests): timestamp determinístico en QueryAsync_Limit_EmitsCursor
...
DATETIME2(3) + cursor roundtrip via O format perdía sub-ms de
DateTime.UtcNow causando ~37% flake rate. Timestamp fijo con sub-ms=0
elimina la ambigüedad.
Fixes residual flake del issue #29 .
2026-04-19 07:40:32 -03:00
a0dcc7258b
docs(database): actualiza README con V013-V015 y sección Test DBs
...
Agrega filas V013, V014, V015 a la tabla de migraciones. Actualiza
convención de "3 bases" (SIGCM2, SIGCM2_Test_App, SIGCM2_Test_Api).
Añade sección "Bases de datos de integration tests" con tabla de
propósito y referencia al script de creación.
2026-04-18 21:44:45 -03:00
e5b6c06f64
refactor(tests): Api.Tests apunta a SIGCM2_Test_Api via TestConnectionStrings
...
Todos los archivos de Api.Tests reemplazan la connection string hardcodeada
por TestConnectionStrings.ApiTestDb. Cada proyecto de tests ahora tiene su
propia base de datos aislada, eliminando la contención entre Application.Tests
y Api.Tests que causaba flakiness.
2026-04-18 21:44:40 -03:00
e0b9cba948
refactor(tests): Application.Tests elimina Respawner inline; usa SqlTestFixture compartido
...
6 clases que instanciaban Respawner directamente migran a recibir SqlTestFixture
vía ICollectionFixture. 8 clases restantes solo actualizan ConnectionString a
TestConnectionStrings.AppTestDb. Cada clase ahora es responsable únicamente de
sus seeds específicos; la limpieza de la base queda centralizada en el fixture.
2026-04-18 21:44:36 -03:00
03a695feb9
refactor(tests): DatabaseCollection centraliza ICollectionFixture<SqlTestFixture>
...
Registra la colección "Database" con SqlTestFixture como fixture compartido
para Application.Tests (elimina el ctor-con-string inline en cada test class).
Agrega Using global a ambos proyectos para evitar usings por archivo.
2026-04-18 21:44:24 -03:00
e987228f14
refactor(tests): SqlTestFixture usa TestConnectionStrings; ctor interno para Api.Tests
...
Agrega ctor parameterless que apunta a SIGCM2_Test_App (requerido por
xUnit ICollectionFixture<T>). El ctor con string se marca internal y
expone via InternalsVisibleTo a SIGCM2.Api.Tests. TestWebAppFactory
apunta a SIGCM2_Test_Api. Se agrega propiedad Connection pública para
que los tests que necesitan queries ad-hoc la usen.
2026-04-18 21:44:19 -03:00
d4a2b3bc3e
feat(tests): añade TestConnectionStrings y script de creación de DBs de test
...
Introduce SIGCM2_Test_App y SIGCM2_Test_Api como bases aisladas para
Application.Tests y Api.Tests respectivamente. TestConnectionStrings.cs
centraliza las connection strings; create-test-api-db.sql documenta
el setup idempotente de ambas bases con COLLATE Modern_Spanish_CI_AS.
2026-04-18 21:44:12 -03: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
8353f73230
Merge pull request 'refactor(udt-011): Quartz jobs usan TimeProvider ( closes #24 )' ( #28 ) from fix/UDT-011-quartz-jobs-timeprovider into main
2026-04-18 14:08:11 +00:00
01ad4cbfbc
test(udt-011): Quartz jobs verifican TimeProvider injection
2026-04-18 11:07:47 -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
8d2618e6e5
Merge pull request 'UDT-011: Localización Temporal Argentina (infra transversal)' ( #25 ) from feature/UDT-011 into main
2026-04-18 13:57:49 +00:00
a5fd3e90fb
Merge branch 'main' into feature/UDT-011
2026-04-18 10:56:09 -03:00