Fineract Build & Cucumber tests (without E2E tests) / verify (main, build-core) (push) Waiting to run
Fineract Build & Cucumber tests (without E2E tests) / verify (main, cucumber) (push) Waiting to run
Fineract Build & Cucumber tests (without E2E tests) / verify (progressive-loan, build-progressive-loan) (push) Waiting to run
Fineract Docker Builds / build (false, docker-compose-postgresql.yml, postgresql) (push) Waiting to run
Fineract Docker Builds / build (true, docker-compose.yml, mariadb) (push) Waiting to run
Fineract Documentation build / build (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 1 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 10 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 2 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 3 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 4 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 5 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 6 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 7 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 8 of 10) (push) Waiting to run
Fineract E2E Tests / E2E Tests (Shard 9 of 10) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-1) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-2) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-3) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-4) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-1) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-3) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-4) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-5) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-2) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-5) (push) Waiting to run
Fineract Messaging Smoke Tests / Smoke Test with ActiveMQ (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-5) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-2) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-1) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-3) (push) Waiting to run
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-4) (push) Waiting to run
Fineract Liquibase Only mode - PostgreSQL / test (push) Waiting to run
Fineract Messaging Smoke Tests / Smoke Test with Kafka (push) Waiting to run
PROBLEM - The account-opening screen quoted FD maturity with a stand-alone calculator (calculate-fd-interest) that counts posting periods from the deposit date. The account engine closes them at calendar period ends (from the financial- year start month), so the quote differed from the account once created, e.g. FD DOUBLE 546,348,939 @ 6.75% for 5 years from 2026-10-21, quarterly: quoted 763,660,633.77, account 763,697,613.00. - FD Special (monthly interest payout) was quoted with compounding, and its product could be saved with Interest Calculation Type "Compounding". CHANGE 1. POST /fixeddepositaccounts/account-preview (FixedDepositAccountPreviewService) Builds the would-be account from the request exactly as submitFDApplication does (DepositAccountAssembler.assembleFrom, updateMaturityDateAndAmount- BeforeAccountActivation, applyCbsFields) inside a transaction that is always rolled back - nothing is saved. Returns the applied rate, maturity date and maturity amount Submit would store, and the interest periods from FixedDepositAccount#projectInterestSchedule (for FD Special: the monthly payout schedule, same engine as the account's Monthly Interest Payout Schedule). Every FD type. Submit's linked-account checks (linkAccountId for FD Special, linkedAccountId for Deposit Account Link) get a stand-in id (-1) when not chosen yet: both are only recorded on the account, never looked up, and the account is never saved. Submit still requires them. 2. FdSpecialProductTermsValidator: an FD Special product must have interestCalculateSelector = Simple, interestCompoundingPeriodType = Monthly and interestPostingPeriodType = Monthly. Checked server-side on create, on update (also the maker-checker approval path) and on submit-for- approval, so Postman / any client gets a 400 validation error per field. Wired through SavingsConfiguration. FILES api/FixedDepositAccountsApiResource.java (account-preview endpoint) service/FixedDepositAccountPreviewService.java (new) data/FdSpecialProductTermsValidator.java (new) service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java starter/SavingsConfiguration.java NOT CHANGED How the account calculates interest; calculate-fd-interest still exists but the opening screen no longer uses it. DATA (not in this commit) Existing FD Special products saved as "Compounding" are refused on their next edit until set to Simple (the local tenant's FD SPECIAL was updated). VERIFIED: compileJava. Numbers above reproduced independently. Not yet run end-to-end through the API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>