From 2c95fd040d918cd0352f3d81bf53947d2b447ad1 Mon Sep 17 00:00:00 2001 From: Ramadhan Sjamsani Date: Wed, 27 May 2026 21:33:51 +0800 Subject: [PATCH] Phase 5.x payment revamp + Xendit Stage-8 prep - Backend wraps idn-finlogos npm at /assets/payment-icons/.svg with 1y immutable cache. Mobile drops bundled SVGs (only placeholder remains) and fetches via flutter_cache_manager. payment_methods.icon is now a CSV of slugs; catalog emits icon_urls[]. CARDS tile renders Visa + MC + JCB side by side. - Per-method min/max amount bounds (BIGINT, nullable). Picker greys out out-of-range tiles with subtitle; backend gates with INVALID_PAYMENT_AMOUNT (422). Defense in depth against stale-catalog clients. - Xendit channel codes corrected from authoritative docs (BCA_VA -> BCA_VIRTUAL_ACCOUNT, CREDIT_CARD -> CARDS, ovo -> ovo-new, shopeepay -> shopee-pay, ...). 18 methods x 5 groups seeded with Xendit-published per-channel min/max. - Re-runnable seed (ON CONFLICT DO NOTHING on payment_code + new unique index on group name). Operator CC edits never clobbered across re-runs. One-shot reset + inspect scripts under backend/.dev/. - Customer redirect HTML pages at /payment/return/{success,failure}, brand-styled with "Buka HaloBestie" CTA firing halobestie:// deeplink. URL scheme registered on Android (intent-filter w/ BROWSABLE on MainActivity) and iOS (CFBundleURLTypes). Waiting-payment poller still owns confirmation; deeplink just brings the activity to foreground. - Control center payment-catalog page: min/max inputs + columns. Other CC pages restyled with new theme tokens (separate work, bundled here). 169/169 backend tests pass. See requirement/phase5-payment-revamp-2026-05-27.md for the full revamp doc. Stage 8 (E2E) still pending: webhook URL routing decision + two client_app follow-ups (legacy /chat/request removal, extension Custom Tab). Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/.dev/inspect-payment-catalog.js | 31 +++ backend/.dev/reset-payment-catalog.js | 28 ++ backend/package-lock.json | 34 +++ backend/package.json | 1 + backend/src/app.internal.js | 2 + backend/src/app.public.js | 6 + backend/src/db/migrate.js | 176 ++++++++---- .../routes/internal/payment-catalog.routes.js | 51 +++- .../routes/internal/payment-icons.routes.js | 40 +++ .../routes/public/client.payment.routes.js | 33 ++- .../routes/public/payment-return.routes.js | 154 ++++++++++ .../public/shared.payment-icons.routes.js | 40 +++ .../src/services/payment-catalog.service.js | 66 ++++- backend/src/services/payment-icon.service.js | 41 +++ .../test/routes/client.payment.routes.test.js | 59 ++++ .../shared.payment-icons.routes.test.js | 59 ++++ .../services/payment-catalog.service.test.js | 50 +++- .../android/app/src/main/AndroidManifest.xml | 13 + .../payment_icons/NOTICE_IDN_FINLOGOS.txt | 31 --- client_app/assets/payment_icons/README.md | 79 ------ client_app/assets/payment_icons/bca.svg | 25 -- client_app/assets/payment_icons/bni.svg | 18 -- client_app/assets/payment_icons/bri.svg | 13 - client_app/assets/payment_icons/dana.svg | 15 - client_app/assets/payment_icons/gopay.svg | 13 - client_app/assets/payment_icons/mandiri.svg | 23 -- client_app/assets/payment_icons/ovo.svg | 10 - client_app/assets/payment_icons/permata.svg | 33 --- client_app/assets/payment_icons/qris.svg | 18 -- client_app/assets/payment_icons/shopeepay.svg | 20 -- client_app/ios/Runner/Info.plist | 14 + .../screens/payment_method_screen.dart | 205 +++++++++----- .../state/payment_catalog_provider.dart | 53 +++- .../payment/widgets/payment_icon.dart | 84 +++--- .../Flutter/GeneratedPluginRegistrant.swift | 2 + client_app/pubspec.lock | 58 +++- client_app/pubspec.yaml | 11 +- control_center/index.html | 3 + control_center/src/assets/logo.png | Bin 0 -> 282016 bytes control_center/src/components/Layout.jsx | 169 +++++++++-- control_center/src/components/ui/HBLogo.jsx | 36 +++ control_center/src/main.jsx | 1 + .../src/pages/dashboard/DashboardPage.jsx | 123 +++++--- .../failed-pairings/FailedPairingsPage.jsx | 103 ++++--- control_center/src/pages/login/LoginPage.jsx | 102 +++++-- .../mitra-activity/MitraActivityPage.jsx | 134 ++++----- .../src/pages/mitras/MitrasPage.jsx | 104 ++++--- .../payment-catalog/PaymentCatalogPage.jsx | 188 +++++++++---- .../src/pages/sessions/SessionsPage.jsx | 61 ++-- control_center/src/pages/users/UsersPage.jsx | 65 +++-- control_center/src/theme/global.css | 263 ++++++++++++++++++ control_center/src/theme/tokens.js | 37 +++ .../phase5-payment-revamp-2026-05-27.md | 223 +++++++++++++++ 53 files changed, 2389 insertions(+), 832 deletions(-) create mode 100644 backend/.dev/inspect-payment-catalog.js create mode 100644 backend/.dev/reset-payment-catalog.js create mode 100644 backend/src/routes/internal/payment-icons.routes.js create mode 100644 backend/src/routes/public/payment-return.routes.js create mode 100644 backend/src/routes/public/shared.payment-icons.routes.js create mode 100644 backend/src/services/payment-icon.service.js create mode 100644 backend/test/routes/shared.payment-icons.routes.test.js delete mode 100644 client_app/assets/payment_icons/NOTICE_IDN_FINLOGOS.txt delete mode 100644 client_app/assets/payment_icons/README.md delete mode 100644 client_app/assets/payment_icons/bca.svg delete mode 100644 client_app/assets/payment_icons/bni.svg delete mode 100644 client_app/assets/payment_icons/bri.svg delete mode 100644 client_app/assets/payment_icons/dana.svg delete mode 100644 client_app/assets/payment_icons/gopay.svg delete mode 100644 client_app/assets/payment_icons/mandiri.svg delete mode 100644 client_app/assets/payment_icons/ovo.svg delete mode 100644 client_app/assets/payment_icons/permata.svg delete mode 100644 client_app/assets/payment_icons/qris.svg delete mode 100644 client_app/assets/payment_icons/shopeepay.svg create mode 100755 control_center/src/assets/logo.png create mode 100644 control_center/src/components/ui/HBLogo.jsx create mode 100644 control_center/src/theme/global.css create mode 100644 control_center/src/theme/tokens.js create mode 100644 requirement/phase5-payment-revamp-2026-05-27.md diff --git a/backend/.dev/inspect-payment-catalog.js b/backend/.dev/inspect-payment-catalog.js new file mode 100644 index 0000000..4ec3e7b --- /dev/null +++ b/backend/.dev/inspect-payment-catalog.js @@ -0,0 +1,31 @@ +// Dump the current payment catalog for a quick visual sanity check after a +// reset. Read-only. + +import 'dotenv/config' +import { getDb } from '../src/db/client.js' + +const sql = getDb() +const rows = await sql` + SELECT g.name AS grp, m.display_name, m.payment_code, m.icon, + m.min_amount, m.max_amount, m.is_active + FROM payment_methods m + JOIN payment_method_groups g ON m.group_id = g.id + ORDER BY g.display_order, m.display_order +` +console.log(`${rows.length} methods across ${new Set(rows.map(r => r.grp)).size} groups\n`) +const w = (s, n) => String(s).padEnd(n) +const r = (s, n) => String(s).padStart(n) +console.log(w('Group', 18), w('Display', 26), w('Code', 26), w('Icon', 26), r('Min', 10), r('Max', 16)) +console.log('-'.repeat(124)) +for (const row of rows) { + console.log( + w(row.grp, 18), + w(row.display_name, 26), + w(row.payment_code, 26), + w(row.icon ?? '—', 26), + r(row.min_amount ?? '—', 10), + r(row.max_amount ?? '—', 16), + row.is_active ? '' : '(inactive)', + ) +} +await sql.end() diff --git a/backend/.dev/reset-payment-catalog.js b/backend/.dev/reset-payment-catalog.js new file mode 100644 index 0000000..75d3933 --- /dev/null +++ b/backend/.dev/reset-payment-catalog.js @@ -0,0 +1,28 @@ +// One-shot wipe of the payment_methods + payment_method_groups tables in the +// current DATABASE_URL. Use when you want the seed in migrate.js to repopulate +// from scratch on the next migration run. +// +// Safe against payment_requests because that table does NOT FK into +// payment_methods — `xendit_payment_method` and `product_metadata.preferred_payment_code` +// are free-text columns. +// +// Usage: +// cd backend && node .dev/reset-payment-catalog.js +// cd backend && node src/db/migrate.js + +import 'dotenv/config' +import { getDb } from '../src/db/client.js' + +const sql = getDb() + +const [{ count: methodCount }] = await sql`SELECT COUNT(*)::int AS count FROM payment_methods` +const [{ count: groupCount }] = await sql`SELECT COUNT(*)::int AS count FROM payment_method_groups` +console.log(`Before: ${methodCount} methods, ${groupCount} groups`) + +// FK is payment_methods.group_id → payment_method_groups (ON DELETE RESTRICT), +// so methods must go first. +await sql`DELETE FROM payment_methods` +await sql`DELETE FROM payment_method_groups` + +console.log('Wiped. Now run: node src/db/migrate.js') +await sql.end() diff --git a/backend/package-lock.json b/backend/package-lock.json index aeca6c3..b95f4f9 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -17,6 +17,7 @@ "fastify": "^5.0.0", "firebase-admin": "^12.2.0", "google-auth-library": "^9.15.1", + "idn-finlogos": "^2.3.0", "ioredis": "^5.4.1", "jsonwebtoken": "^9.0.3", "jwks-rsa": "^3.2.2", @@ -2642,6 +2643,39 @@ "node": ">= 14" } }, + "node_modules/idn-finlogos": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/idn-finlogos/-/idn-finlogos-2.3.0.tgz", + "integrity": "sha512-s6kF3gPvcW+hdRJdMomKiH7m05X77VAltj2Z1FBQuP00pJxBMDULTOjK4bCsrq6LQ8xVATMGR130fSzdidwKUA==", + "license": "SEE LICENSE IN LICENSE", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": ">=16.8", + "react-native": ">=0.60", + "react-native-svg": ">=12.0", + "svelte": ">=4.0", + "vue": ">=3.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + }, + "react-native-svg": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", diff --git a/backend/package.json b/backend/package.json index d012770..a2a61bc 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,6 +23,7 @@ "fastify": "^5.0.0", "firebase-admin": "^12.2.0", "google-auth-library": "^9.15.1", + "idn-finlogos": "^2.3.0", "ioredis": "^5.4.1", "jsonwebtoken": "^9.0.3", "jwks-rsa": "^3.2.2", diff --git a/backend/src/app.internal.js b/backend/src/app.internal.js index 117bdbe..7d15d08 100644 --- a/backend/src/app.internal.js +++ b/backend/src/app.internal.js @@ -11,6 +11,7 @@ import { sessionManagementRoutes } from './routes/internal/session.routes.js' import { mitraActivityRoutes } from './routes/internal/mitra-activity.routes.js' import { failedPairingsRoutes } from './routes/internal/failed-pairings.routes.js' import { internalPaymentCatalogRoutes } from './routes/internal/payment-catalog.routes.js' +import { internalPaymentIconsRoutes } from './routes/internal/payment-icons.routes.js' import { internalTestRoutes } from './routes/internal/_test.routes.js' import { errorHandler } from './plugins/error-handler.js' @@ -40,6 +41,7 @@ export const buildInternalApp = async () => { app.register(mitraActivityRoutes, { prefix: '/internal/mitra-activity' }) app.register(failedPairingsRoutes, { prefix: '/internal/failed-pairings' }) app.register(internalPaymentCatalogRoutes, { prefix: '/internal' }) + app.register(internalPaymentIconsRoutes, { prefix: '/internal' }) // Dev/test-only — never registered in production builds. if (process.env.NODE_ENV !== 'production') { diff --git a/backend/src/app.public.js b/backend/src/app.public.js index d924e20..4195790 100644 --- a/backend/src/app.public.js +++ b/backend/src/app.public.js @@ -17,6 +17,8 @@ import { clientOnboardingRoutes } from './routes/public/client.onboarding.routes import { sharedSupportRoutes } from './routes/public/shared.support.routes.js' import { sharedChatRoutes } from './routes/public/shared.chat.routes.js' import { paymentWebhookRoutes } from './routes/public/shared.payment-webhooks.routes.js' +import { paymentIconRoutes } from './routes/public/shared.payment-icons.routes.js' +import { paymentReturnRoutes } from './routes/public/payment-return.routes.js' import { errorHandler } from './plugins/error-handler.js' import { registerWebSocketPlugin, registerWebSocketRoute } from './plugins/websocket.js' @@ -47,6 +49,10 @@ export const buildPublicApp = async () => { app.register(sharedSupportRoutes, { prefix: '/api/shared' }) // Payment provider webhooks. Public + token-authed via x-callback-token. app.register(paymentWebhookRoutes, { prefix: '/api/shared/payment' }) + // Brand-mark SVGs from idn-finlogos. Public, 1-year immutable cache. + app.register(paymentIconRoutes, { prefix: '/assets' }) + // Xendit customer-redirect HTML pages. Public, no auth. + app.register(paymentReturnRoutes, { prefix: '/payment' }) // WebSocket route (registered at app level, not prefixed) registerWebSocketRoute(app) diff --git a/backend/src/db/migrate.js b/backend/src/db/migrate.js index dd59ae4..05c9dab 100644 --- a/backend/src/db/migrate.js +++ b/backend/src/db/migrate.js @@ -1191,69 +1191,125 @@ const migrate = async () => { ON payment_methods (group_id, display_order) ` - // Seed: only when the groups table is empty. Once seeded, operators edit via - // CC; we never re-seed (avoid clobbering custom orderings). - const [{ n: groupCount }] = await sql` - SELECT COUNT(*)::int AS n FROM payment_method_groups + // Per-method amount bounds (Phase 5.x). Both inclusive, both nullable + // (null = no bound). The customer app greys out methods whose bounds the + // current bill misses; the backend rejects with INVALID_PAYMENT_AMOUNT. + // BIGINT so we can store Xendit's published per-channel ceilings verbatim + // (some banks document up to Rp 50 billion, well past INT range). + await sql` + ALTER TABLE payment_methods + ADD COLUMN IF NOT EXISTS min_amount BIGINT, + ADD COLUMN IF NOT EXISTS max_amount BIGINT ` - if (groupCount === 0) { - const PAYMENT_CATALOG_SEED = [ - { - name: 'Paling Cepat', - order: 0, - methods: [ - { code: 'QRIS', display: 'QRIS', icon: 'qris', active: true }, - ], - }, - { - name: 'E-Wallet', - order: 1, - methods: [ - { code: 'OVO', display: 'OVO', icon: 'ovo', active: true }, - { code: 'DANA', display: 'DANA', icon: 'dana', active: true }, - { code: 'SHOPEEPAY', display: 'ShopeePay', icon: 'shopeepay', active: true }, - // Xendit Invoice API doesn't expose GoPay (Gojek/GoPay relationship). - // Seeded as inactive so it surfaces in CC but is hidden from the app - // until we either confirm a Xendit channel or remove it entirely. - { code: 'GOPAY', display: 'GoPay', icon: 'gopay', active: false }, - ], - }, - { - name: 'Virtual Account', - order: 2, - methods: [ - { code: 'BCA_VA', display: 'BCA Virtual Account', icon: 'bca', active: true }, - { code: 'MANDIRI_VA', display: 'Mandiri Virtual Account', icon: 'mandiri', active: true }, - { code: 'BNI_VA', display: 'BNI Virtual Account', icon: 'bni', active: true }, - { code: 'BRI_VA', display: 'BRI Virtual Account', icon: 'bri', active: true }, - { code: 'PERMATA_VA', display: 'Permata Virtual Account', icon: 'permata', active: true }, - ], - }, - ] - for (const group of PAYMENT_CATALOG_SEED) { - const [{ id: groupId }] = await sql` - INSERT INTO payment_method_groups (name, display_order, is_active) - VALUES (${group.name}, ${group.order}, true) - RETURNING id + // Unique on group name so we can re-run the seed below with ON CONFLICT. + await sql` + CREATE UNIQUE INDEX IF NOT EXISTS payment_method_groups_name_uq + ON payment_method_groups (name) + ` + + // --- Catalog seed ----------------------------------------------------------- + // + // Re-runnable: groups upsert via ON CONFLICT on name; methods via ON CONFLICT + // on payment_code (already UNIQUE). Operator edits in CC are NOT clobbered + // because DO NOTHING leaves existing rows alone. New methods you add to this + // list later land on the next migration; existing methods don't get bumped. + // + // Limits are pulled from https://docs.xendit.co/docs/available-payment-channels + // (verified 2026-05-27). Amounts are inclusive Rp. Where Xendit's documented + // max exceeds 50B, we keep the literal number — `payment_requests.amount` is + // INTEGER-capped at 2.1B so we never get that high in practice; the bound is + // recorded faithfully for documentation / future raises. + const PAYMENT_CATALOG_SEED = [ + { + name: 'Paling Cepat', + order: 0, + methods: [ + { code: 'QRIS', display: 'QRIS', icon: 'qris', + min: 1500, max: 20000000, active: true }, + ], + }, + { + name: 'E-Wallet', + order: 1, + methods: [ + { code: 'OVO', display: 'OVO', icon: 'ovo-new', min: 100, max: 20000000, active: true }, + { code: 'DANA', display: 'DANA', icon: 'dana', min: 100, max: 20000000, active: true }, + { code: 'SHOPEEPAY', display: 'ShopeePay', icon: 'shopee-pay', min: 1, max: 20000000, active: true }, + { code: 'LINKAJA', display: 'LinkAja', icon: 'linkaja', min: 1, max: 20000000, active: true }, + { code: 'ASTRAPAY', display: 'AstraPay', icon: 'astra-pay', min: 100, max: 20000000, active: true }, + ], + }, + { + name: 'Virtual Account', + order: 2, + methods: [ + { code: 'BCA_VIRTUAL_ACCOUNT', display: 'BCA Virtual Account', icon: 'bca', min: 10000, max: 50000000, active: true }, + { code: 'MANDIRI_VIRTUAL_ACCOUNT', display: 'Mandiri Virtual Account', icon: 'mandiri', min: 1, max: 50000000000n, active: true }, + { code: 'BNI_VIRTUAL_ACCOUNT', display: 'BNI Virtual Account', icon: 'bni', min: 1, max: 50000000, active: true }, + { code: 'BRI_VIRTUAL_ACCOUNT', display: 'BRI Virtual Account', icon: 'bri', min: 1, max: 50000000000n, active: true }, + { code: 'BSI_VIRTUAL_ACCOUNT', display: 'BSI Virtual Account', icon: 'bsi', min: 1, max: 50000000000n, active: true }, + { code: 'PERMATA_VIRTUAL_ACCOUNT', display: 'Permata Virtual Account', icon: 'permata', min: 1, max: 9999999999n, active: true }, + { code: 'CIMB_VIRTUAL_ACCOUNT', display: 'CIMB Virtual Account', icon: 'cimb-niaga', min: 1, max: 50000000, active: true }, + { code: 'BJB_VIRTUAL_ACCOUNT', display: 'BJB Virtual Account', icon: 'bank-bjb', min: 1, max: 2000000000, active: true }, + { code: 'BSS_VIRTUAL_ACCOUNT', display: 'BSS Virtual Account', icon: 'bank-sahabat-sampoerna', min: 1, max: 50000000000n, active: true }, + ], + }, + { + name: 'Outlet', + order: 3, + methods: [ + { code: 'ALFAMART', display: 'Alfamart', icon: 'alfamart', min: 10000, max: 5000000, active: true }, + { code: 'INDOMARET', display: 'Indomaret', icon: 'indomaret', min: 10000, max: 2500000, active: true }, + ], + }, + { + name: 'Kartu Kredit', + order: 4, + methods: [ + // `icon` is comma-separated → backend emits multiple icon_urls; client + // renders them side-by-side on the same tile. + { code: 'CARDS', display: 'Kartu Kredit', icon: 'visa,mastercard,jcb', + min: 5000, max: 200000000, active: true }, + ], + }, + ] + + for (const group of PAYMENT_CATALOG_SEED) { + // INSERT new group OR fetch existing's id. ON CONFLICT (name) DO NOTHING + // returns no row, so we RETURNING + fallback SELECT. + const ins = await sql` + INSERT INTO payment_method_groups (name, display_order, is_active) + VALUES (${group.name}, ${group.order}, true) + ON CONFLICT (name) DO NOTHING + RETURNING id + ` + let groupId + if (ins.length > 0) { + groupId = ins[0].id + } else { + const [row] = await sql`SELECT id FROM payment_method_groups WHERE name = ${group.name}` + groupId = row.id + } + let methodOrder = 0 + for (const m of group.methods) { + await sql` + INSERT INTO payment_methods ( + group_id, display_name, payment_code, display_order, icon, + min_amount, max_amount, is_active + ) + VALUES ( + ${groupId}, + ${m.display}, + ${m.code}, + ${methodOrder++}, + ${m.icon}, + ${m.min}, + ${m.max}, + ${m.active} + ) + ON CONFLICT (payment_code) DO NOTHING ` - let methodOrder = 0 - for (const m of group.methods) { - await sql` - INSERT INTO payment_methods ( - group_id, display_name, payment_code, display_order, icon, is_active - ) - VALUES ( - ${groupId}, - ${m.display}, - ${m.code}, - ${methodOrder++}, - ${m.icon}, - ${m.active} - ) - ON CONFLICT (payment_code) DO NOTHING - ` - } } } diff --git a/backend/src/routes/internal/payment-catalog.routes.js b/backend/src/routes/internal/payment-catalog.routes.js index 1ff790e..3467c6d 100644 --- a/backend/src/routes/internal/payment-catalog.routes.js +++ b/backend/src/routes/internal/payment-catalog.routes.js @@ -53,6 +53,22 @@ const conflict = (message, extra = {}) => ({ error: { code: 'CONFLICT', message, ...extra }, }) +// Amount bounds are inclusive Rupiah, null = no bound. Accept either null or +// a non-negative finite integer. We coerce empty string / "" to null on input +// so the CC form can clear a bound by submitting an empty field. +const normalizeAmountBound = (raw) => { + if (raw === null || raw === undefined || raw === '') return null + return raw +} + +const validateAmountBound = (fieldName, raw) => { + if (raw === null || raw === undefined || raw === '') return null + if (typeof raw !== 'number' || !Number.isInteger(raw) || raw < 0) { + return validation(`${fieldName} must be a non-negative integer or null`, fieldName) + } + return null +} + const attachCcUser = async (request, reply) => { if (request.auth?.userType !== UserType.CC_USER) { return reply.code(403).send({ @@ -157,7 +173,8 @@ export const internalPaymentCatalogRoutes = async (app) => { }) app.post('/payment-methods', { preHandler: WRITE_GUARD }, async (request, reply) => { - const { group_id, display_name, payment_code, display_order, icon, is_active } = request.body ?? {} + const { group_id, display_name, payment_code, display_order, icon, + min_amount, max_amount, is_active } = request.body ?? {} if (typeof group_id !== 'string' || !UUID_RE.test(group_id)) { return reply.code(422).send(validation('group_id is required and must be a UUID', 'group_id')) } @@ -167,6 +184,13 @@ export const internalPaymentCatalogRoutes = async (app) => { if (typeof payment_code !== 'string' || payment_code.trim().length === 0) { return reply.code(422).send(validation('payment_code is required', 'payment_code')) } + const minErr = validateAmountBound('min_amount', min_amount) + if (minErr) return reply.code(422).send(minErr) + const maxErr = validateAmountBound('max_amount', max_amount) + if (maxErr) return reply.code(422).send(maxErr) + if (min_amount != null && max_amount != null && min_amount > max_amount) { + return reply.code(422).send(validation('min_amount must be <= max_amount', 'min_amount')) + } try { const row = await createMethod({ groupId: group_id, @@ -174,6 +198,8 @@ export const internalPaymentCatalogRoutes = async (app) => { paymentCode: payment_code.trim(), displayOrder: Number.isFinite(display_order) ? display_order : 0, icon: typeof icon === 'string' && icon.trim().length > 0 ? icon.trim() : null, + minAmount: normalizeAmountBound(min_amount), + maxAmount: normalizeAmountBound(max_amount), isActive: typeof is_active === 'boolean' ? is_active : true, }) return reply.code(201).send({ success: true, data: row }) @@ -198,7 +224,8 @@ export const internalPaymentCatalogRoutes = async (app) => { if (!UUID_RE.test(id)) { return reply.code(422).send(validation('Invalid id format', 'id')) } - const { group_id, display_name, payment_code, display_order, icon, is_active } = request.body ?? {} + const body = request.body ?? {} + const { group_id, display_name, payment_code, display_order, icon, is_active } = body if (group_id !== undefined && (typeof group_id !== 'string' || !UUID_RE.test(group_id))) { return reply.code(422).send(validation('group_id must be a UUID', 'group_id')) } @@ -208,6 +235,24 @@ export const internalPaymentCatalogRoutes = async (app) => { if (payment_code !== undefined && (typeof payment_code !== 'string' || payment_code.trim().length === 0)) { return reply.code(422).send(validation('payment_code must be non-empty', 'payment_code')) } + const hasMin = Object.prototype.hasOwnProperty.call(body, 'min_amount') + const hasMax = Object.prototype.hasOwnProperty.call(body, 'max_amount') + if (hasMin) { + const err = validateAmountBound('min_amount', body.min_amount) + if (err) return reply.code(422).send(err) + } + if (hasMax) { + const err = validateAmountBound('max_amount', body.max_amount) + if (err) return reply.code(422).send(err) + } + // Cross-field check uses post-patch effective values. If only one side is + // patched, the other comes from the existing row — fetched in the service + // would be cleaner, but we'd need a SELECT round-trip; instead, require + // the operator to send both when narrowing the range. + if (hasMin && hasMax && body.min_amount != null && body.max_amount != null + && body.min_amount > body.max_amount) { + return reply.code(422).send(validation('min_amount must be <= max_amount', 'min_amount')) + } try { const row = await updateMethod(id, { groupId: group_id, @@ -215,6 +260,8 @@ export const internalPaymentCatalogRoutes = async (app) => { paymentCode: payment_code?.trim(), displayOrder: Number.isFinite(display_order) ? display_order : undefined, icon: icon === null ? null : (typeof icon === 'string' && icon.trim().length > 0 ? icon.trim() : undefined), + ...(hasMin ? { minAmount: normalizeAmountBound(body.min_amount) } : {}), + ...(hasMax ? { maxAmount: normalizeAmountBound(body.max_amount) } : {}), isActive: typeof is_active === 'boolean' ? is_active : undefined, }) if (!row) return reply.code(404).send(notFound('payment_method not found')) diff --git a/backend/src/routes/internal/payment-icons.routes.js b/backend/src/routes/internal/payment-icons.routes.js new file mode 100644 index 0000000..efb0e54 --- /dev/null +++ b/backend/src/routes/internal/payment-icons.routes.js @@ -0,0 +1,40 @@ +/** + * Control-center read-only manifest for the payment-icon picker. + * + * GET /internal/payment-icons → { slugs: [...] } + * + * The CC payment-method form uses this to populate a dropdown of valid + * `icon` values, so operators pick from a known list instead of typing free + * text and risking a 404 on the asset endpoint. Reuses the `config` `read` + * permission (same scope used by the catalog editor). + */ + +import { authenticate, requirePermission } from '../../plugins/auth.js' +import { getCcUserById } from '../../services/cc-user.service.js' +import { UserType } from '../../constants.js' +import { listIconSlugs } from '../../services/payment-icon.service.js' + +const attachCcUser = async (request, reply) => { + if (request.auth?.userType !== UserType.CC_USER) { + return reply.code(403).send({ + success: false, + error: { code: 'FORBIDDEN', message: 'Not a control center user' }, + }) + } + const user = await getCcUserById(request.auth.userId) + if (!user) { + return reply.code(403).send({ + success: false, + error: { code: 'FORBIDDEN', message: 'Not a control center user' }, + }) + } + request.ccUser = user +} + +const READ_GUARD = [authenticate, attachCcUser, requirePermission('config', 'read')] + +export const internalPaymentIconsRoutes = async (app) => { + app.get('/payment-icons', { preHandler: READ_GUARD }, async (_request, reply) => { + return reply.send({ success: true, data: { slugs: listIconSlugs() } }) + }) +} diff --git a/backend/src/routes/public/client.payment.routes.js b/backend/src/routes/public/client.payment.routes.js index 303e270..6f04c6c 100644 --- a/backend/src/routes/public/client.payment.routes.js +++ b/backend/src/routes/public/client.payment.routes.js @@ -59,6 +59,9 @@ export const clientPaymentRoutes = async (app) => { // must reference an active row in `payment_methods`. Casing-tolerant; older app // versions sending lower-case (`qris`) are normalised inside the service. // `method` is optional for backwards compat with pre-Phase-5.x callers. + // Amount-bound enforcement happens AFTER amount is computed below; we + // capture `methodEntry` here to avoid a second lookup. + let methodEntry = null if (method !== null && method !== undefined) { if (typeof method !== 'string' || method.trim().length === 0) { return reply.code(422).send({ @@ -66,8 +69,8 @@ export const clientPaymentRoutes = async (app) => { error: { code: 'VALIDATION_ERROR', message: 'method must be a non-empty string when provided' }, }) } - const entry = await findActiveMethodByCode(method) - if (!entry) { + methodEntry = await findActiveMethodByCode(method) + if (!methodEntry) { return reply.code(422).send({ success: false, error: { @@ -129,6 +132,32 @@ export const clientPaymentRoutes = async (app) => { } } + // Per-method amount bounds — defense in depth alongside the client's own + // disabled-tile UX. A stale catalog cache on the client could let a request + // through that the picker should have blocked. Bounds are inclusive. + if (methodEntry) { + if (methodEntry.min_amount != null && amount < methodEntry.min_amount) { + return reply.code(422).send({ + success: false, + error: { + code: 'INVALID_PAYMENT_AMOUNT', + message: 'Amount below the minimum for the selected payment method', + details: { amount, min_amount: methodEntry.min_amount, max_amount: methodEntry.max_amount }, + }, + }) + } + if (methodEntry.max_amount != null && amount > methodEntry.max_amount) { + return reply.code(422).send({ + success: false, + error: { + code: 'INVALID_PAYMENT_AMOUNT', + message: 'Amount above the maximum for the selected payment method', + details: { amount, min_amount: methodEntry.min_amount, max_amount: methodEntry.max_amount }, + }, + }) + } + } + // Phase 5: payment.service.js handles the Xendit invoice creation internally // when XENDIT_ENABLED=true. The row comes back with xendit_invoice_url populated; // when off, invoice_url is null and the dev/Maestro stub plays the webhook role. diff --git a/backend/src/routes/public/payment-return.routes.js b/backend/src/routes/public/payment-return.routes.js new file mode 100644 index 0000000..3f17a51 --- /dev/null +++ b/backend/src/routes/public/payment-return.routes.js @@ -0,0 +1,154 @@ +/** + * Customer-facing return pages for Xendit Invoice checkout — Phase 5.x. + * + * Routes (public, no auth — Xendit's hosted checkout 302s the customer's + * browser here after payment): + * GET /payment/return/success + * GET /payment/return/failure + * + * Xendit appends query params like `external_id` and `payment_id`; we don't + * need them — the customer's app polls `GET /payment-requests/:id` + * independently and learns the outcome from there. These pages are PURE UX: + * they confirm the outcome and offer a `halobestie://` deeplink button so + * the customer can flip back to the app with one tap. + * + * The deeplink scheme must be registered in + * `client_app/android/app/src/main/AndroidManifest.xml` and + * `client_app/ios/Runner/Info.plist`. If the scheme isn't registered the + * button is a no-op; the customer can still tap the Custom Tab back arrow. + * + * Brand colors mirror `client_app/lib/core/theme/halo_tokens.dart`: + * brand #E17A9D + * brandDark #8C3255 + * brandSofter #FBEFF3 + * danger (red shades — failure variant) + */ + +const renderPage = ({ variant, title, headline, body, deeplink }) => { + const accent = variant === 'success' ? '#E17A9D' : '#D86B6B' + const accentDark = variant === 'success' ? '#8C3255' : '#7A1E1E' + const accentSoft = variant === 'success' ? '#FBEFF3' : '#FCEDED' + const glyph = variant === 'success' ? '✓' : '!' + return ` + + + + + + ${title} + + + + + + +
+
+ +

${headline}

+

${body}

+ Buka HaloBestie +
Atau tutup tab ini untuk kembali ke aplikasi.
+
+
+ +` +} + +export const paymentReturnRoutes = async (app) => { + app.get('/return/success', async (_request, reply) => { + return reply.type('text/html; charset=utf-8').send(renderPage({ + variant: 'success', + title: 'Pembayaran berhasil — HaloBestie', + headline: 'Pembayaran berhasil!', + body: 'Sesi kamu sedang disiapkan. Buka aplikasi HaloBestie untuk mulai curhat.', + deeplink: 'halobestie://payment/return?status=success', + })) + }) + + app.get('/return/failure', async (_request, reply) => { + return reply.type('text/html; charset=utf-8').send(renderPage({ + variant: 'failure', + title: 'Pembayaran tidak berhasil — HaloBestie', + headline: 'Pembayaran tidak berhasil', + body: 'Tenang, belum ada yang ditarik. Buka aplikasi HaloBestie dan coba metode lain.', + deeplink: 'halobestie://payment/return?status=failure', + })) + }) +} diff --git a/backend/src/routes/public/shared.payment-icons.routes.js b/backend/src/routes/public/shared.payment-icons.routes.js new file mode 100644 index 0000000..de88757 --- /dev/null +++ b/backend/src/routes/public/shared.payment-icons.routes.js @@ -0,0 +1,40 @@ +/** + * Public payment-icon serving — Phase 5.x. + * + * GET /assets/payment-icons/:slug.svg + * Returns the idn-finlogos SVG for `slug` with a 1-year immutable cache + * header. Content is stable per backend deploy (icons change only when the + * `idn-finlogos` npm dep is bumped); clients can cache aggressively. + * + * Public on purpose — these are brand-mark icons, not sensitive data. The + * catalog endpoint (`GET /api/client/payment-methods`) is still authenticated; + * leaking the icon URL by itself reveals nothing useful. + * + * 404 on unknown slug. We deliberately do NOT 200-with-placeholder here — + * upstream owns the "show placeholder" fallback, and 404ing tells operators + * about typo'd slugs in the CC payment-method form. + */ + +import { createReadStream } from 'fs' +import { hasIconSlug, resolveIconPath } from '../../services/payment-icon.service.js' + +const SLUG_RE = /^[a-z0-9][a-z0-9-]{0,63}$/ + +export const paymentIconRoutes = async (app) => { + app.get('/payment-icons/:slug.svg', async (request, reply) => { + const { slug } = request.params + + // Guard against path-traversal / oversized slug before touching the FS. + if (!SLUG_RE.test(slug) || !hasIconSlug(slug)) { + return reply.code(404).send({ + success: false, + error: { code: 'NOT_FOUND', message: 'Unknown payment icon slug' }, + }) + } + + return reply + .type('image/svg+xml') + .header('Cache-Control', 'public, max-age=31536000, immutable') + .send(createReadStream(resolveIconPath(slug))) + }) +} diff --git a/backend/src/services/payment-catalog.service.js b/backend/src/services/payment-catalog.service.js index 0b4c7b0..a69bdf2 100644 --- a/backend/src/services/payment-catalog.service.js +++ b/backend/src/services/payment-catalog.service.js @@ -27,7 +27,31 @@ import { getValkeyClient, publish, subscribe } from '../plugins/valkey.js' const sql = getDb() -const CACHE_KEY = 'payment-catalog:v1' +// Bump the version suffix whenever the catalog shape changes so a deploy +// doesn't serve stale-shape entries from L2 Valkey for up to VALKEY_TTL_SECONDS. +// v2: added icon_url alongside icon (2026-05-27, Phase 5.x backend icon hosting). +// v3: added min_amount / max_amount per method (2026-05-27, Phase 5.x amount bounds). +// v4: icon -> comma-separated slug list, emit icon_urls[] (2026-05-27, multi-logo for cards). +const CACHE_KEY = 'payment-catalog:v4' + +// Split a comma-separated `icon` string into trimmed, non-empty slugs. +// Tolerates whitespace and stray commas: " visa , mastercard , " → ['visa','mastercard']. +const parseIconSlugs = (raw) => { + if (!raw) return [] + return String(raw) + .split(',') + .map((s) => s.trim()) + .filter((s) => s.length > 0) +} + +// `postgres` returns BIGINT columns as JS strings (BigInt would break JSON.stringify). +// All realistic payment amounts fit comfortably below Number.MAX_SAFE_INTEGER, so we +// coerce to Number for the API response — keeps the wire shape `{min_amount: 10000}` +// rather than `"10000"`, which is what mobile/CC parsers expect. +const coerceAmount = (v) => { + if (v === null || v === undefined) return null + return typeof v === 'number' ? v : Number(v) +} const VALKEY_TTL_SECONDS = 60 * 60 // 1 hour const INPROCESS_TTL_MS = 60 * 1000 // 60 seconds const INVALIDATE_CHANNEL = 'config:invalidate' @@ -93,6 +117,8 @@ const buildCatalogFromDb = async () => { m.payment_code AS payment_code, m.display_name AS display_name, m.icon AS icon, + m.min_amount AS min_amount, + m.max_amount AS max_amount, m.display_order AS method_order FROM payment_method_groups g JOIN payment_methods m ON m.group_id = g.id @@ -111,11 +137,19 @@ const buildCatalogFromDb = async () => { methods: [], }) } + // `icon` is a comma-separated slug list (single entry for most methods; + // multiple for composite tiles like a credit-card row showing Visa + MC + JCB). + // We emit `icon_urls` as the canonical field; clients render them in a row. + const slugs = parseIconSlugs(r.icon) byGroupId.get(r.group_id).methods.push({ id: r.method_id, payment_code: r.payment_code, display_name: r.display_name, icon: r.icon, + icon_urls: slugs.map((s) => `/assets/payment-icons/${s}.svg`), + // Per-method amount bounds (inclusive). Either may be null = no bound. + min_amount: coerceAmount(r.min_amount), + max_amount: coerceAmount(r.max_amount), order: r.method_order, }) } @@ -193,18 +227,23 @@ export const listMethods = async ({ groupId = null } = {}) => { const rows = groupId ? await sql` SELECT id, group_id, display_name, payment_code, display_order, - icon, is_active, created_at, updated_at + icon, min_amount, max_amount, is_active, created_at, updated_at FROM payment_methods WHERE group_id = ${groupId} ORDER BY display_order ASC, display_name ASC ` : await sql` SELECT id, group_id, display_name, payment_code, display_order, - icon, is_active, created_at, updated_at + icon, min_amount, max_amount, is_active, created_at, updated_at FROM payment_methods ORDER BY display_order ASC, display_name ASC ` - return rows + // BIGINT → number for CC consumption (table uses toLocaleString). + return rows.map((r) => ({ + ...r, + min_amount: coerceAmount(r.min_amount), + max_amount: coerceAmount(r.max_amount), + })) } // --- Catalog mutators (used by control-center routes) ------------------------ @@ -270,11 +309,14 @@ export const createMethod = async ({ paymentCode, displayOrder = 0, icon = null, + minAmount = null, + maxAmount = null, isActive = true, }) => { const [row] = await sql` INSERT INTO payment_methods ( - group_id, display_name, payment_code, display_order, icon, is_active + group_id, display_name, payment_code, display_order, icon, + min_amount, max_amount, is_active ) VALUES ( ${groupId}, @@ -282,15 +324,22 @@ export const createMethod = async ({ ${String(paymentCode).toUpperCase()}, ${displayOrder}, ${icon}, + ${minAmount}, + ${maxAmount}, ${isActive} ) - RETURNING id, group_id, display_name, payment_code, display_order, icon, is_active + RETURNING id, group_id, display_name, payment_code, display_order, + icon, min_amount, max_amount, is_active ` await invalidatePaymentCatalog() return row } export const updateMethod = async (id, patch) => { + // null is a meaningful update for min/max (operator clearing the bound), so + // we route those through a sentinel-aware branch instead of COALESCE. + const setMin = Object.prototype.hasOwnProperty.call(patch, 'minAmount') + const setMax = Object.prototype.hasOwnProperty.call(patch, 'maxAmount') const [row] = await sql` UPDATE payment_methods SET @@ -299,10 +348,13 @@ export const updateMethod = async (id, patch) => { payment_code = COALESCE(${patch.paymentCode ? String(patch.paymentCode).toUpperCase() : null}, payment_code), display_order = COALESCE(${patch.displayOrder ?? null}, display_order), icon = COALESCE(${patch.icon ?? null}, icon), + min_amount = ${setMin ? patch.minAmount : sql`min_amount`}, + max_amount = ${setMax ? patch.maxAmount : sql`max_amount`}, is_active = COALESCE(${patch.isActive ?? null}, is_active), updated_at = NOW() WHERE id = ${id} - RETURNING id, group_id, display_name, payment_code, display_order, icon, is_active + RETURNING id, group_id, display_name, payment_code, display_order, + icon, min_amount, max_amount, is_active ` await invalidatePaymentCatalog() return row diff --git a/backend/src/services/payment-icon.service.js b/backend/src/services/payment-icon.service.js new file mode 100644 index 0000000..a1cb944 --- /dev/null +++ b/backend/src/services/payment-icon.service.js @@ -0,0 +1,41 @@ +/** + * Payment-icon serving — Phase 5.x icon hosting. + * + * Backend wraps the `idn-finlogos` npm package and serves its SVGs at + * `/assets/payment-icons/.svg`. The catalog endpoint returns + * `icon_url: "/assets/payment-icons/.svg"`; the client app fetches + + * caches with `flutter_cache_manager`. No bundled icons in the app anymore. + * + * License: idn-finlogos ships under CC-BY-NC-4.0 for the assets (per-brand + * permission still required for production use). Code under MIT. See + * `backend/node_modules/idn-finlogos/LICENSE-ASSETS` + `NOTICE`. + * + * Slug set is loaded ONCE at module init from `dist/icons/*.svg` filenames so + * the request path stays a single Set.has() lookup. Bump the package version + * to add/replace icons; restart the backend to refresh the slug set. + */ + +import { readdirSync } from 'fs' +import { dirname, join } from 'path' +import { createRequire } from 'module' + +const require = createRequire(import.meta.url) + +const PACKAGE_DIR = dirname(require.resolve('idn-finlogos/package.json')) +const ICONS_DIR = join(PACKAGE_DIR, 'dist', 'icons') + +const SLUGS = new Set( + readdirSync(ICONS_DIR) + .filter((f) => f.endsWith('.svg')) + .map((f) => f.slice(0, -4)), +) + +export const hasIconSlug = (slug) => typeof slug === 'string' && SLUGS.has(slug) + +export const resolveIconPath = (slug) => { + if (!hasIconSlug(slug)) return null + return join(ICONS_DIR, `${slug}.svg`) +} + +/** Sorted slug list for the CC dropdown. */ +export const listIconSlugs = () => Array.from(SLUGS).sort() diff --git a/backend/test/routes/client.payment.routes.test.js b/backend/test/routes/client.payment.routes.test.js index 2503163..04472fa 100644 --- a/backend/test/routes/client.payment.routes.test.js +++ b/backend/test/routes/client.payment.routes.test.js @@ -123,6 +123,65 @@ describe('POST /api/client/payment-requests', () => { expect(confirmed.confirmed_at).toBeTruthy() }) + it('rejects with INVALID_PAYMENT_AMOUNT when amount falls below the method min', async () => { + // Seed a low-min method and price the request below it. + const sql = db() + const [g] = await sql` + INSERT INTO payment_method_groups (name, display_order, is_active) + VALUES ('TestGroup-min', 99, true) RETURNING id + ` + await sql` + INSERT INTO payment_methods (group_id, display_name, payment_code, display_order, + icon, min_amount, max_amount, is_active) + VALUES (${g.id}, 'TestVA', 'TEST_VA', 0, null, 50000, null, true) + ` + // Bust the catalog cache so the new method is visible. + const { invalidatePaymentCatalog } = await import('../../src/services/payment-catalog.service.js') + await invalidatePaymentCatalog() + + // Eligible discount path puts the price at 2000 — well below TEST_VA's 50000 min. + const res = await app.inject({ + method: 'POST', + url: '/api/client/payment-requests', + headers: authHeader(token), + payload: { duration_minutes: 12, method: 'TEST_VA' }, + }) + + expect(res.statusCode).toBe(422) + const body = res.json() + expect(body.error.code).toBe('INVALID_PAYMENT_AMOUNT') + expect(body.error.details.min_amount).toBe(50000) + expect(body.error.details.amount).toBe(2000) + }) + + it('rejects with INVALID_PAYMENT_AMOUNT when amount exceeds the method max', async () => { + const sql = db() + const [g] = await sql` + INSERT INTO payment_method_groups (name, display_order, is_active) + VALUES ('TestGroup-max', 99, true) RETURNING id + ` + await sql` + INSERT INTO payment_methods (group_id, display_name, payment_code, display_order, + icon, min_amount, max_amount, is_active) + VALUES (${g.id}, 'TestWallet', 'TEST_W', 0, null, null, 1000, true) + ` + const { invalidatePaymentCatalog } = await import('../../src/services/payment-catalog.service.js') + await invalidatePaymentCatalog() + + // Discounted 12-min = 2000 IDR, above the 1000 max. + const res = await app.inject({ + method: 'POST', + url: '/api/client/payment-requests', + headers: authHeader(token), + payload: { duration_minutes: 12, method: 'TEST_W' }, + }) + + expect(res.statusCode).toBe(422) + const body = res.json() + expect(body.error.code).toBe('INVALID_PAYMENT_AMOUNT') + expect(body.error.details.max_amount).toBe(1000) + }) + it('call-mode payment session uses the call tier price group', async () => { // 20-minute call tier in Phase 4 = 17000 IDR. const res = await app.inject({ diff --git a/backend/test/routes/shared.payment-icons.routes.test.js b/backend/test/routes/shared.payment-icons.routes.test.js new file mode 100644 index 0000000..da25f09 --- /dev/null +++ b/backend/test/routes/shared.payment-icons.routes.test.js @@ -0,0 +1,59 @@ +import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest' + +vi.mock('../../src/plugins/websocket.js', () => ({ + sendToUser: vi.fn(() => false), + sendToSessionParticipant: vi.fn(() => false), + registerWebSocketPlugin: vi.fn(async () => {}), + registerWebSocketRoute: vi.fn(), + isUserOnlineWs: vi.fn(() => false), + getSessionConnections: vi.fn(() => ({})), +})) +vi.mock('../../src/services/notification.service.js', () => ({ + sendPushNotification: vi.fn(async () => true), + registerDeviceToken: vi.fn(async () => {}), +})) + +const { buildPublic } = await import('../helpers/server.js') + +describe('GET /assets/payment-icons/:slug.svg', () => { + let app + + beforeAll(async () => { + app = await buildPublic() + }) + + afterAll(async () => { + await app.close() + }) + + it('serves a known idn-finlogos slug with svg content-type and immutable cache', async () => { + // 'qris' is one of our seeded slugs and is shipped by idn-finlogos. + const res = await app.inject({ method: 'GET', url: '/assets/payment-icons/qris.svg' }) + expect(res.statusCode).toBe(200) + expect(res.headers['content-type']).toBe('image/svg+xml') + expect(res.headers['cache-control']).toBe('public, max-age=31536000, immutable') + expect(res.body).toMatch(/^<\?xml|^ { + const res = await app.inject({ + method: 'GET', + url: '/assets/payment-icons/definitely-not-a-real-bank.svg', + }) + expect(res.statusCode).toBe(404) + const body = JSON.parse(res.body) + expect(body.error.code).toBe('NOT_FOUND') + }) + + it('404s on slug with path-traversal characters', async () => { + // Fastify normalises `..` in the URL, so this resolves to the parent + // route; we still expect a 404 (no SVG matches) — but the SLUG_RE guard + // is what would catch an unencoded attempt if a router ever let one + // through, so we cover its negative case here. + const res = await app.inject({ + method: 'GET', + url: '/assets/payment-icons/UPPER.svg', + }) + expect(res.statusCode).toBe(404) + }) +}) diff --git a/backend/test/services/payment-catalog.service.test.js b/backend/test/services/payment-catalog.service.test.js index 2df9814..ed003de 100644 --- a/backend/test/services/payment-catalog.service.test.js +++ b/backend/test/services/payment-catalog.service.test.js @@ -44,10 +44,19 @@ const insertGroup = async ({ name, order = 0, active = true }) => { return row.id } -const insertMethod = async ({ groupId, code, display = null, order = 0, icon = null, active = true }) => { +const insertMethod = async ({ + groupId, code, display = null, order = 0, icon = null, + minAmount = null, maxAmount = null, active = true, +}) => { const [row] = await sql` - INSERT INTO payment_methods (group_id, display_name, payment_code, display_order, icon, is_active) - VALUES (${groupId}, ${display ?? code}, ${code}, ${order}, ${icon}, ${active}) + INSERT INTO payment_methods ( + group_id, display_name, payment_code, display_order, icon, + min_amount, max_amount, is_active + ) + VALUES ( + ${groupId}, ${display ?? code}, ${code}, ${order}, ${icon}, + ${minAmount}, ${maxAmount}, ${active} + ) RETURNING id ` return row.id @@ -116,6 +125,41 @@ describe('payment-catalog.service', () => { expect(groups.map((g) => g.name)).toEqual(['E-Wallet']) }) + it('parses icon as comma-separated slug list into icon_urls (relative /assets paths)', async () => { + const g = await insertGroup({ name: 'E-Wallet' }) + await insertMethod({ groupId: g, code: 'OVO', icon: 'ovo-new', order: 0 }) + await insertMethod({ groupId: g, code: 'CARDS', icon: 'visa,mastercard,jcb', order: 1 }) + await insertMethod({ groupId: g, code: 'NOICON', icon: null, order: 2 }) + + await invalidatePaymentCatalog() + const { groups } = await getCatalogForApp() + const methods = groups[0].methods + expect(methods[0].icon_urls).toEqual(['/assets/payment-icons/ovo-new.svg']) + expect(methods[1].icon_urls).toEqual([ + '/assets/payment-icons/visa.svg', + '/assets/payment-icons/mastercard.svg', + '/assets/payment-icons/jcb.svg', + ]) + expect(methods[2].icon_urls).toEqual([]) + }) + + it('emits min_amount + max_amount per method (null when not set)', async () => { + const g = await insertGroup({ name: 'E-Wallet' }) + await insertMethod({ groupId: g, code: 'OVO', minAmount: 10000, maxAmount: 10000000, order: 0 }) + await insertMethod({ groupId: g, code: 'QRIS', minAmount: 1, maxAmount: null, order: 1 }) + await insertMethod({ groupId: g, code: 'BCA_VA', minAmount: null, maxAmount: null, order: 2 }) + + await invalidatePaymentCatalog() + const { groups } = await getCatalogForApp() + const methods = groups[0].methods + expect(methods[0].min_amount).toBe(10000) + expect(methods[0].max_amount).toBe(10000000) + expect(methods[1].min_amount).toBe(1) + expect(methods[1].max_amount).toBeNull() + expect(methods[2].min_amount).toBeNull() + expect(methods[2].max_amount).toBeNull() + }) + it('caches in-process (second call returns the same object reference)', async () => { const g = await insertGroup({ name: 'E-Wallet' }) await insertMethod({ groupId: g, code: 'OVO' }) diff --git a/client_app/android/app/src/main/AndroidManifest.xml b/client_app/android/app/src/main/AndroidManifest.xml index 61c2fbf..affab01 100644 --- a/client_app/android/app/src/main/AndroidManifest.xml +++ b/client_app/android/app/src/main/AndroidManifest.xml @@ -28,6 +28,19 @@ + + + + + + + diff --git a/client_app/assets/payment_icons/NOTICE_IDN_FINLOGOS.txt b/client_app/assets/payment_icons/NOTICE_IDN_FINLOGOS.txt deleted file mode 100644 index a64be70..0000000 --- a/client_app/assets/payment_icons/NOTICE_IDN_FINLOGOS.txt +++ /dev/null @@ -1,31 +0,0 @@ -Logo Assets License — Creative Commons Attribution-NonCommercial 4.0 International -(CC BY-NC 4.0) - -This license applies to all SVG logo assets in `icons/` and `dist/icons/`. - -Copyright (c) 2026 Hafidz Noor Fauzi (collection/curation only). - -The underlying logo marks remain the property of their respective trademark -holders. See NOTICE for details on trademark ownership and disclaimers. - -You are free to: - - Share — copy and redistribute the material in any medium or format. - - Adapt — remix, transform, and build upon the material. - -Under the following terms: - - Attribution — You must give appropriate credit, provide a link to this - license, and indicate if changes were made. You may do so in any - reasonable manner, but not in any way that suggests the licensor - endorses you or your use. - - NonCommercial — You may not use the material for commercial purposes. - -No additional restrictions — You may not apply legal terms or technological -measures that legally restrict others from doing anything the license permits. - -Full license text: - https://creativecommons.org/licenses/by-nc/4.0/legalcode - -Human-readable summary: - https://creativecommons.org/licenses/by-nc/4.0/ - -THE LOGO ASSETS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. diff --git a/client_app/assets/payment_icons/README.md b/client_app/assets/payment_icons/README.md deleted file mode 100644 index 368da09..0000000 --- a/client_app/assets/payment_icons/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Payment method icons - -Bundled SVGs referenced by the payment catalog (`payment_methods.icon` slug -in the backend). The customer app's `PaymentIcon` widget resolves -`.svg` from this directory and falls back to `placeholder.svg` when the -file isn't bundled — see `client_app/lib/features/payment/widgets/payment_icon.dart`. - -## Naming convention - -One SVG per slug, lower-case, hyphens not underscores. Currently bundled -slugs (match the migrate.js seed): - -| Slug | Method | Source filename in `idn-finlogos/icons/` | -|---|---|---| -| `qris` | QRIS | `qris.svg` | -| `ovo` | OVO | `ovo-new.svg` | -| `dana` | DANA | `dana.svg` | -| `shopeepay` | ShopeePay | `shopee-pay.svg` | -| `gopay` | GoPay (seeded inactive) | `gopay.svg` | -| `bca` | BCA Virtual Account | `bca.svg` | -| `mandiri` | Mandiri Virtual Account | `mandiri.svg` | -| `bni` | BNI Virtual Account | `bni.svg` | -| `bri` | BRI Virtual Account | `bri.svg` | -| `permata` | Permata Virtual Account | `permata.svg` | - -## Sourcing — idn-finlogos - -We pull individual SVGs from -[github.com/hafidznoor/idn-finlogos](https://github.com/hafidznoor/idn-finlogos) -rather than installing the Flutter package (`idn_finlogos` on pub.dev). The -package bundles all 572 SVGs as Flutter assets — Flutter doesn't tree-shake -assets, so adding the package ships ~4-6 MB of marks we never use. Manual -copy keeps the APK lean: 10 marks ≈ 80 KB on-disk. - -See `NOTICE_IDN_FINLOGOS.txt` for the upstream licensing terms (MIT for build -tooling, CC BY-NC 4.0 for the SVG assets, plus the project's note that -individual brand marks require permission from each brand holder for -commercial use). - -## Adding a new method - -1. **Catalog row** (control center → Payment Catalog): - - Add a method with `payment_code` set to the Xendit channel code - (uppercase, e.g. `LINKAJA`) and `icon` set to the desired slug - (lowercase, e.g. `linkaja`). - - Method renders immediately with the generic placeholder icon. -2. **Branded SVG** (one-time, requires an app release): - ```sh - cd client_app/assets/payment_icons - curl -sS https://raw.githubusercontent.com/hafidznoor/idn-finlogos/main/icons/.svg -o .svg - ``` - (Browse the repo's `icons/` directory if the source filename isn't an - exact match — e.g. `ovo-new.svg` for the modern OVO mark.) -3. **Append the slug** to `_kBundledSlugs` in - `client_app/lib/features/payment/widgets/payment_icon.dart` so the widget - stops falling back to the placeholder for that slug. -4. **Cut a release.** Assets ship with the APK; new icons need a binary update. - -## Why the explicit `_kBundledSlugs` list? - -Flutter's asset system throws if a referenced asset is missing — there's no -"file exists?" check at runtime without round-tripping the AssetManifest. -Keeping the bundled-slugs list in code makes "what we ship" explicit and -keeps the icon widget cheap. - -## When to migrate to the pub package - -The manual-copy approach beats `idn_finlogos` as long as we bundle fewer -than ~50 icons (where the ~4-6 MB whole-library payload starts looking -reasonable compared to per-file curl-and-commit overhead). If we cross that -threshold, switch: - -```yaml -dependencies: - idn_finlogos: ^2.3.0 -``` - -…and delete this directory's per-icon SVGs (keep `placeholder.svg` + the -slug allowlist). diff --git a/client_app/assets/payment_icons/bca.svg b/client_app/assets/payment_icons/bca.svg deleted file mode 100644 index 4ddf06e..0000000 --- a/client_app/assets/payment_icons/bca.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/bni.svg b/client_app/assets/payment_icons/bni.svg deleted file mode 100644 index ac4ed9a..0000000 --- a/client_app/assets/payment_icons/bni.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/bri.svg b/client_app/assets/payment_icons/bri.svg deleted file mode 100644 index 54e712c..0000000 --- a/client_app/assets/payment_icons/bri.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/dana.svg b/client_app/assets/payment_icons/dana.svg deleted file mode 100644 index c1a9052..0000000 --- a/client_app/assets/payment_icons/dana.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/gopay.svg b/client_app/assets/payment_icons/gopay.svg deleted file mode 100644 index c90a98b..0000000 --- a/client_app/assets/payment_icons/gopay.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/mandiri.svg b/client_app/assets/payment_icons/mandiri.svg deleted file mode 100644 index f0f5e85..0000000 --- a/client_app/assets/payment_icons/mandiri.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/ovo.svg b/client_app/assets/payment_icons/ovo.svg deleted file mode 100644 index 38d40af..0000000 --- a/client_app/assets/payment_icons/ovo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client_app/assets/payment_icons/permata.svg b/client_app/assets/payment_icons/permata.svg deleted file mode 100644 index f984955..0000000 --- a/client_app/assets/payment_icons/permata.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/qris.svg b/client_app/assets/payment_icons/qris.svg deleted file mode 100644 index 26f8b52..0000000 --- a/client_app/assets/payment_icons/qris.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client_app/assets/payment_icons/shopeepay.svg b/client_app/assets/payment_icons/shopeepay.svg deleted file mode 100644 index cc6ce93..0000000 --- a/client_app/assets/payment_icons/shopeepay.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/client_app/ios/Runner/Info.plist b/client_app/ios/Runner/Info.plist index ebf31f6..fea3909 100644 --- a/client_app/ios/Runner/Info.plist +++ b/client_app/ios/Runner/Info.plist @@ -80,5 +80,19 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + + CFBundleURLTypes + + + CFBundleURLName + com.mybestie + CFBundleURLSchemes + + halobestie + + + diff --git a/client_app/lib/features/payment/screens/payment_method_screen.dart b/client_app/lib/features/payment/screens/payment_method_screen.dart index 376ec56..a356025 100644 --- a/client_app/lib/features/payment/screens/payment_method_screen.dart +++ b/client_app/lib/features/payment/screens/payment_method_screen.dart @@ -86,6 +86,12 @@ class _PaymentMethodScreenState extends ConsumerState { String _humanError(DioException e) { final code = e.response?.data?['error']?['code'] as String?; final status = e.response?.statusCode; + if (code == 'INVALID_PAYMENT_AMOUNT') { + // Server confirms the picker should have caught this — most likely a + // stale catalog. The picker's tile subtitle already explains; we just + // need to nudge the user to pick a different method. + return 'Metode pembayaran tidak cocok untuk nominal ini. Pilih metode lain.'; + } if (status == 422 || code == 'VALIDATION_ERROR' || code == 'INVALID_TIER') { return 'Pilihan durasi tidak valid.'; } @@ -204,6 +210,7 @@ class _PaymentMethodScreenState extends ConsumerState { group: g, expanded: _expandedGroupIds.contains(g.id), selectedCode: _selectedCode, + amount: amount, onToggle: () => setState(() { if (!_expandedGroupIds.add(g.id)) { _expandedGroupIds.remove(g.id); @@ -277,6 +284,7 @@ class _GroupSection extends StatelessWidget { final PaymentMethodGroup group; final bool expanded; final String? selectedCode; + final int amount; final VoidCallback onToggle; final ValueChanged onSelect; @@ -284,6 +292,7 @@ class _GroupSection extends StatelessWidget { required this.group, required this.expanded, required this.selectedCode, + required this.amount, required this.onToggle, required this.onSelect, }); @@ -334,13 +343,17 @@ class _GroupSection extends StatelessWidget { firstChild: const SizedBox(height: 0), secondChild: Column( crossAxisAlignment: CrossAxisAlignment.stretch, - children: group.methods - .map((m) => _MethodTile( - method: m, - selected: selectedCode == m.paymentCode, - onTap: () => onSelect(m.paymentCode), - )) - .toList(), + children: group.methods.map((m) { + final disabledReason = m.disabledReason(amount); + return _MethodTile( + method: m, + selected: selectedCode == m.paymentCode, + disabledReason: disabledReason, + onTap: disabledReason == null + ? () => onSelect(m.paymentCode) + : null, + ); + }).toList(), ), crossFadeState: expanded ? CrossFadeState.showSecond : CrossFadeState.showFirst, @@ -351,90 +364,136 @@ class _GroupSection extends StatelessWidget { } } +/// Visual container for one or more brand-mark icons on a payment-method tile. +/// +/// Single-icon: 40×40 box with the icon at 22px. Multi-icon (e.g. credit-card +/// row showing Visa + Mastercard + JCB): box widens to fit, icons render at +/// 18px with 3px gaps. Empty list: placeholder via [PaymentIcon] in the box. +class _MethodIconBox extends StatelessWidget { + final List iconUrls; + const _MethodIconBox({required this.iconUrls}); + + @override + Widget build(BuildContext context) { + final multi = iconUrls.length > 1; + final iconSize = multi ? 18.0 : 22.0; + final children = iconUrls.isEmpty + ? [ + PaymentIcon(iconUrl: null, size: iconSize, color: HaloTokens.brandDark), + ] + : [ + for (var i = 0; i < iconUrls.length; i++) ...[ + if (i > 0) const SizedBox(width: 3), + PaymentIcon(iconUrl: iconUrls[i], size: iconSize, color: HaloTokens.brandDark), + ], + ]; + return Container( + height: 40, + constraints: BoxConstraints(minWidth: multi ? 0 : 40), + padding: EdgeInsets.symmetric(horizontal: multi ? 6 : 0), + decoration: BoxDecoration( + color: HaloTokens.surface, + borderRadius: HaloRadius.md, + border: Border.all(color: HaloTokens.border), + ), + alignment: Alignment.center, + child: Row(mainAxisSize: MainAxisSize.min, children: children), + ); + } +} + class _MethodTile extends StatelessWidget { final PaymentMethodEntry method; final bool selected; - final VoidCallback onTap; + final String? disabledReason; + final VoidCallback? onTap; const _MethodTile({ required this.method, required this.selected, + required this.disabledReason, required this.onTap, }); @override Widget build(BuildContext context) { + final disabled = disabledReason != null; return Padding( padding: const EdgeInsets.only(bottom: HaloSpacing.s8), - child: Material( - color: selected ? HaloTokens.brandSofter : HaloTokens.surface, - borderRadius: HaloRadius.lg, - child: InkWell( + child: Opacity( + opacity: disabled ? 0.5 : 1.0, + child: Material( + color: selected ? HaloTokens.brandSofter : HaloTokens.surface, borderRadius: HaloRadius.lg, - onTap: onTap, - child: AnimatedContainer( - duration: HaloMotion.fast, - padding: const EdgeInsets.all(HaloSpacing.s12), - decoration: BoxDecoration( - border: Border.all( - color: selected ? HaloTokens.brand : HaloTokens.border, - width: selected ? 2 : 1, + child: InkWell( + borderRadius: HaloRadius.lg, + onTap: onTap, + child: AnimatedContainer( + duration: HaloMotion.fast, + padding: const EdgeInsets.all(HaloSpacing.s12), + decoration: BoxDecoration( + border: Border.all( + color: selected ? HaloTokens.brand : HaloTokens.border, + width: selected ? 2 : 1, + ), + borderRadius: HaloRadius.lg, ), - borderRadius: HaloRadius.lg, - ), - child: Row( - children: [ - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: HaloTokens.surface, - borderRadius: HaloRadius.md, - border: Border.all(color: HaloTokens.border), - ), - alignment: Alignment.center, - child: PaymentIcon( - slug: method.icon, - size: 22, - color: HaloTokens.brandDark, - ), - ), - const SizedBox(width: HaloSpacing.s12), - Expanded( - child: Text( - method.displayName, - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: HaloTokens.ink, - ), - ), - ), - Container( - width: 20, - height: 20, - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all( - color: selected ? HaloTokens.brand : HaloTokens.border, - width: 2, - ), - color: selected ? HaloTokens.brand : HaloTokens.surface, - ), - child: selected - ? Center( - child: Container( - width: 8, - height: 8, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, + child: Row( + children: [ + _MethodIconBox(iconUrls: method.iconUrls), + const SizedBox(width: HaloSpacing.s12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + method.displayName, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: HaloTokens.ink, + ), + ), + if (disabled) + Padding( + padding: const EdgeInsets.only(top: 2), + child: Text( + disabledReason!, + style: const TextStyle( + fontSize: 11.5, + color: HaloTokens.inkMuted, + ), ), ), - ) - : null, - ), - ], + ], + ), + ), + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: selected ? HaloTokens.brand : HaloTokens.border, + width: 2, + ), + color: selected ? HaloTokens.brand : HaloTokens.surface, + ), + child: selected + ? Center( + child: Container( + width: 8, + height: 8, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + ), + ), + ) + : null, + ), + ], + ), ), ), ), diff --git a/client_app/lib/features/payment/state/payment_catalog_provider.dart b/client_app/lib/features/payment/state/payment_catalog_provider.dart index 4164862..06db942 100644 --- a/client_app/lib/features/payment/state/payment_catalog_provider.dart +++ b/client_app/lib/features/payment/state/payment_catalog_provider.dart @@ -2,18 +2,58 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../core/api/api_client_provider.dart'; /// One row in the payment-method catalog (server-side: `payment_methods`). +/// +/// `iconUrls` is the backend-resolved list of brand-SVG URLs for this method. +/// Relative paths (e.g. `/assets/payment-icons/qris.svg`) are prepended with +/// `ApiClient.baseUrl` by [PaymentIcon]. Composite tiles (e.g. credit card +/// showing Visa + Mastercard + JCB) carry multiple entries. Empty list = no +/// icon configured → the row renders the bundled placeholder. +/// +/// `minAmount` / `maxAmount` are inclusive Rupiah bounds, either nullable +/// (null = no bound). The picker greys out methods the current bill misses, +/// and the backend enforces the same bounds defensively with +/// `INVALID_PAYMENT_AMOUNT`. class PaymentMethodEntry { final String id; final String paymentCode; final String displayName; - final String? icon; + final List iconUrls; + final int? minAmount; + final int? maxAmount; const PaymentMethodEntry({ required this.id, required this.paymentCode, required this.displayName, - this.icon, + this.iconUrls = const [], + this.minAmount, + this.maxAmount, }); + + /// `null` when the method is usable at [amount]; otherwise a short reason + /// suitable as a tile subtitle (Indonesian, brand voice). + String? disabledReason(int amount) { + if (minAmount != null && amount < minAmount!) { + return 'min ${_rp(minAmount!)}'; + } + if (maxAmount != null && amount > maxAmount!) { + return 'maks ${_rp(maxAmount!)}'; + } + return null; + } +} + +String _rp(int n) { + // Rp 10.000 (Indonesian thousand-separator). Matches the picker's other + // amount formatting via `formatRupiah` in core/constants.dart, kept local + // to avoid pulling that dependency into the catalog model. + final s = n.toString(); + final buf = StringBuffer('Rp '); + for (var i = 0; i < s.length; i++) { + if (i > 0 && (s.length - i) % 3 == 0) buf.write('.'); + buf.write(s[i]); + } + return buf.toString(); } /// One group in the payment-method catalog (server-side: @@ -50,11 +90,13 @@ const _kFallbackGroup = PaymentMethodGroup( id: 'fallback-paling-cepat', name: 'Paling Cepat', methods: [ + // Fallback path renders the bundled placeholder (iconUrls empty) — the + // catalog endpoint being unreachable usually means the icon endpoint is + // too, so deferring to the placeholder is the safest signal. PaymentMethodEntry( id: 'fallback-qris', paymentCode: 'QRIS', displayName: 'QRIS', - icon: 'qris', ), ], ); @@ -74,11 +116,14 @@ final paymentCatalogProvider = FutureProvider((ref) async { final gm = g as Map; final methods = (gm['methods'] as List? ?? const []).map((m) { final mm = m as Map; + final iconUrlsRaw = mm['icon_urls'] as List? ?? const []; return PaymentMethodEntry( id: mm['id'] as String, paymentCode: mm['payment_code'] as String, displayName: mm['display_name'] as String, - icon: mm['icon'] as String?, + iconUrls: iconUrlsRaw.cast(), + minAmount: (mm['min_amount'] as num?)?.toInt(), + maxAmount: (mm['max_amount'] as num?)?.toInt(), ); }).toList(growable: false); return PaymentMethodGroup( diff --git a/client_app/lib/features/payment/widgets/payment_icon.dart b/client_app/lib/features/payment/widgets/payment_icon.dart index 8d3d1fc..20b85b1 100644 --- a/client_app/lib/features/payment/widgets/payment_icon.dart +++ b/client_app/lib/features/payment/widgets/payment_icon.dart @@ -1,56 +1,72 @@ import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import '../../../core/api/api_client.dart'; import '../../../core/theme/halo_tokens.dart'; -/// Slugs we ship SVGs for. Keep this in sync with `assets/payment_icons/`. -/// When a brand mark is added to the bundle (drop the SVG into the asset -/// dir), add its slug here. Anything not in this set renders the placeholder. +/// Renders a payment-method brand mark fetched from the backend. /// -/// Source: idn-finlogos (github.com/hafidznoor/idn-finlogos) — see -/// `assets/payment_icons/NOTICE_IDN_FINLOGOS.txt` for licensing terms. -const Set _kBundledSlugs = { - 'qris', - 'ovo', - 'dana', - 'shopeepay', - 'gopay', - 'bca', - 'mandiri', - 'bni', - 'bri', - 'permata', -}; - -/// Renders a payment-method brand mark by slug (`payment_methods.icon`). -/// Falls back to a generic credit-card placeholder when the slug isn't -/// bundled. Slugs are kept lower-case by convention. +/// `iconUrl` comes from `payment_methods.icon_url` on the catalog response. +/// Relative paths (the common case — `/assets/payment-icons/.svg`) are +/// resolved against [ApiClient.baseUrl]. Absolute URLs (operator override) +/// are used as-is. +/// +/// First fetch hits the network; the file is then persisted to disk by +/// [DefaultCacheManager] (30-day idle LRU) and served locally on subsequent +/// renders. While the cache lookup is in flight or when [iconUrl] is null, +/// the bundled placeholder is shown so the picker never displays a spinner. class PaymentIcon extends StatelessWidget { - final String? slug; + final String? iconUrl; final double size; final Color color; const PaymentIcon({ super.key, - required this.slug, + required this.iconUrl, this.size = 24, this.color = HaloTokens.brandDark, }); + String? get _resolvedUrl { + final raw = iconUrl; + if (raw == null || raw.isEmpty) return null; + if (raw.startsWith('http://') || raw.startsWith('https://')) return raw; + return '${ApiClient.baseUrl}$raw'; + } + @override Widget build(BuildContext context) { - final isBundled = slug != null && _kBundledSlugs.contains(slug); - final asset = isBundled - ? 'assets/payment_icons/$slug.svg' - : 'assets/payment_icons/placeholder.svg'; + final url = _resolvedUrl; + if (url == null) return _placeholder(); - // Brand SVGs ship with their canonical colors and must NOT be tinted; - // the placeholder is mono-color and DOES want the brand-dark tint. - return SvgPicture.asset( - asset, - width: size, - height: size, - colorFilter: isBundled ? null : ColorFilter.mode(color, BlendMode.srcIn), + return FutureBuilder( + future: DefaultCacheManager().getFileFromCache(url), + builder: (context, cachedSnap) { + final cached = cachedSnap.data?.file; + if (cached != null) { + return SvgPicture.file(cached, width: size, height: size); + } + // Cache miss: render placeholder while the download lands, then swap + // in. We fire the download in the same FutureBuilder body so the next + // rebuild picks up the freshly-cached file. + return FutureBuilder( + future: DefaultCacheManager().getSingleFile(url), + builder: (context, snap) { + if (snap.hasData) { + return SvgPicture.file(snap.data!, width: size, height: size); + } + return _placeholder(); + }, + ); + }, ); } + + Widget _placeholder() => SvgPicture.asset( + 'assets/payment_icons/placeholder.svg', + width: size, + height: size, + colorFilter: ColorFilter.mode(color, BlendMode.srcIn), + ); } diff --git a/client_app/macos/Flutter/GeneratedPluginRegistrant.swift b/client_app/macos/Flutter/GeneratedPluginRegistrant.swift index 7e6f540..61cff3f 100644 --- a/client_app/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/client_app/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,6 +12,7 @@ import flutter_secure_storage_macos import google_sign_in_ios import shared_preferences_foundation import sign_in_with_apple +import sqflite_darwin import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -22,5 +23,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SignInWithApplePlugin.register(with: registry.registrar(forPlugin: "SignInWithApplePlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/client_app/pubspec.lock b/client_app/pubspec.lock index f455d23..9b42a5d 100644 --- a/client_app/pubspec.lock +++ b/client_app/pubspec.lock @@ -358,6 +358,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: "direct main" + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" flutter_hooks: dependency: "direct main" description: @@ -1132,6 +1140,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.2" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + url: "https://pub.dev" + source: hosted + version: "2.4.2+1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + url: "https://pub.dev" + source: hosted + version: "2.4.2+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" + source: hosted + version: "2.5.8" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -1172,6 +1220,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" + source: hosted + version: "3.4.0+1" term_glyph: dependency: transitive description: @@ -1389,5 +1445,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.3 <4.0.0" + dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.4" diff --git a/client_app/pubspec.yaml b/client_app/pubspec.yaml index a511c57..4c81b63 100644 --- a/client_app/pubspec.yaml +++ b/client_app/pubspec.yaml @@ -42,12 +42,13 @@ dependencies: # (mock mode encodes payment_session_id; real QR will come from Xendit later). qr_flutter: ^4.1.0 - # Payment method icons (Phase 5.x catalog) — bundled SVGs under - # assets/payment_icons/, copied from github.com/hafidznoor/idn-finlogos. - # Xendit's per-channel media-asset pages were planned but found - # decommissioned during implementation. See - # `requirement/phase5-payment-catalog-plan.md` §7 for the sourcing decision. + # Payment method icons (Phase 5.x catalog). Source-of-truth is the backend + # `/assets/payment-icons/.svg` endpoint, which wraps the `idn-finlogos` + # npm package. Mobile only bundles `placeholder.svg` as the first-launch / + # offline fallback; everything else is fetched on demand and persisted via + # `flutter_cache_manager` for far-future reuse. flutter_svg: ^2.0.10+1 + flutter_cache_manager: ^3.3.1 # OS notification permission — used by the post-payment notif gate # (Phase 4 Stage 4) and the home banner. diff --git a/control_center/index.html b/control_center/index.html index e0ae928..a249a87 100644 --- a/control_center/index.html +++ b/control_center/index.html @@ -4,6 +4,9 @@ Halo Bestie Control Center + + +
diff --git a/control_center/src/assets/logo.png b/control_center/src/assets/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..51570ab6e196d988d86398e8b03ac8ee9f15c41d GIT binary patch literal 282016 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

exTD6d}~=#|cg%w*xSu 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 { const [current, setCurrent] = useState('') @@ -34,18 +46,33 @@ const PasswordChangeForm = ({ onDone }) => { } return ( -

- setCurrent(e.target.value)} required - style={{ display: 'block', width: '100%', marginBottom: 6 }} /> - setNext(e.target.value)} required minLength={8} - style={{ display: 'block', width: '100%', marginBottom: 6 }} /> - {error &&

{error}

} - {success &&

Password berhasil diubah.

} -
- - + + setCurrent(e.target.value)} + required + style={{ marginBottom: 8 }} + /> + setNext(e.target.value)} + required + minLength={8} + style={{ marginBottom: 8 }} + /> + {error &&

{error}

} + {success &&

Password berhasil diubah.

} +
+ +
) @@ -56,27 +83,111 @@ export default function Layout() { const [showPwForm, setShowPwForm] = useState(false) return ( -
-