# app/exceptions/customer.py """ Customer management specific exceptions. """ from typing import Any from .base import ( AuthenticationException, BusinessLogicException, ConflictException, ResourceNotFoundException, ValidationException, ) class CustomerNotFoundException(ResourceNotFoundException): """Raised when a customer is not found.""" def __init__(self, customer_identifier: str): super().__init__( resource_type="Customer", identifier=customer_identifier, message=f"Customer '{customer_identifier}' not found", error_code="CUSTOMER_NOT_FOUND", ) class CustomerAlreadyExistsException(ConflictException): """Raised when trying to create a customer that already exists.""" def __init__(self, email: str): super().__init__( message=f"Customer with email '{email}' already exists", error_code="CUSTOMER_ALREADY_EXISTS", details={"email": email}, ) class DuplicateCustomerEmailException(ConflictException): """Raised when email already exists for vendor.""" def __init__(self, email: str, vendor_code: str): super().__init__( message=f"Email '{email}' is already registered for this vendor", error_code="DUPLICATE_CUSTOMER_EMAIL", details={"email": email, "vendor_code": vendor_code}, ) class CustomerNotActiveException(BusinessLogicException): """Raised when trying to perform operations on inactive customer.""" def __init__(self, email: str): super().__init__( message=f"Customer account '{email}' is not active", error_code="CUSTOMER_NOT_ACTIVE", details={"email": email}, ) class InvalidCustomerCredentialsException(AuthenticationException): """Raised when customer credentials are invalid.""" def __init__(self): super().__init__( message="Invalid email or password", error_code="INVALID_CUSTOMER_CREDENTIALS", ) class CustomerValidationException(ValidationException): """Raised when customer data validation fails.""" def __init__( self, message: str = "Customer validation failed", field: str | None = None, details: dict[str, Any] | None = None, ): super().__init__(message=message, field=field, details=details) self.error_code = "CUSTOMER_VALIDATION_FAILED" class CustomerAuthorizationException(BusinessLogicException): """Raised when customer is not authorized for operation.""" def __init__(self, customer_email: str, operation: str): super().__init__( message=f"Customer '{customer_email}' not authorized for: {operation}", error_code="CUSTOMER_NOT_AUTHORIZED", details={"customer_email": customer_email, "operation": operation}, )