Add Positive Pay, statement guide v1.0, onboarding, and switch every feature on
- Positive Pay on the 12 Oct /pps contract (account number, not account ID): OTP enrollment, cheque submit, saved cheques, detail and stop payment. Full flow passed on the phone against mobile-banking-backend.lincpay. - Statement & Mini Statement guide v1.0 (14 Oct): mini statement JSON on Home and the Statement screen; dated PDF export with the password rule. - Onboarding slides and splash screen, Inter font, shared Icon and TypewriterText components, nearby branches via OpenStreetMap. - Every feature switched on; the 14 Oct switch set is kept in featureConfig.stage-2026-10-14.ts. Loans run on demo data until the backend has /loans routes. - npm run android wraps run-android for shells spawned from VS Code. - OpenProject work packages updated to 14-10-2026 status, with screenshots of Positive Pay, statement, loans and cards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5fbd13ba12
commit
f960a119e8
@@ -9,9 +9,9 @@ import {
|
||||
} from './cbsErrors';
|
||||
|
||||
describe('error code catalogue', () => {
|
||||
it('covers all 52 documented codes, with no duplicates', () => {
|
||||
expect(CBS_ERROR_CODES).toHaveLength(52);
|
||||
expect(new Set(CBS_ERROR_CODES).size).toBe(52);
|
||||
it('covers all 66 documented codes, with no duplicates', () => {
|
||||
expect(CBS_ERROR_CODES).toHaveLength(66);
|
||||
expect(new Set(CBS_ERROR_CODES).size).toBe(66);
|
||||
});
|
||||
|
||||
it('knows the TPIN codes, so none of them collapses into UNKNOWN_ERROR', () => {
|
||||
@@ -54,6 +54,7 @@ describe('error code catalogue', () => {
|
||||
it('knows the statement codes', () => {
|
||||
expect(isCbsErrorCode('INVALID_DATE_RANGE')).toBe(true);
|
||||
expect(isCbsErrorCode('STATEMENT_VIEW_NOT_AVAILABLE')).toBe(true);
|
||||
expect(isCbsErrorCode('STATEMENT_PROFILE_INCOMPLETE')).toBe(true);
|
||||
});
|
||||
|
||||
it('does not invite a retry on either statement refusal', () => {
|
||||
@@ -63,6 +64,8 @@ describe('error code catalogue', () => {
|
||||
// nothing — rather than a retry.
|
||||
expect(isRetryableError('INVALID_DATE_RANGE')).toBe(false);
|
||||
expect(isRetryableError('STATEMENT_VIEW_NOT_AVAILABLE')).toBe(false);
|
||||
// The profile has to be corrected at the bank; retrying cannot help.
|
||||
expect(isRetryableError('STATEMENT_PROFILE_INCOMPLETE')).toBe(false);
|
||||
});
|
||||
|
||||
it('knows the payee-validate codes, which come from IMPS and not from CBS', () => {
|
||||
@@ -110,6 +113,39 @@ describe('error code catalogue', () => {
|
||||
expect(isRetryableError('POSITIVE_PAY_NOT_AVAILABLE')).toBe(false);
|
||||
});
|
||||
|
||||
const PPS_CODES = [
|
||||
'PPS_NOT_ENABLED',
|
||||
'PPS_ALREADY_ENABLED',
|
||||
'PPS_OTP_IN_PROGRESS',
|
||||
'PPS_OTP_ALREADY_VERIFIED',
|
||||
'PPS_OTP_RESEND_COOLDOWN',
|
||||
'PPS_OTP_RESEND_LIMIT',
|
||||
'PPS_TEMPORARILY_UNAVAILABLE',
|
||||
'PPS_REQUEST_CONFLICT',
|
||||
'PPS_CHEQUE_NOT_SUBMITTED',
|
||||
'PPS_OPERATION_IN_PROGRESS',
|
||||
'PPS_OPERATION_UNRESOLVED',
|
||||
'PPS_SUBMIT_FAILED',
|
||||
'PPS_STOP_FAILED',
|
||||
];
|
||||
|
||||
it('knows every PPS code, so none of them collapses into UNKNOWN_ERROR', () => {
|
||||
// The interceptor maps an unrecognised code to UNKNOWN_ERROR, and the PPS
|
||||
// screens branch on each of these — a missing one would silently take the
|
||||
// unknown-outcome path instead of its own.
|
||||
for (const code of PPS_CODES) {
|
||||
expect(isCbsErrorCode(code)).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it('does not invite a retry on any PPS code', () => {
|
||||
// The cheque operations must never be resent automatically, and the
|
||||
// enrollment refusals describe a state an identical call cannot change.
|
||||
for (const code of PPS_CODES) {
|
||||
expect(isRetryableError(code)).toBe(false);
|
||||
}
|
||||
});
|
||||
|
||||
it('has copy for every code, so no failure renders as a blank toast', () => {
|
||||
for (const code of CBS_ERROR_CODES) {
|
||||
const copy = describeError(code);
|
||||
|
||||
Reference in New Issue
Block a user