from enum import Enum

class AccountType(Enum):
    ASSETS = "ASSETS"
    LIABILITIES = "LIABILITIES"
    EQUITY = "EQUITY"
    REVENUE = "REVENUE"
    EXPENSES = "EXPENSES"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + AccountType.to_list()
    
class AccountGroup(Enum):
    CUSTOMER = "CUSTOMER"
    SUPPLIER = "SUPPLIER"
    CASH = "CASH"
    EXPENSE = "EXPENSE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + AccountGroup.to_list()

class TransactionType(Enum):
    DEBIT = "DEBIT"
    CREDIT = "CREDIT"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + TransactionType.to_list()
    
class CashRegisterTransactionType(Enum):
    CASH_IN = "CASH_IN"
    CASH_OUT = "CASH_OUT"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CashRegisterTransactionType.to_list()
    
class CashVoucherTransactionType(Enum):
    EXPENSE = "EXPENSE"
    RETURN = "RETURN"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CashVoucherTransactionType.to_list()

class TransactionDescription(Enum):

    SERVICE = "SERVICE"
    CANCEL_SERVICE = "CANCEL_SERVICE"

    CANCEL_INVOICE = "CANCEL_INVOICE"
    SALES = "SALES"

    CANCEL_SRN = "CANCEL_SRN"
    SALES_RETURN = "SALES_RETURN"

    PURCHASE = "PURCHASE"
    PURCHASE_RETURN = "PURCHASE_RETURN"

    CASHREGISTER_INCOMDE = "CASHREGISTER_INCOMDE"
    CASHREGISTER_EXPENSE = "CASHREGISTER_EXPENSE"

    CASHVOUCHER_RETURN = "CASHVOUCHER_RETURN"
    CASHVOUCHER_EXPENSE = "CASHVOUCHER_EXPENSE"

    CUSTOMER_OPENING_BALANCE = "CUSTOMER_OPENING_BALANCE"
    CUSTOMER_PAYMENT = "CUSTOMER_PAYMENT"
    CANCEL_CUSTOMER_PAYMENT = "CANCEL_CUSTOMER_PAYMENT"

    SUPPLIER_OPENING_BALANCE = "SUPPLIER_OPENING_BALANCE"
    SUPPLIER_PAYMENT = "SUPPLIER_PAYMENT"
    CANCEL_SUPPLIER_PAYMENT = "CANCEL_SUPPLIER_PAYMENT"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + TransactionDescription.to_list()
    
class SourceDocumentType(Enum):

    SERVICE_ORDER = "SERVICE_ORDER"

    SALES_INVOICE = "SALES_INVOICE"
    SALES_RETURN_RECEIPT = "SALES_RETURN_RECEIPT"
    GOOD_RECEIVING_NOTE = "GOOD_RECEIVING_NOTE"
    CASH_REGISTER_TRANSACTION_NOTE = "CASH_REGISTER_TRANSACTION_NOTE"

    CUSTOMER_REGISTRY = "CUSTOMER_REGISTRY"
    CUSTOMER_PAYMENT_RECEIPT = "CUSTOMER_PAYMENT_RECEIPT"

    SUPPLIER_REGISTRY = "SUPPLIER_REGISTRY"
    SUPPLIER_PAYMENT_RECEIPT = "SUPPLIER_PAYMENT_RECEIPT"

    CASH_VOUCHER = "CASH_VOUCHER"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + SourceDocumentType.to_list()
    
class ResultType(Enum):
    MOISTURE = "MOISTURE"
    TEMPERATURE = "TEMPERATURE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ResultType.to_list()
    
class CreditTransactionOption(Enum):
    NOT_ALLOWED = "NOT_ALLOWED"
    ALLOWED = "ALLOWED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CreditTransactionOption.to_list()

class CourseDurationCategory(Enum):
    MONTH = "MONTH"
    WEEK = "WEEK"
    DAY = "DAY"
    HOUR = "HOUR"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]

class PaymentMethod(Enum):
    CASH = "CASH"
    PDQ = "PDQ"
    BANK_TRANSFER = "BANK_TRANSFER"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
class CustomerType(Enum):

    RETAIL = "RETAIL"
    WHOLESALE = "WHOLESALE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CustomerType.to_list()
    
class PaymentStatus(Enum):

    PAID = "PAID"
    UNPAID = "UNPAID"
    CANCELLED = "CANCELLED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentStatus.to_list()
    

class ServiceOrderStatus(Enum):

    NEW = "NEW"
    APPROVED = "APPROVED"
    IN_PROGRESS = "IN_PROGRESS"
    COMPLETED = "COMPLETED"
    BILLED = "BILLED"
    PICKED_UP = "PICKED_UP"
    CANCELLED = "CANCELLED"


    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ServiceOrderStatus.to_list()

class SRNStatus(Enum):

    PAID = "PAID"
    UNPAID = "UNPAID"
    CANCELLED = "CANCELLED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + SRNStatus.to_list()
    
class InvoiceStatus(Enum):

    PAID = "PAID"
    UNPAID = "UNPAID"
    CANCELLED = "CANCELLED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + InvoiceStatus.to_list()
    
class GRNStatus(Enum):

    PAID = "PAID"
    UNPAID = "UNPAID"
    CANCELLED = "CANCELLED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + GRNStatus.to_list()
    

class PaymentSource(Enum):

    SERVICE_ORDER = "SERVICE_ORDER"

    SALES_INVOICE = "SALES_INVOICE"
    CUSTOMER_PAYMENT_RECEIPT = "CUSTOMER_PAYMENT_RECEIPT"
    SALES_RETURN_NOTE = "SALES_RETURN_RECEIPT"
    SALES_RETURN_RECEIPT = "SALES_RETURN_RECEIPT"

    PURCHASE_INVOICE = "PURCHASE_INVOICE"
    SUPPLIER_PAYMENT_RECEIPT = "CUSTOMER_PAYMENT_RECEIPT"
    PURCHASE_RETURN_NOTE = "SALES_RETURN_RECEIPT"


    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentSource.to_list()

class PaymentType(Enum):

    PAYMENT_IN = "PAYMENT_IN"
    PAYMENT_OUT = "PAYMENT_OUT"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentType.to_list() 
    
class PaymentPartyType(Enum):

    CUSTOMER = "CUSTOMER"
    SUPPLIER = "SUPPLIER"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentPartyType.to_list() 

class FilterByOptions(Enum):

    CASHIER = "CASHIER"
    COUNSELLOR = "COUNSELLOR"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + FilterByOptions.to_list()
    

class GeneralPaymentStatus(Enum):
    PAID = "PAID"
    DUE = "DUE"
    OVER_DUE = "OVER_DUE"
    OVER_PAYMENT = "OVER_PAYMENT"
    NOT_APPLICABLE = "NOT_APPLICABLE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + GeneralPaymentStatus.to_list()

class UOM(Enum):
    EACH = "EACH"
    ML = "ML"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + UOM.to_list()

class BillingType(Enum):
    INHOUSE = "INHOUSE"
    EXTERNAL = "EXTERNAL"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + BillingType.to_list() 
    
class Brand(Enum):
    WILE = "WILE"
    OTHER = "OTHER"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + Brand.to_list()
class ResultMode(Enum):
    QR="QR"
    MANUAL="MANUAL"
    BLUETOOTH ="BLUETOOTH"
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ResultMode.to_list()
       
class PlatformType(Enum):
    ANDROID = "ANDROID"
    IOS = "IOS"
        
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PlatformType.to_list()
    
class ProductType(Enum):
    GRAIN = "GRAIN"
    HAY = "HAY"
    COFFEE = "COFFEE"
    OTHER = "OTHER"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ProductType.to_list()
    
class TemperatureUnit(Enum):
    CELSIUS = "C"
    FAHRENHEIT = "F"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + TemperatureUnit.to_list()
    
class DensityUnit(Enum):
    KG_PER_HL = "kg/hl"
    LB_PER_BU = "lb/bu"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + DensityUnit.to_list()

class DrugType(Enum):
    LIQUID = "LIQUID"
    NON_LIQUID = "NON_LIQUID"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        lst = ['COMMON']
        return lst + cls.to_list()
    
    
class Dosage(Enum):
    HALF = "1/2"
    ONE = "1"
    TWO = "2"
    THREE = "3"
    FOUR = "4"
    HALF_TSP = "1/2 tsp"
    ONE_TSP = "1 tsp"
    TWO_TSP = "2 tsp"
    ONE_TBSP = "1 tabsp"
    TWO_TBSP = "2 tabsp"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + Dosage.to_list()
    
    @classmethod
    def get_by_drug_type(cls, drug_type: str):
        """Return dosage list based on drug type"""
        if drug_type == "LIQUID":
            return [e.value for e in cls if "tsp" in e.value or "tabsp" in e.value]
        elif drug_type == "NON_LIQUID":
            return [e.value for e in cls if e.value in ["1", "2", "3", "4"]]
        else:
            return cls.to_list() 
class Frequency(Enum):
    MANE = "Mane"       
    BD = "BD"           
    TDS = "TDS"         
    NOCTE = "Nocte"      
    QTDS = "QTDS"        
    NOON = "NOON"  
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + Frequency.to_list()
    
class Route(Enum):
    ORAL = "Oral"
    NASAL = "Nasal"
    OPTICAL = "Optical"
    TOPICAL = "Topical"
    RECTAL = "Rectal"
    INJECTION = "Injection"
    VAGINAL = "Vaginal"
    HAIR = "Hair"
    INHALE = "Inhale"
    LOCAL = "Local"
    INHALATION = "Inhalation"
    EYE = "Eye"
    EAR = "Ear"
    OPHTHALMIC = "Opthalmic"
    FACE = "Face"
    SOAP = "Soap"
    BRACE = "Brace"
    FOUR_BOT = "4 Bot"
    SIX_BOT = "6 Bot"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + Route.to_list()

class MealPlan(Enum):
    BEFORE_MEAL = "BEFORE_MEAL"
    AFTER_MEAL = "AFTER_MEAL"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + MealPlan.to_list()
        
class ProgramType(Enum):
    GENERAL = "GENERAL"
    WORKSHOP = "WORKSHOP"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ProgramType.to_list()

class PaymentOption(Enum):
    BULK = "BULK"
    INSTALLMENTS = "INSTALLMENTS"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentOption.to_list()


class ProgramRegisterStatus(Enum):
    PENDING_REGISTRATION = "PENDING_REGISTRATION"
    REGISTRATION_DECLINED = "REGISTRATION_DECLINED"
    STUDYING = "STUDYING"
    DROPPED_OUT = "DROPPED_OUT"
    GRADUATED = "GRADUATED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + ProgramRegisterStatus.to_list()
    
class RegistrationStatus(Enum):
    PENDING = "PENDING"
    APPROVED = "APPROVED"
    DECLINED = "DECLINED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + RegistrationStatus.to_list()
       
    
class PaymentDescription(Enum):
    REGISTRATION_FEE = "REGISTRATION FEE"
    COURSE_FEE = "COURSE FEE"
    EXAM_FEE = "EXAM FEE"
    INTERNATIONAL_CERTIFICATION = "INTERNATIONAL CERTIFICATION"
    BOOK = "BOOK"
    ID_CARD = "ID CARD"
    TOR = "TOR"
    GRADUATION_FEE = "GRADUATION FEE"
    GRADUATION_PICTURE = "GRADUATION_PICTURE"
    UNIFORM = "UNIFORM"
    T_SHIRT="T-SHIRT"
    STUDENT_GUEST_FEE = "STUDENT_GUEST_FEE"
    FIRST_AID_AND_TRAINING = "FIRST_AID_AND_TRAINING"
    BLS_TRAINING = "BLS_TRAINING"
    OGT = "OGT"
    MOFA = "MOFA"
    

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    

class JobRole(Enum):
    OTHER = "OTHER"
    DOCTOR = "DOCTOR"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + JobRole.to_list()
    

class SubFeatureType(Enum):
    MODULE = "MODULE"
    AJAX = "AJAX"
    FEATURE = "FEATURE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + SubFeatureType.to_list()   

class PerPageSelector(Enum):
    _10 = "10"
    _25 = "25"
    _50 = "50"
    _100 = "100"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def get_default(cls):
        return PerPageSelector._100
    
    

class UserAccountStatus(Enum):
    ACTIVE = "ACTIVE"
    INACTIVE = "INACTIVE"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + UserAccountStatus.to_list()
    

class PaymentCompletionStatus(Enum):
    FULL_PAYMENT = "FULL_PAYMENT"
    PARTIAL_PAYMENT = "PARTIAL_PAYMENT"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentCompletionStatus.to_list()
    
class PaymentMode(Enum):
    ORIGINAL = "ORIGINAL"
    ADITIONAL = "ADITIONAL"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + PaymentMode.to_list()
    

class DateFilter(Enum):
    ALL = "ALL"
    CURRENT_YEAR = "CURRENT YEAR"
    CURRENT_MONTH = "CURRENT MONTH"
    CURRENT_DATE = "CURRENT DATE"
    DATE_RANGE = "DATE RANGE"
    UP_TO = "UP TO"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]

class AccountNotException(Exception):
    def __init__(self, message):
        super().__init__(message)

class NegativeInputNumberException(Exception):
    def __init__(self, message):
        super().__init__(message)

class NumberFormatException(Exception):
    def __init__(self, message):
        super().__init__(message)

class OverPaymentException(Exception):
    def __init__(self, message):
        super().__init__(message)

class ItemRepetitionException(Exception):
    def __init__(self, message):
        super().__init__(message)

class NegativeValueException(Exception):
    def __init__(self, message):
        super().__init__(message)

class RestrictedInstallmentException(Exception):
    def __init__(self, message):
        super().__init__(message)


class BatchStatus(Enum):

    OPEN = "OPEN"
    CLOSED = "CLOSED"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + BatchStatus.to_list()
    
class StudentAttendenceSearchMode(Enum):

    STUDENT_NUMBER = "STUDENT_NUMBER"
    REGISTRATION_NUMBER = "REGISTRATION_NUMBER"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + StudentAttendenceSearchMode.to_list()

class CustomerRegistrationSource(Enum):
    SYSTEM = "SYSTEM"
    CUSTOMER = "CUSTOMER"
    
    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CustomerRegistrationSource.to_list()
    
class CustomerRegistrationStatus(Enum):

    APPROVED = "APPROVED"
    REJECTED = "REJECTED"
    PENDING = "PENDING"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + CustomerRegistrationStatus.to_list()
    

class GlobalSettingKeys(Enum):

    DEFAULT_PAYMENT_DUE_DATE = "DEFAULT_PAYMENT_DUE_DATE"
    STUDENT_ATTENDENCE_SEARCH_MODE = "STUDENT_ATTENDENCE_SEARCH_MODE"
    SUPER_ADMIN = "SUPER_ADMIN"
    IS_DUE_AMOUNT_DISPLAY_IN_INVOICE = "IS_DUE_AMOUNT_DISPLAY_IN_INVOICE"
    IS_TOTAL_PROGRAM_COST_DISPLAY_AT_STUDENT_REGISTRATION = "IS_TOTAL_PROGRAM_COST_DISPLAY_AT_STUDENT_REGISTRATION"
    IS_DISPLAY_QUICK_STUDENT_REGISTRATION = "IS_DISPLAY_QUICK_STUDENT_REGISTRATION"
    IS_DISPLAY_PAY_BUTTON_FOR_PENDING_REGISTRATIONS_IN_INVOICE = "IS_DISPLAY_PAY_BUTTON_FOR_PENDING_REGISTRATIONS_IN_INVOICE"
    DISCOUNT_NOTIFICATION_LIMIT = "DISCOUNT_NOTIFICATION_LIMIT"

    @classmethod
    def choices(cls):
        return tuple((i.value, i.name) for i in cls)
    
    @classmethod
    def to_list(cls):
        return [e.value for e in cls]
    
    @classmethod
    def to_list_for_reports(cls):
        list = ['ALL']
        return list + GlobalSettingKeys.to_list()
    
    


    

    
    


    