refactor+feat(backend): ChargeableCharConfig por ProductType + Reactivate + Delete endpoints (PRC-001)
Part A — MedioId → ProductTypeId rename across all C# layers:
Domain, Application, Infrastructure, API, all test projects.
Solution was non-compilable after BD refactor (5c1675e); now compiles clean (0 errors).
Part B — PATCH /api/v1/admin/chargeable-chars/{id}/reactivate:
ReactivateChargeableCharConfigCommand/Handler, SP guard maps 50410/50411/50412
→ ChargeableCharConfigReactivationNotAllowedException(Reason) → HTTP 409.
Part C — DELETE /api/v1/admin/chargeable-chars/{id}:
DeleteChargeableCharConfigCommand/Handler, physical DELETE on SYSTEM_VERSIONED table.
KeyNotFoundException → 404 via ExceptionFilter.
Tests: +30 unit tests (TDD RED→GREEN). All 1266 unit tests pass.
This commit is contained in:
@@ -1,21 +1,21 @@
|
||||
namespace SIGCM2.Application.Pricing.ChargeableChars;
|
||||
|
||||
/// <summary>
|
||||
/// PRC-001 — Application service for resolving active chargeable-char config for a Medio.
|
||||
/// PRC-001 — Application service for resolving active chargeable-char config for a ProductType.
|
||||
///
|
||||
/// Priority rule: per-medio row overrides global (MedioId IS NULL) for the same Symbol.
|
||||
/// Priority rule: per-ProductType row overrides global (ProductTypeId IS NULL) for the same Symbol.
|
||||
/// Returns a dictionary keyed by Symbol for O(1) lookup during word-count pricing.
|
||||
/// </summary>
|
||||
public interface IChargeableCharConfigService
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns the resolved active config for the given medio as of the given date.
|
||||
/// Per-medio rows take priority over global rows for the same Symbol.
|
||||
/// Global rows are used as fallback when no per-medio row exists for that Symbol.
|
||||
/// Returns the resolved active config for the given ProductType as of the given date.
|
||||
/// Per-ProductType rows take priority over global rows for the same Symbol.
|
||||
/// Global rows are used as fallback when no per-ProductType row exists for that Symbol.
|
||||
/// Returns an empty dictionary if no config exists at all.
|
||||
/// </summary>
|
||||
Task<IReadOnlyDictionary<string, ChargeableCharSnapshot>> GetActiveConfigForMedioAsync(
|
||||
long medioId,
|
||||
Task<IReadOnlyDictionary<string, ChargeableCharSnapshot>> GetActiveConfigForProductTypeAsync(
|
||||
long productTypeId,
|
||||
DateOnly asOf,
|
||||
CancellationToken ct = default);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user