faturas_4docs/Compliance/Services/ValidationRules/EmergencyValidationRule.cs

75 lines
3.1 KiB
C#

using System;
using System.Threading.Tasks;
using Compliance.DTOs;
using Compliance.Domain.Models;
namespace Compliance.Services.ValidationRules
{
public class EmergencyValidationRule : IValidationRule
{
private const string RULE_NAME = "Emergency Situation Validation";
private const int MAX_EMERGENCY_PERIOD_DAYS = 180;
private const decimal MIN_EMERGENCY_SUPPLY_PERCENTAGE = 10m;
private const string MISSING_DECLARATION_ERROR = "Emergency declaration number is required for emergency situations";
private const string PERIOD_EXCEEDED_ERROR = "Emergency period cannot exceed 180 days";
private const string SUPPLY_BELOW_MINIMUM_ERROR = "Emergency supply must be at least 10% of normal load";
private const string BILLING_EXCEEDED_ERROR = "Emergency billing cannot exceed normal load billing estimate";
public int Priority => 1; // High priority for emergency situations
public Task<ValidationResult> ValidateAsync(
BillComplianceRequest request,
DistributorInformation distributorInfo,
Client clientInfo)
{
if (!request.IsEmergencySituation)
return Task.FromResult(ValidationResult.Success(RULE_NAME));
var errors = ValidateEmergencyRequirements(request);
return Task.FromResult(errors.Count == 0
? ValidationResult.Success(RULE_NAME)
: ValidationResult.Failure(RULE_NAME, errors));
}
private static List<string> ValidateEmergencyRequirements(BillComplianceRequest request)
{
var errors = new List<string>();
// Art. 350 - Emergency Declaration Validation
ValidateDeclaration(request, errors);
// Art. 351 - Emergency Period Validation
ValidatePeriod(request, errors);
// Art. 352 - Emergency Supply Percentage Validation
ValidateSupplyPercentage(request, errors);
// Art. 353 - Emergency Billing Amount Validation
ValidateBillingAmount(request, errors);
return errors;
}
private static void ValidateDeclaration(BillComplianceRequest request, List<string> errors)
{
if (string.IsNullOrEmpty(request.EmergencyDeclarationNumber))
errors.Add(MISSING_DECLARATION_ERROR);
}
private static void ValidatePeriod(BillComplianceRequest request, List<string> errors)
{
if (request.EmergencyPeriodDays > MAX_EMERGENCY_PERIOD_DAYS)
errors.Add(PERIOD_EXCEEDED_ERROR);
}
private static void ValidateSupplyPercentage(BillComplianceRequest request, List<string> errors)
{
if (request.EmergencySupplyPercentage < MIN_EMERGENCY_SUPPLY_PERCENTAGE)
errors.Add(SUPPLY_BELOW_MINIMUM_ERROR);
}
private static void ValidateBillingAmount(BillComplianceRequest request, List<string> errors)
{
if (request.BillTotalBeforeLateCharges > request.NormalLoadBillEstimate)
errors.Add(BILLING_EXCEEDED_ERROR);
}
}
}