from mongoengine import *

###################################### Easy Rupai Models Here ############################
class Regions(Document):
    adminId = ReferenceField("SuperAdmin")
    regionName = StringField()
    regionType = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'regionName',
        ]
    }

class Countries(Document):
    adminId = ReferenceField("SuperAdmin")
    countryName = StringField()
    regionId = ReferenceField("Regions")
    regex = StringField()
    countryCode = StringField()
    countryFlag = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'countryName',
            'regionId',
        ]
    }

class States(Document):
    adminId = ReferenceField("SuperAdmin")
    stateName = StringField()
    countryId = ReferenceField("Countries")
    status = IntField(default=1)
    createdOn = DateTimeField()
    stateCode=StringField()
    meta = {
        'indexes': [
            'status',
            'stateName',
            'countryId',
        ]
    }

class Cities(Document):
    adminId = ReferenceField("SuperAdmin")
    cityName = StringField()
    stateId = ReferenceField("States")
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'cityName',
            'stateId',
        ]
    }

class BlocksPos(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    cityId = ReferenceField("Cities")
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'name',
            'cityId',
        ]
    }

class Pincodes(Document):
    adminId = ReferenceField("SuperAdmin")
    pincode = IntField()
    latitude = StringField()
    longitude = StringField()
    blockPoId = ReferenceField("BlocksPos")
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'pincode',
            'blockPoId',
        ]
    }

class UserTypes(Document):
    adminId = ReferenceField("SuperAdmin")
    userType = StringField()
    code = StringField()
    description = StringField()
    rank = IntField()
    isUser = BooleanField(default=False)
    isAllow = BooleanField(default=False)
    isCommission = BooleanField(default=False)
    isSuperDistributor = BooleanField(default=False)
    userPermissionId = ReferenceField("UserPermissions")
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "userType",
            "userPermissionId",
            "status",
        ]
    }

class UserNameFormats(Document):
    adminId = ReferenceField("SuperAdmin")
    userNameFormat = StringField() # email and mobileNo and custom
    userTypeId = ReferenceField("UserTypes")
    status = IntField(default=1)
    createdOn = DateTimeField()
    prefix = StringField()
    suffix = StringField()

class UserTypeOperations(Document):
    adminId = ReferenceField("SuperAdmin")
    userTypeId = ReferenceField("UserTypes")
    operationId = ReferenceField("Operations")
    isDateValidity  = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()
    startDate = DateTimeField()
    endDate = DateTimeField()

class Channels(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class TransactionTypes(Document):
    adminId = ReferenceField("SuperAdmin")
    transactionType = StringField()
    code = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class OperationTypes(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class Operations(Document):
    adminId = ReferenceField("SuperAdmin")
    operationName = StringField()
    operationTypeId = ReferenceField("OperationTypes")
    userTypeId = ReferenceField("UserTypes")
    channelId = ReferenceField("Channels")
    operationAuth = StringField()
    code = StringField()
    description = StringField()
    isUI = BooleanField(default=False)
    isMakerChecker = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()

class ErrorDefinations(Document):
    adminId = ReferenceField("SuperAdmin")
    typeId = StringField()
    errorCode = StringField()
    errorMessage = StringField()
    resolution = StringField()
    description = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class Categories(Document):
    adminId = ReferenceField("SuperAdmin")
    serviceGroupingId = ReferenceField("ServiceGrouping")
    transactionAPIId = ReferenceField("TransactionAPI")
    categoryName = StringField()
    displayInDashboard = BooleanField(default=True)
    comingsoon = BooleanField(default=False)
    isTpin = BooleanField()
    image = StringField()
    sorting = IntField(default=1)
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',  
            'categoryName',  
            'serviceGroupingId',  
            'transactionAPIId',
            'displayInDashboard',
            ("serviceGroupingId","displayInDashboard","status")  
        ]
    }

class CSVFileExports(Document):
    name = StringField()
    filters = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class FeeDistributionSettings(Document):
    adminId = ReferenceField("SuperAdmin")
    categoryId = ReferenceField("Categories")
    uplineCommDist = BooleanField()
    status = IntField(default=1)
    createdOn = DateTimeField()


class TransactionLimitSettings(Document):
    adminId = ReferenceField("SuperAdmin")
    paymentGatewayIds = ListField(ReferenceField("TransactionAPI"))
    name = StringField()
    code = StringField()
    singleTxnLowerLimit = StringField()
    singleTxnUpperLimit = StringField()
    dailyTxnLimit = StringField()
    dailyTxnCount = StringField()
    minimunAccountBalance = StringField()
    monthlyTxnLimit = StringField()
    monthlyTxnCount = StringField()
    pgType = StringField() # "payin" or "payout"
    isUserWise = BooleanField()
    userIds = ListField(ReferenceField("Users"))
    status = IntField(default=1)
    createdOn = DateTimeField()
    modifiedOn = DateTimeField()
    paymodeWiseLimitList = ListField()
    
class Settlement(Document):
    adminId = ReferenceField("SuperAdmin")
    settlementType = StringField()
    settleInHour = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class Wallet(Document):
    adminId = ReferenceField("SuperAdmin")
    walletName = StringField()
    code = StringField()
    description = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class SourceOfFunds(Document):
    adminId = ReferenceField("SuperAdmin")
    categoryId = ReferenceField("Categories")
    sourceName = StringField()
    code = StringField()
    description = StringField()
    rank = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class SwitchTypes(Document):
    adminId = ReferenceField("SuperAdmin")
    switchType = StringField()
    priority = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    createdOn = DateTimeField()


class TaxTypes(Document):
    adminId = ReferenceField("SuperAdmin")
    taxTypeName = StringField()
    taxType = StringField()
    primaryTax = IntField()
    secondaryTax = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',  
            'taxTypeName',  
        ]
    }


class Service(Document):
    adminId = ReferenceField("SuperAdmin")
    serviceName = StringField()
    serviceType = StringField()
    walletId = ReferenceField('Wallet')
    categoryId = ReferenceField('Categories')
    categoryIdsList = ListField(ReferenceField('Categories'))
    serviceGroupingId = ReferenceField("ServiceGrouping")
    serviceGroupingIdsList = ListField(ReferenceField("ServiceGrouping"))
    transactionAPIId = ReferenceField("TransactionAPI")
    code = StringField()
    sorting = IntField(default=1)
    displayInDashboard = BooleanField(default=True)
    isService = BooleanField()
    isbbps = BooleanField()
    isOperatorWise = BooleanField()
    file = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

    meta = {
        'indexes': [
            'walletId',
            'categoryId',
            'categoryIdsList',
            'serviceGroupingId',
            'serviceGroupingIdsList',
            'transactionAPIId',
            'serviceName',
            'displayInDashboard',
            'status',
        ]
    }


class Operators(Document):
    adminId = ReferenceField("SuperAdmin")
    operatorName = StringField()
    serviceId = ReferenceField('Service')
    serviceGroupingId = ReferenceField("ServiceGrouping")
    transactionAPIId = ReferenceField("TransactionAPI")
    allowType = StringField()
    taxTypeId = ReferenceField('TaxTypes')
    amountPlans = StringField()
    rejectedAmount = IntField()
    minLength = IntField()
    maxLength = IntField()
    minAmount = IntField()
    maxAmount = IntField()
    stateId = ReferenceField('States')
    apiType = StringField()
    apiCode = StringField()
    sorting = IntField(default=1)
    image = StringField()
    displayInDashboard = BooleanField(default=True)
    isBbps = BooleanField()
    isValidate = BooleanField()
    isPortial = BooleanField()
    isRandom = BooleanField()
    payWithoutFetchAllowed = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()
    hascustomerParamGroups = BooleanField(default=False)
    customerParamGroupsList = ListField()
    paymentChannelsAllowedList = ListField()
    paymentModesAllowedList = ListField()
    paymentAmountExactness = StringField()
    meta = {
        'indexes': [                        
            'operatorName',                   
            'serviceId',                   
            'serviceGroupingId',                   
            'transactionAPIId',                   
            'taxTypeId',                   
            'displayInDashboard',                   
            'stateId', 
            'status', 
            ("serviceGroupingId","displayInDashboard","status")                  
        ]
    }

class OperatorsDummy(Document):
    adminId = ReferenceField("SuperAdmin")
    operatorName = StringField()
    serviceId = ReferenceField('Service')
    serviceGroupingId = ReferenceField("ServiceGrouping")
    transactionAPIId = ReferenceField("TransactionAPI")
    allowType = StringField()
    taxTypeId = ReferenceField('TaxTypes')
    amountPlans = StringField()
    rejectedAmount = IntField()
    minLength = IntField()
    maxLength = IntField()
    minAmount = IntField()
    maxAmount = IntField()
    stateId = ReferenceField('States')
    apiType = StringField()
    apiCode = StringField()
    sorting = IntField(default=1)
    image = StringField()
    displayInDashboard = BooleanField(default=True)
    isBbps = BooleanField()
    isValidate = BooleanField()
    isPortial = BooleanField()
    isRandom = BooleanField()
    payWithoutFetchAllowed = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()
    hascustomerParamGroups = BooleanField(default=False)
    customerParamGroupsList = ListField()
    paymentChannelsAllowedList = ListField()
    paymentModesAllowedList = ListField()
    paymentAmountExactness = StringField()

class OperatorParameterDummy(Document):
    adminId = ReferenceField("SuperAdmin")
    parameterName = StringField()
    displayName = StringField()
    operatorId = ReferenceField('OperatorsDummy')
    minLength = IntField()
    maxLength = IntField()
    fieldType = StringField()
    sort = IntField()
    manualSort = IntField()
    pattern = StringField()
    apiName = StringField()
    apiCode = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    isActive = BooleanField()
    isMandatory = BooleanField()
    hasGrouping = BooleanField()
    hasIncludeApiCall = BooleanField(default=False)
    isReferenceKey = BooleanField(default=True)
    hasApiCall = BooleanField()
    hasSubParameters = BooleanField(default=False)
    apiCall = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class OperatorUpdate(Document):
    adminId = ReferenceField("SuperAdmin")
    operatorId = ReferenceField('Operators')
    apiOperatorCode1 = StringField()
    apiOperatorCode2 = StringField()
    apiOperatorCode3 = StringField()
    apiOperatorCode4 = StringField()
    apiOperatorCode5 = StringField()
    apiOperatorCode6 = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',
            'operatorId', 
        ]
    }


class OperatorParameter(Document):
    adminId = ReferenceField("SuperAdmin")
    parameterName = StringField()
    displayName = StringField()
    operatorId = ReferenceField('Operators')
    minLength = IntField()
    maxLength = IntField()
    fieldType = StringField()
    sort = IntField()
    manualSort = IntField()
    pattern = StringField()
    apiName = StringField()
    apiCode = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    isActive = BooleanField()
    isMandatory = BooleanField()
    hasGrouping = BooleanField()
    hasIncludeApiCall = BooleanField(default=False)
    isReferenceKey = BooleanField(default=True)
    hasApiCall = BooleanField()
    hasSubParameters = BooleanField(default=False)
    apiCall = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',                    
            'displayName',                             
            'operatorId',                             
            'transactionAPIId',
            ("operatorId","transactionAPIId","status")                             
        ]
    }

class OperatorGrouping(Document):
    adminId = ReferenceField("SuperAdmin")
    groupName = StringField()
    operatorId = ReferenceField('Operators')
    operatorParameterId = ReferenceField('OperatorParameter')
    value = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',                      
            'groupName',                         
            'operatorId',                         
            'operatorParameterId',                         
        ]
    }

class SubParameters(Document):
    adminId = ReferenceField("SuperAdmin")
    operatorParameterId = ReferenceField("OperatorParameter")
    operatorGroupingId = ReferenceField("OperatorGrouping")
    parameterName = StringField()
    displayName = StringField()
    operatorId = ReferenceField('Operators')
    minLength = IntField()
    maxLength = IntField()
    fieldType = StringField()
    sort = IntField()
    manualSort = IntField()
    pattern = StringField()
    apiName = StringField()
    apiCode = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    isActive = BooleanField()
    isMandatory = BooleanField()
    hasGrouping = BooleanField()
    hasIncludeApiCall = BooleanField(default=False)
    isReferenceKey = BooleanField(default=True)
    hasApiCall = BooleanField()
    hasSubParameters = BooleanField(default=False)
    apiCall = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',                           
            'displayName',                       
            'operatorId',                        
            'operatorParameterId',              
            'operatorGroupingId',                
            'transactionAPIId',                 
        ]
    }

class SubParameterGrouping(Document):
    adminId = ReferenceField("SuperAdmin")
    groupName = StringField()
    subParameterId = ReferenceField('SubParameters')
    operatorParameterId = ReferenceField('OperatorParameter')
    operatorId = ReferenceField('Operators')
    value = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'status',                     
            'groupName',                  
            'operatorId',                  
            'subParameterId',             
            'operatorParameterId',         
        ]
    }

class ServiceGrouping(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    sorting = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            'name',                      
            'status',                       
        ]
    }



class CompanyBankAccounts(Document):
    adminId = ReferenceField("SuperAdmin")
    bankName = StringField()
    bankCode = StringField()
    priority = StringField()
    transactionType = StringField() # "bank","UPI"
    accountType = StringField() # "current","savings","nodal","virtual"
    accountName = StringField()
    accountNumber = IntField()
    ifscCode = StringField()
    branch = StringField()
    upiId = StringField()
    QRData = StringField()
    image = StringField()
    companyType = StringField() # "administrator","parent"
    status = IntField(default=1)
    createdOn = DateTimeField()
    isActive = BooleanField(default=True)
    meta = {
        'indexes': [
            "bankName",
            "companyType",
            "status",
            ("companyType","status")
        ]
    }

class MasterIFSCBank(Document):
    adminId = ReferenceField("SuperAdmin")
    bankName = StringField()
    bankCode = StringField()
    ifscCode = StringField()
    priority = IntField()
    image = StringField()
    remark = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        "indexes": [
            "status",                                
            "bankName",                                                                
            "ifscCode",                                                                
        ]
    }


class TopUpRequests(Document):
    userId = ReferenceField("Users")
    depositBankId = ReferenceField("CompanyBankAccounts")
    amount = FloatField()
    paymentMode = StringField() # "cheque","cash"
    transaction = StringField() # CDMMachine,BranchDeposit,check number,UTR number
    paymentDate = DateTimeField()
    transactionSlip = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "status",
            "createdOn",
            ("createdOn","status")
        ]
    }

class Ekycs(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    code = StringField()
    ekycType = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class Documents(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    priority = IntField()
    hasExpiry = BooleanField(default=False)
    isKYC = BooleanField(default=False)
    isMandatory = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()

class KycGroups(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    code = StringField()
    description = StringField()
    priority = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()


class KYCGroupConfigs(Document):
    adminId = ReferenceField("SuperAdmin")
    documentId = ReferenceField("Documents")
    groupId = ReferenceField("KycGroups")
    status = IntField(default=1)
    createdOn = DateTimeField()

class DocumentAttributes(Document):
    adminId = ReferenceField("SuperAdmin")
    documentId = ReferenceField("Documents")
    attributeName = StringField()
    fieldType = StringField()
    supportedFileType = StringField()
    regex = StringField()
    maxSize = StringField()
    minWidth = StringField()
    maxWidth = StringField()
    mobileRegex = StringField()
    label = StringField()
    validationMessage = StringField()
    priority = IntField()
    isKYC = BooleanField(default=False)
    ekycId = ReferenceField("Ekycs")
    status = IntField(default=1)
    createdOn = DateTimeField()


class TicketCategory(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    userTypeId = ReferenceField("UserTypes")
    icon = StringField()
    priority = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "name",
            "status",
        ]
    }


class TicketSubCategory(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    categoryId = ReferenceField("TicketCategory")
    icon = StringField()
    priority = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "name",
            "categoryId",
            "status",
        ]
    }

class TicketChildCategory(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    subCategoryId = ReferenceField("TicketSubCategory")
    icon = StringField()
    priority = IntField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "name",
            "subCategoryId",
            "status",
        ]
    }


class KnowledgeMaster(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    childCategoryId = ReferenceField("TicketChildCategory")
    image = StringField()
    description = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()


# class Circles(Document):
#     adminId = ReferenceField("SuperAdmin")
#     name = StringField()
#     code = StringField()
#     circleCode1 = StringField()
#     circleCode2 = StringField()
#     circleCode3 = StringField()
#     status = IntField(default=1)
#     createdOn = DateTimeField()


class Circles(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    circleRefId=StringField()
    paymentGatewayId=ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class PrepaidOperators(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    operatorCode=StringField()
    prepaidPgId=ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    image = StringField()
    status = IntField(default=1)

class CircleSeries(Document):
    adminId = ReferenceField("SuperAdmin")
    numberPrefix = StringField()
    circleId = ReferenceField("Circles")
    operatorId = ReferenceField("Operators")
    isUpdate = BooleanField(default=False)
    isCalledForUpdate = BooleanField(default=False)
    createdOn = DateTimeField()
    status = IntField(default=1)
    
class RechargePlans(Document):
    adminId = ReferenceField("SuperAdmin")
    planId = StringField()
    circleId = ReferenceField("Circles")
    operatorId = ReferenceField("Operators")
    amount = FloatField(default=0.00)
    validity = StringField()
    shortDesc = StringField()
    longDesc = StringField()
    planType = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class TenantManagements(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    domainName = StringField()
    version = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class Profiles(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    code = StringField()
    userTypeId = ReferenceField("UserTypes")
    signUpProfile = BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()

class WebsiteContents(Document):
    adminId = ReferenceField("SuperAdmin")
    fieldName = StringField()
    value = StringField()
    primaryLogo = StringField()
    secondaryLogo = StringField()
    favIcon = StringField()
    adminPageTitle = StringField()
    address = StringField()
    supportNo = StringField()
    salesNumber = StringField()
    mapLink = StringField()
    copyRight = StringField()
    salesEmail = StringField()
    supportEmail = StringField()
    privacyPolicy = StringField()
    showPrivacyPolicy = BooleanField(default=True)
    termsAndConditions = StringField()
    showTermsAndConditionsPolicy = BooleanField(default=True)
    refundPolicy = StringField()
    showRefundPolicy = BooleanField(default=True)
    cancellationPolicy = StringField()
    showCancellationPolicy = BooleanField(default=True)
    createdOn = DateTimeField()
    status = IntField(default=1)

class SocialMediaLinks(Document):
    adminId = ReferenceField("SuperAdmin")
    fieldName = StringField()
    value = StringField()
    image = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class Banners(Document):
    adminId = ReferenceField("SuperAdmin")
    bannerType = StringField() # "Web" or "app"
    name = StringField()
    image = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class RegistrationStep(Document):
    adminId = ReferenceField("SuperAdmin")
    stepName = StringField()
    rank = IntField()
    label = StringField()
    userTypeIdsList = ListField(ReferenceField('UserTypes'))
    entityTypeIdsList = ListField(ReferenceField('UserEntity'))
    isMandatory = BooleanField()
    isSignup = BooleanField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "stepName",
            "userTypeIdsList",
            "entityTypeIdsList",
            "status",
        ]
    }

class RegistrationFields(Document):
    adminId = ReferenceField("SuperAdmin")
    fieldName = StringField()
    fieldType = StringField()
    allowedTypes = ListField()
    fieldTypeValuesList = ListField()
    registrationStepId = ReferenceField("RegistrationStep")
    rank = IntField()
    webRegex = StringField()
    mobileRegex = StringField()
    minLength = IntField()
    maxLength = IntField()
    validationMessage = StringField()
    label = StringField()
    userTypeIdsList = ListField(ReferenceField('UserTypes'))
    entityTypeIdsList = ListField(ReferenceField('UserEntity'))
    isMandatory = BooleanField()
    isGroup = BooleanField()
    groupType = StringField()
    hasCaps = BooleanField()
    isVerified = BooleanField()
    isDocumentGroup = BooleanField()
    documentGroupId = ReferenceField('Documents')
    isSignup = BooleanField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class UserPermissions(Document):
    adminId = ReferenceField("SuperAdmin")
    permissionName = StringField()
    groupingPermissionsList = ListField()
    categoryPermissionsList = ListField()
    servicePermissionsList = ListField()
    operatorPermissionsList = ListField()
    otherPermissionsList = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class Commissions(Document):
    adminId = ReferenceField("SuperAdmin")
    commissionList = ListField()
    profileId = ReferenceField("Patterns")
    paymentGatewayId = ReferenceField("TransactionAPI")
    subServiceId = ReferenceField("Service")
    createdOn = DateTimeField()
    status = IntField(default=1)
   

# class UserCommissions(Document):
#   userId = ReferenceField("Users")
#   childUserId = ReferenceField("Users")
#   operatorId = ReferenceField("Operators")
#   serviceId = ReferenceField("Service")
#   transactionAPIId = ReferenceField("TransactionAPI")
#   totalAmount = FloatField()
#   commissionType = StringField() # "Percentage" or "Fixed"
#   commissionAmount = FloatField() # "admin" or "agent"
#   transactionId = StringField()
#   createdOn = DateTimeField()
#   status = IntField(default=1)

class UserCommissions(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    childUserId = ReferenceField("Users")
    slabId =ReferenceField("SetupChargeCommissions")
    commissionfor = StringField() # "Payin" or "Payout" or "Service"
    transactionId = StringField()
    paymentModeId =ReferenceField("PaymentMode")
    subPaymentModeId =ReferenceField("SubPaymentModes")
    walletId = ReferenceField("WalletTransactions")
    transactionAPIId = ReferenceField("TransactionAPI")
    totalAmount = FloatField()
    childCommissionValue=FloatField()
    childCommissionType=StringField()
    parrentSlabCommissionType = StringField()
    parrentSlabCommissionValue = FloatField()
    parrentCommissionType = StringField()
    comment = StringField()
    transferType = StringField()
    parrentCommissionAmount = FloatField()
    parentGstAmount = FloatField()
    parentTdsAmount = FloatField()
    previousBalance = FloatField()
    currentBalance = FloatField()
    parentcommissionData=ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    settlementStatus = IntField(default=1)
    siteTitle=StringField()

class OperatorSwitching(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    operatorId = ReferenceField("Operators")
    apiId1 = ReferenceField("TransactionAPI")
    apiId2 = ReferenceField("TransactionAPI")
    apiId3 = ReferenceField("TransactionAPI")
    apiId4 = ReferenceField("TransactionAPI")
    apiId5 = ReferenceField("TransactionAPI")
    apiId6 = ReferenceField("TransactionAPI")
    apiId7 = ReferenceField("TransactionAPI")
    apiCount = IntField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class AmountSwitching(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    stateId = ReferenceField("States")
    amount = FloatField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class FailedSwitching(Document):
    adminId = ReferenceField("SuperAdmin")
    numberOfFail = IntField()
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    nextTransactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class PendingBlocks(Document):
    adminId = ReferenceField("SuperAdmin")
    numberOfPending = IntField()
    operatorId = ReferenceField("Operators")
    userId = ReferenceField("Users")
    createdOn = DateTimeField()
    status = IntField(default=1)

class PendingSwitching(Document):
    adminId = ReferenceField("SuperAdmin")
    numberOfPending = IntField()
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    nextTransactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class CircleWiseSwitchings(Document):
    adminId = ReferenceField("SuperAdmin")
    circleId = ReferenceField("States")
    planCircleCode = StringField()
    userId = ReferenceField("Users")
    operatorId = ReferenceField("Operators")
    apiId1 = ReferenceField("TransactionAPI")
    apiId2 = ReferenceField("TransactionAPI")
    apiId3 = ReferenceField("TransactionAPI")
    apiId4 = ReferenceField("TransactionAPI")
    apiId5 = ReferenceField("TransactionAPI")
    apiId6 = ReferenceField("TransactionAPI")
    apiId7 = ReferenceField("TransactionAPI")
    apiCount = IntField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class BlockEntryReasons(Document):
    adminId = ReferenceField("SuperAdmin")
    reason = StringField()
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class SpeedControllerSwitchings(Document):
    adminId = ReferenceField("SuperAdmin")
    numberOfTransaction = IntField()
    numberOfSecond = IntField()
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    nextTransactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class RetryFailedTransactions(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    nextTransactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class ReplaceFailureReasons(Document):
    adminId = ReferenceField("SuperAdmin")
    apiReason = StringField()
    actualReason = StringField()
    reasonType = StringField() # "Success" or "Pending" or "Failure"
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class SubPaymentModes(Document):
    adminId = ReferenceField("SuperAdmin")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeType = StringField()
    image = StringField()
    priority = IntField()
    minAmount = FloatField(default=0.00)
    maxAmount = FloatField(default=0.00)
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "status",                    
            "paymentModeId",              
            "subPaymentModeType",
            ("paymentModeId","subPaymentModeType")                              
        ]
    }

class ConfigPaymentGateways(Document):
    adminId = ReferenceField("SuperAdmin")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    transactionAPIId = ReferenceField("TransactionAPI")
    chargeType = StringField() # "Amount" or "Percentage"
    chargeValue = FloatField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "subPaymentModeId",                    
            "transactionAPIId",              
            "status",                            
        ]
    }

class Receipts(Document):
    adminId = ReferenceField("SuperAdmin")
    categoryId = ReferenceField("Categories")
    designName = StringField()
    parameter = StringField()
    receiptTemplateBody = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class DesignDocuments(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    parameter = StringField()
    receiptTemplateBody = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()


class ComplaintReport(Document):
    userId = ReferenceField('Users')
    categoryId = ReferenceField('TicketCategory')
    complaintTypeId = ReferenceField('TicketSubCategory')
    subjectId = ReferenceField('TicketChildCategory')
    priority = StringField()
    document = StringField()
    complaintNumber = StringField()
    transactionId = StringField()
    message = StringField()
    createdOn = DateTimeField()
    status = IntField(default=0) #0-Pending, 1-
    meta = {
        'indexes': [
            "userId",
            "createdOn",
            "status",
        ]
    }

class Remitters(Document):
    userId = ReferenceField("Users")
    firstName = StringField()
    lastName = StringField()
    phoneNumber = StringField()
    moneyArtRemitterId = StringField()
    availableBalance=FloatField(default=0.00)
    monthlyLimit=FloatField(default=0.00)
    pincode = IntField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "phoneNumber",
            "lastName",
            "firstName",
            "pincode",
            "status",
            ("firstName","lastName","phoneNumber"),
            ("userId","status"),
            ("phoneNumber","status")

        ]
    }

class DmtBeneficiaries(Document):
    userId = ReferenceField("Users")
    masterBankId = ReferenceField("MasterIFSCBank")
    remitterId = ReferenceField("Remitters")
    beneficiaryId = StringField()
    beneCodeList = ListField()
    fullName = StringField()
    mobileNumber = StringField()
    # verifyStatus = IntField()
    verifyStatus = BooleanField(default=False)
    accountNumber = StringField()
    ifscCode = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class Beneficiaries(Document):
    userIdsList = ListField(ReferenceField("Users"))
    masterBankId = ReferenceField("MasterIFSCBank")
    beneficiaryId = StringField()
    beneCodeList = ListField()
    beneficiaryName = StringField()
    accountNumber = StringField()
    beniValidationData = ListField()
    ifscCode = StringField()
    transactionReferenceNumber=StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "accountNumber",
            "beneficiaryName",
            "beneficiaryId",
            "userIdsList",
            "status",
            "createdOn",
        ]
    }

    

class Transactions(Document):
    userId = ReferenceField("Users")
    categoryId = ReferenceField('Categories')
    serviceId = ReferenceField('Service')
    operatorId = ReferenceField('Operators')
    paymentGatewayId = ReferenceField('SourceOfFunds')
    beneficiaryId = ReferenceField("Beneficiaries")
    remitterId = ReferenceField("Remitters")
    transactionAPIId = ReferenceField("TransactionAPI")
    categoryName = StringField() # "DMT"
    serviceName = StringField() # "DMT"
    paymentType = StringField() # "IMPS","NEFT"
    paymentCategory = StringField() # VISA, MASTER,AXIS BANK
    cardNumber = StringField() 
    customerVpa = StringField() 
    walletName = StringField() 
    operatorName = StringField()
    transactionId = StringField()
    customeParamsList = DictField()
    amount = FloatField(default=0.00)
    totalAmount = FloatField(default=0.00) 
    commissionCharges = DictField()
    operatorReference = StringField()
    mobileNumber = StringField()
    customerName = StringField()
    customerEmail = StringField()
    bankCode= StringField()
    ifscCode = StringField()
    accountNumber = StringField()
    billPayment = StringField()
    accountHolderName = StringField()
    errorMessage = StringField()
    transactionData = ListField()
    billPaymentRequestData = ListField()
    billPaymentResponseData = ListField()
    createdOn = DateTimeField()
    cardDetails= StringField()
    payload=DictField()
    headers=DictField()
    paymentStatus = IntField()
    bbpsPaymentStatus = IntField()#1-Success #0-Failed #2-processing
    refundStatus= IntField() #1-Success #0-Failed #2-processing #5 Refund Successfully
    refundResponse =  DictField()
    status = IntField(default=1) #1-Success #0-Failed #2-Pending #3-Pending
    checkPaymentRespons= DictField()
    statusCheckId = StringField()
    refundResponseStatus=  DictField()
    pgOrderId = StringField()
    meta = {
        'indexes': [
            "userId",
            "transactionAPIId",
            "transactionId",
            "status",
            "createdOn",
            ("transactionAPIId","userId")
        ]
    }

class Banks(Document):
    userId = ReferenceField("Users")
    paymentMethod = StringField()
    accountHolderName = StringField()
    accountNumber = StringField()
    accountType = StringField()
    bankName = StringField()
    ifscCode = StringField()
    remarks = StringField()
    upiId = StringField()
    bankCheckImage = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "paymentMethod",
            "status",
            ("userId","paymentMethod")
        ]
    } 


class WalletToBank(Document):
    userId = ReferenceField("Users")
    bankId = ReferenceField("Banks")
    upiId = ReferenceField("Banks")
    paymentMethod = StringField()
    paymentMode = StringField()
    amount = FloatField(default=0.00)
    remarks = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class SuperAdmin(Document):
    userName = StringField()
    email = StringField()
    password = StringField()
    phoneNumber = StringField()
    profilePicture = StringField()
    adminType = StringField() # "admin" or "staff"
    status = IntField(default=1)
    createdOn = DateTimeField()
    authenticationEnabled=BooleanField(default=False)
    roleId = ReferenceField("Roles")
    accessToken = StringField()
    loginLatitude = StringField()
    loginLongitude = StringField()

class SuperAdminLogs(Document):
    adminId = ReferenceField('SuperAdmin')
    ipAddress = StringField()
    loginBrowser = StringField()
    userAgent = StringField()
    createdOn = DateTimeField()
    otpCode=StringField()
    attempts=IntField(default=0)
    authenticationEnabled=BooleanField(default=False)
    status = IntField(default=1)

class UserEntity(Document):
    adminId = ReferenceField("SuperAdmin")
    entityType = StringField()
    isIndividual = BooleanField(default=True)
    isDefault= BooleanField(default=True)
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "entityType",
            "status",
        ]
    }

class Users(Document):
    fullName = StringField()
    phoneNumber = StringField()
    email = StringField()
    address = StringField()
    password = StringField()
    categoryId = ReferenceField("MerchantCategories")
    subCategoryId = ReferenceField("MerchantSubCategories")
    profileId = ReferenceField("Profiles")
    parentId = ReferenceField("Users")
    userTypeId = ReferenceField("UserTypes")
    patternId = ReferenceField("Patterns")
    entityTypeId = ReferenceField("UserEntity")
    stateId = ReferenceField("States")
    cityId = ReferenceField("Cities")
    blockPoId = ReferenceField("BlocksPos")
    pincodeId = ReferenceField("Pincodes")
    userPermissionId = ReferenceField("UserPermissions")
    commissionId = ReferenceField("Commissions", default=None)
    status = IntField(default=1)
    createdOn = DateTimeField()
    lastLogin = DateTimeField()
    businessName = StringField()
    businessAddress = StringField()
    tPin = IntField(default=0)
    walletBalance = FloatField(default=0.00)
    usdtBalance = FloatField(default=0.00)
    grandTotal = FloatField(default=0.00)
    payoutBalance = FloatField(default=0.00)
    commissionBalance = FloatField(default=0.00) # commission balance
    profilePicture = StringField()
    merchantPaymentLink = StringField()
    authenticationEnabled = IntField(default=0)
    payInPaymentGatewayId = ReferenceField("TransactionAPI")
    payOutPaymentGatewayId = ReferenceField("TransactionAPI")
    merchantUniqueNumber = StringField()
    signatureImage = StringField()
    agreementAutherized = BooleanField()
    agreementDocument = StringField()
    merchantType = StringField() # "customer" or "retailer"
    channel = StringField() # "web" or "app" or "admin"
    imeiNumber = StringField()
    remark = StringField()
    enablePayin = BooleanField(default=False)
    enablePayout = BooleanField(default=False)
    maxPayinLimit = FloatField(default=0)
    maxPayoutLimit = FloatField(default=0)
    capBalance = FloatField(default=0)
    businessRemark=StringField()
    shopRemark=StringField()
    documentRemark=StringField()
    videoVerificationRemark=StringField()
    agreementVerificationReason=StringField()
    siteTitle=StringField()
    userAccessToken=StringField()
    meta = {
        'indexes': [
            "fullName",
            "email",
            "merchantUniqueNumber",
            "status",
            "patternId",
            "stateId",
            "parentId",
            "merchantPaymentLink",
            ("fullName","phoneNumber","email"),
            ("phoneNumber", "status", "siteTitle"),
        ]
    }


class UserKYC(Document):
    userId = ReferenceField("Users")
    panName = StringField()
    originalPanName = StringField()
    panNumber = StringField()
    panStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    panReason = StringField()
    panDocument = StringField()
    bankName = StringField()
    originalBankName = StringField()
    bankHolderName = StringField()
    bankId = ReferenceField("MasterIFSCBank")
    bankAccountNumber = StringField()
    bankStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    bankReason = StringField()
    ifscCode = StringField()
    aadharName = StringField()
    originalAadharName = StringField()
    aadharNumber = StringField()
    aadharReason = StringField()
    aadharStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    aadharDocument = StringField()
    aadharBackDocument = StringField()
    uploadVideo = StringField()
    videoVerificationStatus = StringField()
    videoVerificationReason = StringField()
    agreementVerificationStatus = StringField()
    agreementVerificationReason = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    submittedDate = DateTimeField()
    companyRegistrationDoc = StringField()
    companyRegistrationStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    moaDoc = StringField()
    moaStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    aoaDoc = StringField()
    aoaStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    companyPanDoc = StringField()
    companyPanStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    channel = StringField() # "web" or "app" or "admin"
    boardOfDirectors = ListField()
    businessName = StringField()
    businessAddress = StringField()
    businessStatus = StringField()
    businessLocation = StringField()
    documentsList = ListField()
    shopVideo = StringField()
    shopImagesList = ListField()
    shopVideoStatus = StringField() # "Approved" or "Submitted" or "Pending" or "Rejected"
    affiliateId = ReferenceField("Affiliates")
    businessRemark=StringField()
    shopRemark=StringField()
    documentRemark=StringField()
    videoVerificationRemark=StringField()
    remark=StringField()
    siteTitle=StringField()
    meta = {
        'indexes': [
            "status",
            "userId",
            ("userId","status")
        ]
    }

class PaymentMode(Document):
    adminId = ReferenceField("SuperAdmin")
    paymentMode = StringField()
    walletType = StringField() #"Payout" or "Payin"
    hasGroup = StringField() # "Yes" or "No"
    groupType = StringField() # banks
    image = StringField()
    priority = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "status",
            "paymentMode",
            "walletType",
            ("status","walletType")
        ]
    }

class WalletTransactions(Document):
    userId = ReferenceField('Users')
    amount = FloatField(default=0.00)
    paymentGatewayId = ReferenceField('TransactionAPI')
    slabId = ReferenceField("SetupChargeCommissions")
    setlementId = ReferenceField("Settlement")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    subPaymentMode = StringField()
    paymentType = StringField() #"IMPS","NEFT","Wallet","UPI"
    creditType = StringField() #Credit #Debit
    transactionId = StringField()
    isConfirm = BooleanField(default=False)
    paymentAuthentication = BooleanField(default=False)
    transactionData = ListField()
    walletLog = StringField()
    remarks = StringField(default="")
    userType = StringField()  #"user", "admin"
    createdBy = ReferenceField('SuperAdmin')
    comment = StringField()
    orderId = StringField() # Means merchant reference number
    customerName = StringField()
    customerEmail = StringField()
    customerPhonenumber = StringField()
    agent = StringField()
    location = StringField()
    platform = StringField() # "page","button","link","api"
    paymentLink = StringField() # To use this payment link  is search in PaymentLinks,PaymentButtons,PaymentPages Tables.
    paymentLinkId = ReferenceField("PaymentLinks")
    PaymentButtonId = ReferenceField("PaymentButtons")
    paymentPageId = ReferenceField("UserId")
    createdOn = DateTimeField()
    status = IntField(default=1)
    gstAmount = FloatField() 
    tdsAmount = FloatField()
    grandTotal = FloatField()
    payInResponseCallBackData = ListField()
    responseCallBackTime = DateTimeField()
    patternId = ReferenceField("Patterns")
    previousBalance = FloatField(default=0.00)
    currentBalance = FloatField(default=0.00)
    errorMessage = StringField()
    paymentChannel = StringField()
    bankRefId = StringField()
    cardmasked = StringField()
    customerVpa = StringField()
    currency = StringField()
    productName = StringField()
    commissionCharges = DictField()
    statusCount = IntField(default=0)
    pgOrderId = StringField() # merchantUniqueId + orderId
    walletTransactionId = ReferenceField("WalletTransactions")
    settlementStatus = IntField(default=1) # 1 means = "unsettled" 2 means = "settled"
    settlementedBy = ReferenceField('SuperAdmin')
    settlementedTime = DateTimeField()
    settlementedRemark = StringField()
    bankName = StringField()
    udf1 = StringField() 
    udf2 = StringField()
    udf3 = StringField()
    udf4 = StringField()
    udf5 = StringField()
    clientIp = StringField()
    statusCheckId = StringField()
    paymentDetails=StringField()
    invoiceNumber = StringField()
    bankCode = StringField()
    cardType = StringField()
    qrPath = StringField()
    qrIntent = StringField()
    paymentLinkUrl = StringField()
    statusCheckId = StringField()
    paymentAccessType=StringField()
    siteTitle=StringField()
    instantSettlement = BooleanField(default=False)
    meta = {
        'indexes': [
            "userId",
            "orderId",
            "createdOn",
            "status",
            "pgOrderId",
            "transactionId",
            "creditType",
            "userType",
           ("transactionId","orderId"),
           ("customerPhonenumber","status","createdOn"),
           ("userId","userType"),
        ]
    }

class OperatorWiseRoutings(Document):
    adminId = ReferenceField("SuperAdmin")
    serviceId = ReferenceField("Service")
    operatorId = ReferenceField("Operators")
    transactionAPIId = ReferenceField("TransactionAPI")
    categoryId = ReferenceField("Categories")
    createdOn = DateTimeField()
    status = IntField(default=1)

class ProfileWiseRoutings(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class MerchantCategories(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    isUserWise = BooleanField(default=False)
    categoryCode = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "isUserWise",
            "status",
        ]
    }

class MerchantSubCategories(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    categoryId = ReferenceField("MerchantCategories")
    status = IntField(default=1)
    isUserWise = BooleanField(default=False)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "categoryId",
            "status",
        ]
    }

class Networks(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class BankBins(Document):
    adminId = ReferenceField("SuperAdmin")
    iiN = IntField()
    entity = StringField()
    bankBinType = StringField() # "Credit" or "Debit" or "Prepaid" or "Unknown"
    bankBinSubType = StringField() # "Consumer" or "Business" or "Unknown"
    cardIin = StringField()
    issuerCode = StringField()
    issuerName = StringField()
    authType = StringField() # "3ds" or "OTP"
    international = StringField() # "True" or "False"
    tokenisedIin = StringField() # "True" or "False"
    emi = StringField() # "True" or "False"
    recurring = StringField() # "True" or "False"
    networkId = ReferenceField("Networks")
    status = IntField(default=1)
    createdOn = DateTimeField()

class Patterns(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    description = StringField()
    code = StringField()
    rank = IntField()
    isUserWise = BooleanField(default=False)
    isAllow = BooleanField(default=False)
    isCommission = BooleanField(default=False)
    isSuperDistributor = BooleanField(default=False)
    userPermissionId = ReferenceField("UserPermissions")
    status = IntField(default=1)
    createdOn = DateTimeField()
    payinPaymentGatewaysList = ListField(ReferenceField("TransactionAPI"))
    payoutPaymentGatewayId = ReferenceField("TransactionAPI")
    payinEnable = BooleanField(default=False)
    payoutEnable = BooleanField(default=False)
    defaultPayinPaymentGatewayId = ReferenceField("TransactionAPI")
    defaultPayoutPaymentGatewayId = ReferenceField("TransactionAPI")
    defaultProfile = BooleanField(default=False)
    meta = {
        'indexes': [
            "name",
            "isUserWise",
            "status",
            "payoutPaymentGatewayId",
            ("payoutPaymentGatewayId","status")
        ]
    }

class SetupChargeCommissions(Document):
    adminId = ReferenceField("SuperAdmin")
    patternId = ReferenceField("Patterns")
    patternIdsList = ListField(ReferenceField("Patterns"))
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    subPaymentModeIdsList = ListField(ReferenceField("SubPaymentModes"))
    paymentModeIdsList = ListField(ReferenceField("PaymentMode"))
    transactionAPIId = ReferenceField("TransactionAPI")
    transactionAPIIdsList = ListField(ReferenceField("TransactionAPI"))
    slabName = StringField()
    priceType = StringField()
    aggregatorType = StringField()
    aggregatorValue = FloatField()
    gstInclude = StringField()
    gstValue = FloatField()
    tdsInclude = StringField()
    tdsValue = FloatField()
    commissionType = StringField() # "FLAT" or "PERCENTAGE"
    commissionValue = FloatField() 
    chargeType = StringField() # "FLAT" or "PERCENTAGE"
    chargeValue = FloatField() 
    status = IntField(default=1)
    createdOn = DateTimeField()
    priceRangeList = ListField()
    instantSettlement = BooleanField(default=False)
    meta = {
        'indexes': [
            "patternId",
            "patternIdsList",
            "paymentModeId",
            "paymentModeIdsList",
            "subPaymentModeId",
            "subPaymentModeIdsList",
            "status",
            ("paymentModeId","status"),
            ("patternId","status"),
            
        ]
    }

    

# class NewSetupChargeCommissions(Document):
#   adminId = ReferenceField("SuperAdmin")
#   patternId = ReferenceField("Patterns")
#   paymentModeId = ReferenceField("PaymentMode")
#   subPaymentModeId = ReferenceField("SubPaymentModes")
#   transactionAPIId = ReferenceField("TransactionAPI")
#   slabName = StringField()
#   priceType = StringField()  # Consider using an Enum for fixed options
#   aggregatorType = StringField()  # "FLAT" or "PERCENTAGE"
#   aggregatorValue = FloatField()
#   gstInclude = StringField()  # "Yes" or "No"
#   gstValue = FloatField()
#   tdsInclude = StringField()  # "Yes" or "No"
#   tdsValue = FloatField()
#   commissionType = StringField()  # "FLAT" or "PERCENTAGE"
#   commissionValue = FloatField() 
#   chargeType = StringField()  # "FLAT" or "PERCENTAGE"
#   chargeValue = FloatField() 
#   status = IntField(default=1)
#   createdOn = DateTimeField()  # Automatically set to current time
#   priceRangeList = ListField()  # Consider defining structure for this


class NewSetupChargeCommissions(Document):
    adminId = ReferenceField("SuperAdmin")
    patternId = ReferenceField("Patterns")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    transactionAPIId = ReferenceField("TransactionAPI")
    patternIdsList = ListField(ReferenceField("Patterns"))
    subPaymentModeIdsList = ListField(ReferenceField("SubPaymentModes"))
    paymentModeIdsList = ListField(ReferenceField("PaymentMode"))
    transactionAPIIdsList = ListField(ReferenceField("TransactionAPI"))
    slabName = StringField()
    priceType = StringField()  # Consider using an Enum for fixed options
    aggregatorType = StringField()  # "FLAT" or "PERCENTAGE"
    aggregatorValue = FloatField()
    gstInclude = StringField()  # "Yes" or "No"
    gstValue = FloatField()
    tdsInclude = StringField()  # "Yes" or "No"
    tdsValue = FloatField()
    commissionType = StringField()  # "FLAT" or "PERCENTAGE"
    commissionValue = FloatField() 
    chargeType = StringField()  # "FLAT" or "PERCENTAGE"
    chargeValue = FloatField() 
    status = IntField(default=1)
    createdOn = DateTimeField()  # Automatically set to current time
    priceRangeList = ListField()  # Consider defining structure for this

class Affiliates(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    phoneNumber = StringField()
    email = StringField()
    password = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class SubAdmins(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    phoneNumber = StringField()
    email = StringField()
    password = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class SubAdminRights(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    pageURL = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class StaffMembers(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    email = StringField()
    password = StringField()
    roleId = ReferenceField("Roles")
    createdOn = DateTimeField()
    status = IntField(default=1)

# class TransactionAPI(Document):
#   adminId = ReferenceField("SuperAdmin")
#   apiName = StringField()
#   perdayTransactionLimit = IntField(default=0)
#   code = StringField()
#   subCode = StringField()
#   virtualCode = StringField()
#   ifscCode = StringField()
#   isActive = BooleanField()
#   isUserWise = BooleanField()
#   transactionType = StringField() # "Service" or "PaymentGateway" or "Payout"
#   paramsList = ListField()
#   param1 = StringField()
#   param2 = StringField()
#   param3 = StringField()
#   lastSixDigits = StringField()
#   status = IntField(default=1)
#   createdOn = DateTimeField()

class TransactionAPI(Document):
    adminId = ReferenceField("SuperAdmin")
    apiName = StringField()
    perdayTransactionLimit = FloatField(default=0)
    code = StringField()
    subCode = StringField()
    virtualCode = StringField()
    ifscCode = StringField()
    isActive = BooleanField()
    isUserWise = BooleanField()
    transactionType = StringField() # "Service" or "PaymentGateway" or "Payout"
    paramsList = ListField()
    param1 = StringField()
    param2 = StringField()
    param3 = StringField()
    lastSixDigits = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    autoSettlement=BooleanField()
    settlementLimit=FloatField(default=0)
    cardBinEnable=BooleanField(default=False)
    isSeamless=BooleanField()
    priceType = StringField()
    preAuthorization=BooleanField(default=False)
    invoiceType=StringField()
    meta = {
        'indexes': [
            "apiName",
            "status",
            "code",
            "transactionType",
            ("status","transactionType")
        ]
    }

class Roles(Document):
    adminId = ReferenceField("SuperAdmin")
    roleName = StringField()
    bankPermissions = ListField() # ["add","edit","view","delete"]
    masterDisputesPermissions = ListField() # ["add","edit","view","delete"]
    paymentMasterPermissions = ListField() # ["add","edit","view","delete"]
    subpaymentmodePermissions = ListField() # ["add","edit","view","delete"]
    merchantCategoriesPermissions = ListField() # ["add","edit","view","delete"]
    merchantSubCategoriesPermissions = ListField() # ["add","edit","view","delete"]
    networksPermissions = ListField() # ["add","edit","view","delete"]
    bankBinsPermissions = ListField() # ["add","edit","view","delete"]
    patternPermissions = ListField() # ["add","edit","view","delete"]
    chargeCommissionsPermissions = ListField() # ["add","edit","view","delete"]
    userManagementPermissions = ListField() # ["add","edit","view","delete"]
    pendingKYCUsersPermissions = ListField() # ["add","edit","view","delete"]
    affiliatesPermissions = ListField() # ["add","edit","view","delete"]
    blockedMerchantPermissions = ListField() # ["add","edit","view","delete"]
    subAdminPermissions = ListField() # ["add","edit","view","delete"]
    subAdminRightsPermissions = ListField() # ["add","edit","view","delete"]
    apiGatewaysPermissions = ListField() # ["add","edit","view","delete"]
    virtualAccountPermissions = ListField() # ["add","edit","view","delete"]
    whitelistPendingPermissions = ListField() # ["add","edit","view","delete"]
    whitelistAccountHistoryPermissions = ListField() # ["add","edit","view","delete"]
    refundReportPermissions = ListField() # ["add","edit","view","delete"]
    pendingTransactionPermissions = ListField() # ["add","edit","view","delete"]
    updateTransactionPermissions = ListField() # ["add","edit","view","delete"]
    bankHolidaysPermissions = ListField() # ["add","edit","view","delete"]
    kycEntityTypesPermissions = ListField() # ["add","edit","view","delete"]
    velocityRuleEnginePermissions = ListField() # ["add","edit","view","delete"]
    transactionRouterPermissions = ListField() # ["add","edit","view","delete"]
    payinSettlementPermissions = ListField() # ["add","edit","view","delete"]
    payoutSettlementPermissions = ListField() # ["add","edit","view","delete"]
    creditDebitSettlementPermissions = ListField() # ["add","edit","view","delete"]
    allTransactionsPermissions = ListField() # ["view"]
    successTransactionsPermissions = ListField() # ["view"]
    pendingTransactionsPermissions = ListField() # ["view"]
    fundSourcesPermissions = ListField() # ["view"]
    paymentLinkPermissions = ListField() # ["view"]
    paymentButtonPermissions = ListField() # ["view"]
    paymentPagePermissions = ListField() # ["view"]
    payoutTransactionReportPermissions = ListField() # ["view"]
    payinTransactionReportPermissions = ListField() # ["view"]
    reconcilationTransactionReportPermissions = ListField() # ["view"]
    downloadPgReportPermissions = ListField() # ["view"]
    downloadPgApproveReportPermissions = ListField() # ["view"]
    payoutLedgerReportPermissions = ListField() # ["view"]
    payinLedgerReportPermissions = ListField() # ["view"]
    autocollectLedgerReportPermissions = ListField() # ["view"]
    creditToWalletPermissions = ListField() # ["edit"]
    debitFromWalletPermissions = ListField() # ["edit"]
    virtualAdminBalancePermissions = ListField() # ["edit"]
    smslogsPermissions = ListField() # # ["view"]
    merchantLogsPermissions = ListField() # # ["view"]
    adminOtpLogsPermissions = ListField() # # ["view"]
    apiLogsPermissions = ListField() # # ["view"]
    clientPermissions = ListField() # # ["view"]
    adminLogsPermissions = ListField() # # ["view"]
    categoriesPermissions = ListField() # # ["add","edit","view","delete"]
    servicesPermissions = ListField() # # ["add","edit","view","delete"]
    subservicesPermissions = ListField() # # ["add","edit","view","delete"]
    operatorPermissions = ListField() # # ["add","edit","view","delete"]
    operatorupdatePermissions = ListField() # # ["add","edit","view","delete"]
    operatorparameterPermissions = ListField() # # ["add","edit","view","delete"]
    operatorgroupingPermissions = ListField() # # ["add","edit","view","delete"]
    subparameterPermissions = ListField() # # ["add","edit","view","delete"]
    subparametergroupingPermissions = ListField() # # ["add","edit","view","delete"]
    taxmasterPermissions = ListField() # # ["add","edit","view","delete"]
    userCommissionsListPermissions = ListField() # # ["add","edit","view","delete"]
    documentsPermissions = ListField() # # ["add","edit","view","delete"]
    staffPermissions = ListField() # # ["add","edit","view","delete"]
    rolePermissions = ListField() # # [edit","view","delete"]
    bannersPermissions = ListField() # # ["add","edit","view","delete"]
    businessDocumentsPermissions = ListField() # # ["add","edit","view","delete"]
    commissionReportsPermissions = ListField() # # [view]
    payinTransactionsPermissions = ListField() # # [view]
    payinsuccessTransactionsPermissions = ListField() # # [view]
    payinpendingTransactionsPermissions = ListField() # #[view]
    payinInitiatedTransactionsPermissions = ListField() # # [view]
    autoCollectTransactionReportPermissions = ListField() # # [view]
    thirdPartyIntegrationPermissions = ListField() # ["add","edit","view"]
    serviceChargePermissions = ListField() # ["add","edit","view"]
    switchUserProfilePermissions = ListField() # ["add","edit","view"]
    userPermissionsList = ListField() # ["add","edit","view","delete"]
    assignvirtualAccountPermissions = ListField() # ["add","view"]
    assignThirdpartyvirtualAccountPermissions = ListField() # ["add","view"]
    beneficiariesListPermissions = ListField() # [view"]
    autoBeneficiariesListPermissions = ListField() # ["add","edit","view""]
    invalidBeneficiariesListPermissions = ListField() # [view"]
    txnLimitSettingsPermissions = ListField() # ["add","edit","view","delete"]
    invoiceCompanyDetailsPermissions = ListField() # ["add","edit","view"]
    utilityTransactionReportPermissions = ListField() # ["view"]
    accountSummaryPermissions = ListField() # ["view"]
    downlineListPermissions = ListField() # ["view"]
    balanceReportPermissions = ListField() # ["view"]
    cummulativeReportPermissions = ListField() # ["view"]
    operatorIncomeReportPermissions = ListField() # ["view"]
    chargeBacksReportPermissions = ListField() # ["add","view"]
    downloadpayoutReportPermissions = ListField() # ["view"]
    autoCollectReportPermissions = ListField() # ["view"]
    gstAndTdsReportPermissions = ListField() # ["view"]
    apiDocumentGuidePermissions = ListField() # ["add","edit","view","delete"]
    goldApiManagementPermissions = ListField() # ["add","edit","view","delete"]
    goldApiTransactionPermissions = ListField() # ["view"]
    productsPermissions = ListField() # ["add","edit","view","delete"]
    multipleAppSitesPermissions = ListField() # ["add","edit","view","delete"]
    contactSetupPermissions = ListField() # ["add","edit","view","delete"]
    ticketCategoryPermissions = ListField() # ["add","edit","view","delete"]
    ticketSubCategoryPermissions = ListField() # ["add","edit","view","delete"]
    ticketChildCategoryPermissions = ListField() # ["add","edit","view","delete"]
    complaintListPermissions = ListField() # ["view"]
    payinAvailableTimePermissions = ListField() # ["add","edit","view","delete""]
    overrideDatePermissions = ListField() # ["add","edit","view","delete"]
    kycApiPermissions = ListField() # ["add","edit","view","delete"]
    assignKycPermissions = ListField() # ["add","edit","view","delete"]
    smsApiPermissions = ListField() # ["add","edit","view","delete"]
    assignSmsPermissions = ListField() # ["add","edit","view","delete"]
    smsTemplatePermissions = ListField() # ["add","edit","view","delete"]
    dynamicProfileSwitchPermissions = ListField() # ["add","edit","view","delete"]
    rolesPermissions = ListField() # ["add","edit","view","delete"]
    switchprofilePermissions = ListField() # [edit]
    bulkprofileupdatePermissions = ListField() # [edit]
    apiSetupchargeCommissionsPermissions = ListField() # [view]
    merchantWiseTransactionPermissions = ListField() # [view]
    commissionStructurePermissions = ListField() # [view]
    unSettlementCommissionPermissions = ListField() # [view]
    generateSettlementCommissionPermissions = ListField() # [view]
    settlementCommissionPermissions = ListField() # [view]
    dashboardPermissions = ListField() # [view]
    locationsPermissions = ListField() # [view]
    holidaydatesPermissions = ListField() # ["add","edit","view","delete"]
    bankcodesPermissions = ListField() # ["add","edit","view","delete"]
    lockedMerchantPermissions = ListField() # ["view"]
    settlementPermissions = ListField() # ["view"]
    apiSecurityPermissions = ListField() # ["add","edit","view","delete"]
    kycApiChargePermissions = ListField() # ["edit"]
    verificationChargePermissions = ListField() # ["view"]
    pgSettlementsPermission = ListField() # ["add","edit","view"]
    mobilePrepaidPermission = ListField() # ["view"]
    circlesMasterPermission = ListField() # ["add","edit","view","delete"]
    prepaidOperationPermission = ListField() # ["add","edit","view","delete"]
    userwisePermission = ListField() # [edit]
    commissionTdsSetupPermission = ListField() # [view]
    adminPayoutDownloadReportPermission = ListField() #["add","edit","view"]
    mobileApkVersionPermission = ListField() # ["add","edit","view","delete"]
    onDemandSettlementChargesPermission = ListField() # ["add","edit","view"]
    adminIpAddressPermission = ListField() # ["add","delete","view"]
    downloadInvoicesPermission = ListField() # ["view"]
    goldUserBalancePermission = ListField() # ["view"]
    goldBuySuccessTransactionPermission = ListField() # ["view"]
    goldBuyPendingTransactionPermission = ListField() # ["view"]
    goldBuyPendingPaymentPermission = ListField() # ["view"]
    goldBuyFailedPermission = ListField() # ["view"]
    goldBuyPaymentFailedPermission = ListField() # ["view"]
    goldSellAllTransactionPermission = ListField() # ["view"]
    goldSellSuccessTransactionPermission = ListField() # ["view"]
    goldSellProcessTransactionPermission = ListField() # ["view"]
    goldSellFailedTransactionPermission = ListField() # ["view"]
    bankPendingPayoutTransactionPermission = ListField() # ["view"]
    apiSetupChargeCommissionslistPermissions = ListField() # ["view"]
    servicePaymentSetupChargeCommissionPermissions = ListField() # ["view"]
    servicePaymentSetupChargeCommissionTableListPermissions = ListField() # ["view"]
    chargeBackPermissions = ListField() # [""add","edit","view""]
    createdOn = DateTimeField()
    status = IntField(default=1)

class MasterDisputes(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class BankHolidays(Document):
    adminId = ReferenceField("SuperAdmin")
    occasion = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    selectDate = DateTimeField()

class LoginReportLogs(Document):
    userId = ReferenceField('Users')
    ipAddress = StringField()
    loginBrowser = StringField()
    deviceName = StringField()
    phoneNumber = StringField()
    latitude = StringField()
    longitude = StringField()
    os = StringField()
    userAgent = StringField()
    createdOn = DateTimeField()
    otpCode=StringField()
    wrongPasswordAttempts=IntField(default=0)
    attempts=IntField(default=0)
    authenticationEnabled=IntField(default=0)
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "status",
            "createdOn",
            ("userId", "createdOn")
        ]
    }


class PaymentLinks(Document):
    userId = ReferenceField("Users")
    email = StringField()
    mobileNumber = StringField()
    amount = FloatField(default=0.00)
    paymentPurpose = StringField()
    paymentLink = StringField()
    linkExpDate = DateTimeField()
    linkStatus = BooleanField()
    createdOn = DateTimeField()
    status = IntField(default=1) # status 3 means expired
    meta = {
        'indexes': [
            "userId",
            "paymentLink",
            "status",
        ]
    }


class PaymentButtons(Document):
    userId = ReferenceField("Users")
    email = StringField()
    mobileNumber = StringField()
    amount = FloatField(default=0.00)
    buttonPurpose = StringField()
    buttonLink = StringField()
    buttonLinkExpDate = DateTimeField()
    buttonColour = StringField()
    textColour = StringField()
    buttonName = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1) # status 3 means expired
    meta = {
        'indexes': [
            "userId",
            "buttonLink",
            "status",
        ]
    }

class ReminderSettings(Document):
    userId = ReferenceField("Users")
    enableReminder = BooleanField()
    smsReminder = BooleanField()
    emailReminder = BooleanField()
    linkExpiry = IntField() # 1 = 1day before expiry date, 2 = 2day before expiry date, 3 = 3day before expiry date, 4 = 4day before expiry date
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "enableReminder",
            "status",   
        ]
    }

class Contacts(Document):
    userId = ReferenceField("Users")
    name = StringField()
    email = StringField()
    mobileNumber = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "status",
           
        ]
    }

class PayOutLinks(Document):
    userId = ReferenceField("Users")
    name = StringField()
    email = StringField()
    mobileNumber = StringField()
    uniqueName = StringField()
    amount = FloatField(default=0.00)
    payOutLink = StringField()
    description = StringField()
    linkExpDate = DateTimeField()
    notifyPayee = BooleanField()
    allowBankAccount = BooleanField()
    allowUPI = BooleanField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "name",
            "payOutLink",
            "status", 
        ]
    }

# class FundTransfers(Document):
#   createdBy = ReferenceField("SuperAdmin")
#   userId = ReferenceField("Users")
#   slabId = ReferenceField("SetupChargeCommissions")
#   bankId = ReferenceField("MasterIFSCBank")
#   transactionAPIId = ReferenceField("TransactionAPI")
#   fundTransferType = StringField() # "instant" or "bulk"
#   accountType = StringField() # "bank" or "upi"
#   accountNumber = StringField()
#   accountIFSCCode = StringField()
#   beneficiaryName = StringField()
#   uniqueRequestNumber = StringField()
#   bankReferenceNumber = StringField()
#   amount = FloatField()
#   grandTotal = FloatField(default=0.00)
#   paymentMode = StringField() # "IMPS","NEFT","RTGS"
#   beneficiaryMail = StringField()
#   beneficiaryPhone = StringField()
#   narration = StringField()
#   merchantReferenceNumber = StringField() # orderId
#   upiId = StringField()
#   bankBranch = StringField()
#   transactionUniqueId = StringField()
#   bankName = StringField()
#   apiType = StringField() # "web" or "api"
#   transactionData = ListField()
#   payoutResponseCallBackData = ListField()
#   responseCallBackTime = DateTimeField()
#   createdOn = DateTimeField()
#   status = IntField(default=1)
#   previousBalance = FloatField(default=0.00)
#   currentBalance = FloatField(default=0.00)
#   transferType = StringField() #"Credit" or "Debit"
#   userType = StringField() #"admin"
#   errorMessage = StringField()
#   internalId = StringField()
#   commissionCharges = DictField()
#   pgOrderId = StringField() # merchantUniqueId + orderId
#   statusCount = IntField(default=0)
#   fundTransferId = ReferenceField("FundTransfers")
#   csvFileUpload = StringField()


class FundTransfers(Document):
    createdBy = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    slabId = ReferenceField("SetupChargeCommissions")
    bankId = ReferenceField("MasterIFSCBank")
    transactionAPIId = ReferenceField("TransactionAPI")
    fundTransferType = StringField() # "instant" or "bulk"
    accountType = StringField() # "bank" or "upi"
    accountNumber = StringField()
    accountIFSCCode = StringField()
    beneficiaryName = StringField()
    remitterAccountNumber = StringField()
    remitterAccountIFSCCode = StringField()
    remitterName = StringField()
    uniqueRequestNumber = StringField()
    bankReferenceNumber = StringField()
    amount = FloatField()
    grandTotal = FloatField(default=0.00)
    paymentMode = StringField() # "IMPS","NEFT","RTGS"
    beneficiaryMail = StringField()
    beneficiaryPhone = StringField()
    narration = StringField()
    merchantReferenceNumber = StringField() # orderId
    upiId = StringField()
    bankBranch = StringField()
    transactionUniqueId = StringField()
    bankName = StringField()
    apiType = StringField() # "web" or "api"
    transactionData = ListField()
    payoutResponseCallBackData = ListField()
    responseCallBackTime = DateTimeField()
    createdOn = DateTimeField()
    status = IntField(default=1) 
    previousBalance = FloatField(default=0.00)
    currentBalance = FloatField(default=0.00)
    transferType = StringField() #"Credit" or "Debit"
    userType = StringField() #"admin"
    errorMessage = StringField()
    internalId = StringField()
    commissionCharges = DictField()
    pgOrderId = StringField() # merchantUniqueId + orderId
    statusCount = IntField(default=0)
    fundTransferId = ReferenceField("FundTransfers")
    bulkFundtransferId = ReferenceField("BulkFundTransfers")
    beneficiaryId = ReferenceField("Beneficiaries")
    csvFileUpload = StringField()
    clientIp = StringField()
    transactionDate = StringField()
    requestData = ListField()
    statusCheckId = StringField()
    batchNumber = StringField()
    siteTitle=StringField()
    overallCommissionAmount = FloatField()
    aggregatorCharges = DictField()
    invoiceId = StringField()
    manualStatusChange = IntField(default=0)
    bankResponseStatus = IntField(default=1) # 1="Success" 2="Pending" 3="Failed"
    meta = {
        'indexes': [
            "merchantReferenceNumber",
            "userId",
            "fundTransferId",
            "createdOn",
            "status",
            "pgOrderId",
            "transferType",
            "fundTransferType",
            "transactionUniqueId",
            ("merchantReferenceNumber","userId"),
            ("userId","userType")
        ]
    }

class FundTransfersDummy(Document):
    createdBy = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    slabId = ReferenceField("SetupChargeCommissions")
    bankId = ReferenceField("MasterIFSCBank")
    transactionAPIId = ReferenceField("TransactionAPI")
    fundTransferType = StringField() # "instant" or "bulk"
    accountType = StringField() # "bank" or "upi"
    accountNumber = StringField()
    accountIFSCCode = StringField()
    beneficiaryName = StringField()
    uniqueRequestNumber = StringField()
    bankReferenceNumber = StringField()
    amount = FloatField()
    grandTotal = FloatField(default=0.00)
    paymentMode = StringField() # "IMPS","NEFT","RTGS"
    beneficiaryMail = StringField()
    beneficiaryPhone = StringField()
    narration = StringField()
    merchantReferenceNumber = StringField() # orderId
    upiId = StringField()
    bankBranch = StringField()
    transactionUniqueId = StringField()
    bankName = StringField()
    apiType = StringField() # "web" or "api"
    transactionData = ListField()
    payoutResponseCallBackData = ListField()
    responseCallBackTime = DateTimeField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    previousBalance = FloatField(default=0.00)
    currentBalance = FloatField(default=0.00)
    transferType = StringField() #"Credit" or "Debit"
    userType = StringField() #"admin"
    errorMessage = StringField()
    internalId = StringField()
    commissionCharges = DictField()
    pgOrderId = StringField() # merchantUniqueId + orderId
    statusCount = IntField(default=0)
    fundTransferId = ReferenceField("FundTransfersDummy")
    csvFileUpload = StringField()

class CustomerCare(Document):
    userId = ReferenceField("Users")
    email = StringField()
    helpNumber = StringField()
    address = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "status",  
        ]
    }

class WebHooks(Document):
    userId = ReferenceField("Users")
    webhookType = StringField() # "payout","auto_collect","payment_gateway"
    webhookLink = StringField()
    webhookStatus = BooleanField()
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "webhookType",
            "status",
            ("webhookType","userId")
        ]
    }

class ApiSecurities(Document):
    userId = ReferenceField("Users")
    apiType = StringField() # "payout","auto_collect","payment_gateway"
    ipAddressList= ListField()
    ipAddress = StringField()
    ipAddress2 = StringField()
    ipAddress3 = StringField()
    ipAddress4 = StringField()
    validFor = StringField() # "one_month","one_year","always"
    apiKey = StringField()
    secretKey = StringField()
    callBackUrl = StringField()
    returnUrl = StringField()
    validStartDate = DateTimeField()
    validEndDate = DateTimeField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "apiType",
            "status",
        ]
    }

class ApiRequestData(Document):
    userId = ReferenceField("Users")
    userOrderId = StringField() 
    orderId = StringField()
    requestData = ListField()
    reponseData = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "userOrderId",
            "status",
        ]
    }


class CreditNotifications(Document):
    userId = ReferenceField("Users")
    requestData = ListField()
    createdOn = DateTimeField()
    status = IntField()
    ecollectAccoutNo=StringField()
    vaAccoutNo=StringField()
    bankReferenceNumber=StringField()
    transferType=StringField()
    transactionDate=DateTimeField()
    transactionAmount=FloatField()
    remitterName=StringField()
    remitterAccountNumber=StringField()
    remitterIfscCode=StringField()
    remitterNote=StringField()
    apiKey=StringField()
    hashValue=StringField()
    transactionUniqueId=StringField()
    responseStatus=StringField()
    transactionAPIId=ReferenceField("TransactionAPI")
    meta = {
        'indexes': [
            "userId",
            "transactionAPIId",
            "ecollectAccoutNo",
            "bankReferenceNumber",
            "transactionUniqueId",
            "createdOn",
            "status",
        ]
    }

class ThirdPartyCreditNotifications(Document):
    userId = ReferenceField("ThirdPartyMerchants")
    requestData = ListField()
    createdOn = DateTimeField()
    status = IntField()
    ecollectAccoutNo=StringField()
    vaAccoutNo=StringField()
    bankReferenceNumber=StringField()
    transferType=StringField()
    transactionDate=DateTimeField()
    transactionAmount=FloatField()
    remitterName=StringField()
    remitterAccountNumber=StringField()
    remitterIfscCode=StringField()
    remitterNote=StringField()
    apiKey=StringField()
    hashValue=StringField()
    transactionUniqueId=StringField()
    responseStatus=StringField()
    transactionAPIId=ReferenceField("TransactionAPI")

class AdminPayoutBalances(Document):
    apiTransactionId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    createdOn = DateTimeField()
    status = IntField()

class VirtualAccounts(Document):
    adminId = ReferenceField("SuperAdmin")
    gatewayId = ReferenceField("TransactionAPI")
    generatedVirtualAccountId = ReferenceField("GeneratedVirtualAccounts")
    virtualAccountNumber = StringField()
    ifscCode = StringField()
    virtualPaymentAddress = StringField()
    remark = StringField()
    isThirdParty = BooleanField(default=False)
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "gatewayId",
            "generatedVirtualAccountId",
            "virtualAccountNumber",
            "status",
            ("virtualAccountNumber","status")
        ]
    }

class AssignedVirtualAccounts(Document):
    adminId = ReferenceField("SuperAdmin")
    virtualAccountId = ReferenceField("VirtualAccounts")
    userId = ReferenceField("Users")
    isThirdParty = BooleanField(default=False)
    thirdpartyUserId = ReferenceField("ThirdPartyMerchants")
    createdOn = DateTimeField()
    status = IntField()

class WhiteListAccounts(Document):
    userId = ReferenceField("Users")
    virtualAccountId = ReferenceField("VirtualAccounts")
    whiteListAccountNumber = StringField()
    ifscCode = StringField()
    bankBranch = StringField()
    bankName = StringField()
    bankDocumentName = StringField()
    document = StringField()
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "whiteListAccountNumber",
            "virtualAccountId",
            "userId",
            "bankName",
            "status",   
        ]
    }

class ApiDocumentGuide(Document):
    adminId = ReferenceField("SuperAdmin")
    title = StringField()
    description = StringField()
    multipleImages = ListField()
    priority = IntField()
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "title",
            "status",
        ]
    }

class PayoutBalances(Document):
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "userId",
            "transactionAPIId",
            "createdOn",
            "status",
        ]
    }

class PayoutBalanceLogs(Document):
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    amount=FloatField(default=0)
    grandTotal=FloatField(default=0)
    orderId=StringField()
    transferType = StringField() # "Credit" or "Debit"
    userType = StringField() # "admin" or "user"
    transactionId = StringField() # "admin" or "user"
    createdOn = DateTimeField()
    status = IntField()

class PayinBalances(Document):
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField()

class PayinBalanceLogs(Document):
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    amount=FloatField(default=0)
    grandTotal=FloatField(default=0)
    orderId=StringField()
    transferType = StringField() # "Credit" or "Debit"
    userType = StringField() # "admin" or "user"
    transactionId = StringField() # "admin" or "user"
    createdOn = DateTimeField()
    status = IntField()

class AdminOverallBalances(Document):
    adminId = ReferenceField("SuperAdmin")
    payinBalance = FloatField(default=0)
    payoutBalance = FloatField(default=0)
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField()

class AdminLogBalances(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    transferType = StringField() # "Payin" or "Payout"
    walletType = StringField() # "Credit" or "Debit"
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    amount = FloatField(default=0)
    comment = StringField()
    createdOn = DateTimeField()
    status = IntField()

class ApiSwitches(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    numberOfFails = IntField()
    maxAmount = FloatField(default=0)
    apiId = ReferenceField("TransactionAPI")
    apiId1 = ReferenceField("TransactionAPI")
    apiId2 = ReferenceField("TransactionAPI")
    apiId3 = ReferenceField("TransactionAPI")
    apiId4 = ReferenceField("TransactionAPI")
    apiId5 = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    walletType = StringField() # "payin" or "payout"
    status = IntField()

class PayoutDownloadReports(Document):
    userId = ReferenceField("Users")
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    reportType = StringField()
    fileSize = StringField()
    downloadFile = StringField()
    userType = StringField() # "user" or "admin"
    dateRange = StringField() # "one_day" or "last_7_days" or "last_30_days" or "custom" custom means startDate and endDate
    startDate = DateTimeField()
    endDate = DateTimeField()
    createdOn = DateTimeField()
    generatedOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "userId",
            "reportType",
            "walletType",
            "userType",
            "createdOn",
            "status",
        ]
    }

class ApiLogs(Document):
    userId = StringField() # This field is reference for "Users" table
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    transactionAPIId = StringField() # This field is reference for "TransactionAPI" table
    apiCallingType = StringField() # "intent" or "call_back" or "create_order" or "fund_transfer"
    apiCallingUrl = StringField()
    requestData = ListField()
    requestDate = DateTimeField()
    responseData = ListField()
    responseDate = DateTimeField()
    clientIp = StringField()
    platformType = StringField() # "api" or "web" or "android" or "ios"
    createdOn = DateTimeField()
    status = IntField()

class ClientLogs(Document):
    userId = ReferenceField("Users")
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    apiCallingType = StringField() # "intent" or "call_back" or "create_order" or "fund_transfer"
    apiCallingUrl = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    requestData = ListField()
    requestDate = DateTimeField()
    responseData = ListField()
    responseDate = DateTimeField()
    clientIp = StringField()
    platformType = StringField() # "api" or "web" or "android" or "ios"
    createdOn = DateTimeField()
    status = IntField()

class AdminLogs(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    transactionAPIId = ReferenceField("TransactionAPI")
    actionUrl = StringField() # action url
    actionType = StringField() # "login"
    actionDate = DateTimeField()
    platformType = StringField() # "admin"
    clientIp = StringField()
    requestData = ListField()
    updatedrequestData = ListField()
    loginBrowser = StringField()
    message = StringField()
    createdOn = DateTimeField()
    status = IntField()
    ### New Fields
    latitude = StringField()
    longitude = StringField()
    liveLocation = StringField()
    attempts = IntField()    

class RoutingSwitchCounts(Document):
    userId = ReferenceField("Users")
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    transactionAPIId = ReferenceField("TransactionAPI")
    numberOfFails = IntField()
    numberOfSuccess = IntField()
    maxVolume = FloatField()
    routingDate = DateTimeField()
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "userId",
            "walletType",
            "transactionAPIId",
            "status",
            "createdOn",
            ("userId", "transactionAPIId","createdOn")
        ]
    }

class ExceptionLogs(Document):
    userId = ReferenceField("Users")
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    apiCallingType = StringField() # "intent" or "call_back" or "create_order"
    apiCallingUrl = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    exceptionData = ListField()
    exceptionDate = DateTimeField()
    clientIp = StringField()
    platformType = StringField() # "api" or "web" or "android" or "ios"
    createdOn = DateTimeField()
    status = IntField()

class VelocityRuleEngine(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    minTxnAmount = IntField()
    maxTxnAmount = IntField()
    maxTxnsPerMinute = IntField()
    maxTxnsPerBenificiary = IntField()
    noOfFailsPerInsuffcientBalance = IntField()
    noOfFailsPerLoadFunds = IntField()
    maxTxnsSameAmountPerHour = IntField()
    noOfFailsPerBenificiary = IntField()
    paymentModeLimits = ListField()
    createdOn = DateTimeField()
    status = IntField()

class OtpChecks(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    otpCode = StringField()
    phoneNumber = StringField()
    emailId = StringField()
    attempts = IntField()
    otpReason = StringField() #fundtransfer,wallet to credit ,wallet to debit
    resendCount = IntField()
    createdOn = DateTimeField()
    status = IntField()
    defaultVerificationField=StringField(default="")
    meta = {
        'indexes': [
            "adminId",
            "userId",
            "defaultVerificationField",
            "status",
            ("adminId", "defaultVerificationField")
        ]
    }

class WebhookLogs(Document):
    userId = ReferenceField("Users") # This field is reference for "Users" table
    walletType = StringField() # "payin" or "payout" or "auto_collect"
    transactionAPIId = ReferenceField("TransactionAPI") # This field is reference for "TransactionAPI" table
    apiCallingType = StringField() # "intent" or "call_back" or "create_order" or "fund_transfer"
    apiCallingUrl = StringField()
    orderId = StringField()
    responseData = ListField()
    responseDate = DateTimeField()
    platformType = StringField() # "api" or "web" or "android" or "ios"
    createdOn = DateTimeField()
    status = IntField()

class VerifyNumbers(Document):
    adminId = ReferenceField("SuperAdmin")
    mobileNumber = StringField()
    verifyType = StringField() #"credit_debit","fundtransfer"
    createdOn = DateTimeField()
    status = IntField()

class Checkqueue(Document):
    amount = FloatField()
    previousamount = FloatField()
    currentamount = FloatField()
    itemValue = StringField()
    itemtype = StringField()
    createdOn = DateTimeField()

class CheckqueueBalance(Document):
    amount = FloatField()
    prevamount = FloatField()
    userId=IntField(default=0)
    createdOn = DateTimeField()
    updatedOn = DateTimeField()


class ChargeBacks(Document):
    userId = ReferenceField("Users")
    walletTransactionId = ReferenceField("WalletTransactions")
    goldTransactionId = ReferenceField("Transactions")
    transactionsWalletId = ReferenceField("GoldTransactions")
    transactionId = StringField()
    transactionReferenceType = StringField()
    chargebackUtr = StringField()
    pgOrderId = StringField()
    amount = FloatField()
    reason = StringField()
    chargeBackRaisedDate = DateTimeField()
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "userId",
            "status",
        ]
    }


class UsdtTransactions(Document):
    createdBy = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    amount = FloatField()
    grandTotal = FloatField(default=0.00)
    transactionData = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    previousBalance = FloatField(default=0.00)
    currentBalance = FloatField(default=0.00)
    transferType = StringField() #"Credit" or "Debit"
    userType = StringField() #"admin"
    transactionUniqueId = StringField()
    narration = StringField()
    orderId = StringField()
    errorMessage = StringField()
    statusCount = IntField(default=0)
    meta = {
        'indexes': [
            "userId",
            "status",
        ]
    }


class Documents(Document):
    adminId = ReferenceField("SuperAdmin")
    documentName = StringField()
    documentContent = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "documentName",
            "status",
        ]
    }

class InsufficientBalanceLogs(Document):
    userId = ReferenceField("Users")
    orderId = StringField()
    orderAmount = FloatField()
    walletAmount = FloatField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class kycApis(Document):
    adminId = ReferenceField("SuperAdmin")
    apiName = StringField()
    code = StringField()
    paramsList = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class AssignKyc(Document):
    adminId = ReferenceField("SuperAdmin")
    kycApiId = ReferenceField("kycApis")
    documentNameList = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class AssemblyMembers(Document):
    adminId = ReferenceField("SuperAdmin")
    distictName = StringField()
    assemblyName = StringField()
    mlaName = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class Departments(Document):
    adminId = ReferenceField("SuperAdmin")
    departmentName = StringField()
    superiorName = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class Grievances(Document):
    userId = ReferenceField("Users")
    name = StringField()
    mobileNumber = StringField()
    complaint = StringField()
    acknowledgementNumber = StringField(default="")
    departmentId = ReferenceField("Departments")
    assemblyMemberId = ReferenceField("AssemblyMembers")
    pincodeId = ReferenceField("Pincodes")
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "userId",
            "status",
        ]
    }

class GrievanceAdmin(Document):
    name = StringField()
    mobileNumber = StringField()
    password = StringField()
    email = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class GrievanceDepartmentUsers(Document):
    GrievanceAdminId=ReferenceField("GrievanceAdmin")
    userName = StringField()
    mobileNumber = StringField()
    password = StringField()
    email = StringField()
    departmentIdList = ListField(ReferenceField("Departments"))
    createdOn = DateTimeField()
    status = IntField(default=1)

    
class AdminRemarks(Document):
    commonId = StringField() # "userId" or "userKycId"
    adminId = ReferenceField("SuperAdmin")
    remark = StringField()
    methodType = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class GeneratedVirtualAccounts(Document):
    transactionAPIId = ReferenceField("TransactionAPI")
    adminId = ReferenceField("SuperAdmin")
    remark = StringField()
    virtualAccountPrefix = StringField()
    ifscCode = StringField()
    noOfAccounts = IntField(default=0)
    createdOn = DateTimeField()
    status = IntField(default=1)
    escrowDigitNumber=IntField()

class BusinessDocuments(Document):
    adminId = ReferenceField("SuperAdmin")
    name = StringField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    isRequired=BooleanField(default=False)

class AdminBanners(Document):
    adminId = ReferenceField("SuperAdmin")
    name=StringField()
    image=StringField()
    sorting=IntField(default=1)
    externalLink=StringField()
    googleScript=StringField()
    isBanner=BooleanField(default=True)
    isGrievance=BooleanField(default=False)
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "name",
            "status",
        ]
    }

class GeneratedCommissions(Document):
    userId = ReferenceField("Users")
    month = IntField()
    year = IntField()
    totalTxnAmount = FloatField()
    netCommissionAmount = FloatField()
    gstAmount = FloatField()
    gstValue = FloatField()
    tdsAmount = FloatField()
    tdsValue = FloatField()
    commissionAmount = FloatField()
    settlementedOn = DateTimeField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class CapBalanceLogs(Document):
    adminId = ReferenceField("SuperAdmin")
    userId = ReferenceField("Users")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    status = IntField(default=1)
    createdOn = DateTimeField()


#QR Codes Models

class AfflitatesQrCode(Document):
    affiliateId=ReferenceField("Affiliates")
    qrcodeType=StringField()
    qrcodeId=StringField()
    accepFixedAmount= BooleanField(default=False)
    acceptAmount=FloatField(default=0)
    businessName=StringField()
    description=StringField()
    qrcodeUrl=StringField()
    paymentRequestData=ListField()
    status=StringField()
    paymentType=StringField()
    responseList=ListField()
    createdOn=DateTimeField()

class VirtualAccountVerificationLogs(Document):
    encryptedData=StringField()
    decryptedDict=DictField()
    VANUm = StringField()
    bankRef = StringField()
    txnAmt = FloatField()
    remitterAc = StringField()
    remiterName = StringField()
    remitterAcType = StringField()
    remitterBank = StringField()
    remitterBranch = StringField()
    remitterBankifsc = StringField()
    errorMessage = StringField()
    createdOn = DateTimeField()
    status = IntField()

class VirtualAccountAlertLogs(Document):
    encryptedData=StringField()
    decryptedDict=DictField()
    customerCode = StringField()
    customerName = StringField()
    amount = FloatField()
    paymentType = StringField()
    poolingAccountNumber = StringField()
    dataKey = StringField()
    batchAmt = StringField()
    currency = StringField()
    creditDate = StringField()
    creditGenerationTime = StringField()
    vaNumber = StringField()
    utrNo = StringField()
    remitterName = StringField()
    remitterAccountNumber = StringField()
    productDescription = StringField()
    remittingBankName = StringField()
    ifscCode = StringField()
    errorMessage = StringField()
    createdOn = DateTimeField()
    status = IntField()


class ThirdPartyMerchants(Document):
    name=StringField()
    ipAddress = StringField()
    apiKey = StringField()
    secretKey = StringField()
    amount = FloatField()
    enablePayin = BooleanField(default=False)
    payinPaymentGatewayId = ReferenceField("TransactionAPI")
    payinWebhook = StringField()
    enablePayout = BooleanField(default=False)
    payoutPaymentGatewayId = ReferenceField("TransactionAPI")
    payoutWebhook = StringField()
    payoutVAWebhook = StringField()
    trnIdentifier = StringField()
    payoutValidationWebhook = StringField()
    payoutAlertsWebhook = StringField()
    payinBalance = FloatField()
    payoutBalance = FloatField()
    createdOn = DateTimeField()
    status = IntField()
    payinPaymentGatewaysList = ListField(ReferenceField("TransactionAPI"))
    payoutPaymentGatewaysList = ListField(ReferenceField("TransactionAPI"))

class ThirdPartyFundTransfers(Document):
    createdBy = ReferenceField("SuperAdmin")
    userId = ReferenceField("ThirdPartyMerchants")
    bankId = ReferenceField("MasterIFSCBank")
    transactionAPIId = ReferenceField("TransactionAPI")
    fundTransferType = StringField() # "instant" or "bulk"
    accountType = StringField() # "bank" or "upi"
    accountNumber = StringField()
    accountIFSCCode = StringField()
    beneficiaryName = StringField()
    remitterAccountNumber = StringField()
    remitterAccountIFSCCode = StringField()
    remitterName = StringField()
    uniqueRequestNumber = StringField()
    bankReferenceNumber = StringField()
    amount = FloatField()
    grandTotal = FloatField(default=0.00)
    paymentMode = StringField() # "IMPS","NEFT","RTGS"
    beneficiaryMail = StringField()
    beneficiaryPhone = StringField()
    narration = StringField()
    merchantReferenceNumber = StringField() # orderId
    upiId = StringField()
    bankBranch = StringField()
    transactionUniqueId = StringField()
    bankName = StringField()
    apiType = StringField() # "web" or "api"
    transactionData = ListField()
    payoutResponseCallBackData = ListField()
    responseCallBackTime = DateTimeField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    previousBalance = FloatField(default=0.00)
    currentBalance = FloatField(default=0.00)
    transferType = StringField() #"Credit" or "Debit"
    userType = StringField() #"admin"
    errorMessage = StringField()
    pgOrderId = StringField() # merchantUniqueId + orderId
    statusCount = IntField(default=0)
    fundTransferId = ReferenceField("ThirdPartyFundTransfers")
    bulkFundtransferId = ReferenceField("ThirdPartyBulkFundTransfers")
    csvFileUpload = StringField()
    clientIp = StringField()
    transactionDate = StringField()
    requestData = ListField()
    batchNumber = StringField()
    statusCheckId = StringField()

class ThirdPartyBulkFundTransfers(Document):
    userId = ReferenceField("ThirdPartyMerchants")
    BulkTransactionId = StringField()
    BatchNumber = StringField()
    BulkCsvFileUpload = StringField()
    status = IntField(default=2)
    totalAmount = FloatField(default=0.00)
    totalTransactionAmount = FloatField(default=0.00)
    totalTransactionCount = IntField(default=0)
    clientRequestData=ListField()
    requestData = ListField()
    responseData = ListField()
    errorMessage = ListField()
    ErrorType = StringField() # "ApiProvider" or "Internal"
    createdOn = DateTimeField()

class ThirdPartyBeneficiaries(Document):
    userId = ReferenceField("ThirdPartyMerchants")
    masterBankId = ReferenceField("MasterIFSCBank")
    remitterId = ReferenceField("Remitters")
    beneficiaryId = StringField()
    beneCodeList = ListField()
    fullName = StringField()
    mobileNumber = StringField()
    # verifyStatus = IntField()
    verifyStatus = BooleanField(default=False)
    accountNumber = IntField()
    ifscCode = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class BenificiaryAccounts(Document):
    userId = ReferenceField("Users")
    creditorAccountNumber = StringField()
    creditorName = StringField()
    ifscCode = StringField()
    bankId = ReferenceField("MasterIFSCBank")
    name = StringField()
    transactionReferenceNumber = StringField()
    beniValidationData = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class ServiceCharges(Document):
    adminId = ReferenceField("SuperAdmin")
    chargeType = StringField() # "benificiaryValidation" or "platformCharges"
    amountType = StringField() # "Percentage" or "Flat"
    chargeName = StringField()
    amount = FloatField(default=0)
    gstInclude = StringField()
    gstValue = FloatField()
    tdsInclude = StringField()
    tdsValue = FloatField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "chargeName",           
            "chargeType",           
            "status",                 
        ]
    }

class AxisEcollect(Document):
    clientRefNumber = StringField()
    Bene_acc_no=StringField()
    Req_type=StringField()
    Req_dt_time=StringField()
    Txn_amnt=StringField()
    Corp_code=StringField()
    Pmode=StringField()
    Sndr_acnt = StringField()
    Sndr_nm=StringField()
    Sndr_ifsc=StringField()
    Sndr_acnt1=StringField()
    Sndr_nm1=StringField()

class BankCodes(Document):
    adminId = ReferenceField("SuperAdmin")
    bankId = ReferenceField('MasterIFSCBank')
    transactionApiIdsList =ListField(ReferenceField('TransactionAPI'))
    bankCode=StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "status",
            "transactionApiIdsList",
            "bankId",
            ("transactionApiIdsList", "bankId")
        ]
    }

class SenderMails(Document):
    adminId = ReferenceField("SuperAdmin")
    mailType = StringField()
    mailsList = ListField()
    mobileNumber = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "status",
            "mailType",
            ("status","mailType")
        ]
    }

class BulkFundTransfers(Document):
    userId = ReferenceField("Users")
    BulkTransactionId = StringField()
    BatchNumber = StringField()
    BulkCsvFileUpload = StringField()
    status = IntField(default=2)
    totalAmount = FloatField(default=0.00)
    totalTransactionAmount = FloatField(default=0.00)
    totalTransactionCount = IntField(default=0)
    clientRequestData=ListField()
    requestData = ListField()
    responseData = ListField()
    errorMessage = ListField()
    ErrorType = StringField() # "ApiProvider" or "Internal"
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "userId",
            "BulkTransactionId",
            "BatchNumber",
            "createdOn",
            "status",
        ]
    }

class smsApis(Document):
    adminId = ReferenceField("SuperAdmin")
    apiName = StringField()
    code = StringField()
    paramsList = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)
 
 
class AssignSms(Document):
    adminId = ReferenceField("SuperAdmin")
    smsApiId = ReferenceField("smsApis")
    otpTypeList = ListField()
    createdOn = DateTimeField()
    status = IntField(default=1)

class SmsTemplates(Document):
    adminId = ReferenceField("SuperAdmin")
    smsApiId = ReferenceField("smsApis")
    otpTypeList = ListField()
    createdOn = DateTimeField()
    templateContent=StringField()
    status = IntField(default=1)

class ApiSetupChargeCommissions(Document):
    adminId = ReferenceField("SuperAdmin")
    # patternId = ReferenceField("Patterns")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    transactionAPIId = ReferenceField("TransactionAPI")
    # patternIdsList = ListField(ReferenceField("Patterns"))
    subPaymentModeIdsList = ListField(ReferenceField("SubPaymentModes"))
    paymentModeIdsList = ListField(ReferenceField("PaymentMode"))
    transactionAPIIdsList = ListField(ReferenceField("TransactionAPI"))
    slabName = StringField()
    priceType = StringField()  # Consider using an Enum for fixed options
    aggregatorType = StringField()  # "FLAT" or "PERCENTAGE"
    aggregatorValue = FloatField()
    gstInclude = StringField()  # "Yes" or "No"
    gstValue = FloatField()
    tdsInclude = StringField()  # "Yes" or "No"
    tdsValue = FloatField()
    commissionType = StringField()  # "FLAT" or "PERCENTAGE"
    commissionValue = FloatField() 
    chargeType = StringField()  # "FLAT" or "PERCENTAGE"
    chargeValue = FloatField() 
    status = IntField(default=1)
    createdOn = DateTimeField()  # Automatically set to current time
    priceRangeList = ListField()  # Consider defining structure for this
    holidayPrice = BooleanField() 
    meta = {
        'indexes': [
            "paymentModeId",
            "subPaymentModeId",
            "transactionAPIId",
            "subPaymentModeIdsList",
            "paymentModeIdsList",
            "transactionAPIIdsList",
            "holidayPrice",
            "status",
            
            
        ]
    } 

    


class Products(Document):
    productName = StringField()
    payinPaymentGatewayId = ReferenceField("TransactionAPI")
    sku = StringField()
    price = FloatField()
    startingPrice = FloatField()
    endingPrice = FloatField()
    description = StringField()
    createdOn = DateTimeField()
    status =  IntField()
    meta = {
        'indexes': [
            "productName",
            "payinPaymentGatewayId",
            "startingPrice",
            "endingPrice",
            "status",
        ]
    }

class AvailableTimings(Document):
    transactionType=StringField() ####### payout , payment_gateway
    isEnabled = BooleanField()
    sunEnabled = BooleanField()
    sunAvailableTimingsList = ListField()
    monEnabled = BooleanField()
    monAvailableTimingsList = ListField()
    tueEnabled = BooleanField()
    tueAvailableTimingsList = ListField()
    wedEnabled = BooleanField()
    wedAvailableTimingsList = ListField()
    thuEnabled = BooleanField()
    thuAvailableTimingsList = ListField()
    friEnabled = BooleanField()
    friAvailableTimingsList = ListField()
    satEnabled = BooleanField()
    satAvailableTimingsList = ListField()
    overridesDatesList = ListField()
    status = IntField()
    createdOn = DateTimeField()
    meta = {
        "indexes": [
            "status", 
            "transactionType",
            ("transactionType","status")
        ]
    }

class ProfileSwitch(Document):
    sunEnabled = BooleanField()
    sunDefaultEnable = BooleanField()
    sunProfileList = ListField()
    monEnabled = BooleanField()
    monDefaultEnable = BooleanField()
    monProfileList = ListField()
    tueEnabled = BooleanField()
    tueDefaultEnable = BooleanField()
    tueProfileList = ListField()
    wedEnabled = BooleanField()
    wedDefaultEnable = BooleanField()
    wedProfileList = ListField()
    thuEnabled = BooleanField()
    thuDefaultEnable = BooleanField()
    thuProfileList = ListField()
    friEnabled = BooleanField()
    friDefaultEnable = BooleanField()
    friProfileList = ListField()
    satEnabled = BooleanField()
    satDefaultEnable = BooleanField()
    satProfileList = ListField()
    overridesProfileList = ListField() 
    status = IntField()
    createdOn = DateTimeField()

class RandomCcCustomers(Document):
    customerName = StringField()
    customerEmail = StringField()
    customerPhoneNumber = StringField()

class InvoiceCompanyDetails(Document):
    adminId = ReferenceField("SuperAdmin")
    transactionApiIdsList = ListField(ReferenceField("TransactionAPI"))
    companyLogo = StringField()
    companyName = StringField()
    address = StringField()
    mobileNumber = StringField()
    email = StringField()
    status = IntField()
    createdOn = DateTimeField()
    invoiceTemplate = StringField()

class GoldUsers(Document):
    userId = ReferenceField("Users")
    transactionApiId = ReferenceField("TransactionAPI")
    apiReferenceId = StringField()
    goldBalanceAmount = FloatField()
    goldBalanceGrams = FloatField()
    sellGrams = FloatField() ## sellable Grams
    sellAmount = FloatField() ### amount added after a sell 
    mobileNumber = StringField()
    pinCode = StringField()
    email = StringField()
    kycVerify = BooleanField()
    aadharNumber = StringField()
    panNumber = StringField()
    registrationResponseData = ListField()
    status = IntField()
    createdOn = DateTimeField()
    meta = {
        'indexes': [
            "userId",
            "transactionApiId",
            "status",
            ("userId","transactionApiId")
        ]
    }


class GoldTransactions(Document):
    goldTransactionType = StringField()
    goldTransactionApiId = ReferenceField("TransactionAPI")
    goldUserId = ReferenceField("GoldUsers")
    userId = ReferenceField("Users")
    channelType = StringField()   ###### api or web or app 
    currentGoldPrice = FloatField()
    rateId = StringField()
    goldPurchaseAmount = FloatField()
    goldPurchaseGrams = FloatField()
    purchaseGrandTotal = FloatField()
    chargesDict = ListField() ########## list or dict confirm has keys ----  gstamount gstvalue gsttype chargesamount chargetype chargevalue
    paymentGatewayRequestBody = ListField()
    paymentGatewayResponseBody = ListField()
    goldApiRequestData = ListField()
    goldApiResponseData = ListField()
    paymentStatus = IntField()
    transactionUniqueId = StringField()
    statusCheckId = StringField()
    apiTransactionId = StringField()
    invoiceId = StringField()
    status=IntField()
    createdOn = DateTimeField()
    paymentAmount = FloatField(default=0.00)
    paymentGrandTotal=FloatField()
    paymentGatewayId = ReferenceField('TransactionAPI')
    currency = StringField()
    paymentType = StringField() #"IMPS","NEFT","Wallet","UPI"
    subPaymentMode = StringField()
    creditType = StringField() #Credit #Debit
    patternId = ReferenceField("Patterns")
    transactionId = StringField()
    transactionData = ListField()
    orderId = StringField() # Means merchant reference number
    userType = StringField()  #"user", "admin"
    location = StringField()
    platform = StringField()
    agent = StringField()
    customerName = StringField()
    customerEmail = StringField()
    customerPhonenumber = StringField()
    paymentLink = StringField() # To use this payment link  is search in PaymentLinks,PaymentButtons,PaymentPages Tables.
    errorMessage = StringField()
    paymentChannel = StringField()
    cardmasked = StringField()
    customerVpa = StringField()
    productName = StringField()
    setlementId = ReferenceField("Settlement")
    pgOrderId = StringField() # merchantUniqueId + orderId
    walletTransactionId = ReferenceField("WalletTransactions")
    slabId = ReferenceField("SetupChargeCommissions")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentMode = StringField()
    paymentStatusCheckId = StringField()
    commissionCharges=DictField()
    settlementStatus = IntField(default=1) # 1 means = "unsettled" 2 means = "settled"
    settlementedBy = ReferenceField('SuperAdmin')
    settlementedTime = DateTimeField()
    settlementedRemark = StringField()
    paymentDetails=StringField()
    comment = StringField()
    bankCode = StringField()
    bankName = StringField()
    cardType = StringField()
    bankRefId = StringField()
    responseCallBackTime = DateTimeField()
    payInResponseCallBackData = ListField()
    paymentApiresponseData = ListField()
    bankStatus=IntField() ### for sell since it doesnt have payment status 
    bankAccountNumber = StringField()
    ifscCode = StringField()
    originalBankName = StringField()
    meta = {
        'indexes': [
            "goldTransactionType",
            "goldTransactionApiId",
            "goldUserId",
            "userId",
            "apiTransactionId",
            "invoiceId",
            "walletTransactionId",
            "pgOrderId",
            "status",
            "paymentStatus",
            "statusCheckId",
            "transactionId",
            "createdOn",
            ("goldTransactionApiId","apiTransactionId")
        ]
    }

class GoldBalanceLogs(Document):
    userId = ReferenceField("Users")
    goldUserId = ReferenceField("GoldUsers")
    transactionAPIId = ReferenceField("TransactionAPI")
    previousBalance = FloatField(default=0)
    currentBalance = FloatField(default=0)
    amount=FloatField(default=0)
    grandTotal=FloatField(default=0)
    orderId=StringField()
    transferType = StringField() # "Credit" or "Debit"
    userType = StringField() # "admin" or "user"
    transactionId = StringField() # "admin" or "user"
    createdOn = DateTimeField()
    status = IntField()

class AutoBeneficiaries(Document):
    adminId = ReferenceField("SuperAdmin")
    transactionAPIId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)

class InvalidBenificiaryLogs(Document):
    userId = ReferenceField("Users")
    accountNumber = StringField()
    beneficiaryName = StringField()
    ifscCode = StringField()
    createdOn = DateTimeField()
    status = IntField(default=1)


class AssignGoldPaymentGateway(Document):
    adminId = ReferenceField("SuperAdmin")
    goldTransactionApiIdsList = ListField(ReferenceField("TransactionAPI"))
    paymentGatewayApiId = ReferenceField("TransactionAPI")
    createdOn = DateTimeField()
    status = IntField(default=1)
    meta = {
        'indexes': [
            "goldTransactionApiIdsList",
            "paymentGatewayApiId",
            "status",
        ]
    }

class MultipleAppSites(Document):
    adminId = ReferenceField("SuperAdmin")
    siteTitle=StringField()
    siteCode=StringField()
    siteUrl=StringField()
    status=IntField(default=1)
    createdOn=DateTimeField()
    enableMerchantSettlement = BooleanField(default=False)
    instantSettlementType = BooleanField(default=False)
    paylaterSettlementType = BooleanField(default=False)
    defaultSettlement= BooleanField() # True means = "Instant" and False means = "T+1" and None
    defaultSelect = StringField()#"instant" or "paylater"
    # settlementTypesList = ListField() #[{"settlementType":"Instant","defaultSelect":True},{"settlementType":"T+1","defaultSelect":False}]
    meta = {
        'indexes': [
            "siteTitle",
            "siteCode",
            "status",
        ]
    }
    
class DuplicateFundtransfers(Document):
    userId = ReferenceField("Users")
    accountNumber=StringField()
    createdOn=DateTimeField()


class CompanyCommissions(Document):
    userId = ReferenceField("Users")
    userPatternId = ReferenceField("Patterns")
    slabId =ReferenceField("ApiSetupChargeCommissions")
    paymentModeId =ReferenceField("PaymentMode")
    subPaymentModeId =ReferenceField("SubPaymentModes")
    commissionfor = StringField() # "Payin" or "Payout" or "Service"
    transferType = StringField() 
    transactionId = StringField()
    transactionAPIId = ReferenceField("TransactionAPI")
    totalAmount = FloatField()
    comment = StringField()
    walletId=ReferenceField("WalletTransactions")
    childCommissionCharges=DictField()
    aggregatorCommissionCharges = DictField()
    commissionAmount = FloatField()
    aggregatorCommissionAmount = FloatField()
    createdOn = DateTimeField()
    status = IntField(default=1)
    settlementStatus = IntField(default=1)
    transactionCommissionCharges = DictField()
    siteTitle=StringField()


class HolidayDates(Document):
    holidayDate = DateField()
    holidayDateTimings = ListField()
    status = IntField(default=1)
    createdOn = DateTimeField()
    meta = {
        "indexes": [
            "status",              
            "holidayDate",         
        ]
    }

class PgSettlements(Document):
    adminId = ReferenceField("SuperAdmin")
    transactionAPIId = ReferenceField("TransactionAPI")
    settlementAmount = FloatField()
    additionalChargeType = StringField()
    additionalChargeValue = FloatField()
    additionalChargeAmount = FloatField()
    gstChargeType = StringField()
    gstChargeValue = FloatField()
    gstChargeAmount = FloatField()
    uploadFilePath = StringField()
    settlementDateTime = DateTimeField()
    status = IntField(default=1)
    createdOn = DateTimeField()

class SiteAssignPaymentgateways(Document):
    adminId = ReferenceField("SuperAdmin")
    siteId = ReferenceField("MultipleAppSites")
    transactionApiId = ReferenceField("TransactionAPI")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    instantSettlement = BooleanField(default=False)
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        "indexes": [
            "siteId",              
            "transactionApiId",         
            "paymentModeId",         
            "subPaymentModeId",
            ("siteId","paymentModeId","subPaymentModeId","transactionApiId","status")         
        ]
    }

class MultipleAppSitesAvailableTimings(Document):
    transactionType=StringField() ####### payout , payment_gateway
    siteId = ReferenceField("MultipleAppSites")
    isEnabled = BooleanField()
    sunEnabled = BooleanField()
    sunAvailableTimingsList = ListField()
    monEnabled = BooleanField()
    monAvailableTimingsList = ListField()
    tueEnabled = BooleanField()
    tueAvailableTimingsList = ListField()
    wedEnabled = BooleanField()
    wedAvailableTimingsList = ListField()
    thuEnabled = BooleanField()
    thuAvailableTimingsList = ListField()
    friEnabled = BooleanField()
    friAvailableTimingsList = ListField()
    satEnabled = BooleanField()
    satAvailableTimingsList = ListField()
    overridesDatesList = ListField()
    status = IntField()
    createdOn = DateTimeField()

class MobileApkVersions(Document):
    adminId = ReferenceField("SuperAdmin")
    siteId = ReferenceField("MultipleAppSites")
    versionNumber = StringField()
    downloadLink = StringField()
    createdOn = DateTimeField()
    status = IntField()

class KycApiCharges(Document):
    adminId = ReferenceField("SuperAdmin")
    documentType = StringField()
    kycApiId = ReferenceField("kycApis")
    gstInclude = StringField()  # "Yes" or "No"
    gstValue = FloatField()
    tdsInclude = StringField()  # "Yes" or "No"
    tdsValue = FloatField()
    chargeType = StringField()  # "FLAT" or "PERCENTAGE"
    chargeValue = FloatField() 
    createdOn = DateTimeField()
    status = IntField()

class ThirdpartyApiCharges(Document):
    userId = ReferenceField("Users")
    kycApiId = ReferenceField("kycApis")
    aggregatorCharges = DictField()
    commissionCharges = DictField()
    overallCommissionAmount = FloatField()
    verificationNumber = StringField()
    verificationType = StringField() # "aadhar" or "bank" or "pan" or "cin"
    apiRequestData = ListField()
    apiResponseData = ListField()
    createdOn = DateTimeField()
    status = IntField()


class ApiRandomPrices(Document):
    userId = ReferenceField("Users")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    bankId = ReferenceField("MasterIFSCBank")
    productName = StringField()
    orderId = StringField()
    issuingBank = StringField()
    paymentMode = StringField()
    subPaymentMode = StringField() 
    priceRangeList = ListField()
    transactionApiId = ReferenceField("TransactionAPI")
    cardLast4Digits = StringField()
    cvv = StringField()
    vpa = StringField()
    actualPrice = FloatField()
    createdOn = DateTimeField()
    status = IntField()

class PrepaidMobileSetup(Document):
    enablePrepaid = BooleanField(default=False)
    prepaidProviderId = ReferenceField("TransactionAPI")
    prepaidPgId = ReferenceField("TransactionAPI")
    adminId = ReferenceField("SuperAdmin")
    serviceType = StringField() # "bbps" or "prepaid"
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "serviceType",
            "enablePrepaid",
            "status",
        ]
    }
 
class CommissionTdsSetup(Document):
    adminId = ReferenceField("SuperAdmin")
    tdsLimitAmount=FloatField()
    tdsChargePer=FloatField()
    createdOn = DateTimeField()
    updatedOn = DateTimeField()
    status = IntField()

 
class DailyTrackingBalance(Document):
    totalPayinPendingBalance=FloatField()
    totalPayoutPendingBalance=FloatField()
    bankClosingBalance=FloatField()
    totalPayinTransactionAmount=FloatField()
    totalPayoutDebitAmount=FloatField()
    totalPayoutCreditAmount=FloatField()
    merchantWisePayoutBalanceExcel=StringField()
    createdOn = DateTimeField()
    status = IntField()


class UsersSavedServices(Document):
    userId = ReferenceField("Users")
    operatorId = ReferenceField("Operators")
    serviceId= ReferenceField("Service")
    payloadList = ListField()
    operatorCustomerParametersDict = DictField()
    operatorName = StringField() 
    operatorNumber = StringField() 
    fetchResponseList = ListField()
    createdOn = DateTimeField()
    status = IntField()
    meta = {
        'indexes': [
            "userId",
            "operatorId",
            "serviceId",
            "status",
        ]
    }

class OnDemandSettlementCharges(Document):
    chargeName = StringField()
    paymentGatewayIdsList = ListField(ReferenceField("TransactionAPI"))
    holidayCalculation = BooleanField()
    maxDays = IntField()
    priceType = StringField()
    chargeType = StringField()
    chargeValue = FloatField()
    gstInclude = StringField()
    gstValue = FloatField()
    tdsInclude = StringField()
    tdsValue = FloatField()
    createdOn = DateTimeField()
    status = IntField()

    meta = {
        'indexes': [
            "chargeName",
            "paymentGatewayIdsList",
            "priceType",
            "chargeType",
            "status",
            "createdOn",
            ( "chargeName", "chargeType","priceType")
        ]
    }

class AdminIpAdress(Document):
    createdBy = ReferenceField("SuperAdmin")
    ipAddress = StringField()
    otpCheckId = StringField()
    deletedBy = ReferenceField("SuperAdmin")
    createdOn = DateTimeField()
    status = IntField()


class ServicePaymentSetupChargeCommission(Document):
    adminId = ReferenceField("SuperAdmin")
    # patternId = ReferenceField("Patterns")
    paymentModeId = ReferenceField("PaymentMode")
    subPaymentModeId = ReferenceField("SubPaymentModes")
    # transactionAPIId = ReferenceField("TransactionAPI")
    # patternIdsList = ListField(ReferenceField("Patterns"))
    subPaymentModeIdsList = ListField(ReferenceField("SubPaymentModes"))
    paymentModeIdsList = ListField(ReferenceField("PaymentMode"))
    # transactionAPIIdsList = ListField(ReferenceField("TransactionAPI"))
    # slabName = StringField()
    servicePaymentType = StringField()
    priceType = StringField()  # Consider using an Enum for fixed options
    # aggregatorType = StringField()  # "FLAT" or "PERCENTAGE"
    # aggregatorValue = FloatField()
    gstInclude = StringField()  # "Yes" or "No"
    gstValue = FloatField()
    tdsInclude = StringField()  # "Yes" or "No"
    tdsValue = FloatField()
    # commissionType = StringField()  # "FLAT" or "PERCENTAGE"
    # commissionValue = FloatField() 
    chargeType = StringField()  # "FLAT" or "PERCENTAGE"
    chargeValue = FloatField() 
    status = IntField(default=1)
    createdOn = DateTimeField()  # Automatically set to current time
    priceRangeList = ListField()  # Consider defining structure for this
    # holidayPrice = BooleanField() 
    meta = {
        'indexes': [
            "paymentModeId",
            "subPaymentModeId",
            "subPaymentModeIdsList",
            "paymentModeIdsList",
            "servicePaymentType",
            "status",
            
        ]
    }