Initial Review Guide
A step-by-step walkthrough for reviewing the remoteEaze dashboard features. No technical background required.
First Release Disclaimer — This is the first test release of the remoteEaze system. Features are being added rapidly and this guide will be updated with each iteration.
Before You Start
Make sure you have:
- Your login credentials (email and temporary password)
- A stable internet connection
URLs:
| Environment | Home | Dashboard |
|---|---|---|
| Development | remote-eaze-dev.arclabs.top | remote-eaze-dev.arclabs.top/admin |
| Staging | N/A | N/A |
| Production | N/A | N/A |
Device Testing
All features in this guide should be tested on three screen sizes. Tablet is the most important since that is the expected primary device for end users.
| Device | How to simulate |
|---|---|
| Laptop / Desktop | Your normal browser window |
| Tablet * | Use your browser's built-in DevTools → Toggle Device Toolbar, or use the extension below |
| Mobile | Same as above, select a mobile preset |
Recommended tool for Chrome-based browsers: Install the Responsive Viewer extension. It lets you preview multiple screen sizes simultaneously without switching back and forth.
For each item in this guide, note whether it looks and works correctly on all three sizes.
1. Theme Switching
The theme switcher lets you switch between Light, Dark, and System (follows your device setting) themes.
On the Home page (/):
The theme toggle button is in the top header area of the home page.
On the Dashboard (/admin):
The theme switcher is inside the user menu at the bottom-left of the sidebar. Click your name/avatar button at the bottom of the sidebar to open the menu — the theme toggle is inside that dropdown.
What to do: Switch between the three theme options in both locations.
Pass:
- The page colors change immediately when you switch.
- Refresh the browser — the theme you selected is still active (it is remembered).
Fail:
- The page does not change when you click the toggle.
- The theme resets back to default after refreshing.
2. Offline Mode on the Home Page
What to do: Open the home page while connected to the internet. Then, in your browser, go to Developer Tools → Network tab and set it to Offline. Watch the indicator on the home page.
Pass:
- A network status indicator on the home page changes to show you are offline (different color or "offline" label).
- When you go back online, the indicator returns to its normal state.
Fail:
- The indicator does not react when you disconnect.
- The page crashes or shows a hard error instead of gracefully showing offline status.
3. Login
What to do: Go to the login page and enter your email and password.
Pass:
- You are taken to the correct page after logging in (admin users go to the admin dashboard at
/admin/dashboard, other users go to the home page). - A "Welcome back!" message appears briefly.
Fail cases to check:
| What you do | What should happen |
|---|---|
| Leave email empty and click Sign In | Error: "Email is required" |
Type something that is not an email (e.g., hello) | Error: "Please enter a valid email address" |
| Leave password empty | Error: "Password is required" |
| Type a password shorter than 8 characters | Error: "Password must be at least 8 characters" |
| Enter wrong credentials | An error message on the form saying authentication failed |
Try to visit /login while already logged in | You are redirected away from the login page automatically |
4. Forgot Password
If you forget your password, you can reset it using your email address.
What to do: On the login page, click the "Forgot password?" link next to the Password field.
Pass on the "Reset your password" page:
- The page shows an email input field and a "Send reset link" button.
- You can enter an email address and click "Send reset link".
- Regardless of whether the email exists or not, you see a "Check your email" message saying "If an account exists... we've sent a password reset link."
- The message notes that "The link will expire in 60 minutes."
- You can click "Try a different email" to go back and try another email.
Fail:
- An error message appears that reveals whether the email exists (e.g., "Email not found").
- The button does nothing when clicked.
Email and Token Validation
What to do: If you used a real email address that has an account, check your inbox and spam folder for an email titled "Reset Your Password".
Pass if email received:
- The email is branded with the RemoteEaze company name.
- It contains a prominent "Reset Your Password" button/link.
- The email notes that the link will expire in 60 minutes.
- Clicking the button/link takes you to a "Set a new password" screen.
Fail:
- No email arrives after several seconds.
- The email button/link does not work or takes you to an error page.
Setting a New Password
What to do: After clicking the reset link in the email, you land on the "Set a new password" page. Enter a new password in both fields and click "Reset password".
Pass:
- Both "New Password" and "Confirm New Password" fields are visible with show/hide toggles.
- A "Reset password" button submits the form.
- After successful reset, you see a success message and are taken back to the login page.
Fail cases to check:
| What you do | What should happen |
|---|---|
| Enter a password shorter than 8 characters | Error: "Password must be at least 8 characters" (shown before submission) |
| Enter different values in the two fields | Error: "Passwords do not match" (shown before submission) |
| Do not fill in the fields and click submit | Validation errors appear on both fields |
| Wait 60+ minutes and then click the reset link | Page shows "Invalid or expired link" with a "Request a new reset link" button |
| Try to reset a password for a non-existent user | The form may fail silently or show a generic error — this is intentional for security |
Pass after reset:
- You can log in with the new password.
- The new password meets the organization's security requirements (you will see a "Password reset successfully" message after reset).
5. Logout
What to do: While logged in on the home page, click the Logout button in the top header. On the dashboard, logout is inside the user menu at the bottom of the sidebar (click your name/avatar, then Log out).
Pass:
- You are taken back to the login page.
- If you try to go back using the browser's back button, you are redirected to login again — you cannot access the dashboard after logging out.
Fail:
- An error message appears ("Failed to log out").
- You can still access protected pages after logging out.
6. Forced Password Change on First Login
When a new user is invited to the system, they receive a temporary password by email. The system requires them to change it on their very first login.
What to do: Log in using the temporary password from the invite email.
Pass:
- After logging in, you are immediately taken to a Change Password screen.
- You cannot skip this step — navigating away sends you back to the change password page.
- The form asks for: Current Password, New Password, Confirm New Password.
- After successfully changing the password, you are taken to the dashboard.
- Any other active sessions (e.g., on another device) are logged out automatically.
Fail cases to check:
| What you do | What should happen |
|---|---|
| New password does not match the confirmation field | Error: "Passwords do not match" |
| New password is shorter than 8 characters | Error: "Password must be at least 8 characters" |
| Enter the wrong current password | A server error is shown on the form |
7. Account Management
Every logged-in user can view and update their own profile from the sidebar. Click your name/avatar button at the bottom-left of the sidebar to open the user menu, then click Account.
This opens the Account dialog — a panel with the following sections:
| Section | What it shows |
|---|---|
| Header | Your avatar, display name, work email, and role badge |
| Work Information | Read-only: work email, staff number, department, cost centre |
| Personal Information | Editable: display name, personal email, personal phone, official phone, non-working days |
| Next of Kin | Editable: name, relationship, ID type, ID number, address |
| Security | Change password button |
Viewing Your Profile
What to do: Open the Account dialog and check the Work Information section.
Pass:
- Your work email, staff number, department, and cost centre are displayed correctly.
- There is no Edit button on this section — it is read-only.
Fail:
- Any of the read-only fields are blank when they should have data.
- An Edit button appears on the Work Information section.
Editing Personal Information
What to do: In the Personal Information section, click the Edit button (pencil icon). Make changes to one or more fields, then click Save.
Pass:
- The section switches from read-only items to an editable form.
- A Cancel button replaces the Edit button while in edit mode.
- After saving, a success toast appears ("Personal information updated") and the section returns to read-only view showing the updated values.
Fields to test:
| Field | What to verify |
|---|---|
| Display Name | Change your name and save — the header at the top of the dialog also reflects the change |
| Personal Email | Enter a valid personal email address |
| Personal Phone | Enter a phone number |
| Official Phone | Enter a phone number |
| Non-Working Days | Check one or more days (checkboxes for Mon–Sun) — the view mode shows badge labels for selected days |
Cancel behaviour:
- Click Edit, make changes, then click Cancel — the form closes and the original values are restored. Nothing is saved.
Fail:
- Saving shows an error toast.
- Changes are not reflected after saving.
- Clicking Cancel still saves the changes.
Editing Next of Kin
What to do: In the Next of Kin section, click Edit. Fill in the fields and click Save.
Pass:
- The section switches to an editable form.
- After saving, a success toast appears ("Next of kin updated") and the section shows the saved values.
Fields to test:
| Field | What to verify |
|---|---|
| Name | Full name of your next of kin |
| Relationship | e.g., Spouse, Parent, Sibling |
| ID Type | e.g., National ID, Passport |
| ID Number | The document number |
| Address | Physical or postal address (textarea) |
Clearing next of kin: If both Name and Relationship are left blank and you save, the next of kin record is cleared entirely.
Fail:
- Saving returns an error.
- The view mode still shows old values after saving.
Changing Your Password from the Account Dialog
What to do: In the Security section, click the Change button. A nested dialog opens. Enter your current password, a new password, and confirm the new password. Click Change Password.
Pass:
- A success toast appears ("Password changed successfully").
- The dialog closes automatically.
- Other active sessions (e.g., on another device) are logged out.
Fail cases to check:
| What you do | What should happen |
|---|---|
| Leave any field empty and click Change Password | Validation errors appear on the empty fields |
| Enter a new password shorter than 8 characters | Error: "Password must be at least 8 characters" |
| Enter different values in New Password and Confirm fields | Error: "Passwords do not match" |
| Enter the wrong current password | A server error is shown on the form |
8. Creating a License (Organization Setup)
From the admin dashboard, go to Licenses in the sidebar and create a new license by filling in the organization details (company name, country, base currency, expiry date, etc.).
Pass: After a license is successfully created, the following should ALL be automatically set up. Navigate to the pages listed to confirm:
| What is created | Where to check in the dashboard |
|---|---|
| Head Office branch for the organization | Branch Management in the sidebar |
| Tenant Administrator role | Roles & Permissions in the sidebar |
| Base currency for the organization | Financial Config → Tenant Currency in the sidebar |
Fail cases to check:
| What you do | What should happen |
|---|---|
| Set the expiry date to a date in the past | Error: "License expiry must be in the future" |
Note: Country and currency are selected from dropdowns, so invalid values are not possible through normal use.
9. Initialize Sequences
After creating a license, you must initialize the standard sequences (Customer Number, Account Number) before you can create customers or accounts for that organization.
What to do:
- Go to Licenses in the sidebar.
- Click View on a license you just created.
- Look for the Sequences section in the license detail page.
- Click the Initialize button.
Pass:
- The Sequences card shows "Initialized" badges for CUSTOMER and ACCOUNT.
- The "Initialize" button disappears or becomes disabled.
- A success toast appears: "Sequences initialized successfully".
Fail:
- The button does nothing when clicked.
- Sequences remain in "Pending" or "Missing" state.
10. Create a Department
Go to Org Structure in the sidebar, then navigate to Departments. Create a new department by providing a code and a name/description.
Pass:
- The department appears in the list immediately after saving.
- You can optionally assign a parent department for hierarchical structures.
Fail cases:
| What you do | What should happen |
|---|---|
| Leave the code empty | A validation error is shown |
| Use the exact same code as an existing department | An error saying the code already exists |
11. Create a Cost Centre
Go to Org Structure in the sidebar, then navigate to Cost Centres. Create a new cost centre by providing a code and a name.
Pass:
- The cost centre appears in the list after saving.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing cost centre | An error saying the code already exists |
12. Invite a User
Go to Users in the sidebar, then click Invite User. Fill in the details: name, email address, role, and any other required fields.
Testing tip — choosing roles:
- To test the admin dashboard (this release's focus): invite users with the Tenant Administrator role (the role created automatically when a license is set up).
- To test permission boundaries in future releases (e.g., what happens when a non-admin tries to access admin areas): invite users with a non-admin role and see if they are properly blocked.
This release focuses on the Tenant Administrator dashboard, so most of your test users should be invited with the Tenant Administrator role.
Pass:
- The user is created and appears in the user list.
- The invited user receives a welcome email with their login credentials and temporary password.
- When that user logs in with their temporary password, they are immediately forced to change it (see section 6).
Fail cases to check carefully:
| What you do | What should happen |
|---|---|
Use an email at a domain that cannot receive emails — e.g., remoteEaze@arclabs.top | Error: "Email domain cannot receive emails" — the invite is blocked |
| Use an email address that already belongs to an existing user | Error: "User with this email already exists" |
| Leave required fields empty | Validation errors on those fields |
Why is
remoteEaze@arclabs.topa good test case? The system actively checks whether the email domain you enter is actually capable of receiving emails — not just whether the format looks correct.arclabs.topdoes not have mail servers configured, so even though the email format looks valid, it will be rejected. This protects against invites being sent to addresses that will never receive them.
13. Branch Creation
Go to Branch Management in the sidebar and create a new branch. You will select a country and a currency.
Pass:
- The branch is created and appears in the branch list.
- The branch code is automatically generated — you do not type it manually. For example, a second branch for Kenya might get a code like
ABC-KEN-001-0000.
Fail cases:
| What you do | What should happen |
|---|---|
| Select a currency that has not been added to your organization yet | Error: "Currency is not enabled for this organization. Please add it in Currency Settings first." |
| Try to create a second Head Office (Lead) branch for the same country | Error saying a Lead branch already exists for that country |
Note: Every organization automatically gets a Head Office branch when the license is created (see section 8). This means when creating additional branches, a Lead already exists and sub-branches can be created freely under it.
14. Calendar Operations — Create a Work Day Year
Go to Calendar & Operations in the sidebar and create a new work day year by selecting the year.
Pass:
- The year record is created in Draft state.
- You can configure individual months within that year — marking which days of the week are weekends and which specific dates are public holidays.
- The record must go through the approval process before it is considered active (see the Maker-Checker section).
Fail cases:
| What you do | What should happen |
|---|---|
| Try to create the same year twice | An error saying that year already exists |
15. Add Tenant Currency
Go to Financial Config in the sidebar, then Tenant Currency. Add a new currency for your organization by selecting the currency and entering the exchange rates.
Pass:
- The currency appears in the list.
- When adding a currency, note:
- Buy Rate, Sell Rate, Mid Rate — these are the exchange rates relative to your base currency.
- If you set a currency as the Base Currency, its rates are automatically set to 1:1 (since it is the reference currency). Only one currency can be the base at a time — setting a new one as base will replace the previous.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to add a currency code that is not in the global system | The dropdown only shows valid currencies, so this is not possible through normal use |
16. Add Source of Funds
Go to Financial Config in the sidebar, then Source of Funds. Create a new entry by providing a code and a description.
Note: Source of funds here refers to the organization's own funding sources (e.g.,
NGO,GOVERNMENT,MEMBER_SAVINGS).
Pass:
- The entry appears in the list after saving.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing source | An error saying the code already exists |
17. Add Transaction Codes
Go to Financial Config in the sidebar, then Transaction Codes. Create a new transaction code by providing a code, description, and specifying whether it is a Debit, Credit, or Both.
Pass:
- The transaction code is created in Draft state.
- It must be submitted and go through the approval process before it can be used (see the Maker-Checker section).
Fail cases:
| What you do | What should happen |
|---|---|
| Use a code that already exists | An error saying the code already exists |
| Try to edit a transaction code that is currently waiting for approval | An error — records in the approval process cannot be edited |
18. Commission Types and Bands Management
Go to Financial Config in the sidebar, then Commission Types. This is where you define how the system calculates charges and commissions for products.
What to do:
- Create a Commission Type by providing a code, name, currency, and link it to an Income Account (must be an INCOME type product) and a Transaction Code.
- Once the Commission Type is created, open its details and go to the Bands section.
- Add one or more commission bands. Each band defines a range of transaction amounts and the corresponding charge.
Pass:
- The Commission Type is created in Draft state.
- You can add, edit, and remove bands.
- Validation: If the calculation basis is
PERCENTAGE, you can optionally set Min Charge and Max Charge limits. - Validation: Bands must be continuous with no gaps or overlaps (e.g., if Band 1 ends at 500.00, Band 2 must start at 500.00).
- Validation: A band must have either a Charge Amount (flat fee) or a Charge Percentage, but not both.
Fail cases:
| What you do | What should happen |
|---|---|
| Set a Max Amount that is less than or equal to the Min Amount in a band | Error: "maxAmount must be greater than minAmount" |
| Provide both a flat Charge Amount and a Charge Percentage in the same band | Error: "Cannot specify both chargeAmount and chargePercentage" |
Link to an Income Account that is not of type INCOME | Error: "Income account must be of type INCOME" |
| Add a band with a different currency than the parent Commission Type | Error: "Band currency must match commission type currency" |
19. Add Titles, Genders, and Marital Statuses
Go to System Data in the sidebar and add entries for each category:
- Titles (e.g.,
MR,MRS,DR,PROF) - Genders (e.g.,
M,F,OTHER) - Marital Statuses (e.g.,
SINGLE,MARRIED,DIVORCED)
For each, provide a short code and a description/label.
Pass:
- Entries appear in their respective lists.
- These entries become available as dropdown options during customer creation.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing entry in the same category | An error saying the code already exists |
20. Add Customer Type and Customer Rating
Go to Customer Configuration in the sidebar and create entries for:
- Customer Types (e.g.,
INDIVIDUAL,CORPORATE,SME) - Customer Ratings (e.g.,
LOW_RISK,MEDIUM_RISK,HIGH_RISK)
Pass:
- Entries appear in their respective lists and become available when creating customers.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing entry | An error saying the code already exists |
21. Add Account Statuses
Go to Account Configuration in the sidebar, then Statuses. Create account statuses. For each, configure:
- Code and Description (e.g.,
ACTIVE,DORMANT,FROZEN) - Allow Debit — can money be taken out when an account has this status?
- Allow Credit — can money be put in when an account has this status?
- Allow Close of Business Transactions — can end-of-day processing run on this account?
Pass:
- Statuses appear in the list.
- A
DORMANTstatus with all three flags turned off means no transactions of any kind are allowed on accounts with that status.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing status | An error saying the code already exists |
22. Add Activity Rules
Go to Account Configuration in the sidebar, then Activity Rules. Create rules that automatically change an account's status based on activity. Configure:
- Rule type (e.g., "No transactions for X days", "Balance is zero", "Balance below a threshold")
- Threshold — number of days or an amount, depending on the rule type
- Target status — which account status the account should be moved to when the rule triggers (e.g., move to
DORMANT) - Priority — in case multiple rules apply at once
Pass:
- The rule is created in Draft state.
- It must go through the approval process before it is active (see the Maker-Checker section).
23. Add Document Types and Identity Types
Go to Identity / Compliance in the sidebar.
Document Types — Add document categories used for customer record-keeping (e.g., PHOTO, PASSPORT_COPY, PROOF_OF_ADDRESS).
Identity Types — Add types of identity documents (e.g., NATIONAL_ID, PASSPORT). You can optionally configure:
- Which country the ID type belongs to
- Which fields are required (e.g., issue date, expiry date, reference number)
- A format pattern for the ID number (used to validate that the number matches the expected format)
Pass:
- Entries appear in their lists and become available when capturing customer identity information.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing entry | An error saying the code already exists |
24. Add Loan Purposes, Collateral Types, and Facility Classes
Go to Loan Configuration in the sidebar. This section has three tabs: Loan Purposes, Collateral Types, and Facility Classes.
Loan Purposes — Add reasons a customer might take a loan (e.g., AGRICULTURE, SCHOOL_FEES, BUSINESS).
Collateral Types — Add types of security a customer can offer against a loan (e.g., LOGBOOK, TITLE_DEED, FIXED_DEPOSIT).
For both, provide a short code and a description. These entries become available as dropdown options when creating facilities.
Fail cases (Loan Purposes and Collateral Types):
| What you do | What should happen |
|---|---|
| Use the same code as an existing entry | An error saying the code already exists |
Facility Classes
A Facility Class is a product template that defines the default behaviour for credit facilities created under it. You must have at least one approved Facility Class before creating a facility.
What to do:
- Go to Loan Configuration → Facility Classes.
- Click Create Facility Class.
- Fill in the fields and click Save & Submit.
Form fields:
| Field | Notes |
|---|---|
| Code | 2–30 characters; auto-uppercased; immutable after creation |
| Name | 3–100 characters |
| Description | Optional, up to 500 characters |
| Revolving Facility | Toggle — on by default (revolving). Turn off for term facilities |
| Availability (%) | 0–100; defaults to 100. Controls how much of the facility limit is available for utilization |
Pass:
- Using Save as Draft creates the class in Draft state. Save & Submit submits it — as a System Administrator it immediately moves to Authorized.
- An authorized Facility Class shows an Eligible Products section on its detail page where you can link authorized contract products.
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same code as an existing Facility Class | An error saying the code already exists |
| Try to edit an Authorized Facility Class | No Edit button is shown |
25. Customer Management (CRM)
Go to CRM in the sidebar, then Customers. This is where you onboard and manage individual and corporate clients.
What to do:
- Click Create Customer.
- Select a Customer Type (Individual or Corporate).
- Fill in the required demographics and contact information.
- Add at least one Identity document.
- Submit the record for approval.
Pass — Individual customer:
- Form shows individual fields: First Name, Surname, Title, Gender, Marital Status, Date of Birth.
- At least one identity document is required.
- After creation, the customer is in Draft state with an auto-generated Customer Number.
- A unique QR Code is automatically generated.
Pass — Corporate customer:
- Form shows corporate fields: Corporate Name, Date of Incorporation.
- At least one Director, one Shareholder, and one Contact Person are required.
- At least one identity document for the entity is required.
- After creation, the customer is in Draft state.
Fail cases:
| What you do | What should happen |
|---|---|
| Submit an Individual customer without a First Name | Validation error on First Name |
| Submit a Corporate customer without any Directors | Validation error: at least one director required |
| Submit a Corporate customer without any Shareholders | Validation error: at least one shareholder required |
| Submit a Corporate customer without any Contacts | Validation error: at least one contact required |
| Provide total shareholder percentage exceeding 100% | Error: "Total shareholder percentage cannot exceed 100%" |
| Provide an identity reference that doesn't match the configured format pattern | Error: reference does not match the format defined in the Identity Type |
| Submit without any identity document | Error: at least one identity document is required |
26. Agent Management (CRM)
Go to CRM in the sidebar, then Agents. Agents are individuals authorized to perform transactions and onboard customers.
Creating an Agent
What to do:
- Click Create Agent.
- Select an existing User to be the agent and assign them to a Branch.
- Optionally configure working hours and Geo-fencing.
- Submit for approval.
Pass:
- The agent is created in Draft state.
- The Agent Number is automatically generated from the branch code (e.g.,
KCB-KEN-001-0001). - The User and Branch cannot be changed after creation.
Fail cases:
| What you do | What should happen |
|---|---|
| Select a user who is already linked to another agent record | Error: "User is already an agent" |
| Set an End Time earlier than or equal to the Start Time | Error: "End time must be after start time" |
| Enable geo-lock without providing a geo zone | Error: "allowedGeoZone is required when geoLockEnabled is true" |
Updating Agent Working Configuration
Once an agent is Approved, their working hours and geo-fencing can be updated directly — no maker-checker cycle required.
What to do:
- Open an Approved agent's detail page.
- Click Edit Config (or equivalent working config section).
- Change the start/end times or geo zone and save.
Pass:
- The changes are saved immediately without needing a separate approval step.
- The same time and geo-zone validations apply.
Linking an Agent Account
Once an agent is Approved, they must be linked to a dedicated Agent Account (operating account for commissions and float). Both the agent and the account must be AUTHORIZED before linking.
What to do:
- Create a new account (see Section 29) and mark it as an Agent Account flag — do not assign a customer.
- Approve the account until it reaches Approved status.
- Open the Agent's detail page.
- Click Link Account and select the approved account.
Pass:
- The account is successfully linked to the agent.
- A PRIMARY_HOLDER mandate is automatically created for the linked account, using the agent's user profile (name, email, and official phone number) as the signatory.
- The mandate has no
signatoryCustomerId— agents are not customers.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to link an account that is not yet Approved | Error: "Can only link AUTHORIZED accounts" |
| Try to link an account before the agent is Approved | Error: "Can only link account to AUTHORIZED agent" |
27. Facility Management
Go to Ledger Operations in the sidebar and click the Facilities tab. This is where you create and manage credit facilities for customers.
Prerequisites: You need at least one Authorized customer (section 25) and at least one Authorized Facility Class (section 24) before you can create a facility.
Creating a Facility
What to do:
- Click Create Facility.
- Select a Customer — only Authorized customers are shown.
- Select a Facility Class — only Authorized, active classes are shown.
- Fill in the remaining fields (see table below).
- Click Save & Submit.
Form fields:
| Field | Notes |
|---|---|
| Customer | Required; immutable after creation |
| Facility Class | Required; immutable after creation |
| Description | Required; 3–500 characters |
| Currency | Required; immutable after creation |
| Approved Amount | Required; the total credit limit approved |
| Advised Amount | Required; the amount communicated to the customer — must not exceed Approved Amount |
| Expiry Date | Required; must be a future date |
| Review Frequency (days) | 1–365; defaults to 30 — days before expiry to trigger a review |
| Expiry Mode | Manual (default) or Automatic |
| Revolving Limit | Three options: Inherit from class (default), Yes, or No |
| Availability Marker | YES (facility available) or NO (facility blocked) |
Pass:
- Save as Draft creates the facility in Draft state. Save & Submit immediately moves it to Authorized for a System Administrator.
- The Facility Ref is automatically generated by the system in the format
{customerNumber}.{facilityClassCode}— you do not type it. - The Date Approved is automatically stamped when the facility reaches Authorized.
Fail cases:
| What you do | What should happen |
|---|---|
| Set Advised Amount higher than Approved Amount | Error: advised amount must not exceed approved amount |
| Set an Expiry Date in the past | Error: expiry date must be in the future |
| Select a customer that is not Authorized | The customer does not appear in the dropdown |
| Create a second facility with the same Customer + Facility Class combination | Error: that Facility Ref already exists |
| Try to create a facility where the Approved Amount would push the customer over their total credit limit | Error: exceeds customer credit limit |
Facility List
What to do: On the Facilities list page, verify that the filters and table work correctly.
Pass:
- The list shows: Facility Ref, Customer, Facility Class code, Approved Amount, Facility Status, Approval Status, Expiry Date, and Created date.
- Filters work: by search (searches Facility Ref), Approval Status, Facility Status, and Active/Inactive.
- The default view shows only Authorized facilities.
Viewing a Facility (Detail)
What to do: Click View on any facility in the list.
Pass:
- The detail page shows all facility fields plus a Record Info sidebar with status, version, dates, and a Change button for Facility Status (Authorized facilities only).
- Below the main details, two inline card sections are present: Collateral and Facility Accounts.
Updating a Facility
What to do: Open a Draft or Rejected facility and click the Edit button. Update one or more fields and save.
Pass:
- Changes are saved and reflected on the detail page.
- The version number increments.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to edit an Authorized facility | No Edit button is shown |
| Try to edit a facility awaiting approval | No Edit button is shown |
Changing Facility Status
Once a facility is Authorized, its operational status can be changed without going through maker-checker.
What to do:
- Open an Authorized facility.
- In the Record Info sidebar, click Change next to Facility Status.
- Select one of the four options and confirm.
Available statuses:
| Status | Meaning |
|---|---|
| Active | Facility is available for utilization |
| Suspended | Temporarily blocked — requires a memo (min 5 characters) |
| Expired | Past its expiry date |
| Cancelled | Permanently cancelled — requires a memo (min 5 characters) |
Pass:
- The status updates immediately and the badge on the detail page changes.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to set Suspended or Cancelled without entering a memo | Error: status memo is required (min 5 characters) |
| Try to change the status of a non-Authorized facility | The Change button is not visible |
Deleting a Facility
What to do: Open a Draft or Rejected facility and use the Danger Zone card to delete it.
Pass:
- Confirmation dialog appears. After confirming, you are taken back to the list.
- The facility no longer appears in the active list. Switch to Inactive status filter to confirm it still exists as a soft-deleted record.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to delete an Authorized facility | No delete option is shown — you must Cancel the facility first via status change |
| Try to delete a Denied facility | No delete option is shown — Denied is terminal |
28. Facility Collateral
Collateral is managed directly on the Facility Detail page — there is no separate route. Scroll down on an Authorized facility's detail page to find the Collateral card. The Add, Edit, and Delete controls are only available when the facility is Authorized and active.
Adding Collateral
What to do:
- Open an Authorized facility.
- In the Collateral card, click Add Collateral.
- A side panel opens on the right. Fill in the fields and click Add Collateral.
Form fields:
| Field | Notes |
|---|---|
| Collateral Type | Required; select from your configured collateral types |
| Collateral Ref | Required; the external reference number (e.g., title deed number, logbook number); max 100 characters |
| Currency | Required |
| Description | Required; max 500 characters |
| Market Value | Required; current market value |
| Forced Sale Value | Required; estimated forced sale value — must not exceed Market Value |
| Last Valuation Date | Required; date the opening valuation was performed |
| Expiry Date | Optional; for time-limited collateral such as Fixed Deposits |
| Remarks | Optional; valuation report summary; max 2000 characters |
Pass:
- The collateral item appears in the Collateral card table.
- An initial valuation record is automatically created in the valuation history using the Market Value, Forced Sale Value, and Last Valuation Date you entered. The valuer name is recorded as "Initial valuation".
- Totals at the bottom of the card (total Market Value and total Forced Sale Value) update.
Fail cases:
| What you do | What should happen |
|---|---|
| Set Forced Sale Value higher than Market Value | Error: forced sale value must not exceed market value |
| Try to add collateral to a non-Authorized facility | The Add Collateral button is not shown |
Updating Collateral
What to do: Click the Edit button on a collateral row. The same side panel opens in edit mode.
Note: The valuation figures (Market Value, Forced Sale Value, Last Valuation Date) are not editable here. To update the collateral's value, you must add a new valuation (see section 29 — Collateral Valuation). Edit mode only allows updating the classification fields: Collateral Type, Collateral Ref, Currency, Description, Expiry Date, and Remarks.
Pass:
- Changes are saved and the row updates.
- Valuation figures are unchanged unless a new valuation is added separately.
Removing Collateral
What to do: Click the Delete button on a collateral row and confirm the dialog.
Pass:
- A confirmation dialog warns that all associated valuation records will also be removed.
- After confirming, the collateral row disappears from the card.
- The totals strip at the bottom recalculates.
Fail:
- No confirmation dialog appears before deletion.
29. Collateral Valuation
Valuation history is accessed by expanding a collateral row on the Facility Detail page. Click the chevron/expand toggle on the left of any collateral row to reveal the inline valuation history panel.
Valuations are append-only — you cannot edit a past valuation. If a valuation was recorded in error, you delete it (which recalculates the current values from the next most recent entry).
Adding a Valuation (Re-valuation)
What to do:
- Expand a collateral row.
- In the Valuation History panel, click Add Valuation.
- A side panel opens. Fill in the fields and click Add Valuation.
Form fields:
| Field | Notes |
|---|---|
| Valuation Date | Required |
| Currency | Required; pre-filled from the collateral's currency |
| Market Value | Required |
| Forced Sale Value | Required; must not exceed Market Value |
| Valuation Method | Optional: Market Comparison, Income Approach, Cost Approach, or Other |
| Valuer Name | Required; name of the valuer or firm; min 2 characters |
| Valuer Reference | Optional; report or certificate reference number |
| Remarks | Optional; notes or conditions |
Pass:
- A new valuation entry appears at the top of the valuation history (sorted newest first).
- The parent collateral row immediately updates its Market Value, Forced Sale Value, and Last Valuation Date to reflect the new valuation.
- The Collateral card totals strip also recalculates.
Fail cases:
| What you do | What should happen |
|---|---|
| Set Forced Sale Value higher than Market Value | Error: forced sale value must not exceed market value |
| Leave Valuer Name empty | Validation error |
Deleting a Valuation
What to do: In the valuation history panel, click Delete on a valuation row and confirm.
Pass:
- A confirmation dialog warns that this will recalculate the collateral's current values.
- After confirming, the valuation entry is removed from the history.
- The parent collateral row updates to show the values from the next most recent valuation.
Fail:
- No confirmation dialog appears.
- The parent collateral's values do not update after deletion.
30. Facility Accounts
Account linking is managed directly on the Facility Detail page — scroll down past the Collateral card to find the Facility Accounts card. Controls are only available when the facility is Authorized.
The Facility Accounts card shows a capacity strip: Advised (total limit), Allocated (sum of all account allocations), Remaining (Advised − Allocated), and Utilized / Outstanding (system-managed, updated by transaction processing). If Remaining goes negative, it is shown in red with an "Over limit" warning.
Linking an Account to a Facility
What to do:
- Open an Authorized facility.
- In the Facility Accounts card, click Link Account.
- A side panel opens. Fill in the fields and click Link Account.
Form fields:
| Field | Notes |
|---|---|
| Account | Required; only Authorized, active accounts for the same customer are shown in the dropdown |
| Allocation Amount | Required; the portion of the facility's advised limit reserved for this account — must be greater than 0 |
Pass:
- The account appears in the Facility Accounts table with its number, name, allocation amount, link date, and status.
- The capacity strip updates: Allocated increases by the allocation amount, Remaining decreases.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to link an account belonging to a different customer | The account does not appear in the dropdown |
| Try to link an account that is not Authorized | The account does not appear in the dropdown |
| Set an Allocation Amount that would push total allocations over the facility's Advised Amount | Error: total allocation would exceed the facility advised amount |
| Try to link the same account to the same facility twice | Error: account is already linked to this facility |
| Try to link an account to a non-Authorized facility | The Link Account button is not shown |
Updating an Account Link (Edit Allocation)
What to do: Click the Edit button on an account row in the Facility Accounts card. Only the Allocation Amount can be changed — the account itself is immutable once linked.
Pass:
- The allocation amount updates and the capacity strip recalculates.
Fail cases:
| What you do | What should happen |
|---|---|
| Update the allocation to an amount that would push total allocations over the Advised Amount | Error: total allocation would exceed the facility advised amount |
Releasing an Account from a Facility
What to do: Click Unlink on an account row and confirm the dialog.
Pass:
- A confirmation dialog shows the account number and allocation amount being released.
- After confirming, the account row is removed from the Facility Accounts card.
- The capacity strip recalculates — Allocated decreases, Remaining increases.
- The account itself is not deleted; it is simply no longer linked to this facility.
Fail:
- No confirmation dialog appears.
- The account still appears in the card after unlinking.
31. Add a Product (Chart of Accounts)
Go to Chart of Accounts in the sidebar and create a new product. Products are the financial building blocks — think of them as the categories that all money movements are tracked against. You will choose a product type:
- Asset — things the organization owns (e.g., loans given out)
- Liability — things the organization owes (e.g., customer deposits)
- Income — money coming into the organization (e.g., interest earned)
- Expense — money going out of the organization (e.g., interest paid out)
The product code is automatically generated — you do not type it. The format is a two-letter prefix followed by a number:
| Type | Prefix | Number range |
|---|---|---|
| Asset | AS | 10000 – 29999 |
| Liability | LI | 30000 – 49999 |
| Income | IN | 50000 – 69999 |
| Expense | EX | 70000 – 79999 |
Pass (basic creation):
- Product is created in Draft state with an auto-generated code (e.g.,
AS-10000,LI-30000).
Pass (after the product is approved — balance tracking):
- Once a product is approved, balance tracking records are automatically created for branches.
- If the product has no branch restriction: balance records are created for every branch.
- If the product has a branch restriction (specific branches selected): balance records are only created for those branches.
- Navigate to the product and look for its balances to confirm the correct branch records exist.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to edit a product that is waiting for approval | An error saying you cannot edit it in that state |
| Try to edit a product that has already been approved | An error — approved products cannot have their details changed |
32. Account Condition (Interest Engine)
Go to Account Configuration in the sidebar, then Account Conditions. This is where you define interest calculation rules that can be linked to products and applied to accounts.
What to do:
- Click Create Account Condition.
- Enter a Code (uppercase alphanumeric with dashes, e.g.
SAV-STD-01), a Name, and an Effective From date. - Select a Currency.
- Configure the interest settings: Interest Basis, Balance Type, Calculation Methods, and frequencies.
- Optionally add Debit Tiers and/or Credit Tiers (tiered interest rates).
- Link GL accounts for interest posting (Expense, Liability, Income, Tax accounts).
- Submit for approval.
Pass:
- The condition is created in Draft state.
- The Code and Currency cannot be changed after creation.
- After approval, the condition can be linked to Products so that accounts using those products inherit these interest rules.
Frequency validation — what to check:
| Rule | What should happen |
|---|---|
| Set Accrual Frequency to MONTHLY and Posting Frequency to MONTHLY | Allowed — they can be equal |
| Set Accrual Frequency to MONTHLY and Posting Frequency to QUARTERLY | Error: accrual cannot be less frequent than posting |
| Set Capitalization Frequency to MONTHLY and Posting Frequency to QUARTERLY | Error: capitalization cannot be more frequent than posting |
Tier validation:
| What you do | What should happen |
|---|---|
| Add two tiers with the same Min Amount | Error: duplicate minAmount values |
| Set a tier's Max Amount to null on a non-last tier | Error: only the last tier can have unlimited max amount |
| Set Debit Min Interest greater than Debit Max Interest | Error: minimum cannot exceed maximum |
Tax validation:
| What you do | What should happen |
|---|---|
| Enter a tax rate without selecting a tax type | Error: tax type is required when tax rate is set |
| Enter a tax rate above 100% | Error: tax rate cannot exceed 100% |
Fail cases:
| What you do | What should happen |
|---|---|
| Use the same Code + Effective From as an existing condition | Error: this combination already exists |
| Try to edit a condition that is already Approved | Edit button not visible — use Supersede instead |
Superseding an Account Condition
When interest rates change, you do not delete and recreate. Instead, you supersede the existing condition to create a new time-bounded version.
What to do:
- Open an Approved, open-ended condition (one with no Effective To date).
- Click Supersede.
- Enter a New Effective From date — must be tomorrow or later.
- Optionally add comments.
- Confirm.
Pass:
- A new Draft version of the condition is created with the new effective date.
- The original condition's Effective To date is automatically set to the day before the new version starts.
- All product links from the original are automatically copied to the new version.
Fail cases:
| What you do | What should happen |
|---|---|
| Enter an Effective From date of today or in the past | Error: date must be at least tomorrow |
| Try to supersede a condition that already has an Effective To date | Supersede button not available |
Interest Preview
Once approved, you can test a condition's calculation before applying it to real accounts.
What to do:
- Open an Approved condition.
- Click Interest Preview.
- Enter a Balance (positive = savings/credit, negative = loan/debit) and a Days value.
- Optionally enable Include Tax.
- Click Calculate.
Pass:
- The result shows gross interest, applied rate, day-count basis, and (if tax is included) tax amount and net interest.
- Tier breakdown is shown if tiered rates are configured.
- A "Waived" badge appears if the calculated interest is below the de minimis threshold.
33. Account Creation
Go to Ledger in the sidebar, then Accounts. This is where you create and manage financial accounts for customers, agents, or internal use.
What to do:
- Click Create Account.
- Select a Product — must be AUTHORIZED.
- Choose the account type:
- Customer account: select a Customer (must be AUTHORIZED).
- Agent account: tick the Agent Account flag — do not select a customer.
- Internal GL account: leave both customer and agent flag empty (only valid for non-contract products).
- Select an Account Type and Branch.
- Set the Currency (must match the product's currency).
- Optionally configure dates, interest condition, signing rule, sector/industry, and services.
- Submit for approval.
Pass:
- The Account Number is automatically generated (e.g.,
ACC-00000001). - The Account Name is automatically computed:
{Customer Name} {Account Type} {Currency}. For agent accounts, the product name is used in place of a customer name. - A unique QR Code is automatically generated (
QR-ACC-{accountNumber}). - For internal GL accounts, the customer and agent fields are absent.
Fail cases:
| What you do | What should happen |
|---|---|
| Select a contract product but provide neither a customer nor the agent account flag | Error: "Customer ID is required for contract products" |
| Select a contract product and set both a customer AND the agent account flag | Error: cannot set both |
| Select a product that is not yet Approved | Error: "Product is not authorized" |
| Select a customer that is not yet Approved | Error: "Customer is not authorized" |
Set scheduleDefined = true without selecting a schedule frequency | Error: schedule frequency is required |
| Set an End Date earlier than or equal to the Start Date | Error: end date must be after start date |
Auto-mandate on Account Authorization (Individual customers)
When an account linked to an Individual customer is approved and reaches Approved status, a PRIMARY_HOLDER mandate is created automatically.
What to do:
- Create an account for an Individual customer.
- Approve the account through to Approved status.
- Open the account details and go to the Mandates tab.
Pass:
- A PRIMARY_HOLDER mandate already exists.
- The mandate shows the customer's name as the signatory.
- The mandate includes the customer's contact info (email, phone) and their first identity document details.
effectiveFromis set to today's date.
Note: Corporate customer accounts do not get an auto-mandate. You must add mandates manually.
34. Mandate Management (Signatories)
Mandates define who is authorized to sign for transactions on an account. Go to an Approved account's detail page and open the Mandates tab.
Manual Mandate Creation
What to do:
- Open an Approved account and go to the Mandates tab.
- Click Add Mandate.
- Fill in: Signatory Name, Signatory Type, Effective From date, and optionally Transaction Limit, contact info, and identity details.
- Optionally link to an existing Customer record via Signatory Customer.
- Save.
Pass:
- The mandate appears in the list and is marked as Active.
effectiveTonull means the mandate is indefinitely valid.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to add a mandate to a non-Approved account | Error: "Can only add mandates to AUTHORIZED accounts" |
| Set an Effective To date on or before the Effective From date | Error: "effectiveTo must be after effectiveFrom" |
| Provide a Signatory Customer ID that does not exist | Error: "Signatory customer not found" |
Signing Rule
The Signing Rule (how mandates must be collectively fulfilled) is set on the Account, not on individual mandates. Go to the account's detail and look for the Signing Rule field.
| Rule | Meaning |
|---|---|
ANY_ONE | Any single active mandate holder can authorize |
ALL_MUST_SIGN | All active mandate holders must authorize |
TWO_OF_THREE | Two out of three must authorize |
MAJORITY | More than half of active mandate holders must authorize |
35. Account Statement Configuration
Configure how and when a customer receives their account statements. Go to an Approved account's detail page and open the Statements tab.
What to do:
- Click Configure Statement (or Add Statement Config).
- Select the Frequency (DAILY, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY).
- Select the Delivery Method (EMAIL, PHYSICAL, or BOTH).
- Save.
Pass:
- The configuration is saved and displayed on the Statements tab.
lastStatementDateandlastStatementBalare empty until the first statement is generated by the system.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to configure a statement on a non-Approved account | Error: "Can only add statement config to AUTHORIZED accounts" |
36. Record Versions Increment on Update
Every record in the system has a version number that increases every time the record is updated. This helps track how many times something has been changed.
What to do: After creating any record (e.g., a department, a branch), open its details and note the version number. Make any edit and save. Check the version number again.
Pass:
- The version number goes up by 1 with each save (starts at 1, becomes 2 after the first edit, 3 after the second, etc.).
Fail:
- The version number stays the same after an update.
37. Maker-Checker Workflow (Basic)
For the full maker-checker approval workflow with multi-level approvals, reject, deny, and re-edit testing, see Section 42.
This section covers the basic workflow states and what you can test with a single admin user.
The Maker-Checker system is a two-person approval process for sensitive actions. One person creates or changes a record (the Maker), and another authorized person reviews and approves it (the Checker).
This applies to: Commission Types, Customers, Agents, Transaction Codes, Products (Chart of Accounts), Calendar Years, Activity Rules, Transactions, Standing Orders, and other financial configuration items.
Workflow States
| Status | What it means |
|---|---|
| CAPTURED (Draft) | Created but not yet submitted for approval |
| PENDING_AUTH_L3/L2/L1 | Submitted and waiting for the relevant approval level |
| AUTHORIZED (Approved) | Fully authorized and active |
| REJECTED | Returned to the maker with a reason — can be edited and resubmitted |
| DENIED | Permanently refused — cannot be reopened or edited |
What to Test with a Single Admin User
1. Super Admin submits directly to Authorized ✅ Test now
When the Tenant Administrator submits a record, it should skip the approval queue and go directly to Authorized — because an admin does not need a separate person to check their own work.
Create a record (e.g., a Transaction Code), click Submit.
Pass: The record immediately shows as Authorized (not "Pending Approval"). Fail: It shows as "Pending Approval" even for the admin.
2. Editing restrictions ✅ Test now
Create a record (e.g., a Transaction Code or Product), then open it after saving. Confirm the Edit button is visible. Submit it, then open it again and confirm the Edit button is gone.
| Record state | Can you edit it? |
|---|---|
| CAPTURED (Draft) | Yes — Edit button is visible |
| AUTHORIZED (Approved) | No — no Edit button shown |
| REJECTED | Yes — Edit button is visible, can resubmit |
| DENIED | No — no Edit button, no actions available |
3. Viewing the difference between versions — Coming in a future iteration
The ability to see what changed between the draft and the submitted version is not yet available on the dashboard. This will be added in a future iteration.
38. License Validity and Enforcement
From the admin dashboard, go to Licenses and view a license record.
What to verify visually:
- The license list correctly shows an Expired badge next to licenses whose expiry date has passed.
- The license details page shows the correct organization name, expiry date, modules, and active status.
License enforcement — what to expect when a license has a problem:
If a tenant's license is expired, inactive, or has an integrity problem, the system blocks access after login. The user can always log in — but as soon as the dashboard tries to load data, they are redirected to an error page with a clear message.
| Scenario | What the user sees |
|---|---|
| License expired (expiry date has passed) | "Your organization's license has expired. Contact your system administrator." |
| License inactive (manually disabled by system admin) | "Your license is inactive. Contact your system administrator." |
| License tampered (integrity check failed) | "Unable to verify your organization's license. Your license may have been tampered with. Contact support." |
The page shows only the message and a Sign Out button — the user cannot proceed into the dashboard until the issue is resolved by the system administrator.
What to test:
| What you do | What should happen |
|---|---|
| Log in as a user whose license has expired | Login succeeds, then you are immediately redirected to the license error page with the expired message |
| Log in as a user whose license is inactive | Login succeeds, then you are immediately redirected to the license error page with the inactive message |
| Click Sign Out on the license error page | You are signed out and taken to the login page |
Try to navigate directly to /admin/dashboard after being redirected | You are sent back to the license error page |
Note for testers: To test the expired and inactive scenarios you will need a license that has been set to the appropriate state. Ask the developer to set up a test tenant/license before running these checks.
To test the tampered scenario, ask a developer to manually corrupt a license record in the database. This cannot be done through the dashboard — it requires direct database access to simulate what would happen if license data was altered outside the system.
39. Activity Logs
Go to Activity Logs in the sidebar. This page shows a record of every significant action performed in the system — who did what, when, and what changed.
The List View
What to do: Open the Activity Logs page. You should see a table of events recorded by the system.
Pass:
- The list shows events with columns: Actor (who did it, with a badge like "Human" or "System"), Action (what was done), Entity (which record was affected), Status (Success or Failure badge), and Time.
- As a system admin, you also see a Company column showing which organization the event belongs to.
- Events are sorted by most recent first.
Filters to test:
| Filter | What to do | What should happen |
|---|---|---|
| Date range | Change the "From" and "To" dates | Only events within that date range are shown. The range cannot exceed 90 days. |
| Search | Type an actor name, action, or entity ID into the search box | The list filters as you type (with a short delay) |
| Status | Select "Failure" from the status dropdown | Only failed events are shown |
| Company | Select a specific organization from the company dropdown | Only events for that organization are shown |
| Clear filters | After applying filters, look for a way to clear them | The list returns to showing all events |
Fail:
- The list is empty even though you have been performing actions in the system.
- Filters do not update the results.
- The date range allows more than 90 days without an error.
The Detail View
What to do: Click View on any event in the list to open its detail page.
Pass:
- The detail page shows the full event information organized into cards:
- Event Summary — action, entity type and ID, status, module, tags, and whether the event is marked as sensitive.
- Actor — who performed the action, their role, and their branch.
- Request Context — the HTTP method and path (e.g.,
POST /api/v1/...), IP address, and browser information. - Record Status — if the action involved a workflow change (e.g., Draft to Approved), the before and after states are shown with colored badges.
- Trace & System — request ID, session ID, service name, and environment.
- Timestamps — when the event happened and when it was logged.
Fail:
- The detail page is blank or shows an error.
- Information is missing (e.g., no actor name, no timestamps).
The Diff Viewer (View Changes)
What to do: Find an event where a record was created or edited (e.g., you edited a department name or updated a branch). Open the detail page. Look for a "View Changes" button near the top — it shows a badge with the number of fields that changed.
Click View Changes to open the diff dialog.
Pass:
- A dialog opens showing what changed in the record.
- Modified fields (something changed from one value to another) are shown with the old value in red with a strikethrough and the new value in green.
- Added fields (a value was set for the first time) are shown in green with a
+marker. - Removed fields (a value was cleared) are shown in red with a
-marker. - Field names are displayed in readable format (e.g.,
address > streetinstead ofuser.address.street). - If a field contains encrypted data, it shows a lock icon and the word "Encrypted" instead of the raw value.
- If a field contains redacted data, it shows a lock icon and "Redacted".
Fail:
- The "View Changes" button does not appear on an event that clearly involved a change.
- The dialog is empty or shows raw technical data instead of a readable comparison.
Decrypting Sensitive Data
Some events involve personal information (emails, phone numbers, etc.) that is encrypted for security. Authorized users can temporarily decrypt this data for review.
What to do: Find a sensitive event in the list (look for events marked as sensitive on the detail page). Open it, click View Changes, and look for a "Decrypt PII" toggle switch inside the dialog.
Pass:
- The toggle is only visible on sensitive events.
- Toggling it on briefly shows "Decrypting..." then reveals the actual values (e.g., a real email address instead of "Encrypted").
- Decrypted values are visually distinct (different text color) so you can tell they are decrypted.
- Toggling it off returns the values to their encrypted state.
Fail:
- The decrypt toggle appears on events that are not sensitive.
- Toggling decrypt does nothing or shows an error.
- Decrypted values look identical to encrypted values (no visual distinction).
Important: Every time you decrypt sensitive data, that action is itself recorded in the activity logs. This is by design — it creates an audit trail of who accessed personal information and when.
40. Soft Delete and Viewing Deleted Records
Most configuration records in the system can be deleted. Deletion is soft — the record is not permanently removed from the database, it is marked as inactive. This means deleted records can still be viewed for audit purposes.
Deleting a Record
What to do: Open the detail page of any entity that supports deletion (see the table below). At the bottom of the page (or in the right sidebar), look for a "Danger Zone" card with a red Delete button. Click it.
Pass:
- A confirmation dialog appears asking you to confirm the deletion. You do not need to type anything — just click Delete to confirm.
- After confirming, a success message appears briefly (e.g., "Department deleted successfully").
- You are automatically taken back to the list page.
- The record no longer appears in the default "Active" list.
Fail:
- No confirmation dialog appears — the record is deleted immediately without asking.
- An error appears after confirming.
- You are not taken back to the list page.
Viewing Deleted Records
What to do: On the list page, change the status filter to Inactive. Deleted records will appear in this list. Click View on a deleted record.
Pass:
- The detail page loads successfully — no "Not Found" error.
- The status badge shows Inactive in red.
- There is no Edit button — the page is completely read-only.
- There is no Danger Zone card — you cannot delete an already-deleted record.
- All the record's data is still visible for reference.
Fail:
- Clicking View on a deleted record shows a "Not Found" error page.
- The Edit button is still visible on a deleted record.
- The Danger Zone / Delete card is still visible on a deleted record.
Which Entities Support Delete
| Entity | Location in sidebar | Special conditions |
|---|---|---|
| Title | System Data → Titles | — |
| Gender | System Data → Genders | — |
| Marital Status | System Data → Marital Statuses | — |
| Customer Type | Customer Config → Customer Types | — |
| Customer Rating | Customer Config → Customer Ratings | — |
| Account Type | Account Config → Account Types | — |
| Account Status | Account Config → Statuses | — |
| Document Type | Identity / Compliance → Document Types | — |
| Identity Type | Identity / Compliance → Identity Types | — |
| Source of Funds | Financial Config → Source of Funds | — |
| Loan Purpose | Loan Config → Loan Purposes | — |
| Collateral Type | Loan Config → Collateral Types | — |
| Commission Type | Financial Config → Commission Types | Can only delete in Draft or Rejected state |
| Branch | Branch Management | Cannot delete a branch that has child branches |
| Department | Org Structure → Departments | Cannot delete a department that has child departments |
| Cost Centre | Org Structure → Cost Centres | — |
| Role | Roles & Permissions | The System Administrator role cannot be deleted |
| Tenant Currency | Financial Config → Tenant Currency | The base currency cannot be deleted |
| Transaction Code | Financial Config → Transaction Codes | Can only delete in Draft or Rejected state |
| Activity Rule | Account Config → Activity Rules | Can only delete in Draft or Rejected state |
| Work Day Year | Calendar & Operations | Can only delete in Draft or Rejected state |
Maker-Checker entities (Commission Types, Customers, Agents, Transaction Codes, Activity Rules, Work Day Years, Facilities) can only be deleted when they are in Draft or Rejected state. Once a record has been submitted for approval or is already approved, the Delete button is not available. Note that Denied facilities additionally cannot be deleted at all — Denied is a terminal permanent block.
Entities That Do NOT Support Delete
The following entities use different lifecycle management and do not have a Delete option:
| Entity | Why no delete |
|---|---|
| License | Use activate/deactivate instead |
| Users | Use deactivate instead (coming soon) |
| Products (Chart of Accounts) | Managed through the maker-checker approval lifecycle |
| Product Balances | System-managed — created automatically when products are approved |
| Account, Facility, Customer, Agent | Managed through status lifecycle workflows |
Activity Logs After Delete
After deleting a record, you can verify the action was recorded:
- Go to Activity Logs in the sidebar.
- Search for the entity you deleted.
- You should see a
*.deleteevent (e.g.,department.delete) with Success status.
Pass: Only one log entry for the delete action — no additional failed "view" entries immediately after.
Fail: You see a failed *.view entry immediately following the delete (this would indicate a bug).
41. Transaction Creation
Transactions are the core financial operation of the system. Every money movement is recorded as a double-entry transaction with debit and credit lines that must balance in the organization's base currency.
Go to Ledger Operations in the sidebar, then Transactions. Click Create Transaction to open the form.
Creating a Transaction
What to do:
- Click Create Transaction.
- Fill in the header fields (see table below).
- Add posting lines in the Posting Lines section (see next subsection).
- Click Save as Draft or Save & Submit.
Header fields:
| Field | Notes |
|---|---|
| Company | Only shown for System Admin. Select the organization this transaction belongs to. |
| Posting Date | Required. The business date the transaction is posted. Defaults to today. |
| Value Date | Required. The date funds take effect (used for interest calculations). Defaults to today. |
| Branch | Required. Select the branch where this transaction is initiated. The dropdown populates after a company is selected. |
| Narrative | Optional. Overall description for the transaction (max 500 characters). |
Pass:
- The transaction is created with a system-generated Transaction Reference (e.g.,
TXN-00000001). - Two status badges appear on the detail page:
- Approval Status (record lifecycle): CAPTURED, PENDING_AUTH_L1/L2/L3, AUTHORIZED, REJECTED, or DENIED
- Processing Status (financial lifecycle): Pending, Processed, Failed, or Reversed
- Save as Draft saves the transaction in CAPTURED status. Save & Submit submits it for approval — for a System/Tenant Administrator, it goes directly to AUTHORIZED.
Fail cases:
| What you do | What should happen |
|---|---|
| Leave Posting Date empty | Error: "Posting date is required." |
| Leave Value Date empty | Error: "Value date is required." |
| Leave Branch empty | Error: "Branch is required." |
| Submit without any posting lines | Error: "At least one debit line is required." / "At least one credit line is required." |
Posting Lines (Double-Entry)
The posting lines section is where you define the debit and credit entries. Lines are organized into batches, each batch sharing a single transaction code.
How it works:
- Each batch has a Transaction Code (e.g., a code for cash deposit, transfer, etc.).
- Within a batch, add Debit lines and Credit lines.
- Each line requires: Account, Currency, Amount, and Narrative.
- When you select an account, its currency is auto-filled.
Balance indicator:
- Each batch shows its own balance indicator (total debits vs. total credits in base currency).
- A global summary at the bottom shows combined totals across all batches.
- Green "Balanced" indicator appears when debits equal credits in base currency.
- Red "Not balanced" indicator appears when they don't match.
Cross-currency transactions:
- Change a line's currency to any tenant-enabled currency.
- If the transaction currency differs from the account's currency, an FX override panel appears.
- You can set the exchange rate source to SYSTEM (uses tenant mid-rate), MANUAL (enter a rate), CBK (central bank rate), or THIRD_PARTY.
- For manual rates, enter the exchange rate and (optionally) a rate date.
Fail cases:
| What you do | What should happen |
|---|---|
| Submit with debits not equal to credits in base currency | Error: "Transaction is not balanced in [BASE_CURRENCY]. Debit total: X — Credit total: Y." |
| Enter a zero or negative amount on a line | Error: "All line amounts must be greater than zero." |
| Leave a line's account empty | Error: "All lines must have an account selected." |
| Leave a line's transaction code empty | Error: "All lines must have a transaction code selected." |
| Leave a line's narrative empty | Error: "All lines must have a narrative." |
| Use a currency that has no tenant rate configured | Error: "Rate unavailable for [FROM] → [TO]. Please configure tenant currencies first." |
Editing a Transaction
What to do: Open a transaction in CAPTURED or REJECTED status and click Edit.
Pass:
- The form pre-fills with the existing transaction header and posting lines.
- You can modify the narrative, value date, and all posting lines.
- Posting date and branch are immutable after creation.
- The version number increments after saving.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to edit an AUTHORIZED transaction | No Edit button is shown |
| Try to edit a PENDING_AUTH transaction | No Edit button is shown |
Viewing a Transaction
What to do: Click View on any transaction in the list.
Pass:
- The detail page shows all header fields, two status badges, and a split Debit / Credit view of posting lines.
- Total Debit (LCY) and Total Credit (LCY) are displayed.
- The Record Info sidebar shows: Approval Status, Processing Status, ID, Version, Created/Updated timestamps.
- An Audit Information card shows who created, last modified, and authorized the record (L1, L2, L3 approvers) when the record is not in CAPTURED status.
Transaction List and Filters
What to do: Open the Transactions list page.
Pass:
- The list shows transactions with columns: Reference, Date, Branch, Status, Total LCY, etc.
- Filters available: Search (by reference), Approval Status, Processing Status, Company (System Admin only).
- Click Create Transaction in the toolbar to go to the creation form.
Reversing a Transaction
Once a transaction has been Processed (its Processing Status shows "Processed"), it can be reversed. This creates a counter-transaction that undoes the original posting.
What to do:
- Open a Processed transaction.
- Click the Reverse button in the top-right corner.
- Enter a Reversal Reason (minimum 10 characters).
- Click Confirm Reversal.
Pass:
- A confirmation dialog warns that this action cannot be undone.
- A new reversal transaction is created in CAPTURED status.
- You are automatically navigated to the new reversal transaction.
- The original transaction's Processing Status changes to Reversed.
- Both the original and reversal transactions show a Reversal Chain card linking them together with a "View" button to navigate between them.
- The reversal transaction carries the reversal reason you entered.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to reverse a transaction that is not Processed | The Reverse button is not shown |
| Try to reverse a transaction that is already Reversed | The Reverse button is not shown |
| Enter fewer than 10 characters for the reversal reason | Error: "Reversal reason must be at least 10 characters." |
Deleting a Transaction
What to do: Open a transaction in CAPTURED status and use the Danger Zone card to delete it.
Pass:
- Confirmation dialog appears. After confirming, you are taken back to the list.
- The transaction no longer appears in the active list.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to delete a transaction that is PENDING_AUTH or AUTHORIZED | No delete option is shown |
| Try to delete a transaction that is DENIED | No delete option is shown — Denied is terminal |
42. Maker-Checker Approval Workflow
The Maker-Checker system is a multi-level approval process where one person (the Maker) creates or changes a record, and one or more authorized persons (the Checkers) review and approve it. This section covers the actual approval workflow — how records move through approval levels and how checkers accept, reject, or deny them.
Prerequisites: To test the full multi-user approval workflow, you need at least two user accounts with different role configurations. The first user (Maker) creates and submits records, and the second user (Checker) reviews and acts on them.
Approval Levels
The system supports up to three approval levels. The number of required levels is determined by Approval Rules configured in Access Control → Approval Rules.
| Level | Status | Meaning |
|---|---|---|
| L3 | PENDING_AUTH_L3 | Waiting for Level 3 (highest) approval |
| L2 | PENDING_AUTH_L2 | Waiting for Level 2 approval |
| L1 | PENDING_AUTH_L1 | Waiting for Level 1 (final) approval |
The approval chain flows from L3 → L2 → L1. Each level must approve before the next level can act. Once L1 approves, the record reaches AUTHORIZED status.
Workflow States
| Status | Meaning | Can Edit? | Can Delete? |
|---|---|---|---|
| CAPTURED | Draft — not yet submitted | Yes | Yes (soft delete) |
| PENDING_AUTH_L3 | Awaiting Level 3 approval | No | No |
| PENDING_AUTH_L2 | Awaiting Level 2 approval | No | No |
| PENDING_AUTH_L1 | Awaiting Level 1 approval | No | No |
| AUTHORIZED | Fully approved and active | No | No |
| REJECTED | Returned to maker for correction | Yes (then resubmit) | Yes (soft delete) |
| DENIED | Permanently refused — cannot be reopened | No | No |
Submitting a Record for Approval
What to do: Create any maker-checker record (e.g., a Transaction Code, Agent, or Transaction) and click Save & Submit instead of Save as Draft.
Pass:
- For a System/Tenant Administrator, the record immediately moves to AUTHORIZED — because the admin can self-approve.
- For a non-admin user, the record moves to the first pending approval level (e.g., PENDING_AUTH_L3).
Testing note: When testing with admin users, records go directly to AUTHORIZED. To test the multi-level approval flow, create a non-admin role with limited approval permissions and test with that user.
Approving a Record
What to do: Log in as a user who has the appropriate approval permission for the current level. Open a record that is in a pending approval state.
Pass:
- The detail page shows the Workflow panel in the sidebar with:
- A Record Status badge (e.g., "PENDING_AUTH_L2")
- A Stage description (e.g., "Waiting for Level 2 approval")
- Approve, Reject, and Deny buttons (if the user has the relevant permissions)
- Clicking Approve immediately moves the record to the next level (or AUTHORIZED if it was the final level).
- A success toast appears: "Transaction approved" (or the relevant entity name).
Fail cases:
| What you do | What should happen |
|---|---|
| Try to approve your own record (self-approval) | All action buttons are disabled and a message reads: "You cannot act on your own work" |
| Try to approve at a level you don't have permission for | The Approve button is visible but disabled with a tooltip explaining you need a higher permission level |
| Try to approve a record that is CAPTURED (not yet submitted) | No approval buttons are shown; message reads: "Record must be submitted for approval first" |
| Try to approve an already AUTHORIZED record | No approval buttons are shown; message reads: "This record is already finalized" |
Rejecting a Record
What to do: While viewing a pending approval record, click Reject.
Pass:
- A dialog opens with the title "Reject Record".
- The dialog explains: "This record will be returned to the maker for correction. A reason is required."
- Enter a reason (minimum 5 characters, maximum 500 characters).
- Click Confirm.
- The record moves to REJECTED status.
- The Rejection Reason appears on the detail page in the Record Info sidebar.
- The maker can now edit the record and resubmit it.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to reject without entering a reason | The Confirm button is disabled |
| Enter fewer than 5 characters | Character counter shows the minimum is not met; Confirm button stays disabled |
| Try to reject your own record | The Reject button is disabled with a self-approval block message |
Denying a Record
What to do: While viewing a pending or rejected record, click Deny.
Pass:
- A dialog opens with the title "Deny Record Permanently".
- The dialog explains: "This record will be permanently denied and cannot be resubmitted. A reason is required."
- Enter a reason (minimum 5 characters, maximum 500 characters).
- Click Confirm.
- The record moves to DENIED status — permanently blocked.
- No further actions are available: no Edit button, no approval buttons, no Delete option.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to deny an AUTHORIZED record | No Deny button is shown |
| Try to deny your own record | The Deny button is disabled with a self-approval block message |
| Enter fewer than 5 characters for the reason | Confirm button is disabled |
Re-editing and Resubmitting a Rejected Record
What to do:
- Find a record in REJECTED status.
- Click Edit.
- Make corrections.
- Click Save & Submit.
Pass:
- The edit form opens with the existing data pre-filled.
- After saving and submitting, the record moves back to the first pending approval level.
- The version number increments.
- The previous rejection reason remains visible in the Record Info sidebar.
Fail:
- No Edit button appears on the rejected record.
- The record cannot be resubmitted.
Which Entities Use Maker-Checker?
The following entities follow the maker-checker approval workflow:
| Entity | Location in Sidebar |
|---|---|
| Transactions | Ledger Operations → Transactions |
| Agents | CRM → Agents |
| Customers | CRM → Customers |
| Products (Chart of Accounts) | Chart of Accounts |
| Transaction Codes | Financial Config → Transaction Codes |
| Commission Types | Financial Config → Commission Types |
| Account Conditions | Account Config → Account Conditions |
| Activity Rules | Account Config → Activity Rules |
| Work Day Years | Calendar & Operations |
| Facilities | Ledger Operations → Facilities |
| Facility Classes | Loan Config → Facility Classes |
| Standing Orders | Transactions → Standing Orders |
| Forward-Dated Transactions | Transactions → Forward-Dated |
| Third-Party Systems | Third Party Delivery → Systems |
| Delivery Hook Configs | Third Party Delivery → Hook Configs |
| Loan Workflow Types | Loan Config → Workflow Types |
| Loan Workflow Stages | Loan Config → Workflow Stages |
| Base Rates | Loan Config → Base Rates |
| COB Configurations | Close of Business → Configuration |
The approval workflow behaves the same way for all these entities. The steps above (Submit, Approve, Reject, Deny, Re-edit) apply universally.
Approval Rules Configuration
What to do: Go to Access Control in the sidebar, then Approval Rules.
Pass:
- You can create approval rules that specify which entity types require approval and at what levels.
- Rules can define thresholds (e.g., transactions above a certain amount require L2 approval).
43. Forward-Dated Transactions (FDT)
Forward-Dated Transactions let you schedule a payment or posting for a future date. The system locks in exchange rates at creation time and reserves (holds) funds from the debit accounts so the money is guaranteed to be available when the transaction executes.
Go to Ledger Operations in the sidebar, then Forward-Dated. Click Create Forward-Dated Transaction to open the form.
Prerequisites: You need at least one active Transaction Code, one Branch, and accounts in the relevant currencies. Working-day calendars (WorkDayYear) must be configured for the tenant to test execution-date resolution.
FDT Lifecycle — Two Status Axes
A Forward-Dated Transaction has two independent status axes:
| Axis | Purpose | Values |
|---|---|---|
| Approval Status (recordStatus) | Maker-Checker workflow | CAPTURED → PENDING_AUTH_L3/L2/L1 → AUTHORIZED; also REJECTED, DENIED |
| Execution Status (forwardStatus) | Financial lifecycle | DRAFT → SCHEDULED → EXECUTING → EXECUTED; also FAILED, CANCELLED |
When both axes are combined:
| Approval Status | Execution Status | Meaning |
|---|---|---|
| CAPTURED | DRAFT | Being composed, not yet submitted |
| PENDING_AUTH_L* | DRAFT | Pending approval at some level |
| REJECTED | DRAFT | Returned to maker; can be edited and resubmitted |
| AUTHORIZED | SCHEDULED | Fully approved; awaiting execution date |
| AUTHORIZED | EXECUTING | Currently being materialized into a real transaction |
| AUTHORIZED | EXECUTED | Successfully executed; real transaction created |
| AUTHORIZED | FAILED | Execution failed; reservation released |
| CAPTURED or SCHEDULED | CANCELLED | Cancelled by operator before execution |
Creating a Forward-Dated Transaction
What to do:
- Click Create Forward-Dated Transaction.
- Fill in the header fields (see table below).
- Add posting lines in the Posting Lines section (same batch-based double-entry editor as Section 41).
- Click Save as Draft or Save & Submit.
Header fields:
| Field | Notes |
|---|---|
| Company | Only shown for System Admin. Select the organization. |
| Transaction Type | Required. Choose Post-Dated Check or Scheduled Payment. (Standing Order Instance is system-generated only.) |
| Branch | Required. Select the originating branch. Populated after a company is chosen. |
| Scheduled Date | Required. The calendar date you want the transaction to execute. Must be tomorrow or later (cannot be in the past or today). |
| Working Day Policy | Defaults to Roll Forward. If the scheduled date falls on a weekend or public holiday, the system rolls forward to the next working day. |
| Narrative | Optional. Overall description (max 500 characters). |
Pass:
- The FDT is created with a system-generated Forward Reference (format:
FWD-YYYY-NNNNN). - Two status badges appear: Approval Status (CAPTURED) and Execution Status (DRAFT).
- If the scheduled date falls on a non-working day, the detail page shows both the original date and the Execution Date (Rolled) label indicating the resolved working day.
Fail cases:
| What you do | What should happen |
|---|---|
| Set Scheduled Date to today or a past date | Error: "Scheduled date must be a future working day." |
| Leave Branch empty | Error: "Branch is required." |
| Leave Transaction Type unselected | Error: "Transaction type is required." |
| Submit with no posting lines | Error: "At least one debit line is required." / "At least one credit line is required." |
| Submit with debits ≠ credits in base currency | Error: "Transaction is not balanced in [BASE_CURRENCY]." |
Posting Lines (Double-Entry with Exchange Rate Locking)
The posting lines editor works the same as Section 41 (Transaction Creation), with one additional field:
| Field | Notes |
|---|---|
| Exchange Rate Date | FDT-only. Locks the exchange rate to a specific date for future execution. Shown only when the rate source is not SYSTEM. |
Key difference from regular transactions: In a regular transaction, exchange rates are resolved at posting time. In an FDT, rates are locked at creation time. When you select a non-SYSTEM rate source (MANUAL, CBK, or THIRD_PARTY), both the exchange rate and rate date are captured and preserved. They will be used unchanged when the FDT executes on its scheduled date.
Fail cases:
| What you do | What should happen |
|---|---|
| Use a manual rate source but leave the exchange rate field empty | Error: "Exchange rate is required when rate source is not SYSTEM." |
| Enter a zero or negative exchange rate | Error: "Exchange rate must be a positive number." |
Editing a Forward-Dated Transaction
What to do: Open an FDT in CAPTURED or REJECTED status (Approval Status) and click Edit.
Pass:
- The form pre-fills with the existing header and posting lines.
- You can modify Narrative, Scheduled Date, Branch, Transaction Type (only in CAPTURED), and all posting lines.
- If you change the Scheduled Date, the resolved execution date is recalculated using the working-day calendar.
- The version number increments after saving.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to edit an AUTHORIZED + SCHEDULED FDT | No Edit button is shown |
| Try to edit an EXECUTED or FAILED FDT | No Edit button is shown; the detail page is read-only |
Balance Reservation
When an FDT reaches AUTHORIZED status (after final approval), the system automatically reserves funds on every debit account:
- The reserved amount is shown in the detail page as "locked from available balance".
transForwardAmountincreases andavailableOnlineBalancedecreases on each debit account by the FCY reservation amount.- The reservation amount in LCY is also displayed so you can verify the hold amount in base currency.
Testing note: After approving an FDT, go to the debit account(s) and verify that the Available Balance has decreased by the reservation amount. After cancellation or execution, verify the balance is restored.
Cancelling a Forward-Dated Transaction
What to do: Open an FDT whose Execution Status is DRAFT or SCHEDULED, then click Cancel.
Pass:
- A confirmation dialog warns that the cancellation is permanent.
- The Execution Status changes to CANCELLED.
- If the FDT was SCHEDULED (i.e., already had a reservation), the reservation is released:
transForwardAmountdecreases andavailableOnlineBalanceincreases on each debit account. - The detail page shows the FDT as CANCELLED with no further actions available.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to cancel an EXECUTED FDT | No Cancel button is shown |
| Try to cancel an EXECUTING FDT | No Cancel button is shown — this is a system lock state |
Approving a Forward-Dated Transaction
Approval follows the standard Maker-Checker workflow (Section 42). On final approval the following happens automatically:
- The Approval Status moves to AUTHORIZED.
- The Execution Status moves from DRAFT to SCHEDULED.
- Balance reservations are applied to all debit accounts.
Pass:
- After the last level approves, both badges update immediately.
- The detail page shows "locked from available balance" next to the reservation amount on each debit line.
- A self-approval block applies: you cannot approve an FDT you created yourself.
Execution of a Forward-Dated Transaction
FDTs are executed automatically by the system when the resolved execution date arrives. You do not manually trigger execution in normal operation.
How it works: When the current working day reaches the resolved execution date, the system:
- Changes forwardStatus to EXECUTING (locks the record).
- Creates a real Transaction from the FDT's posting lines with
recordStatus = AUTHORIZEDandlineSource = FORWARD_DATED_EXECUTION. - Releases the balance reservation on all debit accounts.
- Links the FDT to the created transaction via Executed Transaction.
- Changes forwardStatus to EXECUTED.
If execution fails, the status moves to FAILED and the reservation is released. No automatic retry occurs.
What to verify on an EXECUTED FDT:
- Open the FDT detail page.
- The Execution Status badge shows EXECUTED.
- A link to the Executed Transaction appears in the detail page — click it to view the real transaction.
- The debit account(s) show the reservation released (available balance restored minus the real transaction posting).
FDT List and Filters
What to do: Open the Forward-Dated Transactions list page.
Pass:
- The list shows FDTs with columns: Forward Reference, Scheduled Date, Branch, Type, Approval Status, Execution Status, Total LCY, etc.
- Filters available: Search (by reference), Approval Status, Execution Status, Transaction Type, Company (System Admin only).
- Click Create Forward-Dated Transaction in the toolbar to go to the creation form.
FDT and Close of Business (COB)
The COB process checks for due FDTs as part of its pre-flight:
- COB Config has a "Block on Due FDT Failure" flag. When enabled, if any SCHEDULED FDT whose resolved execution date is the current working day has a FAILED status, the COB run is blocked.
- COB Run Steps include
TRIGGER_DUE_FDTandWAIT_DUE_FDT— these ensure all due FDTs are executed before the COB run completes.
See also Section 45 (COB Configuration & Trigger) for more details.
FDTs Generated by Standing Orders
When a Standing Order generates a child FDT:
- The child FDT's Transaction Type is set to Standing Order Instance (not selectable in the UI).
- The
sourceTypeon the child FDT is"STANDING_ORDER"withsourceIdlinking to the parent. - The detail page of such an FDT shows a Source card with a link to the parent Standing Order.
- Child FDTs are created directly in AUTHORIZED + SCHEDULED status — they bypass maker-checker because the parent was already approved.
44. Standing Orders
Standing Orders create recurring payments that automatically generate Forward-Dated Transactions on a monthly schedule. Each occurrence is a child FDT that goes through the execution flow described in Section 43.
Go to Ledger Operations in the sidebar, then Standing Orders. Click Create Standing Order to open the form.
Prerequisites: Same as FDTs — you need Transaction Codes, Branches, and accounts. Additionally, you need Working Day calendars configured for date resolution and rollover.
Standing Order Lifecycle — Two Status Axes
Like FDTs, Standing Orders have two independent status axes:
| Axis | Purpose | Values |
|---|---|---|
| Approval Status (recordStatus) | Maker-Checker workflow | CAPTURED → PENDING_AUTH_L3/L2/L1 → AUTHORIZED; also REJECTED, DENIED |
| Standing Order Status (standingOrderStatus) | Business lifecycle | DRAFT, ACTIVE, PAUSED, CANCELLED, COMPLETED |
| Approval Status | Standing Order Status | Meaning |
|---|---|---|
| CAPTURED | DRAFT | Being composed, not yet submitted |
| PENDING_AUTH_L* | DRAFT | Pending approval at various levels |
| REJECTED | DRAFT | Returned to maker; can edit and resubmit |
| AUTHORIZED | ACTIVE | Fully approved and generating child FDTs |
| AUTHORIZED | PAUSED | Temporarily suspended; no new children generated |
| AUTHORIZED | CANCELLED | Permanently stopped |
| AUTHORIZED | COMPLETED | Naturally ended (endDate reached) |
Creating a Standing Order
What to do:
- Click Create Standing Order.
- Fill in the header and recurrence fields (see table below).
- Add posting lines in the Posting Lines section (same batch-based double-entry editor).
- Click Save as Draft or Save & Submit.
Header fields:
| Field | Notes |
|---|---|
| Company | Only shown for System Admin. Select the organization. |
| Branch | Required. Select the originating branch. Populated after a company is chosen. |
| Day of Month | Required. Integer from 1 to 31. The day each monthly occurrence is scheduled. If the day exceeds the number of days in a given month (e.g., 31 in April), it is clamped to the last day of that month (April 30). |
| Start Date | Required. The date from which occurrences should begin. Must be today or in the future. |
| End Date | Optional. Leave blank for an open-ended (indefinite) standing order. If set, must be on or after the Start Date. After the last occurrence before this date, the standing order automatically moves to COMPLETED. |
| Narrative | Optional. Overall description (max 500 characters). |
Recurrence rules:
| Rule | Behavior |
|---|---|
| Frequency | Currently Monthly only. The form does not show a frequency selector — it is always monthly. |
| First occurrence | Computed as the nearest matching day-of-month on or after the Start Date. If Start Date is the 15th and Day of Month is 20, the first occurrence is the 20th of the same month. If Start Date is the 25th and Day of Month is 20, the first occurrence is the 20th of the next month. |
| Subsequent occurrences | Each month, the system generates an occurrence on the configured Day of Month (clamped for short months). Weekend/holiday dates roll forward to the next working day. |
| Open-ended | If End Date is blank, the standing order runs indefinitely until manually cancelled. |
Pass:
- The standing order is created in CAPTURED / DRAFT status.
- The form shows a "How It Works" sidebar explaining the recurrence rules.
- A computed Next Scheduled Date and Resolved Execution Date appear after approval and activation.
Fail cases:
| What you do | What should happen |
|---|---|
| Set Day of Month to 0 or 32 | Error: "Day of month must be between 1 and 31." |
| Set Start Date to a past date | Error: "Start date must not be in the past." |
| Set End Date before Start Date | Error: "End date must be on or after the start date." |
| Submit with no posting lines | Error: "At least one debit line is required." / "At least one credit line is required." |
| Submit with debits ≠ credits in base currency | Error: "Transaction is not balanced in [BASE_CURRENCY]." |
Posting Lines (Recurring Template)
The posting lines act as a recurring template. Every monthly occurrence uses the same line structure:
- Same accounts, transaction codes, amounts, and exchange rates are copied into each child FDT.
- Exchange rates are locked at submission time and carried into every child FDT unchanged.
- If you need different amounts each month, you should use individual FDTs (Section 43) instead.
Testing note: The line editor is identical to the Transaction and FDT editors. The same double-entry and FX rules apply. The only FDT-specific field (Exchange Rate Date) also appears here because Standing Order children are Forward-Dated Transactions.
Approving and Activating a Standing Order
Approval follows the standard Maker-Checker workflow (Section 42). On final approval the following happens automatically:
- The Approval Status moves to AUTHORIZED.
- The Standing Order Status moves from DRAFT to ACTIVE.
- The first child FDT is immediately generated:
- Computed date: nearest matching Day of Month on or after the Start Date.
- Resolved to a working day using the Roll Forward policy.
- Created with
forwardTransType = STANDING_ORDER_INSTANCE,sourceType = "STANDING_ORDER", directly in AUTHORIZED + SCHEDULED status. - Balance reservation is applied to all debit accounts of the child FDT.
Pass:
- After the last level approves, both status badges update: Approval → AUTHORIZED, Standing Order → ACTIVE.
- A Recurrence Cursor card appears on the detail page showing: Next Scheduled Date, Resolved Execution Date, Last Generated Date, and Generated Count (initially 1).
- Navigate to the child FDT from the Last Generated FDT link.
- The child FDT shows a Source card linking back to this Standing Order.
Viewing a Standing Order
What to do: Click on any standing order in the list.
Pass:
- The detail page shows all header fields, recurrence information, posting lines, and two status badges.
- A Recurrence Cursor card (visible after activation) displays:
- Next Scheduled Date — the calendar date for the next occurrence
- Next Resolved Execution Date — the actual execution date after working-day roll
- Last Generated Date — the calendar date of the last generated occurrence
- Generated Count — total number of child FDTs created so far
- The Workflow panel in the sidebar shows the approval chain (same as Section 42).
- Self-approval block applies: you cannot approve a standing order you created yourself.
Editing a Standing Order
What to do: Open a standing order in CAPTURED or REJECTED status and click Edit.
Pass:
- The form pre-fills with the existing data.
- You can modify all fields except Frequency (which is immutable).
- The version number increments after saving.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to edit an ACTIVE standing order | No Edit button is shown |
| Try to edit a CANCELLED standing order | No Edit button is shown |
| Try to change the Frequency | Frequency is not editable — it is always Monthly |
Pausing a Standing Order
What to do: Open an ACTIVE standing order and click Pause.
Pass:
- A confirmation dialog explains that pausing will temporarily stop new occurrences.
- The Standing Order Status changes to PAUSED.
- No new child FDTs are generated while paused.
- Existing scheduled child FDTs are NOT affected — they will still execute on their scheduled dates.
Resuming a Standing Order
What to do: Open a PAUSED standing order and click Resume.
Pass:
- The Standing Order Status changes back to ACTIVE.
- The system generates the next occurrence immediately (the next monthly date after the last generated date, not from today — so no occurrences are skipped).
- A new child FDT is created in AUTHORIZED + SCHEDULED status.
- The Recurrence Cursor card updates with the new Next Scheduled Date and increments the Generated Count.
Testing note: If you pause a standing order and resume it months later, the system does NOT backfill missed occurrences. It generates exactly one new child for the next month after the last generated date, then continues monthly from there.
Cancelling a Standing Order
What to do: Open an ACTIVE or PAUSED standing order and click Cancel.
Pass:
- A confirmation dialog warns: "This will permanently stop the standing order. No further payments will be generated. Existing scheduled child payments will be cancelled and reservations released."
- The Standing Order Status changes to CANCELLED.
- No further child FDTs are generated.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to cancel a CAPTURED (draft) standing order | No Cancel button is shown — use Delete instead |
| Try to cancel a COMPLETED standing order | No Cancel button is shown |
Important: Cancelling a standing order updates only the parent record's status. Any child FDTs that have already been generated and are in SCHEDULED status remain active. Cancel them individually (see Section 43 — Cancelling an FDT) if you want to release their reservations immediately.
Natural Completion (End Date)
What to do: Create a standing order with an End Date set to a few months in the future. Approve it and allow occurrences to generate over time.
Pass:
- After each child FDT executes, the system computes the next occurrence date.
- When the next computed occurrence date would be after the End Date, the standing order's status automatically changes to COMPLETED.
- A standing order with a blank End Date never completes naturally — it runs indefinitely until manually cancelled.
Deleting a Standing Order
What to do: Open a standing order in CAPTURED status and use the Danger Zone card to delete it.
Pass:
- Confirmation dialog appears. After confirming, you are taken back to the list.
- The standing order no longer appears in the active list.
Fail cases:
| What you do | What should happen |
|---|---|
| Try to delete an ACTIVE or PAUSED standing order | No delete option is shown |
| Try to delete a CANCELLED or COMPLETED standing order | No delete option is shown |
Standing Order List and Filters
What to do: Open the Standing Orders list page.
Pass:
- The list shows standing orders with columns: Reference, Day of Month, Start Date, End Date, Frequency, Approval Status, Standing Order Status, Total LCY, etc.
- Filters available: Search (by reference), Approval Status, Standing Order Status, Company (System Admin only).
- Click Create Standing Order in the toolbar.
Relationship Between Standing Orders and FDTs
| Aspect | Standing Order (Parent) | Forward-Dated Transaction (Child) |
|---|---|---|
| Purpose | Defines the recurring schedule and template | Single scheduled occurrence |
| Approval | Goes through full Maker-Checker workflow | If generated by a standing order: bypasses Maker-Checker (created in AUTHORIZED + SCHEDULED directly). If created manually: goes through Maker-Checker. |
| Status link | Uses standingOrderStatus (DRAFT/ACTIVE/PAUSED/CANCELLED/COMPLETED) | Uses forwardStatus (DRAFT/SCHEDULED/EXECUTING/EXECUTED/FAILED/CANCELLED) |
| Child tracking | lastGeneratedForwardTransId, generatedCount, nextScheduledDate | sourceType = "STANDING_ORDER", sourceId = <standingOrderId> |
| Exchange rates | Locked at submission time, carried into each child unchanged | Locked at creation time for manual FDTs; inherited from parent for standing order children |
General Notes for All Testing
- Speed and responsiveness — Note if any page or action takes noticeably long (more than a few seconds for simple operations like saving a form or loading a list).
- Error messages — If a form shows an error, note the exact wording. Errors should be clear and tell you what went wrong.
- If something behaves unexpectedly — Note the exact steps you took, what you expected to happen, and what actually happened. Screenshots are very helpful.
- Activity Logs — Use the Activity Logs page in the sidebar to verify that your actions are being recorded. See section 39 for detailed testing instructions.