Files
cbsnexora-backend/fineract-provider
niteshandClaude Opus 5.5 43c60223af
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
feat(fixed-deposits): account-engine FD quote at opening, FD Special schedule and locked Special terms
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>
2026-10-20 16:44:47 +05:30
..
2026-04-13 13:26:33 +05:30