feat: PRC-001 WordCounter + ChargeableCharConfig (SPIKE + scope delta) #59
Reference in New Issue
Block a user
Delete Branch "feature/PRC-001"
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?
Resumen
Implementa PRC-001 (WordCounter + extracción de caracteres especiales, SPIKE) más el scope delta que emergió post-smoke-test: el config de caracteres pasó de per-
Medioa per-ProductType, con seed global a 0 (opt-in billing), endpoints de Reactivar (A+guard) y Eliminar, y UI condicional porisActive.Scope entregado
Core SPIKE (commits 9144c2e..5175cc1 — 8 commits)
WordCounterServicepuro con pipeline de 9 pasos (normalize + detect specials + anti-fraude + tokenize).WordCountResultvalue object. 4 excepciones de dominio.WordCounterGoldenCasesTests) — acceptance gate del SPIKE.dbo.ChargeableCharConfig+_Historycon SYSTEM_VERSIONING (retention 10y). SPInsertWithClosecon forward-only semantics. Permiso RBACtasacion:caracteres_especiales:gestionar.IAuditLoggerfail-closed dentro de TransactionScope. Repository Dapper. Controller admin con 5 endpoints.chargeableCharscon table + form dialog + emoji-blockerSymbolInput+ copy-to-all quick action.Scope delta post-smoke (commits 5c1675e..3a59608 +
ee36d86— 6 commits)Tras smoke test (2026-04-20), el usuario identificó 4 ajustes que se resolvieron pre-merge sin salir de la branch:
MedioId→ProductTypeIdcon FK adbo.ProductType. SP renombrado aGetActiveForProductType. Seed global aPricePerUnit=0.0000(opt-in billing).PATCH /api/v1/admin/chargeable-chars/{id}/reactivate+ SPReactivateWithGuardcon 4 guards (not found / already active / vigente exists / posterior rows) → 409 conreason.DELETE /api/v1/admin/chargeable-chars/{id}. Guard de uso DIFERIDO a FAC-001 (callout[!important]en doc UDT FAC-001 recuerda la obligación).isActive=true→ Desactivar + Eliminar;isActive=false→ Reactivar + Eliminar. Mensaje genérico del delete dialog (sin referencia FAC-001 hardcodeada).Bugs detectados y arreglados en esta branch
d7c6cbd): dosSqlConnectionen el mismoTransactionScopepromovían la tx a DTC → MSDTC no habilitado → excepción opaca. Fix: SP + SELECT en la MISMA connection (local LTM).40b5f39):SET SYSTEM_VERSIONING = OFFfallaba si ya estaba OFF. Fix: guard contemporal_type=2.d7c6cbd): tests usaban(Nombre, Codigo, Activo)inexistentes. Fix: usar(Nombre, HasDuration, RequiresText, RequiresCategory, IsBundle, AllowImages)como los otros tests.d7c6cbd): ALTER fallaba en segunda corrida post-V023. Fix: guardIF hasMedioId.Migraciones
V020__add_chargeable_chars_permission.sqltasacion:caracteres_especiales:gestionar+ asignación a adminV021__create_chargeable_char_config.sqlV022__seed_chargeable_char_config.sql$,%,!,¡)V023__refactor_chargeable_char_config_to_product_type.sqlV024__reseed_global_with_zero_price.sqlTodas aplicadas en
SIGCM2,SIGCM2_Test_App,SIGCM2_Test_Api.Verify
sdd/prc-001-word-counter-spike/verify-report-v2): PASS-WITH-FOLLOWUPSFollowups creados (7 issues label
followup)Documentación
Obsidian/STATUS.md: PRC-001[✅], Critical Path apunta a PRC-002.Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.5 📋 Auditoría.md: entidad agregada al catálogo.Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.8 📋 UDTs Módulo Tasación.md: sección ✅ Implementación con hashes.Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.12 📋 UDTs Módulo Facturación.md: callout[!important]en FAC-001 con guards obligatorios (imposible de ignorar al abrir FAC-001).Obsidian/06-API-y-CONTRATOS/6.3 📊 API Tasación.md: doc creado desde cero con contratos.database/README.md: V018..V024 agregadas (este commit finalee36d86).Artifacts engram
sdd/prc-001-word-counter-spike/archive-report— status ARCHIVEDsdd/prc-001-word-counter-spike/verify-report-v2— pass finalsdd/prc-001-word-counter-spike/scope-delta-1— historia del refactor post-smokesdd/prc-001-word-counter-spike/apply-progress— journey completoCloses #56 parcialmente (guards diferidos a FAC-001). No cierra #52..#55 ni #57/#58 (followups de PRC-001 standalone).