remoteEaze
Database

Database Schema

Complete reference for the RemoteEaze database schema as of 31/12/2025. Covers all tables, relationships, enums, and common patterns.

Schema Snapshot

This document reflects the Prisma schema as of 31 December 2025. The schema lives in packages/database/prisma/schema/.

Common Fields

Nearly every table in the schema shares a set of standard fields. These are documented once here and omitted from individual table descriptions to avoid repetition.

Audit Fields (present on all tables)

FieldTypeDescription
idString @id @default(cuid())Primary key. CUID format unless noted otherwise.
versionInt @default(1)Optimistic concurrency counter. Incremented on every update.
customFieldsJson?Dynamic custom fields. GIN-indexed in PostgreSQL for efficient querying.
createdAtDateTime @db.Timestamptz(6)Record creation timestamp (UTC).
updatedAtDateTime @updatedAtAuto-updated by Prisma on every mutation.
deletedAtDateTime?Soft delete marker. All queries filter deletedAt: null.

Multi-Tenant Isolation

FieldTypeDescription
tenantIdStringLoose reference to License.id (no FK). Every query is scoped by this field. Global reference tables (Nation, Language, Currency) do not have tenantId.

Maker-Checker Fields (on workflow-enabled entities)

Entities that go through an approval workflow carry these additional fields:

FieldTypeDescription
recordStatusRecordStatusWorkflow state. See the RecordStatus enum below.
createdByIdString?ID of the user who created the record (the "maker").
lastModifiedByIdString?ID of the user who last modified the record.
rejectReasonString?Reason for rejection, set by the "checker" when returning to maker.

The workflow follows: CAPTURED -> PENDING_AUTH_L3/L2/L1 (depending on required approval levels) -> AUTHORIZED, or REJECTED / DENIED.


A. System Infrastructure

CustomFieldDefinition

Table: remoteEaze_custom_field_definitions Purpose: Defines dynamic (tenant-configurable) columns that can be attached to any entity type. Each definition specifies the field key, label, data type, validation rules, default value strategy, and UI rendering config.

Key FieldTypeDescription
entityTypeStringThe entity this field applies to (e.g. "customer", "account").
fieldKeyStringMachine key for the field (unique per tenant + entity).
fieldLabelStringHuman-readable label for UI display.
fieldTypeCustomFieldTypeData type: STRING, NUMBER, BOOLEAN, DATE, COMPUTED, JSON, SELECT.
isRequiredBooleanWhether the field is mandatory.
displayOrderIntOrdering hint for UI rendering.
defaultValueString?Static default value.
defaultStrategyDefaultStrategy?How defaults are determined: STATIC, RULE_BASED, or COMPUTED.
defaultRulesJson?Rules for RULE_BASED defaults.
computedFormulaString?Formula for COMPUTED defaults.
validation / validationRulesJson?Validation configuration.
uiConfigJson?UI rendering hints (widget type, placeholder, etc.).
isActiveBooleanWhether the field definition is currently active.

Unique constraint: [tenantId, entityType, fieldKey]

ActivityLog

Table: remoteEaze_activity_logs Purpose: Immutable audit trail capturing the "Who, What, Where, When, and Why" of every significant action. Uses loose references (no FKs) so audit history survives entity deletion.

See the dedicated Activity Logs documentation for the full architecture, tiered logging strategy, sensitivity/sanitization model, and usage guide.

Key FieldTypeDescription
idStringCustom time-sorted format: YYYYMMDD-HHMMSSms-RAND.
actorId / actorType / actorNameVariousWho performed the action (snapshot at time of action).
actionStringAction identifier, e.g. "customer.create", "auth.signin".
entityType / entityIdStringWhat entity was affected.
timestampDateTimeWhen the action actually occurred (UTC).
changeBefore / changeAfter / diffJson?State before/after mutation, plus calculated delta.
recordStatusBefore / recordStatusAfterString?Workflow state transitions.
statusLogStatusSUCCESS, FAILURE, or PENDING.
isSensitiveBooleanFlags rows containing encrypted PII (HIGH sensitivity).
retentionPolicyStringRetention rule: "90_days", "1_year", "2_years", "7_years".
moduleString?Business module: "AUTH", "LOANS", etc.
tagsString[]Filterable tags (GIN indexed).

Indexes: Optimized for tenant+date range, action filtering, entity history, user timeline, trace correlation, status analysis, and tag/custom field queries (GIN).

Sequence

Table: remoteEaze_sequences Purpose: Atomic auto-incrementing sequence generator used to produce business keys (customer numbers, staff numbers, agent numbers, account numbers). Supports configurable prefix, zero-padding, year inclusion, and yearly reset.

Key FieldTypeDescription
nameStringSequence identifier, e.g. "CUSTOMER", "ACCOUNT", "AGENT", "STAFF".
currentBigIntCurrent counter value. Incremented atomically in a transaction.
prefixString?Static prefix prepended to the generated value, e.g. "STF-", "AGT-".
padLengthIntZero-pad the sequence number to this length (default 10).
includeYearBooleanWhether to embed the year in the generated value.
resetYearlyBooleanWhether to reset the counter to 0 each January.
lastResetYearInt?Tracks when the last yearly reset occurred.

Unique constraint: [tenantId, name]


B. Tenant & Organization

License

Table: remoteEaze_licenses Purpose: The root tenant/organization record. Each License represents one organization using the system. Contains company information, contract details, financial configuration, password policies, and session policies.

Key FieldTypeDescription
companyNameStringFull company name.
companyAbbreviationString @uniqueAuto-generated 3-4 char abbreviation (e.g. "KCB", "STC"). Used in branch code generation.
slugString @uniqueURL-safe identifier, e.g. "kcb-bank".
licenseCodeString @uniqueUnique license/contract identifier.
licenseExpiryDateDateTime @db.DateContract expiry. Evaluated at EOD in tenant's timezone.
modulesString[]Licensed modules: ["CORE", "LORG", "LP"].
timezoneStringIANA timezone, e.g. "Africa/Nairobi".
financialYearCycleStringFinancial year configuration, e.g. "20251231M1231".
accountingTypeString"CASH" or "ACCRUAL".
passwordMin*IntPassword policy settings (length, numbers, uppercase, special chars, lowercase).
inactivityTimeoutIntSession inactivity timeout in seconds (default 600).
passwordChangeIntervalIntDays between forced password changes (default 90).
isActiveBooleanWhether the license is active.

Branch

Table: remoteEaze_branches Purpose: Organizational branches with parent-child hierarchy. Each branch has an auto-generated code and belongs to a nation and currency. On authorization, ProductBalance rows are created for all applicable products.

Key FieldTypeDescription
codeStringAuto-generated: {CNA}-{RCC}-{BBB}-0000. CNA = company abbreviation, RCC = country alpha-3, BBB = branch sequence (000 = Lead).
nameStringBranch display name.
branchTypeBranchTypeLEAD (head office) or BRANCH.
reportingBranchIdString?Parent branch FK (self-referencing hierarchy).
financialReportBooleanWhether the branch has an independent P&L (default true).
nonWorkingDaysJson?Array of day-of-week integers, e.g. [0, 6] for Saturday/Sunday.
nationCodeStringFK to Nation (country).
currencyCodeStringFK to Currency (branch default currency).

Unique constraint: [tenantId, code]

Maker-Checker: Yes.

Department

Table: remoteEaze_departments Purpose: Organizational departments/units with hierarchy. Used for access control (deptUnitRestrict on Product) and user assignment.

Key FieldTypeDescription
codeStringFormat: "DDDD-UUUU" (department-unit).
descriptionStringDepartment/unit name.
reportingToIdString?Parent department FK (self-referencing hierarchy).

Unique constraint: [tenantId, code]

CostCentre

Table: remoteEaze_cost_centres Purpose: Cost allocation centres for financial reporting and user assignment.

Key FieldTypeDescription
codeStringCost centre code.
centreNameStringDisplay name.
descriptionString?Optional description.

Unique constraint: [tenantId, code]

TenantCurrency

Table: remoteEaze_tenant_currencies Purpose: Currencies enabled per tenant with foreign exchange rates. One currency per tenant is marked as the base currency.

Key FieldTypeDescription
currencyCodeStringFK to Currency (ISO 4217).
buyRateDecimal(20,4)Buying rate.
sellRateDecimal(20,4)Selling rate.
midRateDecimal(20,4)Mid-market rate.
isBaseCurrencyBooleanWhether this is the tenant's base (home) currency.

Unique constraint: [tenantId, currencyCode]


C. Authentication & Access Control

RemoteEaze_userProfile

Table: remoteEaze_userProfile Purpose: User accounts. Integrates with Better-Auth for authentication while carrying extensive business fields for the financial system. Users can be INTERNAL (staff), EXTERNAL (field agents), or SYSTEM (super admins).

Key FieldTypeDescription
name / emailStringBetter-Auth required fields.
emailVerifiedBooleanWhether email has been verified.
mustChangePasswordBooleanForce password change on next login.
passwordLastChangedAtDateTime?For enforcing passwordChangeInterval from License.
tenantIdString"SYSTEM" for super admins, licenseId for org users.
staffNumberString?Format: "STF-2025-001". Required for INTERNAL users.
userTypeUserTypeINTERNAL, EXTERNAL, or SYSTEM.
roleIdStringFK to Role. Determines permissions.
branchIdString?Current branch assignment. Optional for SYSTEM users.
branchRestrictJson?Array of branch IDs the user can access.
dataAccessScopeDataAccessScopeSYSTEM, ORGANIZATION, BRANCH, or SELF. Controls data visibility.
reportingToIdString?Self-referencing hierarchy (manager).
languageCodeStringDefault "EN".

Unique constraints: [email], [tenantId, staffNumber]

RemoteEaze_userSession

Table: remoteEaze_userSession Purpose: Active user sessions managed by Better-Auth. Stores session tokens, expiry, and client context (IP, user agent).

RemoteEaze_authAccount

Table: remoteEaze_authAccount Purpose: Authentication provider accounts (Better-Auth). Links users to credential or OAuth providers with access/refresh tokens.

RemoteEaze_accountVerification

Table: remoteEaze_accountVerification Purpose: Email/phone verification tokens with expiry. Used during account verification flows.

Role

Table: remoteEaze_roles Purpose: Named roles per tenant used for RBAC. Each role has associated permissions, transaction approval thresholds, and approval rules.

Key FieldTypeDescription
slugStringMachine key, e.g. "BRANCH_MANAGER", "TELLER".
nameStringDisplay name, e.g. "Branch Manager".
isActiveBooleanWhether the role is active.

Unique constraints: [tenantId, slug], [tenantId, name]

Maker-Checker: Yes.

Relations: users (RemoteEaze_userProfile[]), permissions (PermissionMatrix[]), thresholds (TransactionApproval[]), permissionRules (TransactionApprovalRule[]).

PermissionMatrix

Table: remoteEaze_permission_matrix Purpose: Maps a Role to an entity type (e.g. "transfer", "customer"), grouping the granular permission actions for that combination.

Key FieldTypeDescription
roleIdStringFK to Role.
entityTypeStringThe entity type this permission set applies to.

Unique constraint: [tenantId, roleId, entityType]

Relations: actions (PermissionAction[]).

PermissionAction

Table: remoteEaze_permission_actions Purpose: Individual permission flags within a PermissionMatrix. Each action (read, write, approve_l1, etc.) can be allowed or denied, optionally with a required approval level.

Key FieldTypeDescription
permissionMatrixIdStringFK to PermissionMatrix.
actionStringAction name: "read", "write", "approve_l1", etc.
allowedBooleanWhether the action is permitted.
requiredLevelInt?Approval level required (if applicable).

Unique constraint: [permissionMatrixId, action]

TransactionApproval

Table: remoteEaze_transaction_approvals Purpose: Amount-based approval thresholds per role. Defines what a role can create or approve based on transaction amount ranges and currency.

Key FieldTypeDescription
roleIdStringFK to Role.
entityTypeStringEntity type (e.g. "transfer").
fieldNameStringThe field being evaluated (e.g. "amount").
minAmount / maxAmountDecimal(20,2)Amount range (maxAmount null = unlimited).
currencyStringISO currency code. Strict match required.
requiredLevelsInt?Number of approval levels needed.
canCreate / canApprove_l1 / canApprove_l2 / canApprove_l3BooleanPermission flags per approval level.

TransactionApprovalRule

Table: remoteEaze_transaction_approval_rules Purpose: Conditional rules that override or extend base approval thresholds. Two types: PERMISSION (role-specific conditional overrides) and VALIDATION (global blocking rules that apply to everyone).

Key FieldTypeDescription
ruleNameStringHuman-readable rule name.
ruleTypeRuleTypePERMISSION (role-specific) or VALIDATION (global block).
entityTypeStringEntity type the rule applies to.
roleIdString?FK to Role. Null = global validation rule.
priorityIntEvaluation order (lower = first).
validationMessageString?Error message shown when validation rule blocks.

Relations: conditions (TransactionApprovalCondition[]).

TransactionApprovalCondition

Table: remoteEaze_transaction_approval_conditions Purpose: Individual conditions within an approval rule. Uses field-level operators to evaluate transaction data.

Key FieldTypeDescription
ruleIdStringFK to TransactionApprovalRule.
fieldNameStringField to evaluate, e.g. "transCode".
fieldOperationFieldOpOperator: EQ, NE, GT, LT, IN, NOT_IN, CONTAINS.
fieldValueStringValue to compare against.
logicalOpLogicalOp?How to combine with other conditions: AND or OR.

D. Global Reference Data

These tables have no tenantId. They are system-wide, read-only for tenants, and typically seeded from ISO standards.

Nation

Table: remoteEaze_nations Purpose: ISO 3166 country reference. Used for branch location, customer nationality/residence, and identity type scoping.

Key FieldTypeDescription
codeString @idISO 3166-1 alpha-2 (e.g. "KE").
alpha3CodeString @uniqueISO 3166-1 alpha-3 (e.g. "KEN").
numericCodeString @uniqueISO 3166-1 numeric (e.g. "404").
nameStringCountry name.
dialCodeString?Phone dial code, e.g. "+254".

Relations: branches, sectors, identityTypes.

Language

Table: remoteEaze_languages Purpose: ISO 639 language reference. Used for user language preferences.

Key FieldTypeDescription
codeString @idISO 639-1 (e.g. "EN", "SW").
alpha3CodeString @uniqueISO 639-2 (e.g. "eng").
nameStringLanguage name.

Currency

Table: remoteEaze_currencies Purpose: ISO 4217 currency reference. Critical for banking math -- the decimals field determines rounding precision across the system.

Key FieldTypeDescription
codeString @idISO 4217 (e.g. "KES", "USD").
numericCodeString @uniqueISO 4217 numeric (e.g. "404").
nameStringCurrency name.
decimalsIntDecimal places for this currency (default 2). Drives all financial calculations.

Relations: tenantConfigs, branches, accountConditions, commissionTypes, commissionBands, accounts, facilities, facilityCollaterals, collateralValuations.

Sector

Table: remoteEaze_sectors Purpose: Economic sectors per country, defined by regulators. Used for customer and account classification (regulatory reporting).

Key FieldTypeDescription
nameStringSector name.
countryCodeStringFK to Nation.
codeStringRegulator-assigned code (e.g. "1000").

Unique constraint: [countryCode, code]

Relations: industries, customers, accounts.

Industry

Table: remoteEaze_industries Purpose: Industries within sectors. Finer-grained classification for regulatory reporting.

Key FieldTypeDescription
nameStringIndustry name.
sectorIdStringFK to Sector.
codeStringRegulator-assigned code.

Unique constraint: [sectorId, code]

Relations: customers, accounts.


E. Tenant Reference Data (Lookup Tables)

These are simple code + description lookup tables scoped by tenantId. They power dropdown menus across the UI and enforce consistent categorization. All follow the same pattern:

FieldTypeDescription
codeStringMachine-readable identifier (unique per tenant).
descriptionStringHuman-readable display name.

Unique constraint (all): [tenantId, code]

Complex Configuration Tables

TableDB NamePurposeExtra Fields
IdentityTyperemoteEaze_identity_typesID document types (passport, national ID, etc.)countryCode (FK Nation), mandatoryFields (Json), formatRegex, integratorApi
AccountStatusremoteEaze_account_statusesAccount operational statuses (ACTIVE, DORMANT, FROZEN, etc.)allowDebit, allowCredit, allowCobTrans (boolean flags controlling what transactions are permitted)

Simple Lookup Tables

TableDB NameTypical Codes
CustomerTyperemoteEaze_customer_types"INDIVIDUAL", "CORPORATE"
CustomerRatingremoteEaze_customer_ratings"HIGH_RISK", "LOW_RISK"
TitleremoteEaze_titles"MR", "DR", "PROF"
GenderremoteEaze_genders"M", "F", "O"
MaritalStatusremoteEaze_marital_statuses"SINGLE", "MARRIED"
SourceFundsremoteEaze_source_funds"NGO", "GOVERNMENT" (org-level, not customer-level)
LoanPurposeremoteEaze_loan_purposes"AGRICULTURE", "SCHOOL_FEES"
CollateralTyperemoteEaze_collateral_types"LOGBOOK", "TITLE_DEED"
DocumentTyperemoteEaze_document_types"PHOTO", "PASSPORT_COPY", "MANDATE", "BOARD_RESOLUTION"
AccountTyperemoteEaze_account_types"INDIVIDUAL_SAVINGS", "CORPORATE_CURRENT", "SME_LOAN", "FIXED_DEPOSIT"

F. Entity Onboarding (CRM)

Customer

Table: remoteEaze_customers Purpose: Core customer entity supporting both Individual and Corporate customer types. Carries demographics, contact info, KYC data, compliance fields, and complex JSON fields for identities, directors, shareholders, and documents.

Key FieldTypeDescription
customerNumberString10-digit auto-generated via Sequence (unique per tenant).
customerTypeIdStringFK to CustomerType ("INDIVIDUAL" or "CORPORATE").
displayNameStringComputed: "John Doe" for individuals, "Acme Corp" for corporates.

Individual-specific fields: firstName, surname, titleCode, genderCode, maritalStatusCode, dateOfBirth, placeOfBirth, countryOfBirth.

Corporate-specific fields: corporateName, dateOfIncorporation, placeOfIncorporation, countryOfIncorporation.

Creation rules:

  • At least one entry in identities is always required on creation (both Individual and Corporate).
  • For Corporate: at least one Director, one Shareholder, and one Contact Person are required.
  • Total shareholder percentage across all shareholders cannot exceed 100%.
  • Identity ref is validated against the formatRegex defined in the matching IdentityType record.
  • customerTypeId cannot be changed after creation.

Contact: email, phone, addressPhysical, addressHome, addressPostal.

Classification: nationality, residence, sectorId, industryId, customerRatingCode.

Relationships: relationOfficerId (FK to User), agentId (FK to Agent), branchId (FK to Branch).

Complex JSON fields:

  • identities -- Array: [{ typeCode, ref, issueDate, expiryDate }]
  • directors -- Array (corporate): [{ name, address, email, phone, idTypeCode, idRef, memo }]
  • shareholders -- Array (corporate): [{ name, address, email, phone, idTypeCode, idRef, sharePercentage }]
  • contacts -- Array (corporate): [{ name, email, phone, role }]
  • nextOfKin -- Array: [{ name, address, relationship, idTypeCode, idRef, idIssueDate, idExpiryDate }]
  • documents -- Array: [{ typeCode, ref, imageUrl, uploadDate, expiryDate }]

Credit: totalCreditLimit (Decimal) -- Max total facility exposure allowed for this customer.

Dual status:

  • recordStatus (RecordStatus) -- Maker-checker workflow state.
  • customerStatus (CustomerStatus) -- Operational state: ACTIVE, PENDING_KYC, BLOCKED, DECEASED.
  • statusMemo / statusDate -- Reason and timestamp for last customerStatus change.

Relations: accounts, mandates (as signatory), facilities.

Maker-Checker: Yes.

Agent

Table: remoteEaze_agents Purpose: Field agents who operate on behalf of the organization, typically for mobile banking or outreach. Each agent is linked to exactly one user account and one branch. Personal information (name, email, phone) comes from the linked User record (single source of truth).

Key FieldTypeDescription
agentNumberStringAuto-generated from branch code: {CNA}-{RCC}-{BBB}-{AAAA}. AAAA is per-branch sequence (0001-9999). Example: KCB-KEN-001-0001.
userIdStringFK to User (one-to-one). Agent must have a user account. Name/email/phone pulled from User. branchId and userId cannot be changed after creation.
agentAccountIdString? @uniqueFK to Account. Null until agent's operating account is created and linked via the linkAccount action.
branchIdStringFK to Branch (home/recruiting branch). Determines the agent number prefix and cannot be changed.
agentAddressString?Work address (can differ from User's personal address).
startTime / endTimeString?Working hours in 24-hour format, e.g. "08:00" / "17:00". End time must be after start time.
geoLockEnabledBooleanWhether geo-restriction is enabled. If true, allowedGeoZone is required.
allowedGeoZoneString?Permitted working zone. Format: lat,lng,radius_meters.
currentLocationString?Last known position. Format: lat,lng. System-tracked when geo-lock enabled.
currentLocationAtDateTime?When location was last captured.
statusMemoString?Reason for status change. Required (min 5 chars) when setting agentStatus to SUSPENDED or TERMINATED.

Dual status:

  • recordStatus (RecordStatus) — Maker-checker workflow state.
  • agentStatus (AgentStatus) — Operational state: ACTIVE, SUSPENDED, TERMINATED.

Working config updates: An AUTHORIZED agent's working hours and geo-fencing can be updated directly (no maker-checker cycle) via the updateConfig action.

Relations: customers (managed), managedAccounts.

Maker-Checker: Yes.

Profile fields removed: agentName, agentEmail, and agentPhones have been removed from the Agent model. These values are now sourced from the linked User record to maintain a single source of truth.


G. Financial Engine (General Ledger)

Product

Table: remoteEaze_products Purpose: Chart of Accounts (GL codes). Each product represents a general ledger account category. Products are either customer-facing contracts (savings, loans) or internal GL accounts (expense, income tracking).

Key FieldTypeDescription
productCodeStringAuto-generated: PP-NNNNN. Series by type: ASSET (AS-10000..29999), LIABILITY (LI-30000..49999), INCOME (IN-50000..69999), EXPENSE (EX-70000..79999).
productNameStringDisplay name.
productTypeProductTypeASSET, LIABILITY, INCOME, EXPENSE, CONTINGENT_ASSET, CONTINGENT_LIABILITY.
isContractProductBooleantrue = customer-facing (savings, loans). false = internal GL.
deptUnitRestrictString[]Departments restricted from using this product during transaction posting.
branchRestrictString[]Branches allowed to use this product. Empty = unrestricted. ProductBalance rows are created only for these branches on authorization.

Relations: balances (ProductBalance[]), accounts, facilityClassProducts, activityRules, and various GL account link relations from AccountCondition and CommissionType.

Maker-Checker: Yes.

ProductBalance

Table: remoteEaze_product_balances Purpose: System-managed ledger balances per product per branch. Tracks Year-to-Date, Month-to-Date, and Day-level open balances and debit/credit movements. Created automatically when a Product is authorized or a new Branch is created.

Key FieldTypeDescription
productId / branchIdStringComposite key identifying one balance row.
ytdOpenBalance / ytdDebitMvmt / ytdCreditMvmtDecimal(20,4)Year-to-date tracking.
mtdOpenBalance / mtdDebitMvmt / mtdCreditMvmtDecimal(20,4)Month-to-date tracking.
dayOpenBalance / dayDebitMvmt / dayCreditMvmtDecimal(20,4)Daily tracking (reset by batch job).

Unique constraint: [tenantId, productId, branchId]

Not user-editable. Read-only via API. Updated by the transaction posting engine and batch jobs.

TransCode

Table: remoteEaze_trans_codes Purpose: Transaction codes that define posting behavior. Referenced by CommissionType to link fee types to their transaction posting rules.

Key FieldTypeDescription
codeStringTransaction code, e.g. "1000", "90901".
descriptionStringHuman-readable description.
debitCreditTransDebitCreditDEBIT, CREDIT, or BOTH.
turnOverChargeBooleanWhether this code triggers turnover-based charges.

Unique constraint: [tenantId, code]

Maker-Checker: Yes.


H. Product Rules Engine

AccountCondition (Interest Engine)

Table: remoteEaze_account_conditions Purpose: Interest calculation configuration with temporal versioning. Defines how debit interest (customer pays) and credit interest (customer earns) are calculated, including tiered rates, day-count conventions, frequency settings, GL account links, and tax configuration.

Key FieldTypeDescription
codeStringCondition code. Must be uppercase alphanumeric with dashes only, e.g. "SAV-STD-01". Cannot be changed after creation.
nameStringDisplay name (3–100 chars).
effectiveFromDateTime @db.DateStart of validity. Must be a valid date.
effectiveToDateTime?End of validity. Null = currently active. Must be after effectiveFrom if set.
currencyCodeStringFK to Currency. Cannot be changed after creation.
interestBasisInterestBasisDay-count convention: ACTUAL_360, ACTUAL_364, ACTUAL_365, ACTUAL_ACTUAL, THIRTY_360, THIRTY_E_360. Default: ACTUAL_365.
debitCalcMethod / creditCalcMethodInterestCalcMethodFLAT_RATE, LEVEL (each tier applies to portion in range), or BAND (entire balance uses rate of matching tier).
balanceTypeBalanceTypeBalance figure used for calculation: DAILY, AVERAGE_DAILY, LOWEST_MONTHLY, HIGHEST_MONTHLY, END_OF_PERIOD.
accrualFrequencyAccrualFrequencyDAILY or MONTHLY. Must be at least as frequent as postingFrequency.
postingFrequencyPostingFrequencyMONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY.
capitalizationFrequencyCapitalizationFrequencyNEVER, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY. Must be less frequent than or equal to postingFrequency.
debitTiers / creditTiersJson?Tiered rate arrays: [{ minAmount, maxAmount, rate }]. Only the last tier may have null maxAmount. No duplicate minAmount values.
debitInterestMinimum / debitInterestMaximumDecimal?Min/max interest to charge per period. Minimum cannot exceed maximum.
debitInterestDeMinimisDecimal?Do not charge if calculated interest is below this threshold.
debitAllowCompound / creditAllowCompoundBooleanWhether compound interest is allowed.
debitExpenseAccountIdString?FK to Product of type EXPENSE (debit interest expense account).
debitLiabilityAccountIdString?FK to Product of type LIABILITY (accrued interest payable).
creditIncomeAccountIdString?FK to Product of type INCOME (credit interest income account).
taxAccountIdString?FK to Product of type LIABILITY (tax payable).
debitTaxRate / creditTaxRateDecimal?Tax rates (max 4 decimal places, cannot exceed 100%). Debit = excise duty, Credit = withholding tax.
debitTaxType / creditTaxTypeTaxType?INCLUSIVE or EXCLUSIVE. Required if the corresponding tax rate is set.
capitalizeFeesBooleanWhether to capitalize fees. If true, feesCapitalizationDays is required.
interestChargesJson?Fee commission types to apply on interest events: { onDebitPosting, onDebitCapitalization, onCreditPosting }.
scheduleConfigJson?Posting schedule config: { postingDayOfMonth, useWorkingDay, rollForward }.

Unique constraint: [tenantId, code, effectiveFrom] (allows temporal versioning — multiple versions of the same code can coexist with different effective dates).

Supersede operation: Creates a new CAPTURED version of an existing open-ended AUTHORIZED condition. The new version's effectiveFrom must be at least tomorrow. The current version's effectiveTo is automatically set to the day before the new effectiveFrom. All product links from the current version are copied to the new version atomically.

Interest preview: AUTHORIZED conditions support a preview endpoint that calculates interest for a given balance and number of days, with optional tax calculation.

Maker-Checker: Yes. A condition code cannot be reused (same code + effectiveFrom combination). Use supersede instead of creating a new record with the same code.

ProductAccountCondition

Table: remoteEaze_product_account_conditions Purpose: Junction table linking Products to AccountConditions. Only CONTRACT products (customer-facing) can be linked. Unlinking is prevented if active AUTHORIZED accounts exist using that combination.

Unique constraint: [productId, accountConditionId]

CommissionType (Fee Engine)

Table: remoteEaze_commission_types Purpose: Fee and commission definitions. Each commission type has GL account links, a transaction code, tax configuration, and calculation settings. Supports FLAT, PERCENTAGE, and FORMULA calculation bases.

Key FieldTypeDescription
codeStringCommission code, e.g. "STMT-FEE", "OD-SETUP".
currencyCodeStringFK to Currency.
incomeAccountIdStringFK to Product (INCOME type).
taxAccountIdString?FK to Product (LIABILITY type, for tax collection).
transCodeIdStringFK to TransCode.
calculationBasisCalculationBasisFLAT, PERCENTAGE, or FORMULA.
bandCalcTypeBandCalcTypeLEVEL (tiered) or BAND (flat by bracket).
externalCalcApiString?URL for FORMULA basis (external calculation service).
taxType / taxRateVariousTax configuration (e.g. 16% VAT).
chargeAsInterestBooleanWhether to include in APR calculation (regulatory).

Maker-Checker: Yes. Must have at least one band before submission.

CommissionBand

Table: remoteEaze_commission_bands Purpose: Tiered fee brackets within a CommissionType. Defines amount ranges with either flat fees or percentage-based charges.

Key FieldTypeDescription
commissionTypeIdStringFK to CommissionType.
currencyCodeStringMust match parent CommissionType currency.
minAmount / maxAmountDecimal(20,4)Amount range (maxAmount null = unlimited).
chargeAmountDecimal?Flat fee (mutually exclusive with chargePercentage).
chargePercentageDecimal?Percentage rate.
minCharge / maxChargeDecimal?Floor/ceiling for percentage-based charges.

Unique constraint: [commissionTypeId, currencyCode, minAmount]

Bands are validated as a set: contiguous ranges, no gaps, no overlaps.

FacilityClass

Table: remoteEaze_facility_classes Purpose: Credit facility templates. Defines whether facilities are revolving (overdraft) or term (fixed loan), and what percentage of the limit is available for utilization.

Key FieldTypeDescription
codeStringClass code, e.g. "OD-SECURED", "TERM-LOAN".
isRevolvingBooleantrue = overdraft (reusable limit), false = term loan (draw once).
availabilityPercentDecimal(5,2)Percentage of approved limit available (default 100%).

Maker-Checker: Yes.

Relations: eligibleProducts (FacilityClassProduct[]), facilities (Facility[]).

FacilityClassProduct

Table: remoteEaze_facility_class_products Purpose: Junction table linking FacilityClasses to eligible Products. Only CONTRACT products can be linked. Unlinking prevented if active facilities exist.

Unique constraint: [facilityClassId, productId]

ActivityStatusRule

Table: remoteEaze_activity_status_rules Purpose: Lifecycle automation rules for account dormancy management. Defines conditions that trigger automatic status changes on accounts (e.g. mark as DORMANT after 90 days of inactivity). Includes cycle detection to prevent circular status transitions.

Key FieldTypeDescription
nameStringRule name.
ruleTypeActivityRuleTypeDAYS_SINCE_LAST_DEBIT, DAYS_SINCE_LAST_CREDIT, DAYS_SINCE_LAST_TRANSACTION, BALANCE_BELOW_THRESHOLD, BALANCE_IS_ZERO, CONSECUTIVE_MONTHS_INACTIVE.
thresholdDaysInt?For DAYS_SINCE_* rules.
thresholdAmountDecimal?For BALANCE_* rules.
targetAccountStatusIdStringFK to AccountStatus. The status to assign when the rule triggers.
productIdString?FK to Product. Null = applies to all products.
priorityIntEvaluation order (lower = first).

Maker-Checker: Yes.

WorkDayYear

Table: remoteEaze_work_day_years Purpose: Business calendar year definition. Tracks the current, last, and next working days. Used for interest calculations, business date determination, and transaction scheduling.

Key FieldTypeDescription
yearIntCalendar year (e.g. 2025).
currentWorkingDayDateTime @db.DateToday's business date.
lastWorkingDayDateTime @db.DatePrevious business date.
nextWorkingDayDateTime @db.DateNext business date.

Unique constraint: [tenantId, year]

Maker-Checker: Yes.

WorkDayMonth

Table: remoteEaze_work_day_months Purpose: Monthly breakdown within a WorkDayYear. Defines which days are weekends and which are public holidays for each month.

Key FieldTypeDescription
workDayYearIdStringFK to WorkDayYear.
monthIntMonth number (1-12).
weekendDaysInt[]Day-of-week integers, e.g. [0, 6] (Sunday, Saturday).
publicHolidayDaysInt[]Day-of-month integers, e.g. [1, 25] (1st and 25th).

Unique constraint: [workDayYearId, month]

Months can only be modified when the parent year is in CAPTURED or REJECTED status.


I. Account & Credit Management

Account

Table: remoteEaze_accounts Purpose: The core financial account entity. Can be customer-facing (savings, loans, fixed deposits) or internal GL accounts. Carries six balance fields, interest state, schedule state, activity tracking, and services/notifications configuration.

Key FieldTypeDescription
accountNumberStringAuto-generated via Sequence. Format: ACC-{8-digit-zero-padded-counter}, e.g. ACC-00000001. Unique per tenant.
accountNameStringComputed on create: {customerDisplayName} {accountType.description} {currencyCode}. For agent/internal accounts, product name is used in place of customer name.
customerIdString?FK to Customer. Required for contract products unless isAgentAccount = true. Null for internal GL accounts. Customer must be AUTHORIZED at creation time.
isAgentAccountBooleantrue = this is an agent operating account (float/commissions). Mutually exclusive with customerId.
productIdStringFK to Product. Must be AUTHORIZED. For contract products, determines whether customer/agent is required. Cannot be changed after creation.
accountTypeIdStringFK to AccountType.
currencyCodeStringFK to Currency. Cannot be changed after creation.
startDate / endDateDateTime?Validity period. Typically required for term products (loans, fixed deposits). endDate must be after startDate.
dateOpenedDateTimeAccount opening business date. Set automatically on creation.
accountConditionIdString?FK to AccountCondition (interest rules). Must be AUTHORIZED if provided.
accountStatusIdStringFK to AccountStatus (current operational status).
activityStatusIdString?FK to AccountStatus. Automated by the ActivityStatusRule engine — not manually set.
signingRuleSigningRule?Account-level signing policy: ANY_ONE, ALL_MUST_SIGN, TWO_OF_THREE, MAJORITY.
facilityReferenceString?Links to Facility for overdraft accounts.
branchIdStringFK to Branch. Required.
relationOfficerIdString?FK to User (Relationship Officer). User must belong to the same tenant.
agentIdString?FK to Agent. Agent must be AUTHORIZED if provided.
sectorId / industryIdString?FK to Sector/Industry. Inherited from the customer record; can be overridden per account.
accountEmail / accountPhoneString?Contact information specific to this account (e.g. for joint or corporate accounts).
uniqueQRCodeString?Auto-generated on create. Format: QR-ACC-{accountNumber}.

Contract product rules:

  • isContractProduct = true on the product → either customerId or isAgentAccount = true is required (not both).
  • isContractProduct = false (internal GL) → customerId and isAgentAccount must both be absent/false.

Operational status update: An AUTHORIZED account's accountStatusId can be changed directly (no maker-checker). Restrictive statuses (BLOCKED, CLOSED, DORMANT, FROZEN) require a statusMemo (min 5 characters).

Balance fields:

FieldDescription
unclearOnlineBalanceCurrent balance including pending transactions.
clearedOnlineBalanceCurrent balance excluding pending.
availableOnlineBalanceCleared + overdraft limit.
unclearOpenBalanceStart-of-day including pending.
clearedOpenBalanceStart-of-day excluding pending.
availableOpenBalanceStart-of-day + overdraft.

Interest state fields: lastDrInterestAccrDate, lastDrInterestCapDate, lastCrInterestAccrDate, lastCrInterestCapDate, lastDrInterestCapAmt, lastCrInterestCapAmt, currAccrDrInterAmt, currAccrCrInterAmt, plus YTD and grand-total interest/charge amounts.

Schedule state: scheduleDefined, scheduleFrequency, nextScheduleDate, nextScheduleAmount, lastScheduleDate, lastScheduleAmount. scheduleFrequency is required when scheduleDefined = true.

Activity tracking: lastTxnDate, lastCreditDate, lastDebitDate (used by ActivityStatusRule evaluation).

Services: subscribedServices (DEBITCARD, CREDITCARD, POS, INTERNET), notificationServices (EMAIL, SMS).

Maker-Checker: Yes.

Auto-mandate on authorization: When an account for an Individual customer reaches AUTHORIZED status, the system automatically creates a PRIMARY_HOLDER mandate using the customer's name, contact details, and first identity document. This happens atomically in the same transaction as the status change. Corporate accounts do not get an auto-mandate.

AccountMandate

Table: remoteEaze_account_mandates Purpose: Signing authority records per account. Defines who is authorized to sign for transactions, their transaction limits, and validity period. SigningRule (how mandates must be collectively fulfilled) lives on the Account, not the mandate.

Key FieldTypeDescription
accountIdStringFK to Account. Account must be AUTHORIZED.
signatoryNameStringFull name of the signatory (min 2 chars).
signatoryTypeSignatoryTypePRIMARY_HOLDER, JOINT_HOLDER, POWER_OF_ATTORNEY, AUTHORIZED_SIGNATORY, DIRECTOR.
signatoryCustomerIdString?FK to Customer. Optional link if the signatory is also an existing customer record.
transactionLimitDecimal?Max amount this signatory can authorize alone.
effectiveFromDateTime @db.DateStart of validity. effectiveTo must be after effectiveFrom if set.
effectiveToDateTime?End of validity. Null = indefinite.
isActiveBooleanCan be deactivated without deletion (default true).
email / phoneString?Contact information for the signatory.
idTypeCode / idRefString?Identity document type code and reference number.
idIssueDate / idExpiryDateDateTime?Identity document dates.
additionalAttributesJson?Extra identity fields driven by the IdentityType.mandatoryFields config.

Rules:

  • Can only be created on AUTHORIZED accounts.
  • If signatoryCustomerId is provided, the customer must exist in the same tenant.
  • The signingRule for collective authorization is set on the Account (Account.signingRule), not here.

Auto-creation: Two paths create a PRIMARY_HOLDER mandate automatically:

  1. Individual customer account reaches AUTHORIZED — mandate is created with the customer's displayName, contact details, and first identity document, atomically in the same transaction.
  2. Agent's account is linked via linkAccount — mandate is created using the agent's User record (user.name, user.email, user.userPhoneOfficial). No signatoryCustomerId is set for agent mandates.

AccountStatement

Table: remoteEaze_account_statements Purpose: Statement delivery configuration per account. Defines how often statements are generated and how they are delivered. Tracks the last generation date and balance.

Key FieldTypeDescription
accountIdStringFK to Account. Account must be AUTHORIZED.
statementFreqStatementFrequencyDAILY, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY.
deliveryMethodStatementDeliveryEMAIL, PHYSICAL, or BOTH.
lastStatementDateDateTime?Business date of the last generated statement (system-managed).
lastStatementBalDecimal?Account balance at the time of the last statement (system-managed).

Rules: Can only be created for AUTHORIZED accounts. An account can have one statement configuration.

Facility

Table: remoteEaze_facilities Purpose: Credit facilities (overdraft lines or term loans) granted to customers. Each facility is based on a FacilityClass template, has an approved amount, and tracks expiry/review dates.

Key FieldTypeDescription
facilityRefStringComputed: {customerNumber}.{facilityClassCode}.
customerIdStringFK to Customer. Customer must be AUTHORIZED and ACTIVE.
facilityClassIdStringFK to FacilityClass (template). Must be AUTHORIZED.
currencyCodeStringFK to Currency.
amountApprovedDecimal(20,4)Total credit limit approved. Checked against customer's totalCreditLimit.
amountAdvisedDecimal(20,4)Amount communicated to customer. Must not exceed amountApproved.
expiryDateDateTimeFacility expiry date.
reviewFreqIntDays before expiry to trigger review alert (default 30).
expiryModeExpiryModeMANUAL or AUTOMATIC renewal.
revolvingLimitBoolean?Override FacilityClass setting. Null = use class default.
availMarkerAvailMarkerYES = available for utilization, NO = suspended.

Dual status: recordStatus (workflow) + facilityStatus (ACTIVE, EXPIRED, SUSPENDED, CANCELLED).

Maker-Checker: Yes. dateApproved set automatically on AUTHORIZED.

FacilityCollateral

Table: remoteEaze_facility_collaterals Purpose: Collateral pledged against a facility. Carries current valuation and links to a CollateralType.

Key FieldTypeDescription
facilityIdStringFK to Facility.
collateralTypeIdStringFK to CollateralType.
collateralRefStringExternal reference (title deed, logbook, certificate).
currencyCodeStringFK to Currency.
marketValue / forcedSaleValueDecimal(20,4)Current valuation. Updated when new valuations are added.
lastValuationDateDateTimeDate of latest valuation.
expiryDateDateTime?For time-limited collateral (e.g. fixed deposit receipts).

CollateralValuation

Table: remoteEaze_collateral_valuations Purpose: Immutable valuation history for collateral. Each record represents one professional valuation. On creation, the parent FacilityCollateral is updated with the latest values atomically.

Key FieldTypeDescription
facilityCollateralIdStringFK to FacilityCollateral.
valuationDateDateTimeDate of valuation.
currencyCodeStringFK to Currency.
marketValue / forcedSaleValueDecimal(20,4)Assessed values.
valuerNameStringName of valuer/firm.
valuerReferenceString?Valuer's report reference number.
valuationMethodString?e.g. "MARKET_COMPARISON", "INCOME_APPROACH".

Immutable: No updates. Corrections via soft delete + new record.

FacilityAccount

Table: remoteEaze_facility_accounts Purpose: Junction table tracking which accounts draw from which facilities and how much. Enforces allocation limits: total allocation across all linked accounts cannot exceed the facility's amountAdvised.

Key FieldTypeDescription
facilityId / accountIdStringJunction keys. Both must be AUTHORIZED.
allocationAmountDecimal(20,4)Portion of facility reserved for this account.
amtUtilizedDecimal(20,4)Cumulative drawn amount.
amtOutstandingDecimal(20,4)Current outstanding balance.

Unique constraint: [facilityId, accountId]


J. Third-Party Delivery

ThirdPartySystem

Table: remoteEaze_third_party_systems Purpose: Registry of external systems (core banking, ERPs, payment gateways) that the platform can deliver data to. Stores connection details, authentication credentials (encrypted at rest), and default retry/timeout behaviour. Uses maker-checker workflow.

Key FieldTypeDescription
codeStringShort unique identifier, e.g. T24, SAP, FLEXCUBE. Unique per tenant. Immutable after creation.
nameStringHuman-readable name, e.g. "Temenos T24 Core Banking".
descriptionString?Optional description.
transportFormatTransportFormatDefault serialization format: REST_JSON or REST_XML.
baseUrlStringRoot API address, e.g. https://t24.bank.com/api.
authTypeAuthTypeAuthentication method: NONE, BASIC, BEARER, API_KEY, OAUTH2.
authConfigString?Encrypted JSON containing credentials. Decrypted only at delivery time inside the queue processor. Never returned via API.
defaultHeadersJson?Default HTTP headers merged into all outgoing requests.
timeoutMsIntHTTP timeout in milliseconds (default: 30000).
retryLimitIntMaximum retry attempts for failed deliveries (default: 3).
retryBackoffMsIntDelay between retries in milliseconds (default: 1000).
isActiveBooleanWhether this system is enabled for deliveries.

Unique constraint: [tenantId, code]

ThirdPartyMapping

Table: remoteEaze_third_party_mappings Purpose: Junction table mapping internal entity records to their identifiers in external systems. For example, a customer cust_abc123 might be CUS001 in T24. Simple CRUD — no maker-checker workflow.

Key FieldTypeDescription
entityTypeStringWhat kind of record: customer, account, transaction, etc.
entityIdStringThe record's internal ID.
entityDisplayNameString?Denormalized human-readable label, e.g. "CUS001 — John Doe". Captured at creation time.
systemIdStringFK to ThirdPartySystem. Which external system this mapping is for.
externalKeyStringSlot name for the external identifier, e.g. PRIMARY, T24_ACCOUNT, SAP_BP_NUMBER.
externalValueStringThe actual value in the external system, e.g. CUS001, 1234567.
valueTypeExternalValueTypeData type: STRING, NUMBER, BOOLEAN, DATE.

Unique constraint: [tenantId, entityType, entityId, systemId, externalKey]

DeliveryHookConfig

Table: remoteEaze_delivery_hook_configs Purpose: Rules defining when and how to deliver data to external systems. Each config ties an entity type + event to a system with field mappings that transform the payload. Uses maker-checker workflow. Only AUTHORIZED + active configs trigger deliveries.

Key FieldTypeDescription
systemIdStringFK to ThirdPartySystem. Target external system.
entityTypeStringEntity type that triggers delivery, e.g. customer, account.
eventDeliveryEventTriggering event: ON_CREATE, ON_UPDATE, ON_DELETE, ON_SUBMIT, ON_AUTHORIZE, ON_REJECT, ON_DENY.
isActiveBooleanWhether this config is enabled.
endpointUrlString?Path appended to system base URL (e.g. /customers). Can be a full URL override.
httpMethodDeliveryHttpMethodPOST, PUT, or PATCH.
transportFormatTransportFormat?Override system default format. Null = use system default.
fieldMappingsJsonArray of { source, target, transforms[] } defining how to map entity fields to the outgoing payload.
responseMappingsJson?Array of { source, externalKey }. On ON_CREATE success, extracts values from the response and auto-upserts ThirdPartyMapping records.
includeThirdPartyIdsBooleanAttach known External IDs to the payload under _thirdPartyIds (default: true).
includeMetadataBooleanWrap payload in an event envelope with timestamp and correlation ID (default: true).
retryLimitInt?Override system retry limit. Null = use system default.
retryBackoffMsInt?Override system retry backoff. Null = use system default.

Unique constraint: [tenantId, systemId, entityType, event]

DeliveryLog

Table: remoteEaze_delivery_logs Purpose: Immutable audit trail of every delivery attempt. Written exclusively by the queue processor — never directly via API. Each retry creates a new log entry, so you can trace the full retry history.

Key FieldTypeDescription
hookConfigIdStringFK to DeliveryHookConfig. Which config triggered this delivery.
systemIdStringFK to ThirdPartySystem. Denormalized for efficient querying.
entityTypeStringEntity type.
entityIdStringEntity ID.
eventDeliveryEventWhich event triggered the delivery.
correlationIdStringUUID linking all deliveries triggered by the same entity event.
jobIdString?Background queue job ID.
requestUrlStringFull URL that was called.
requestMethodStringHTTP method used.
requestHeadersJson?Sanitized headers (Authorization header stripped).
requestPayloadJsonExactly what was sent.
responseStatusInt?HTTP status code returned.
responseBodyJson?What the external system returned.
responseHeadersJson?Response headers.
statusDeliveryStatusPENDING, SUCCESS, FAILED, RETRYING.
attemptIntWhich attempt this is (starts at 1).
maxAttemptsIntMaximum attempts allowed.
errorMessageString?Error details if failed.
durationMsInt?Request duration in milliseconds.
nextRetryAtDateTime?When the next retry will happen.

Enums Reference

Workflow & Status

EnumValuesDescription
RecordStatusCAPTURED, PENDING_AUTH_L3, PENDING_AUTH_L2, PENDING_AUTH_L1, AUTHORIZED, REJECTED, DENIEDMaker-checker workflow states. CAPTURED = draft, PENDING_AUTH_* = awaiting approval at respective level, AUTHORIZED = live, REJECTED = returned for corrections, DENIED = permanently blocked.
CustomerStatusACTIVE, PENDING_KYC, BLOCKED, DECEASEDCustomer operational states.
AgentStatusACTIVE, SUSPENDED, TERMINATEDAgent operational states.
FacilityStatusACTIVE, EXPIRED, SUSPENDED, CANCELLEDFacility operational states.
LogStatusSUCCESS, FAILURE, PENDINGAudit log outcome status.

User & Access

EnumValuesDescription
UserTypeINTERNAL, EXTERNAL, SYSTEMINTERNAL = staff, EXTERNAL = field agents, SYSTEM = super admin.
DataAccessScopeSYSTEM, ORGANIZATION, BRANCH, SELFData visibility level for users.
ActorTypeHUMAN, SYSTEM, SERVICE, CRON, IMPERSONATIONWho performed an audited action.

Financial

EnumValuesDescription
ProductTypeASSET, LIABILITY, INCOME, EXPENSE, CONTINGENT_ASSET, CONTINGENT_LIABILITYGL account classification.
TransDebitCreditDEBIT, CREDIT, BOTHTransaction code posting direction.
InterestBasisACTUAL_360, ACTUAL_364, ACTUAL_365, ACTUAL_ACTUAL, THIRTY_360, THIRTY_E_360Day-count conventions for interest calculation.
InterestCalcMethodFLAT_RATE, LEVEL, BANDFLAT_RATE = simple. LEVEL = each tier applies to portion in range. BAND = entire balance uses rate of matching tier.
BalanceTypeDAILY, AVERAGE_DAILY, LOWEST_MONTHLY, HIGHEST_MONTHLY, END_OF_PERIODWhich balance figure to use for interest calculation.
CalculationBasisFLAT, PERCENTAGE, FORMULACommission calculation method.
BandCalcTypeLEVEL, BANDSame as InterestCalcMethod but for commission bands.
TaxTypeINCLUSIVE, EXCLUSIVEWhether tax is included in the amount or added on top.

Frequency

EnumValuesDescription
AccrualFrequencyDAILY, MONTHLYHow often interest is accrued.
PostingFrequencyMONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLYHow often accrued interest is posted.
CapitalizationFrequencyNEVER, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLYHow often posted interest is capitalized (added to principal).
ScheduleFrequencyDAILY, WEEKLY, BI_WEEKLY, MONTHLY, BI_MONTHLY, QUARTERLY, HALF_YEARLY, ANNUALLYRepayment schedule frequency.
StatementFrequencyDAILY, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLYStatement generation frequency.

Branch & Organization

EnumValuesDescription
BranchTypeLEAD, BRANCHLEAD = head office, BRANCH = sub-branch.

Third-Party Delivery

EnumValuesDescription
TransportFormatREST_JSON, REST_XMLPayload serialization format for external system communication.
AuthTypeNONE, BASIC, BEARER, API_KEY, OAUTH2Authentication method for connecting to external systems.
ExternalValueTypeSTRING, NUMBER, BOOLEAN, DATEData type of an external ID value stored in ThirdPartyMapping.
DeliveryEventON_CREATE, ON_UPDATE, ON_DELETE, ON_SUBMIT, ON_AUTHORIZE, ON_REJECT, ON_DENYEntity lifecycle events that can trigger a delivery hook.
DeliveryHttpMethodPOST, PUT, PATCHHTTP methods available for outgoing delivery requests.
DeliveryStatusPENDING, SUCCESS, FAILED, RETRYINGOutcome status of a delivery attempt. RETRYING = will be retried automatically.

Custom Fields

EnumValuesDescription
CustomFieldTypeSTRING, NUMBER, BOOLEAN, DATE, COMPUTED, JSON, SELECTData types for dynamic custom field definitions.
DefaultStrategySTATIC, RULE_BASED, COMPUTEDHow default values for custom fields are determined.

Rules & Conditions

EnumValuesDescription
RuleTypePERMISSION, VALIDATIONPERMISSION = role-specific conditional override. VALIDATION = global blocking rule.
FieldOpEQ, NE, GT, LT, IN, NOT_IN, CONTAINSField-level comparison operators for approval conditions.
LogicalOpAND, ORLogical combinator for multi-condition rules.
ActivityRuleTypeDAYS_SINCE_LAST_DEBIT, DAYS_SINCE_LAST_CREDIT, DAYS_SINCE_LAST_TRANSACTION, BALANCE_BELOW_THRESHOLD, BALANCE_IS_ZERO, CONSECUTIVE_MONTHS_INACTIVETrigger conditions for account lifecycle automation.

Account & Facility

EnumValuesDescription
SignatoryTypePRIMARY_HOLDER, JOINT_HOLDER, POWER_OF_ATTORNEY, AUTHORIZED_SIGNATORY, DIRECTORTypes of account signatories.
SigningRuleANY_ONE, ALL_MUST_SIGN, TWO_OF_THREE, MAJORITYRules for how mandates must be fulfilled.
StatementDeliveryEMAIL, PHYSICAL, BOTHStatement delivery method.
ExpiryModeMANUAL, AUTOMATICFacility expiry behavior.
AvailMarkerYES, NOWhether a facility is available for utilization.

On this page