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:
@@ -0,0 +1,29 @@
|
||||
using SIGCM2.Domain.Exceptions;
|
||||
|
||||
namespace SIGCM2.Domain.Pricing.Exceptions;
|
||||
|
||||
/// <summary>
|
||||
/// PRC-001 — Thrown when a reactivation attempt is blocked by a guard rule.
|
||||
/// Maps to HTTP 409.
|
||||
///
|
||||
/// Reason codes:
|
||||
/// ALREADY_ACTIVE — target row is currently active (50410)
|
||||
/// VIGENTE_EXISTS — a different active row exists for (ProductTypeId, Symbol) (50411)
|
||||
/// POSTERIOR_ROWS_EXIST — rows with higher ValidFrom exist after the target row (50412)
|
||||
/// </summary>
|
||||
public sealed class ChargeableCharConfigReactivationNotAllowedException : DomainException
|
||||
{
|
||||
public long Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// "ALREADY_ACTIVE" | "VIGENTE_EXISTS" | "POSTERIOR_ROWS_EXIST"
|
||||
/// </summary>
|
||||
public string Reason { get; }
|
||||
|
||||
public ChargeableCharConfigReactivationNotAllowedException(long id, string reason)
|
||||
: base($"Reactivation not allowed for config {id}: {reason}")
|
||||
{
|
||||
Id = id;
|
||||
Reason = reason;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user