from typing import List from src.domain.entities.legal_charges import LegalChargesRule from src.domain.interfaces.legal_charges_repository import LegalChargesRepositoryInterface from src.core.exceptions import ValidationError _VALID_CONDITIONS = {"loan_amount_less_than", "loan_amount_more_than"} class SaveLegalChargesUseCase: """Upsert legal-charges rules for a set of merchant categories. Rules: - At least one rule must be provided. - condition must be one of the two allowed values. - net_loan_amount and legal_charges must both be non-negative integers. - Duplicate category_ids in the same request are rejected. """ def __init__(self, repo: LegalChargesRepositoryInterface) -> None: self.repo = repo def execute( self, rules: List[LegalChargesRule], user_id: int, ) -> List[LegalChargesRule]: if not rules: raise ValidationError("At least one rule must be provided.") seen_categories: set = set() for rule in rules: if rule.condition not in _VALID_CONDITIONS: raise ValidationError( f"Invalid condition '{rule.condition}' for category_id={rule.category_id}. " f"Must be one of: {sorted(_VALID_CONDITIONS)}." ) if rule.net_loan_amount < 0: raise ValidationError( f"net_loan_amount for category_id={rule.category_id} must be non-negative." ) if rule.legal_charges < 0: raise ValidationError( f"legal_charges for category_id={rule.category_id} must be non-negative." ) if rule.category_id in seen_categories: raise ValidationError( f"Duplicate category_id={rule.category_id} in request." ) seen_categories.add(rule.category_id) return self.repo.upsert_all(rules=rules, user_id=user_id)