from mongoengine import *

###################################### Easy Rupai Models Here ############################
class Regions(Document):
	adminId = ReferenceField("SuperAdmin")
	regionName = StringField()
	regionType = StringField()
	status = IntField(default=1)
	createdOn = DateTimeField()

class Countries(Document):
	adminId = ReferenceField("SuperAdmin")
	countryName = StringField()
	regionId = ReferenceField("Regions")
	regex = StringField()
	countryCode = StringField()
	countryFlag = StringField()
	status = IntField(default=1)
	createdOn = DateTimeField()

class States(Document):
	adminId = ReferenceField("SuperAdmin")
	stateName = StringField()
	countryId = ReferenceField("Countries")
	status = IntField(default=1)
	createdOn = DateTimeField()

class Cities(Document):
	adminId = ReferenceField("SuperAdmin")
	cityName = StringField()
	stateId = ReferenceField("States")
	status = IntField(default=1)
	createdOn = DateTimeField()

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

class Pincodes(Document):
	adminId = ReferenceField("SuperAdmin")
	pincode = IntField()
	latitude = StringField()
	longitude = StringField()
	blockPoId = ReferenceField("BlocksPos")
	status = IntField(default=1)
	createdOn = DateTimeField()

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()

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()

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()
	
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()


class Service(Document):
	adminId = ReferenceField("SuperAdmin")
	serviceName = StringField()
	serviceType = StringField()
	walletId = ReferenceField('Wallet')
	categoryId = ReferenceField('Categories')
	serviceGroupingId = 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()


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()

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()


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()

class OperatorGrouping(Document):
	adminId = ReferenceField("SuperAdmin")
	groupName = StringField()
	operatorId = ReferenceField('Operators')
	operatorParameterId = ReferenceField('OperatorParameter')
	value = StringField()
	status = IntField(default=1)
	createdOn = DateTimeField()

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()

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()

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


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)

class MasterIFSCBank(Document):
	adminId = ReferenceField("SuperAdmin")
	bankName = StringField()
	bankCode = StringField()
	priority = StringField()
	image = StringField()
	remark = StringField()
	status = IntField(default=1)
	createdOn = DateTimeField()

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()

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()


class TicketSubCategory(Document):
	adminId = ReferenceField("SuperAdmin")
	name = StringField()
	categoryId = ReferenceField("TicketCategory")
	icon = StringField()
	priority = IntField()
	status = IntField(default=1)
	createdOn = DateTimeField()

class TicketChildCategory(Document):
	adminId = ReferenceField("SuperAdmin")
	name = StringField()
	subCategoryId = ReferenceField("TicketSubCategory")
	icon = StringField()
	priority = IntField()
	status = IntField(default=1)
	createdOn = DateTimeField()


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 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)

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()
	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)

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()
	status = IntField(default=1)
	createdOn = DateTimeField()

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()

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-

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)

class Beneficiaries(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 = IntField()
	ifscCode = StringField()
	transactionAPIId = ReferenceField("TransactionAPI")
	createdOn = DateTimeField()
	status = IntField(default=1)

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()
	ifscCode = StringField()
	accountNumber = StringField()
	billPayment = StringField()
	accountHolderName = StringField()
	errorMessage = StringField()
	transactionData = ListField()
	billPaymentRequestData = ListField()
	billPaymentResponseData = ListField()
	createdOn = DateTimeField()
	payload=DictField()
	headers=DictField()
	status = IntField(default=1) #1-Success #0-Failed #2-Pending #3-Pending

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)


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")

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)
	status = IntField(default=1)
	createdOn = DateTimeField()

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()


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()

class PaymentMode(Document):
	adminId = ReferenceField("SuperAdmin")
	paymentMode = StringField()
	walletType = StringField() #"Payout" or "Payin"
	hasGroup = StringField() # "Yes" or "No"
	groupType = StringField() # banks
	image = StringField()
	status = IntField(default=1)
	createdOn = DateTimeField()

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()

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()

class MerchantSubCategories(Document):
	adminId = ReferenceField("SuperAdmin")
	name = StringField()
	categoryId = ReferenceField("MerchantCategories")
	status = IntField(default=1)
	isUserWise = BooleanField(default=False)
	createdOn = DateTimeField()

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)

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()

# 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()
	cardBinEnable=BooleanField(default=False)
	isSeamless=BooleanField()
	priceType = StringField()
	preAuthorization=BooleanField(default=False)

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"]
	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)


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

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

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)

class Contacts(Document):
	userId = ReferenceField("Users")
	name = StringField()
	email = StringField()
	mobileNumber = StringField()
	createdOn = DateTimeField()
	status = IntField(default=1)

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)

# 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()

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)

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)

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()
	validStartDate = DateTimeField()
	validEndDate = DateTimeField()
	createdOn = DateTimeField()
	status = IntField(default=1)

class ApiRequestData(Document):
	userId = ReferenceField("Users")
	userOrderId = StringField() 
	orderId = StringField()
	requestData = ListField()
	reponseData = ListField()
	createdOn = DateTimeField()
	status = IntField(default=1)

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")

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()

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()

class ApiDocumentGuide(Document):
	adminId = ReferenceField("SuperAdmin")
	title = StringField()
	description = StringField()
	multipleImages = ListField()
	priority = IntField()
	createdOn = DateTimeField()
	status = IntField()

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

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()

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()

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()

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()
	attempts = IntField()
	otpReason = StringField() #fundtransfer,wallet to credit ,wallet to debit
	createdOn = DateTimeField()
	status = IntField()

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")
	adjustDate = DateTimeField()
	adjustType = StringField()
	remitter = StringField()
	beneficiaryName = StringField()
	reasonCode = StringField()
	remarks = StringField()
	payee = StringField()
	rrn = StringField()
	upiTxnId = StringField()
	referId = StringField()
	pgOrderId = StringField()
	txnAmount = FloatField()
	adjAmount = FloatField()
	txnDate = DateTimeField()
	createdOn = DateTimeField()
	status = IntField()

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)

class Documents(Document):
	adminId = ReferenceField("SuperAdmin")
	documentName = StringField()
	documentContent = StringField()
	createdOn = DateTimeField()
	status = IntField(default=1)

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)

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()

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=DictField()
	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=DictField()
	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"
	amount = FloatField(default=0)
	gstInclude = StringField()
	gstValue = FloatField()
	tdsInclude = StringField()
	tdsValue = FloatField()
	createdOn = DateTimeField()
	status = IntField(default=1)

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)

class SenderMails(Document):
	adminId = ReferenceField("SuperAdmin")
	mailType = StringField()
	mailsList = ListField()
	mobileNumber = ListField()
	createdOn = DateTimeField()
	status = IntField(default=1)

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()

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

class Products(Document):
	productName = StringField()
	payinPaymentGatewayId = ReferenceField("TransactionAPI")
	sku = StringField()
	price = FloatField()
	startingPrice = FloatField()
	endingPrice = FloatField()
	description = StringField()
	createdOn = DateTimeField()
	status =  IntField()

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()

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()