75 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
} |