joopjs 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.claude/skills/observables.md +28 -0
  2. package/.claude/skills/setup.md +14 -3
  3. package/.cursor/rules/joopjs.mdc +4 -5
  4. package/.github/copilot-instructions.md +3 -1
  5. package/.windsurf/rules/joopjs.md +4 -0
  6. package/CHANGELOG.md +31 -2
  7. package/README.md +19 -7
  8. package/ai-rules/AGENTS.md +21 -0
  9. package/ai-rules/GEMINI.md +17 -3
  10. package/dist/ai/index.js +15 -3
  11. package/dist/ai/index.js.map +1 -1
  12. package/dist/ai/index.mjs +15 -3
  13. package/dist/ai/index.mjs.map +1 -1
  14. package/dist/analytics/index.js +10 -2
  15. package/dist/analytics/index.js.map +1 -1
  16. package/dist/analytics/index.mjs +10 -2
  17. package/dist/analytics/index.mjs.map +1 -1
  18. package/dist/angular/index.d.mts +98 -27
  19. package/dist/angular/index.d.ts +98 -27
  20. package/dist/angular/index.js +44 -0
  21. package/dist/angular/index.js.map +1 -1
  22. package/dist/angular/index.mjs +39 -1
  23. package/dist/angular/index.mjs.map +1 -1
  24. package/dist/api/index.js +15 -3
  25. package/dist/api/index.js.map +1 -1
  26. package/dist/api/index.mjs +15 -3
  27. package/dist/api/index.mjs.map +1 -1
  28. package/dist/auth/index.js +15 -3
  29. package/dist/auth/index.js.map +1 -1
  30. package/dist/auth/index.mjs +15 -3
  31. package/dist/auth/index.mjs.map +1 -1
  32. package/dist/banking/index.js +15 -3
  33. package/dist/banking/index.js.map +1 -1
  34. package/dist/banking/index.mjs +15 -3
  35. package/dist/banking/index.mjs.map +1 -1
  36. package/dist/cache/index.js +15 -3
  37. package/dist/cache/index.js.map +1 -1
  38. package/dist/cache/index.mjs +15 -3
  39. package/dist/cache/index.mjs.map +1 -1
  40. package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
  41. package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
  42. package/dist/core/index.d.mts +34 -1
  43. package/dist/core/index.d.ts +34 -1
  44. package/dist/core/index.js +56 -5
  45. package/dist/core/index.js.map +1 -1
  46. package/dist/core/index.mjs +54 -6
  47. package/dist/core/index.mjs.map +1 -1
  48. package/dist/deeplink/index.js +15 -3
  49. package/dist/deeplink/index.js.map +1 -1
  50. package/dist/deeplink/index.mjs +15 -3
  51. package/dist/deeplink/index.mjs.map +1 -1
  52. package/dist/device/index.js +15 -3
  53. package/dist/device/index.js.map +1 -1
  54. package/dist/device/index.mjs +15 -3
  55. package/dist/device/index.mjs.map +1 -1
  56. package/dist/forms/index.js +15 -3
  57. package/dist/forms/index.js.map +1 -1
  58. package/dist/forms/index.mjs +15 -3
  59. package/dist/forms/index.mjs.map +1 -1
  60. package/dist/i18n/index.js +15 -3
  61. package/dist/i18n/index.js.map +1 -1
  62. package/dist/i18n/index.mjs +15 -3
  63. package/dist/i18n/index.mjs.map +1 -1
  64. package/dist/index.d.mts +2 -2
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.js +50 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/index.mjs +50 -8
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
  71. package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
  72. package/dist/native-bridge/index.js +10 -2
  73. package/dist/native-bridge/index.js.map +1 -1
  74. package/dist/native-bridge/index.mjs +10 -2
  75. package/dist/native-bridge/index.mjs.map +1 -1
  76. package/dist/network/index.js +15 -3
  77. package/dist/network/index.js.map +1 -1
  78. package/dist/network/index.mjs +15 -3
  79. package/dist/network/index.mjs.map +1 -1
  80. package/dist/observability/index.js +15 -3
  81. package/dist/observability/index.js.map +1 -1
  82. package/dist/observability/index.mjs +15 -3
  83. package/dist/observability/index.mjs.map +1 -1
  84. package/dist/pwa/index.js +15 -3
  85. package/dist/pwa/index.js.map +1 -1
  86. package/dist/pwa/index.mjs +15 -3
  87. package/dist/pwa/index.mjs.map +1 -1
  88. package/dist/react/index.d.mts +2 -2
  89. package/dist/react/index.d.ts +2 -2
  90. package/dist/react/index.js +15 -3
  91. package/dist/react/index.js.map +1 -1
  92. package/dist/react/index.mjs +15 -3
  93. package/dist/react/index.mjs.map +1 -1
  94. package/dist/router/index.js +15 -3
  95. package/dist/router/index.js.map +1 -1
  96. package/dist/router/index.mjs +15 -3
  97. package/dist/router/index.mjs.map +1 -1
  98. package/dist/security/index.js +15 -3
  99. package/dist/security/index.js.map +1 -1
  100. package/dist/security/index.mjs +15 -3
  101. package/dist/security/index.mjs.map +1 -1
  102. package/dist/session/index.js +15 -3
  103. package/dist/session/index.js.map +1 -1
  104. package/dist/session/index.mjs +15 -3
  105. package/dist/session/index.mjs.map +1 -1
  106. package/dist/state/index.js +15 -3
  107. package/dist/state/index.js.map +1 -1
  108. package/dist/state/index.mjs +15 -3
  109. package/dist/state/index.mjs.map +1 -1
  110. package/dist/storage/index.js +15 -3
  111. package/dist/storage/index.js.map +1 -1
  112. package/dist/storage/index.mjs +15 -3
  113. package/dist/storage/index.mjs.map +1 -1
  114. package/dist/sync/index.js +15 -3
  115. package/dist/sync/index.js.map +1 -1
  116. package/dist/sync/index.mjs +15 -3
  117. package/dist/sync/index.mjs.map +1 -1
  118. package/dist/theme/index.js +15 -3
  119. package/dist/theme/index.js.map +1 -1
  120. package/dist/theme/index.mjs +15 -3
  121. package/dist/theme/index.mjs.map +1 -1
  122. package/dist/ui/index.js +15 -3
  123. package/dist/ui/index.js.map +1 -1
  124. package/dist/ui/index.mjs +15 -3
  125. package/dist/ui/index.mjs.map +1 -1
  126. package/dist/utilities/index.js +46 -4
  127. package/dist/utilities/index.js.map +1 -1
  128. package/dist/utilities/index.mjs +46 -4
  129. package/dist/utilities/index.mjs.map +1 -1
  130. package/dist/vue/index.d.mts +2 -2
  131. package/dist/vue/index.d.ts +2 -2
  132. package/dist/vue/index.js +15 -3
  133. package/dist/vue/index.js.map +1 -1
  134. package/dist/vue/index.mjs +15 -3
  135. package/dist/vue/index.mjs.map +1 -1
  136. package/dist/workflow/index.js +15 -3
  137. package/dist/workflow/index.js.map +1 -1
  138. package/dist/workflow/index.mjs +15 -3
  139. package/dist/workflow/index.mjs.map +1 -1
  140. package/package.json +16 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/banking/masking.utility.ts","../../src/banking/custom-mask.utility.ts","../../src/banking/iban.utility.ts","../../src/banking/currency.utility.ts","../../src/banking/amount.utility.ts","../../src/banking/transaction.utility.ts","../../src/banking/receipt.service.ts","../../src/banking/luhn.utility.ts","../../src/events/index.ts","../../src/banking/fraud-detection.ts","../../src/banking/open-banking.ts","../../src/banking/payment-orchestrator.ts","../../src/banking/statement-parser.ts","../../src/banking/beneficiary.service.ts","../../src/banking/scheduled-payment.service.ts","../../src/banking/card-management.service.ts","../../src/banking/statement-generator.service.ts","../../src/banking/notification-center.service.ts","../../src/banking/dispute.service.ts","../../src/banking/bill-payment.service.ts","../../src/banking/payment-uri.service.ts","../../src/banking/mandate.service.ts","../../src/banking/split-payment.service.ts","../../src/banking/chequebook.service.ts","../../src/banking/insurance.service.ts","../../src/banking/remittance.service.ts","../../src/banking/virtual-account.service.ts","../../src/banking/ledger.service.ts","../../src/banking/reconciliation.service.ts","../../src/banking/limit-management.service.ts","../../src/banking/standing-order.service.ts","../../src/banking/loan-servicing.service.ts","../../src/banking/digital-wallet.service.ts","../../src/banking/fx-forward.service.ts"],"names":["_uid","n","d","_round"],"mappings":"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EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,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","file":"index.mjs","sourcesContent":["export function maskCard(cardNumber: string, showLast = 4): string {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < showLast) return cardNumber;\n const masked = '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n return masked.replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function formatCard(cardNumber: string): string {\n return cardNumber.replace(/\\D/g, '').replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function maskIban(iban: string, showChars = 8): string {\n const clean = iban.replace(/\\s/g, '');\n if (clean.length <= showChars) return iban;\n return clean.slice(0, 4) + '*'.repeat(clean.length - showChars) + clean.slice(-4);\n}\n\nexport function maskAccountNumber(account: string, showLast = 4): string {\n const clean = account.replace(/\\D/g, '');\n if (clean.length <= showLast) return clean;\n return '*'.repeat(clean.length - showLast) + clean.slice(-showLast);\n}\n\nexport function maskEmail(email: string): string {\n const [user, domain] = email.split('@');\n if (!domain || user.length < 3) return '***@' + (domain ?? '');\n return user[0] + '*'.repeat(user.length - 2) + user[user.length - 1] + '@' + domain;\n}\n\nexport function maskPhone(phone: string, showLast = 4): string {\n const digits = phone.replace(/\\D/g, '');\n if (digits.length <= showLast) return phone;\n return '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n}\n\nexport function maskName(name: string): string {\n const parts = name.trim().split(/\\s+/);\n return parts.map((p, i) => i === 0 ? p : p[0] + '*'.repeat(p.length - 1)).join(' ');\n}\n\n// ── Singapore / Malaysia NRIC ───────────────────────────────────────────────\n\nconst NRIC_SG_REGEX = /^[STFGM]\\d{7}[A-Z]$/i;\n// Singapore checksum weights and checksums\nconst NRIC_WEIGHTS = [2, 7, 6, 5, 4, 3, 2];\nconst NRIC_SG_ST = ['J','Z','I','H','G','F','E','D','C','B','A'];\nconst NRIC_SG_FG = ['X','W','U','T','R','Q','P','N','M','L','K'];\nconst NRIC_SG_M = ['K','L','J','N','P','Q','R','T','U','W','X'];\n\nexport function validateNric(nric: string): boolean {\n const clean = nric.trim().toUpperCase();\n if (!NRIC_SG_REGEX.test(clean)) return false;\n const prefix = clean[0];\n const digits = clean.slice(1, 8).split('').map(Number);\n const suffix = clean[8];\n const sum = digits.reduce((acc, d, i) => acc + d * NRIC_WEIGHTS[i], 0);\n const offset = (prefix === 'G' || prefix === 'T' || prefix === 'S') ? 0 : (prefix === 'F' ? 0 : 0);\n const mod = (sum + (prefix === 'G' || prefix === 'T' ? 4 : prefix === 'M' ? 3 : 0)) % 11;\n let table: string[];\n if (prefix === 'S' || prefix === 'T') table = NRIC_SG_ST;\n else if (prefix === 'F' || prefix === 'G') table = NRIC_SG_FG;\n else table = NRIC_SG_M;\n void offset;\n return table[mod] === suffix;\n}\n\nexport function maskNric(nric: string): string {\n const clean = nric.trim().toUpperCase();\n if (clean.length < 5) return nric;\n return clean[0] + '*'.repeat(clean.length - 4) + clean.slice(-3);\n}\n\n// Malaysia MyKad (IC): YYMMDD-PB-NNNG\nconst MYKAD_REGEX = /^\\d{12}$|^\\d{6}-\\d{2}-\\d{4}$/;\n\nexport function validateMyKad(ic: string): boolean {\n return MYKAD_REGEX.test(ic.replace(/\\s/g, ''));\n}\n\nexport function maskMyKad(ic: string): string {\n const clean = ic.replace(/[-\\s]/g, '');\n if (clean.length !== 12) return ic;\n // Show birth year (first 2) + state code (pos 6-7), mask the rest → always 12 chars\n return clean.slice(0, 2) + '****' + clean.slice(6, 8) + '****';\n}\n\nexport function formatMyKad(ic: string): string {\n const clean = ic.replace(/\\D/g, '');\n if (clean.length !== 12) return ic;\n return `${clean.slice(0, 6)}-${clean.slice(6, 8)}-${clean.slice(8)}`;\n}\n","// Custom masking — flexible pattern-based masking for any string value\n\n/** Mask a string showing the first N and last M characters, masking everything in between.\n * maskRange('1234567890', 2, 4) → '12****7890'\n * maskRange('1234567890', 0, 4) → '******7890'\n * maskRange('1234567890', 2, 0) → '12********'\n */\nexport function maskRange(\n value: string,\n firstVisible: number,\n lastVisible: number,\n maskChar = '*',\n): string {\n const len = value.length;\n const first = Math.max(0, Math.min(firstVisible, len));\n const last = Math.max(0, Math.min(lastVisible, len - first));\n const midLen = Math.max(0, len - first - last);\n return value.slice(0, first) + maskChar.repeat(midLen) + value.slice(len - last || len);\n}\n\n/** Show only the last N characters.\n * maskShowLast('1234567890', 4) → '******7890'\n */\nexport function maskShowLast(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, 0, n, maskChar);\n}\n\n/** Show only the first N characters.\n * maskShowFirst('1234567890', 3) → '123*******'\n */\nexport function maskShowFirst(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, n, 0, maskChar);\n}\n\n/** Pattern-based masking using a format string.\n * '#' = reveal original character, 'X' = mask.\n * maskPattern('4532015112830366', '####XXXXXXXX####') → '4532********0366'\n * maskPattern('ABCPG1234C', 'XX*****XX*') → 'AB*****34*' (any non-# char = mask)\n *\n * Pattern characters:\n * '#' — show original character\n * '*' / 'X' / 'x' — replace with maskChar\n * Any other char is passed through as-is (separator)\n */\nexport function maskPattern(value: string, pattern: string, maskChar = '*'): string {\n let result = '';\n let vi = 0;\n for (let i = 0; i < pattern.length; i++) {\n const pc = pattern[i];\n if (pc === '#') {\n result += vi < value.length ? value[vi++] : '';\n } else if (pc === '*' || pc === 'X' || pc === 'x') {\n result += vi < value.length ? maskChar : '';\n vi++;\n } else {\n // separator / literal — pass through (skip one source char if aligned)\n result += pc;\n }\n }\n return result;\n}\n\n/** Keep middle characters visible, mask the edges.\n * maskKeepMiddle('1234567890', 4) → '***4567***'\n */\nexport function maskKeepMiddle(value: string, visibleCount: number, maskChar = '*'): string {\n const len = value.length;\n const half = Math.floor(visibleCount / 2);\n const start = Math.max(0, Math.floor((len - visibleCount) / 2));\n const end = start + visibleCount;\n return maskChar.repeat(start) + value.slice(start, end) + maskChar.repeat(Math.max(0, len - end));\n}\n\n/** Mask every other character (interleaved masking).\n * maskInterleaved('1234567890') → '1*3*5*7*9*'\n */\nexport function maskInterleaved(value: string, maskChar = '*'): string {\n return value.split('').map((c, i) => i % 2 === 0 ? c : maskChar).join('');\n}\n\n/** Mask all but keep separators in place (useful for formatted IBANs, phones etc).\n * maskKeepSeparators('GB29 NWBK 6016 1331', 4) → 'GB29 **** **** 1331'\n */\nexport function maskKeepSeparators(value: string, lastVisible: number, separators = ' -', maskChar = '*'): string {\n const stripped = value.split('').filter(c => !separators.includes(c)).join('');\n const maskedStripped = maskShowLast(stripped, lastVisible, maskChar);\n let mi = 0;\n return value.split('').map(c => separators.includes(c) ? c : maskedStripped[mi++] ?? '').join('');\n}\n","const IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22,\n BR: 29, BY: 28, CH: 21, CR: 22, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28,\n EE: 20, EG: 29, ES: 24, FI: 18, FO: 18, FR: 27, GB: 22, GE: 22, GI: 23,\n GL: 18, GR: 27, GT: 28, HR: 21, HU: 28, IE: 22, IL: 23, IQ: 23, IS: 26,\n IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LC: 32, LI: 21, LT: 20, LU: 20,\n LV: 21, LY: 25, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30,\n NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29, RO: 24, RS: 22,\n SA: 24, SC: 31, SD: 18, SE: 24, SI: 19, SK: 24, SM: 27, ST: 25, SV: 28,\n TL: 23, TN: 24, TR: 26, UA: 29, VA: 22, VG: 24, XK: 20,\n};\n\nexport function validateIban(iban: string): boolean {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n const country = clean.slice(0, 2);\n if (!IBAN_LENGTHS[country] || clean.length !== IBAN_LENGTHS[country]) return false;\n\n const numeric = (clean.slice(4) + clean.slice(0, 4))\n .split('')\n .map(c => c.charCodeAt(0) >= 65 ? (c.charCodeAt(0) - 55).toString() : c)\n .join('');\n\n let remainder = 0;\n for (const ch of numeric) remainder = (remainder * 10 + parseInt(ch)) % 97;\n return remainder === 1;\n}\n\nexport function formatIban(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function getIbanCountry(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().slice(0, 2);\n}\n\nexport function parseIban(iban: string): { country: string; checkDigits: string; bban: string } | null {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n if (!validateIban(clean)) return null;\n return { country: clean.slice(0, 2), checkDigits: clean.slice(2, 4), bban: clean.slice(4) };\n}\n\nexport function getSupportedIbanCountries(): string[] {\n return Object.keys(IBAN_LENGTHS).sort();\n}\n","export interface JoopCurrencyFormatOptions {\n currency: string;\n locale?: string;\n showSymbol?: boolean;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport function formatCurrency(amount: number | string, options: JoopCurrencyFormatOptions): string {\n const num = typeof amount === 'string' ? parseFloat(amount.replace(/[,\\s]/g, '')) : amount;\n if (!isFinite(num)) return '—';\n\n return new Intl.NumberFormat(options.locale ?? 'en-US', {\n style: options.showSymbol === false ? 'decimal' : 'currency',\n currency: options.showSymbol === false ? undefined : options.currency,\n minimumFractionDigits: options.minimumFractionDigits ?? 2,\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\n }).format(num);\n}\n\nexport function parseCurrencyString(value: string): number {\n const cleaned = value.replace(/[^0-9.\\-]/g, '');\n const num = parseFloat(cleaned);\n return isNaN(num) ? 0 : num;\n}\n\nexport function convertCurrency(amount: number, rate: number, decimals = 2): number {\n return parseFloat((amount * rate).toFixed(decimals));\n}\n\nexport function getCurrencySymbol(currency: string, locale = 'en-US'): string {\n const formatted = new Intl.NumberFormat(locale, { style: 'currency', currency }).format(0);\n return formatted.replace(/[\\d\\s.,]/g, '').trim();\n}\n\nexport function formatAmount(amount: number, decimals = 2, locale = 'en-US'): string {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(amount);\n}\n","export function safeAdd(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) + Math.round(b * f)) / f;\n}\n\nexport function safeSubtract(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) - Math.round(b * f)) / f;\n}\n\nexport function safeMultiply(a: number, b: number, decimals = 2): number {\n return parseFloat((a * b).toFixed(decimals));\n}\n\nexport function safeDivide(a: number, b: number, decimals = 2): number {\n if (b === 0) throw new Error('Division by zero');\n return parseFloat((a / b).toFixed(decimals));\n}\n\nexport function roundAmount(amount: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return Math.round(amount * f) / f;\n}\n\nexport function isValidAmount(value: unknown): boolean {\n if (typeof value === 'string') {\n const clean = value.replace(/[,\\s]/g, '');\n return /^-?\\d+(\\.\\d+)?$/.test(clean) && isFinite(parseFloat(clean));\n }\n return typeof value === 'number' && isFinite(value);\n}\n\nexport function clampAmount(amount: number, min: number, max: number): number {\n return Math.min(Math.max(amount, min), max);\n}\n\nexport function toMinorUnits(amount: number, decimalPlaces = 2): number {\n return Math.round(amount * Math.pow(10, decimalPlaces));\n}\n\nexport function fromMinorUnits(amount: number, decimalPlaces = 2): number {\n return amount / Math.pow(10, decimalPlaces);\n}\n\nexport function sumAmounts(...amounts: number[]): number {\n const f = 100;\n return amounts.reduce((acc, a) => acc + Math.round(a * f), 0) / f;\n}\n","export interface JoopTransactionRef {\n id: string;\n timestamp: number;\n prefix: string;\n full: string;\n}\n\nexport function generateTransactionId(prefix = 'TXN'): JoopTransactionRef {\n const timestamp = Date.now();\n const randomBytes = new Uint8Array(8);\n crypto.getRandomValues(randomBytes);\n const randomHex = Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n return { id: randomHex, timestamp, prefix, full: `${prefix}-${timestamp}-${randomHex}` };\n}\n\nexport function generateReferenceNumber(length = 12): string {\n const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n}\n\nexport function parseTransactionId(id: string): { prefix: string; timestamp: number; random: string } | null {\n const parts = id.split('-');\n if (parts.length < 3) return null;\n const timestamp = parseInt(parts[1]);\n if (isNaN(timestamp)) return null;\n return { prefix: parts[0], timestamp, random: parts.slice(2).join('-') };\n}\n\nexport function isValidTransactionId(id: string): boolean {\n return parseTransactionId(id) !== null;\n}\n\nexport function generateBatchId(): string {\n const arr = new Uint8Array(12);\n crypto.getRandomValues(arr);\n return 'BATCH-' + Array.from(arr).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n}\n","export interface JoopReceiptLine {\n label: string;\n value: string;\n bold?: boolean;\n}\n\nexport interface JoopReceiptData {\n title: string;\n referenceNumber: string;\n timestamp: string;\n lines: JoopReceiptLine[];\n footer?: string;\n}\n\nexport class JoopReceiptService {\n build(data: JoopReceiptData): JoopReceiptData { return data; }\n\n toText(data: JoopReceiptData): string {\n const div = '─'.repeat(40);\n return [\n div,\n data.title.toUpperCase().padStart(Math.ceil((40 + data.title.length) / 2)),\n div,\n `Ref : ${data.referenceNumber}`,\n `Date: ${data.timestamp}`,\n div,\n ...data.lines.map(l => l.label.padEnd(22) + l.value),\n div,\n ...(data.footer ? [data.footer] : []),\n ].join('\\n');\n }\n\n toJson(data: JoopReceiptData): string {\n return JSON.stringify(data, null, 2);\n }\n\n toHtml(data: JoopReceiptData): string {\n const rows = data.lines.map(l =>\n `<tr><td>${l.label}</td><td${l.bold ? ' style=\"font-weight:bold\"' : ''}>${l.value}</td></tr>`\n ).join('');\n return `<div class=\"joop-receipt\">\n <h2>${data.title}</h2>\n <p>Ref: ${data.referenceNumber} &nbsp;|&nbsp; ${data.timestamp}</p>\n <table>${rows}</table>${data.footer ? `\\n <p class=\"footer\">${data.footer}</p>` : ''}\n</div>`;\n }\n}\n","// ── Luhn algorithm & card type detection ──────────────────────────────────\n\nexport type JoopCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unionpay' | 'jcb' | 'diners' | 'maestro' | 'unknown';\n\nexport interface JoopCardInfo {\n network: JoopCardNetwork;\n valid: boolean;\n lengths: number[];\n cvvLength: number;\n formatted: string;\n}\n\nconst CARD_PATTERNS: Array<{ network: JoopCardNetwork; pattern: RegExp; lengths: number[]; cvvLength: number }> = [\n { network: 'amex', pattern: /^3[47]/, lengths: [15], cvvLength: 4 },\n { network: 'diners', pattern: /^3(?:0[0-5]|[68])/, lengths: [14], cvvLength: 3 },\n { network: 'discover', pattern: /^6(?:011|5[0-9]{2})/, lengths: [16], cvvLength: 3 },\n { network: 'jcb', pattern: /^(?:2131|1800|35)/, lengths: [16], cvvLength: 3 },\n { network: 'maestro', pattern: /^(?:5018|5020|5038|6304|6759|676[1-3])/, lengths: [12,13,14,15,16,17,18,19], cvvLength: 3 },\n { network: 'mastercard', pattern: /^5[1-5]|^2[2-7]/, lengths: [16], cvvLength: 3 },\n { network: 'unionpay', pattern: /^62/, lengths: [16,17,18,19], cvvLength: 3 },\n { network: 'visa', pattern: /^4/, lengths: [13,16,19], cvvLength: 3 },\n];\n\n/** Validate a card number using the Luhn algorithm */\nexport function validateLuhn(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < 8) return false;\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/** Compute the Luhn check digit for a partial card number */\nexport function luhnCheckDigit(partial: string): number {\n const digits = partial.replace(/\\D/g, '');\n let sum = 0;\n let double = true;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return (10 - (sum % 10)) % 10;\n}\n\n/** Detect the card network from the card number prefix */\nexport function getCardNetwork(cardNumber: string): JoopCardNetwork {\n const digits = cardNumber.replace(/\\D/g, '');\n for (const card of CARD_PATTERNS) {\n if (card.pattern.test(digits)) return card.network;\n }\n return 'unknown';\n}\n\n/** Get full card validation info */\nexport function getCardInfo(cardNumber: string): JoopCardInfo {\n const digits = cardNumber.replace(/\\D/g, '');\n const match = CARD_PATTERNS.find(c => c.pattern.test(digits));\n const network = match?.network ?? 'unknown';\n const lengths = match?.lengths ?? [13, 14, 15, 16, 19];\n const cvvLength = match?.cvvLength ?? 3;\n const valid = lengths.includes(digits.length) && validateLuhn(digits);\n const formatted = formatCardNumber(digits);\n return { network, valid, lengths, cvvLength, formatted };\n}\n\n/** Format card number with spaces (e.g. 4111 1111 1111 1111 or 3714 496353 98431 for Amex) */\nexport function formatCardNumber(cardNumber: string): string {\n const digits = cardNumber.replace(/\\D/g, '');\n const network = getCardNetwork(digits);\n if (network === 'amex') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{5})$/, '$1 $2 $3');\n }\n if (network === 'diners') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{4})$/, '$1 $2 $3');\n }\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ');\n}\n\n/** Validate card expiry (MM/YY or MM/YYYY) */\nexport function isCardExpired(month: number | string, year: number | string): boolean {\n const m = parseInt(String(month), 10);\n let y = parseInt(String(year), 10);\n if (y < 100) y += 2000;\n const now = new Date();\n const expiry = new Date(y, m - 1, 1);\n expiry.setMonth(expiry.getMonth() + 1); // expire at end of month\n return expiry <= now;\n}\n\n/** Validate a CVV/CVC value */\nexport function validateCvv(cvv: string, network: JoopCardNetwork = 'unknown'): boolean {\n const digits = cvv.replace(/\\D/g, '');\n const expectedLength = network === 'amex' ? 4 : 3;\n return digits.length === expectedLength;\n}\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopTransactionSignal {\n transactionId: string;\n amount: number;\n currency: string;\n timestamp: number;\n deviceId?: string;\n ipAddress?: string;\n latitude?: number;\n longitude?: number;\n cardBin?: string;\n merchantCategory?: string;\n channel?: 'web' | 'mobile' | 'atm' | 'pos';\n userId?: string;\n}\n\nexport interface JoopFraudSignalResult {\n name: string;\n score: number;\n triggered: boolean;\n detail?: string;\n}\n\nexport type JoopFraudLevel = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface JoopFraudResult {\n transactionId: string;\n score: number;\n level: JoopFraudLevel;\n signals: JoopFraudSignalResult[];\n recommendation: 'allow' | 'review' | 'challenge' | 'block';\n timestamp: number;\n}\n\nexport interface JoopFraudConfig {\n velocityWindowMs?: number;\n velocityCountThreshold?: number;\n velocityAmountThreshold?: number;\n largeAmountThreshold?: number;\n geoDistanceThresholdKm?: number;\n alertThreshold?: number;\n maxHistorySize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction _haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = (lat2 - lat1) * Math.PI / 180;\n const dLon = (lon2 - lon1) * Math.PI / 180;\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\nfunction _scoreToLevel(score: number): JoopFraudLevel {\n if (score <= 30) return 'low';\n if (score <= 60) return 'medium';\n if (score <= 80) return 'high';\n return 'critical';\n}\n\nfunction _levelToRecommendation(level: JoopFraudLevel): 'allow' | 'review' | 'challenge' | 'block' {\n switch (level) {\n case 'low': return 'allow';\n case 'medium': return 'review';\n case 'high': return 'challenge';\n case 'critical': return 'block';\n }\n}\n\n// ---------------------------------------------------------------------------\n// JoopFraudDetection\n// ---------------------------------------------------------------------------\n\nexport class JoopFraudDetection {\n private readonly _cfg: Required<JoopFraudConfig>;\n private _history: JoopTransactionSignal[] = [];\n private _alertHandlers: Array<(result: JoopFraudResult) => void> = [];\n\n // Expose a reactive subject so callers can subscribe to every evaluation result\n readonly result$: JoopBehaviorSubject<JoopFraudResult | null>;\n\n constructor(config: JoopFraudConfig = {}) {\n this._cfg = {\n velocityWindowMs: config.velocityWindowMs ?? 3_600_000,\n velocityCountThreshold: config.velocityCountThreshold ?? 10,\n velocityAmountThreshold: config.velocityAmountThreshold ?? 5_000,\n largeAmountThreshold: config.largeAmountThreshold ?? 10_000,\n geoDistanceThresholdKm: config.geoDistanceThresholdKm ?? 500,\n alertThreshold: config.alertThreshold ?? 70,\n maxHistorySize: config.maxHistorySize ?? 1_000,\n };\n this.result$ = new JoopBehaviorSubject<JoopFraudResult | null>(null);\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n evaluate(signal: JoopTransactionSignal): JoopFraudResult {\n const signals: JoopFraudSignalResult[] = [\n this._velocityCount(signal),\n this._velocityAmount(signal),\n this._largeAmount(signal),\n this._geoDistance(signal),\n this._timeAnomaly(signal),\n ];\n\n const raw = signals.reduce((sum, s) => sum + s.score, 0);\n const score = Math.min(100, Math.round(raw));\n const level = _scoreToLevel(score);\n\n const result: JoopFraudResult = {\n transactionId: signal.transactionId,\n score,\n level,\n signals,\n recommendation: _levelToRecommendation(level),\n timestamp: Date.now(),\n };\n\n this.result$.next(result);\n return result;\n }\n\n addSignal(signal: JoopTransactionSignal): void {\n this._history.push(signal);\n if (this._history.length > this._cfg.maxHistorySize) {\n this._history.shift();\n }\n\n const result = this.evaluate(signal);\n if (result.score >= this._cfg.alertThreshold) {\n for (const handler of this._alertHandlers) {\n try { handler(result); } catch { /* swallow handler errors */ }\n }\n }\n }\n\n clearHistory(userId?: string): void {\n if (userId === undefined) {\n this._history = [];\n } else {\n this._history = this._history.filter(s => s.userId !== userId);\n }\n }\n\n onAlert(handler: (result: JoopFraudResult) => void): () => void {\n this._alertHandlers.push(handler);\n return () => {\n this._alertHandlers = this._alertHandlers.filter(h => h !== handler);\n };\n }\n\n // -------------------------------------------------------------------------\n // Signal evaluators\n // -------------------------------------------------------------------------\n\n /** Velocity: count of transactions by same user/device in window — max 30 pts */\n private _velocityCount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const count = recent.length;\n const threshold = this._cfg.velocityCountThreshold;\n\n if (count === 0) {\n return { name: 'velocity_count', score: 0, triggered: false };\n }\n\n const ratio = Math.min(count / threshold, 1);\n const score = Math.round(ratio * 30);\n return {\n name: 'velocity_count',\n score,\n triggered: count >= threshold,\n detail: `${count} transactions in window (threshold ${threshold})`,\n };\n }\n\n /** Velocity: total amount by same user/device in window — max 25 pts */\n private _velocityAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n s.currency === signal.currency &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const total = recent.reduce((sum, s) => sum + s.amount, 0) + signal.amount;\n const threshold = this._cfg.velocityAmountThreshold;\n\n if (total <= 0) {\n return { name: 'velocity_amount', score: 0, triggered: false };\n }\n\n const ratio = Math.min(total / threshold, 1);\n const score = Math.round(ratio * 25);\n return {\n name: 'velocity_amount',\n score,\n triggered: total >= threshold,\n detail: `${total.toFixed(2)} ${signal.currency} in window (threshold ${threshold})`,\n };\n }\n\n /** Large single amount — max 20 pts */\n private _largeAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const threshold = this._cfg.largeAmountThreshold;\n if (signal.amount < threshold) {\n return { name: 'large_amount', score: 0, triggered: false };\n }\n const ratio = Math.min(signal.amount / (threshold * 3), 1);\n const score = Math.round(10 + ratio * 10); // 10–20 pts once over threshold\n return {\n name: 'large_amount',\n score,\n triggered: true,\n detail: `Amount ${signal.amount} ${signal.currency} exceeds threshold ${threshold}`,\n };\n }\n\n /** Geo distance from last transaction by same user — max 15 pts */\n private _geoDistance(signal: JoopTransactionSignal): JoopFraudSignalResult {\n if (signal.latitude === undefined || signal.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const previous = [...this._history]\n .reverse()\n .find(s =>\n s.latitude !== undefined &&\n s.longitude !== undefined &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n\n if (!previous || previous.latitude === undefined || previous.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const km = _haversine(previous.latitude, previous.longitude, signal.latitude, signal.longitude);\n const threshold = this._cfg.geoDistanceThresholdKm;\n\n if (km < threshold) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const ratio = Math.min(km / (threshold * 4), 1);\n const score = Math.round(ratio * 15);\n return {\n name: 'geo_distance',\n score,\n triggered: true,\n detail: `${km.toFixed(0)} km from last transaction (threshold ${threshold} km)`,\n };\n }\n\n /** Time anomaly: unusual hours 02:00–05:00 local time — max 10 pts */\n private _timeAnomaly(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const hour = new Date(signal.timestamp).getHours();\n if (hour >= 2 && hour < 5) {\n return {\n name: 'time_anomaly',\n score: 10,\n triggered: true,\n detail: `Transaction at unusual hour ${hour}:xx (02–05 local)`,\n };\n }\n return { name: 'time_anomaly', score: 0, triggered: false };\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\n// ---------------------------------------------------------------------------\n// Interfaces and types\n// ---------------------------------------------------------------------------\n\nexport interface JoopOBCredentials {\n clientId: string;\n clientSecret: string;\n baseUrl: string;\n tokenUrl: string;\n}\n\nexport type JoopOBConsentStatus =\n | 'AwaitingAuthorisation'\n | 'Authorised'\n | 'Rejected'\n | 'Consumed'\n | 'Expired';\n\nexport type JoopOBPaymentStatus =\n | 'Pending'\n | 'AcceptedSettlementInProcess'\n | 'AcceptedSettlementCompleted'\n | 'Rejected'\n | 'Cancelled';\n\nexport type JoopOBAccountType = 'Personal' | 'Business';\n\nexport interface JoopOBAccount {\n accountId: string;\n iban?: string;\n currency: string;\n accountType: JoopOBAccountType;\n nickname?: string;\n balance?: {\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n };\n}\n\nexport interface JoopOBTransaction {\n transactionId: string;\n accountId: string;\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n status: 'Booked' | 'Pending';\n bookingDateTime: string;\n description?: string;\n merchantName?: string;\n reference?: string;\n}\n\nexport interface JoopOBPaymentRequest {\n reference: string;\n amount: number;\n currency: string;\n creditorName: string;\n creditorIban: string;\n debtorIban?: string;\n remittanceInfo?: string;\n}\n\nexport interface JoopOBConsentRequest {\n scopes: Array<\n | 'ReadAccountsBasic'\n | 'ReadAccountsDetail'\n | 'ReadBalances'\n | 'ReadTransactionsDetail'\n | 'ReadTransactionsCredits'\n | 'ReadTransactionsDebits'\n >;\n expirationDateTime?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal token state\n// ---------------------------------------------------------------------------\n\ninterface _TokenState {\n accessToken: string;\n expiresAt: number; // epoch ms\n}\n\n// ---------------------------------------------------------------------------\n// OBIE-spec raw response shapes (minimal subset)\n// ---------------------------------------------------------------------------\n\ninterface _OBIEAccountsResponse {\n Data: {\n Account: Array<{\n AccountId: string;\n Currency: string;\n AccountType: string;\n Nickname?: string;\n Account?: Array<{ Identification?: string }>;\n }>;\n };\n}\n\ninterface _OBIETransactionsResponse {\n Data: {\n Transaction: Array<{\n TransactionId: string;\n AccountId: string;\n Amount: { Amount: string; Currency: string };\n CreditDebitIndicator: string;\n Status: string;\n BookingDateTime: string;\n TransactionInformation?: string;\n MerchantDetails?: { MerchantName?: string };\n Reference?: string;\n }>;\n };\n}\n\ninterface _OBIEConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n Links?: { Self?: string };\n Risk?: Record<string, unknown>;\n}\n\ninterface _OBIEPaymentConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n}\n\ninterface _OBIEPaymentResponse {\n Data: {\n DomesticPaymentId: string;\n Status: string;\n ConsentId: string;\n };\n}\n\ninterface _OBIEPaymentStatusResponse {\n Data: { Status: string };\n}\n\ninterface _OBIEConsentStatusResponse {\n Data: { Status: string };\n}\n\n// ---------------------------------------------------------------------------\n// JoopOpenBankingClient\n// ---------------------------------------------------------------------------\n\nexport class JoopOpenBankingClient {\n private readonly _credentials: JoopOBCredentials;\n private _token: _TokenState | null = null;\n\n /** Reactive authentication state — true once a valid token is held */\n readonly authenticated$: JoopBehaviorSubject<boolean>;\n\n constructor(credentials: JoopOBCredentials) {\n this._credentials = credentials;\n this.authenticated$ = new JoopBehaviorSubject<boolean>(false);\n }\n\n // -------------------------------------------------------------------------\n // Authentication\n // -------------------------------------------------------------------------\n\n async authenticate(): Promise<void> {\n const token = await this._fetchToken();\n this._token = token;\n this.authenticated$.next(true);\n }\n\n // -------------------------------------------------------------------------\n // Accounts & balances\n // -------------------------------------------------------------------------\n\n async getAccounts(consentId: string): Promise<JoopOBAccount[]> {\n const raw = await this._request<_OBIEAccountsResponse>('GET', '/accounts', undefined, consentId);\n return (raw.Data.Account ?? []).map(a => ({\n accountId: a.AccountId,\n iban: a.Account?.[0]?.Identification,\n currency: a.Currency,\n accountType: (a.AccountType as JoopOBAccountType) ?? 'Personal',\n nickname: a.Nickname,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Transactions\n // -------------------------------------------------------------------------\n\n async getTransactions(\n accountId: string,\n consentId: string,\n fromDate?: string,\n toDate?: string,\n ): Promise<JoopOBTransaction[]> {\n const params = new URLSearchParams();\n if (fromDate) params.set('fromBookingDateTime', fromDate);\n if (toDate) params.set('toBookingDateTime', toDate);\n const query = params.toString() ? `?${params.toString()}` : '';\n const raw = await this._request<_OBIETransactionsResponse>(\n 'GET',\n `/accounts/${accountId}/transactions${query}`,\n undefined,\n consentId,\n );\n return (raw.Data.Transaction ?? []).map(t => ({\n transactionId: t.TransactionId,\n accountId: t.AccountId,\n amount: parseFloat(t.Amount.Amount),\n currency: t.Amount.Currency,\n creditDebitIndicator: t.CreditDebitIndicator as 'Credit' | 'Debit',\n status: t.Status as 'Booked' | 'Pending',\n bookingDateTime: t.BookingDateTime,\n description: t.TransactionInformation,\n merchantName: t.MerchantDetails?.MerchantName,\n reference: t.Reference,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Consents\n // -------------------------------------------------------------------------\n\n async createConsent(\n request: JoopOBConsentRequest,\n ): Promise<{ consentId: string; authorisationUrl: string; status: JoopOBConsentStatus }> {\n const body = {\n Data: {\n Permissions: request.scopes,\n ...(request.expirationDateTime ? { ExpirationDateTime: request.expirationDateTime } : {}),\n },\n Risk: {},\n };\n const raw = await this._request<_OBIEConsentResponse>('POST', '/account-access-consents', body);\n const consentId = raw.Data.ConsentId;\n // Build OBIE authorisation URL (redirect-based)\n const authorisationUrl =\n `${this._credentials.baseUrl.replace(/\\/open-banking.*$/, '')}/oauth2/authorize` +\n `?response_type=code%20id_token` +\n `&client_id=${encodeURIComponent(this._credentials.clientId)}` +\n `&request=${encodeURIComponent(consentId)}`;\n return {\n consentId,\n authorisationUrl,\n status: raw.Data.Status as JoopOBConsentStatus,\n };\n }\n\n async getConsentStatus(consentId: string): Promise<JoopOBConsentStatus> {\n const raw = await this._request<_OBIEConsentStatusResponse>(\n 'GET',\n `/account-access-consents/${consentId}`,\n );\n return raw.Data.Status as JoopOBConsentStatus;\n }\n\n async revokeConsent(consentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/account-access-consents/${consentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Payments\n // -------------------------------------------------------------------------\n\n async initiatePayment(\n request: JoopOBPaymentRequest,\n ): Promise<{ paymentId: string; status: JoopOBPaymentStatus; consentId: string }> {\n // Step 1: create payment consent\n const consentBody = {\n Data: {\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const consentRaw = await this._request<_OBIEPaymentConsentResponse>(\n 'POST',\n '/domestic-payment-consents',\n consentBody,\n );\n const consentId = consentRaw.Data.ConsentId;\n\n // Step 2: submit payment using the consent\n const paymentBody = {\n Data: {\n ConsentId: consentId,\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const paymentRaw = await this._request<_OBIEPaymentResponse>(\n 'POST',\n '/domestic-payments',\n paymentBody,\n );\n return {\n paymentId: paymentRaw.Data.DomesticPaymentId,\n status: paymentRaw.Data.Status as JoopOBPaymentStatus,\n consentId,\n };\n }\n\n async getPaymentStatus(paymentId: string): Promise<JoopOBPaymentStatus> {\n const raw = await this._request<_OBIEPaymentStatusResponse>(\n 'GET',\n `/domestic-payments/${paymentId}`,\n );\n return raw.Data.Status as JoopOBPaymentStatus;\n }\n\n async cancelPayment(paymentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/domestic-payments/${paymentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private async _getToken(): Promise<string> {\n if (this._token && Date.now() < this._token.expiresAt - 30_000) {\n return this._token.accessToken;\n }\n const state = await this._fetchToken();\n this._token = state;\n this.authenticated$.next(true);\n return state.accessToken;\n }\n\n private async _fetchToken(): Promise<_TokenState> {\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this._credentials.clientId,\n client_secret: this._credentials.clientSecret,\n scope: 'accounts payments',\n });\n\n const res = await fetch(this._credentials.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!res.ok) {\n throw new Error(`[JoopOpenBankingClient] Token request failed: ${res.status} ${res.statusText}`);\n }\n\n const json = await res.json() as { access_token: string; expires_in: number };\n return {\n accessToken: json.access_token,\n expiresAt: Date.now() + json.expires_in * 1_000,\n };\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n consentId?: string,\n ): Promise<T> {\n const token = await this._getToken();\n const url = `${this._credentials.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'x-fapi-interaction-id': _generateInteractionId(),\n 'x-fapi-financial-id': this._credentials.clientId,\n };\n if (consentId) {\n headers['x-ob-consent-id'] = consentId;\n }\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => '');\n throw new Error(\n `[JoopOpenBankingClient] ${method} ${path} failed: ${res.status} ${res.statusText} — ${errorText}`,\n );\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _buildInitiation(req: JoopOBPaymentRequest): Record<string, unknown> {\n return {\n InstructionIdentification: req.reference,\n EndToEndIdentification: req.reference,\n InstructedAmount: {\n Amount: req.amount.toFixed(2),\n Currency: req.currency,\n },\n CreditorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.creditorIban,\n Name: req.creditorName,\n },\n ...(req.debtorIban\n ? {\n DebtorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.debtorIban,\n },\n }\n : {}),\n ...(req.remittanceInfo\n ? { RemittanceInformation: { Unstructured: req.remittanceInfo } }\n : {}),\n };\n}\n\nfunction _generateInteractionId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Format as UUID v4-like string\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\n\n// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopPaymentStep =\n | 'idle'\n | 'initiating'\n | 'awaiting_3ds'\n | 'processing_3ds'\n | 'authorised'\n | 'settled'\n | 'failed'\n | 'cancelled';\n\nexport interface JoopPaymentSession {\n sessionId: string;\n paymentId: string;\n amount: number;\n currency: string;\n step: JoopPaymentStep;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentRequest {\n amount: number;\n currency: string;\n cardNumber: string;\n cardExpiry: string;\n cvv: string;\n merchantId: string;\n reference: string;\n returnUrl?: string;\n notifyUrl?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface JoopThreeDsResult {\n transactionId: string;\n status: 'Y' | 'N' | 'U' | 'A';\n eci: string;\n cavv?: string;\n}\n\nexport interface JoopPaymentOrchestratorConfig {\n gatewayUrl: string;\n merchantId: string;\n apiKey: string;\n timeoutMs?: number;\n pollIntervalMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal gateway response shapes\n// ---------------------------------------------------------------------------\n\ninterface _GatewayInitiateResponse {\n paymentId: string;\n status: string;\n requires3ds?: boolean;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\ninterface _GatewayStatusResponse {\n paymentId: string;\n status: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Step → terminal/error checks\n// ---------------------------------------------------------------------------\n\nconst _TERMINAL_STEPS = new Set<JoopPaymentStep>(['authorised', 'settled', 'failed', 'cancelled']);\n\n// ---------------------------------------------------------------------------\n// JoopPaymentOrchestrator\n// ---------------------------------------------------------------------------\n\nexport class JoopPaymentOrchestrator {\n private readonly _cfg: Required<JoopPaymentOrchestratorConfig>;\n private readonly _sessions = new Map<string, JoopBehaviorSubject<JoopPaymentSession>>();\n\n constructor(config: JoopPaymentOrchestratorConfig) {\n this._cfg = {\n gatewayUrl: config.gatewayUrl,\n merchantId: config.merchantId,\n apiKey: config.apiKey,\n timeoutMs: config.timeoutMs ?? 30_000,\n pollIntervalMs: config.pollIntervalMs ?? 2_000,\n };\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n async initiate(request: JoopPaymentRequest): Promise<JoopPaymentSession> {\n const sessionId = this._generateSessionId();\n const now = Date.now();\n\n // Mask card number — keep only last 4 digits in session\n const maskedCard = `****${request.cardNumber.replace(/\\s/g, '').slice(-4)}`;\n\n const session: JoopPaymentSession = {\n sessionId,\n paymentId: '',\n amount: request.amount,\n currency: request.currency,\n step: 'initiating',\n createdAt: now,\n updatedAt: now,\n };\n\n const subject = new JoopBehaviorSubject<JoopPaymentSession>(session);\n this._sessions.set(sessionId, subject);\n\n try {\n const raw = await this._fetch<_GatewayInitiateResponse>('POST', '/payments', {\n amount: request.amount,\n currency: request.currency,\n cardNumber: maskedCard, // send masked to gateway after capture\n cardExpiry: request.cardExpiry,\n cvv: request.cvv,\n merchantId: request.merchantId,\n reference: request.reference,\n returnUrl: request.returnUrl,\n notifyUrl: request.notifyUrl,\n metadata: request.metadata,\n });\n\n const updated = this._updateSession(subject, {\n paymentId: raw.paymentId,\n step: raw.requires3ds ? 'awaiting_3ds' : 'authorised',\n threeDsUrl: raw.threeDsUrl,\n threeDsData: raw.threeDsData,\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n\n return updated;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, {\n step: 'failed',\n errorMessage: errMsg,\n });\n }\n }\n\n async handle3ds(sessionId: string, result: JoopThreeDsResult): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (result.status === 'N') {\n return this._updateSession(subject, {\n step: 'failed',\n errorCode: 'AUTH_FAILED_3DS',\n errorMessage: '3DS authentication was declined by the card issuer.',\n });\n }\n\n this._updateSession(subject, { step: 'processing_3ds' });\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/3ds`,\n {\n transactionId: result.transactionId,\n status: result.status,\n eci: result.eci,\n cavv: result.cavv,\n },\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async poll(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'GET',\n `/payments/${current.paymentId}`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async confirm(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/confirm`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async cancel(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n await this._fetch<unknown>('DELETE', `/payments/${current.paymentId}`);\n return this._updateSession(subject, { step: 'cancelled' });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n getSession(sessionId: string): JoopPaymentSession | null {\n return this._sessions.get(sessionId)?.getValue() ?? null;\n }\n\n session$(sessionId: string): JoopObservable<JoopPaymentSession> {\n const existing = this._sessions.get(sessionId);\n if (existing) return existing.asObservable();\n\n // Return an observable that never emits if session doesn't exist yet;\n // callers should call initiate() first.\n return new JoopObservable<JoopPaymentSession>(() => () => { /* no-op unsubscribe */ });\n }\n\n destroy(): void {\n this._sessions.clear();\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _requireSession(sessionId: string): JoopBehaviorSubject<JoopPaymentSession> {\n const subject = this._sessions.get(sessionId);\n if (!subject) throw new Error(`[JoopPaymentOrchestrator] Unknown sessionId: ${sessionId}`);\n return subject;\n }\n\n private _updateSession(\n subject: JoopBehaviorSubject<JoopPaymentSession>,\n patch: Partial<JoopPaymentSession>,\n ): JoopPaymentSession {\n const next: JoopPaymentSession = { ...subject.getValue(), ...patch, updatedAt: Date.now() };\n subject.next(next);\n return next;\n }\n\n private _generateSessionId(): string {\n const bytes = new Uint8Array(18);\n crypto.getRandomValues(bytes);\n // Base64url encode (no +, /, =)\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n\n private async _fetch<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this._cfg.gatewayUrl}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this._cfg.timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this._cfg.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-Merchant-Id': this._cfg.merchantId,\n },\n signal: controller.signal,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[JoopPaymentOrchestrator] ${method} ${path}: ${res.status} — ${text}`);\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _mapGatewayStatus(status: string): JoopPaymentStep {\n switch (status?.toLowerCase()) {\n case 'authorised':\n case 'authorized':\n return 'authorised';\n case 'settled':\n case 'captured':\n return 'settled';\n case 'failed':\n case 'declined':\n case 'error':\n return 'failed';\n case 'cancelled':\n case 'canceled':\n case 'voided':\n return 'cancelled';\n case 'pending':\n case 'processing':\n return 'processing_3ds';\n default:\n return 'processing_3ds';\n }\n}\n","// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopTxnType = 'credit' | 'debit' | 'fee' | 'interest' | 'transfer' | 'unknown';\n\nexport interface JoopTransaction {\n id: string;\n date: string;\n valueDate?: string;\n amount: number;\n type: JoopTxnType;\n currency: string;\n description: string;\n reference?: string;\n balance?: number;\n counterpartyName?: string;\n counterpartyIban?: string;\n category?: string;\n raw?: string;\n}\n\nexport interface JoopStatementResult {\n format: 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown';\n accountId?: string;\n currency?: string;\n openingBalance?: number;\n closingBalance?: number;\n transactions: JoopTransaction[];\n parseErrors: string[];\n}\n\nexport interface JoopCsvStatementConfig {\n delimiter?: string;\n dateColumn?: string | number;\n amountColumn?: string | number;\n creditColumn?: string | number;\n debitColumn?: string | number;\n descriptionColumn?: string | number;\n referenceColumn?: string | number;\n balanceColumn?: string | number;\n dateFormat?: string;\n hasHeader?: boolean;\n skipRows?: number;\n}\n\n// ---------------------------------------------------------------------------\n// JoopStatementParser\n// ---------------------------------------------------------------------------\n\nexport class JoopStatementParser {\n\n // -------------------------------------------------------------------------\n // Auto-detect and dispatch\n // -------------------------------------------------------------------------\n\n parse(text: string, csvConfig?: JoopCsvStatementConfig): JoopStatementResult {\n const format = JoopStatementParser.detectFormat(text);\n switch (format) {\n case 'MT940': return this.parseMT940(text);\n case 'OFX': return this.parseOFX(text);\n case 'QIF': return this.parseQIF(text);\n case 'CSV': return this.parseCsv(text, csvConfig);\n default:\n return {\n format: 'unknown',\n transactions: [],\n parseErrors: ['Unable to detect statement format.'],\n };\n }\n }\n\n static detectFormat(text: string): 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown' {\n const trimmed = text.trimStart();\n if (trimmed.startsWith(':20:') || trimmed.includes('\\n:20:')) return 'MT940';\n if (trimmed.includes('OFXHEADER:') || trimmed.includes('<OFX>')) return 'OFX';\n if (/^[DTPMNLC!\\^]/m.test(trimmed) && trimmed.includes('^')) return 'QIF';\n // Heuristic: at least one line contains delimiter-separated fields\n const firstLines = trimmed.split('\\n').slice(0, 5).join('\\n');\n if (/[,;\\t]/.test(firstLines)) return 'CSV';\n return 'unknown';\n }\n\n // -------------------------------------------------------------------------\n // MT940\n // -------------------------------------------------------------------------\n\n parseMT940(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'MT940',\n transactions: [],\n parseErrors: [],\n };\n\n // Normalise line endings\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n // Extract individual fields using tag markers\n const fieldRegex = /:(\\d{2}[A-Z]?):([\\s\\S]*?)(?=\\n:\\d{2}[A-Z]?:|$)/g;\n const fields = new Map<string, string[]>();\n let m: RegExpExecArray | null;\n while ((m = fieldRegex.exec(lines)) !== null) {\n const tag = m[1];\n const value = m[2].trim();\n const existing = fields.get(tag) ?? [];\n existing.push(value);\n fields.set(tag, existing);\n }\n\n // :25: account\n const acct = fields.get('25')?.[0];\n if (acct) {\n result.accountId = acct.includes('/') ? acct.split('/')[1] : acct;\n }\n\n // :60F: or :60M: opening balance — format: C/DYYMMDDCUR,Amount\n const ob = fields.get('60F')?.[0] ?? fields.get('60M')?.[0];\n if (ob) {\n const parsed = _parseMT940Balance(ob);\n if (parsed) {\n result.currency = parsed.currency;\n result.openingBalance = parsed.amount;\n }\n }\n\n // :62F: or :62M: closing balance\n const cb = fields.get('62F')?.[0] ?? fields.get('62M')?.[0];\n if (cb) {\n const parsed = _parseMT940Balance(cb);\n if (parsed) result.closingBalance = parsed.amount;\n }\n\n // :61: / :86: pairs\n const tag61 = fields.get('61') ?? [];\n const tag86 = fields.get('86') ?? [];\n\n tag61.forEach((line61, idx) => {\n const narrative = tag86[idx] ?? '';\n try {\n const txn = _parseMT940Transaction(line61, narrative, result.accountId, result.currency, idx);\n if (txn) result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`MT940 :61: index ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // OFX / QFX (SGML format)\n // -------------------------------------------------------------------------\n\n parseOFX(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'OFX',\n transactions: [],\n parseErrors: [],\n };\n\n const tag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(text)?.[1]?.trim();\n };\n\n result.accountId = tag('ACCTID') ?? tag('BANKID');\n result.currency = tag('CURDEF') ?? tag('CURRENCY');\n\n const ledgerBal = tag('BALAMT');\n if (ledgerBal !== undefined) result.closingBalance = parseFloat(ledgerBal);\n\n // Extract all STMTTRN blocks\n const txnBlockRe = /<STMTTRN>([\\s\\S]*?)<\\/STMTTRN>/gi;\n let blockMatch: RegExpExecArray | null;\n let idx = 0;\n\n while ((blockMatch = txnBlockRe.exec(text)) !== null) {\n const block = blockMatch[1];\n const bTag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(block)?.[1]?.trim();\n };\n\n try {\n const trnType = bTag('TRNTYPE') ?? '';\n const dtPosted = bTag('DTPOSTED') ?? '';\n const dtAvail = bTag('DTAVAIL');\n const amtStr = bTag('TRNAMT') ?? '0';\n const fitId = bTag('FITID') ?? String(idx);\n const name = bTag('NAME');\n const memo = bTag('MEMO');\n const refNum = bTag('REFNUM') ?? bTag('CHECKNUM');\n\n const rawAmount = parseFloat(amtStr);\n const amount = Math.abs(rawAmount);\n const type = _ofxTrnType(trnType, rawAmount);\n\n const date = _parseOFXDate(dtPosted);\n const valueDate = dtAvail ? _parseOFXDate(dtAvail) : undefined;\n\n const txn: JoopTransaction = {\n id: _stableId(result.accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: result.currency ?? 'USD',\n description: memo ?? name ?? '',\n reference: refNum,\n counterpartyName: name,\n raw: block,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`OFX STMTTRN index ${idx}: ${String(e)}`);\n }\n idx++;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // QIF (Quicken Interchange Format)\n // -------------------------------------------------------------------------\n\n parseQIF(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'QIF',\n transactions: [],\n parseErrors: [],\n };\n\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n let current: Partial<{\n date: string;\n amount: number;\n payee: string;\n memo: string;\n ref: string;\n cleared: string;\n }> = {};\n let idx = 0;\n\n for (const line of lines) {\n if (line.startsWith('!')) continue; // header / account type line\n if (line === '^') {\n // End of record — commit\n if (current.date !== undefined && current.amount !== undefined) {\n try {\n const amount = Math.abs(current.amount);\n const type: JoopTxnType = current.amount < 0 ? 'debit' : 'credit';\n const txn: JoopTransaction = {\n id: _stableId(undefined, current.date, amount, idx),\n date: current.date,\n amount,\n type,\n currency: 'USD', // QIF doesn't carry currency\n description: current.memo ?? current.payee ?? '',\n reference: current.ref,\n counterpartyName: current.payee,\n raw: undefined,\n };\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`QIF record ${idx}: ${String(e)}`);\n }\n idx++;\n }\n current = {};\n continue;\n }\n\n const code = line[0];\n const value = line.slice(1).trim();\n\n switch (code) {\n case 'D': current.date = _parseQIFDate(value); break;\n case 'T': current.amount = parseFloat(value.replace(/,/g, '')); break;\n case 'P': current.payee = value; break;\n case 'M': current.memo = value; break;\n case 'N': current.ref = value; break;\n case 'L': /* category — skip for now */ break;\n case 'C': current.cleared = value; break;\n }\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // CSV\n // -------------------------------------------------------------------------\n\n parseCsv(text: string, config: JoopCsvStatementConfig = {}): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'CSV',\n transactions: [],\n parseErrors: [],\n };\n\n const delimiter = config.delimiter ?? _detectDelimiter(text);\n const hasHeader = config.hasHeader ?? true;\n const skipRows = config.skipRows ?? 0;\n\n const rawRows = text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .split('\\n')\n .filter(l => l.trim().length > 0);\n\n const allRows = rawRows.slice(skipRows);\n if (allRows.length === 0) {\n result.parseErrors.push('CSV: no data rows found.');\n return result;\n }\n\n const headerRow: string[] | undefined = hasHeader ? _splitCsvRow(allRows[0], delimiter) : undefined;\n const dataRows = hasHeader ? allRows.slice(1) : allRows;\n\n const resolve = (col: string | number | undefined): number => {\n if (col === undefined) return -1;\n if (typeof col === 'number') return col;\n return headerRow ? headerRow.findIndex(h => h.toLowerCase() === col.toLowerCase()) : -1;\n };\n\n const dateIdx = resolve(config.dateColumn ?? _guessColumn(headerRow, ['date', 'transaction date', 'txn date']));\n const amtIdx = resolve(config.amountColumn ?? _guessColumn(headerRow, ['amount', 'value']));\n const crIdx = resolve(config.creditColumn ?? _guessColumn(headerRow, ['credit', 'credits']));\n const drIdx = resolve(config.debitColumn ?? _guessColumn(headerRow, ['debit', 'debits']));\n const descIdx = resolve(config.descriptionColumn ?? _guessColumn(headerRow, ['description', 'details', 'narrative', 'memo']));\n const refIdx = resolve(config.referenceColumn ?? _guessColumn(headerRow, ['reference', 'ref', 'cheque no', 'check no']));\n const balIdx = resolve(config.balanceColumn ?? _guessColumn(headerRow, ['balance', 'running balance']));\n\n dataRows.forEach((row, idx) => {\n if (!row.trim()) return;\n const cols = _splitCsvRow(row, delimiter);\n try {\n const rawDate = dateIdx >= 0 ? cols[dateIdx] ?? '' : '';\n const rawDesc = descIdx >= 0 ? cols[descIdx] ?? '' : '';\n const rawRef = refIdx >= 0 ? cols[refIdx] ?? '' : undefined;\n const rawBal = balIdx >= 0 ? cols[balIdx] ?? '' : undefined;\n\n const date = _parseCsvDate(rawDate.trim(), config.dateFormat);\n\n // Determine amount and type\n let amount: number;\n let type: JoopTxnType;\n\n if (crIdx >= 0 || drIdx >= 0) {\n const crAmt = crIdx >= 0 ? _parseAmount(cols[crIdx] ?? '') : 0;\n const drAmt = drIdx >= 0 ? _parseAmount(cols[drIdx] ?? '') : 0;\n if (crAmt > 0) { amount = crAmt; type = 'credit'; }\n else if (drAmt > 0) { amount = drAmt; type = 'debit'; }\n else { amount = 0; type = 'unknown'; }\n } else if (amtIdx >= 0) {\n const raw = _parseAmount(cols[amtIdx] ?? '');\n amount = Math.abs(raw);\n type = raw < 0 ? 'debit' : (raw > 0 ? 'credit' : 'unknown');\n } else {\n result.parseErrors.push(`CSV row ${idx}: no amount column found.`);\n return;\n }\n\n const txn: JoopTransaction = {\n id: _stableId(undefined, date, amount, idx),\n date,\n amount,\n type,\n currency: 'USD',\n description: rawDesc.replace(/^\"|\"$/g, ''),\n reference: rawRef?.replace(/^\"|\"$/g, ''),\n balance: rawBal ? _parseAmount(rawBal) : undefined,\n raw: row,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`CSV row ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// MT940 helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseMT940Balance(value: string): { currency: string; amount: number } | null {\n // Format: C|D YYMMDD CUR AMOUNT (comma as decimal separator)\n const m = /^[CD](\\d{6})([A-Z]{3})([\\d,]+)/.exec(value.replace(/\\s/g, ''));\n if (!m) return null;\n const indicator = value[0] === 'D' ? -1 : 1;\n return {\n currency: m[2],\n amount: indicator * parseFloat(m[3].replace(',', '.')),\n };\n}\n\nfunction _parseMT940Transaction(\n line61: string,\n narrative: string,\n accountId: string | undefined,\n currency: string | undefined,\n idx: number,\n): JoopTransaction | null {\n // :61: format: YYMMDD[MMDD]C|D[Rd]Amount[FReference//BankRef]\n // Example: 2301151216CR500,00NTRFREF123//BANKREF\n const re = /^(\\d{6})(\\d{4})?([CD])(R?)([A-Z]?)(\\d[\\d,]+)(.*)$/;\n const m = re.exec(line61.replace(/\\s/g, ''));\n if (!m) return null;\n\n const yymmdd = m[1];\n const mmddOpt = m[2]; // optional value date\n const cdFlag = m[3]; // C or D\n const _reversal = m[4]; // R prefix means reversal\n // m[5] is the swift funds code (single letter), not needed\n const amtStr = m[6];\n const rest = m[7] ?? '';\n\n const year = parseInt(yymmdd.slice(0, 2)) + 2000;\n const month = yymmdd.slice(2, 4);\n const day = yymmdd.slice(4, 6);\n const date = `${year}-${month}-${day}`;\n\n let valueDate: string | undefined;\n if (mmddOpt) {\n const vmm = mmddOpt.slice(0, 2);\n const vdd = mmddOpt.slice(2, 4);\n valueDate = `${year}-${vmm}-${vdd}`;\n }\n\n const amount = parseFloat(amtStr.replace(',', '.'));\n const type: JoopTxnType = cdFlag === 'C' ? 'credit' : 'debit';\n\n // Reference extraction: after the swift code letter, up to // or end\n const refMatch = /^([^/]{1,16})(?:\\/\\/(.+))?$/.exec(rest);\n const reference = refMatch?.[1]?.trim() || undefined;\n\n // Narrative from :86: tag — use entire content as description\n const description = narrative.replace(/\\n/g, ' ').trim() || reference || '';\n\n return {\n id: _stableId(accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: currency ?? 'USD',\n description,\n reference,\n raw: line61 + (narrative ? '\\n' + narrative : ''),\n };\n}\n\n// ---------------------------------------------------------------------------\n// OFX helpers\n// ---------------------------------------------------------------------------\n\nfunction _ofxTrnType(trnType: string, rawAmount: number): JoopTxnType {\n switch (trnType.toUpperCase()) {\n case 'CREDIT': return 'credit';\n case 'DEBIT': return 'debit';\n case 'FEE': return 'fee';\n case 'INT': return 'interest';\n case 'XFER': return 'transfer';\n case 'DEP': return 'credit';\n case 'PAYMENT': return 'debit';\n case 'ATM':\n case 'POS': return rawAmount < 0 ? 'debit' : 'credit';\n default: return rawAmount < 0 ? 'debit' : 'credit';\n }\n}\n\nfunction _parseOFXDate(value: string): string {\n // OFX date: YYYYMMDDHHMMSS[.mmm][TZ] — we only need YYYYMMDD\n const clean = value.slice(0, 8);\n if (clean.length < 8) return value;\n return `${clean.slice(0, 4)}-${clean.slice(4, 6)}-${clean.slice(6, 8)}`;\n}\n\n// ---------------------------------------------------------------------------\n// QIF helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseQIFDate(value: string): string {\n // Common QIF date formats: M/D/YY, M/D/YYYY, D-M-YY, D.M.YYYY, MM/DD/YYYY\n const clean = value.replace(/'/g, ''); // QIF sometimes uses ' as year separator\n const parts = clean.split(/[\\-\\.\\/]/);\n if (parts.length < 3) return clean;\n\n let y = parseInt(parts[2]);\n const a = parseInt(parts[0]);\n const b = parseInt(parts[1]);\n\n if (y < 100) y += y < 30 ? 2000 : 1900;\n\n // Heuristic: if first part > 12 it must be day (D-M-Y)\n if (a > 12) {\n return `${y}-${String(b).padStart(2, '0')}-${String(a).padStart(2, '0')}`;\n }\n // Otherwise assume M/D/Y (US format)\n return `${y}-${String(a).padStart(2, '0')}-${String(b).padStart(2, '0')}`;\n}\n\n// ---------------------------------------------------------------------------\n// CSV helpers\n// ---------------------------------------------------------------------------\n\nfunction _detectDelimiter(text: string): string {\n const sample = text.slice(0, 2000);\n const counts: Record<string, number> = { ',': 0, ';': 0, '\\t': 0, '|': 0 };\n for (const ch of sample) {\n if (ch in counts) counts[ch]++;\n }\n return Object.entries(counts).sort((a, b) => b[1] - a[1])[0][0];\n}\n\nfunction _splitCsvRow(row: string, delimiter: string): string[] {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < row.length; i++) {\n const ch = row[i];\n if (ch === '\"') {\n if (inQuotes && row[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === delimiter && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n}\n\nfunction _guessColumn(header: string[] | undefined, candidates: string[]): number {\n if (!header) return -1;\n for (const c of candidates) {\n const idx = header.findIndex(h => h.toLowerCase().trim() === c.toLowerCase());\n if (idx >= 0) return idx;\n }\n return -1;\n}\n\nfunction _parseAmount(raw: string): number {\n if (!raw || !raw.trim()) return 0;\n // Strip currency symbols, spaces, parentheses-based negatives\n const negative = raw.includes('(') || raw.trimStart().startsWith('-');\n const clean = raw.replace(/[^0-9.,]/g, '');\n if (!clean) return 0;\n // Handle European format: 1.234,56 → 1234.56\n const hasEuropean = /\\d{1,3}(\\.\\d{3})+,\\d{2}$/.test(clean);\n const normalised = hasEuropean\n ? clean.replace(/\\./g, '').replace(',', '.')\n : clean.replace(/,/g, '');\n const val = parseFloat(normalised);\n return negative ? -Math.abs(val) : val;\n}\n\nfunction _parseCsvDate(raw: string, fmt?: string): string {\n if (!raw) return '';\n const format = fmt ?? _detectDateFormat(raw);\n\n const clean = raw.replace(/[^\\d]/g, '-').replace(/--+/g, '-');\n const parts = clean.split('-').filter(Boolean);\n if (parts.length < 3) return raw;\n\n let day: string, month: string, year: string;\n\n switch (format) {\n case 'DD/MM/YYYY':\n [day, month, year] = parts;\n break;\n case 'MM/DD/YYYY':\n [month, day, year] = parts;\n break;\n case 'YYYY-MM-DD':\n default:\n [year, month, day] = parts;\n }\n\n const y = parseInt(year);\n const fullYear = y < 100 ? (y < 30 ? 2000 + y : 1900 + y) : y;\n return `${fullYear}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n}\n\nfunction _detectDateFormat(sample: string): string {\n // YYYY-MM-DD or YYYY/MM/DD\n if (/^\\d{4}[^\\d]\\d{2}[^\\d]\\d{2}$/.test(sample)) return 'YYYY-MM-DD';\n // DD/MM/YYYY — day <= 12 is ambiguous; assume if separator is /\n if (/^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/.test(sample)) {\n const parts = sample.split('/');\n if (parseInt(parts[0]) > 12) return 'DD/MM/YYYY';\n return 'MM/DD/YYYY'; // default to US\n }\n if (/^\\d{1,2}-\\d{1,2}-\\d{4}$/.test(sample)) return 'DD/MM/YYYY';\n return 'YYYY-MM-DD';\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a deterministic but collision-resistant transaction ID.\n * Uses a simple djb2-style hash over the concatenated key fields + index.\n */\nfunction _stableId(accountId: string | undefined, date: string, amount: number, index: number): string {\n const key = `${accountId ?? ''}|${date}|${amount.toFixed(2)}|${index}`;\n let hash = 5381;\n for (let i = 0; i < key.length; i++) {\n hash = ((hash << 5) + hash) ^ key.charCodeAt(i);\n hash = hash >>> 0; // keep unsigned 32-bit\n }\n return `TXN-${hash.toString(16).toUpperCase().padStart(8, '0')}-${index}`;\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBeneficiaryType = 'domestic' | 'international' | 'upi' | 'mobile' | 'wallet' | 'crypto';\n\nexport interface JoopBeneficiary {\n id: string;\n name: string;\n nickname?: string;\n type: JoopBeneficiaryType;\n // Bank account details\n accountNumber?: string;\n iban?: string;\n bic?: string;\n routingNumber?: string;\n sortCode?: string;\n bankName?: string;\n bankCode?: string;\n branchCode?: string;\n // Alternative identifiers\n upiId?: string;\n mobile?: string;\n email?: string;\n walletId?: string;\n // Meta\n currency?: string;\n country?: string;\n group?: string;\n isFavorite: boolean;\n isVerified: boolean;\n transferLimit?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n lastUsedAt?: number;\n useCount: number;\n}\n\nexport interface JoopBeneficiaryValidation {\n valid: boolean;\n errors: string[];\n}\n\nexport class JoopBeneficiaryService {\n private _beneficiaries = new Map<string, JoopBeneficiary>();\n private _list$ = new JoopBehaviorSubject<JoopBeneficiary[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopBeneficiary, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): JoopBeneficiary {\n const validation = this.validate(data);\n if (!validation.valid) throw new Error(`Invalid beneficiary: ${validation.errors.join(', ')}`);\n const b: JoopBeneficiary = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now(), useCount: 0 };\n this._beneficiaries.set(b.id, b);\n this._emit();\n return { ...b };\n }\n\n update(id: string, patch: Partial<Omit<JoopBeneficiary, 'id' | 'createdAt'>>): JoopBeneficiary {\n const b = this._get(id);\n const updated = { ...b, ...patch, id, updatedAt: Date.now() };\n this._beneficiaries.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n remove(id: string): void {\n this._beneficiaries.delete(id);\n this._emit();\n }\n\n get(id: string): JoopBeneficiary | undefined {\n const b = this._beneficiaries.get(id);\n return b ? { ...b } : undefined;\n }\n\n getAll(): JoopBeneficiary[] {\n return Array.from(this._beneficiaries.values()).map(b => ({ ...b }));\n }\n\n // ── Filtering ────────────────────────────────────────────────────────────\n\n getByType(type: JoopBeneficiaryType): JoopBeneficiary[] {\n return this.getAll().filter(b => b.type === type);\n }\n\n getByGroup(group: string): JoopBeneficiary[] {\n return this.getAll().filter(b => b.group === group);\n }\n\n getFavorites(): JoopBeneficiary[] {\n return this.getAll().filter(b => b.isFavorite);\n }\n\n getRecent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .filter(b => b.lastUsedAt)\n .sort((a, b) => (b.lastUsedAt ?? 0) - (a.lastUsedAt ?? 0))\n .slice(0, limit);\n }\n\n getFrequent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .sort((a, b) => b.useCount - a.useCount)\n .slice(0, limit);\n }\n\n search(query: string): JoopBeneficiary[] {\n const q = query.toLowerCase();\n return this.getAll().filter(b =>\n b.name.toLowerCase().includes(q) ||\n b.nickname?.toLowerCase().includes(q) ||\n b.accountNumber?.includes(q) ||\n b.iban?.toLowerCase().includes(q) ||\n b.upiId?.toLowerCase().includes(q) ||\n b.mobile?.includes(q) ||\n b.bankName?.toLowerCase().includes(q),\n );\n }\n\n // ── Actions ───────────────────────────────────────────────────────────────\n\n toggleFavorite(id: string): JoopBeneficiary {\n const b = this._get(id);\n return this.update(id, { isFavorite: !b.isFavorite });\n }\n\n verify(id: string): JoopBeneficiary {\n return this.update(id, { isVerified: true });\n }\n\n markUsed(id: string): void {\n const b = this._get(id);\n this.update(id, { lastUsedAt: Date.now(), useCount: b.useCount + 1 });\n }\n\n // ── Meta ──────────────────────────────────────────────────────────────────\n\n getGroups(): string[] {\n return [...new Set(this.getAll().map(b => b.group).filter(Boolean) as string[])].sort();\n }\n\n count(): number { return this._beneficiaries.size; }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n validate(b: Partial<JoopBeneficiary>): JoopBeneficiaryValidation {\n const errors: string[] = [];\n if (!b.name?.trim()) errors.push('name is required');\n if (!b.type) errors.push('type is required');\n\n if (b.type === 'domestic' || b.type === 'international') {\n if (!b.accountNumber && !b.iban) errors.push('accountNumber or iban required for bank transfers');\n }\n if (b.type === 'upi') {\n if (!b.upiId) errors.push('upiId required for UPI beneficiaries');\n else if (!/^[\\w.\\-]+@[\\w]+$/.test(b.upiId)) errors.push('upiId format invalid (expected user@bank)');\n }\n if (b.type === 'mobile') {\n if (!b.mobile) errors.push('mobile required for mobile transfers');\n }\n if (b.iban && !/^[A-Z]{2}\\d{2}[A-Z0-9]{4,}$/.test(b.iban.replace(/\\s/g, ''))) {\n errors.push('IBAN format invalid');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n beneficiaries$() { return this._list$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopBeneficiary {\n const b = this._beneficiaries.get(id);\n if (!b) throw new Error(`Beneficiary '${id}' not found`);\n return b;\n }\n\n private _emit(): void {\n this._list$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopRecurrenceFrequency = 'once' | 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'annually';\nexport type JoopScheduledPaymentStatus = 'active' | 'paused' | 'completed' | 'cancelled' | 'failed';\n\nexport interface JoopScheduledPayment {\n id: string;\n name: string;\n fromAccount: string;\n toAccount: string;\n beneficiaryId?: string;\n amount: number;\n currency: string;\n frequency: JoopRecurrenceFrequency;\n startDate: number;\n endDate?: number;\n nextExecutionDate: number;\n lastExecutionDate?: number;\n executionCount: number;\n maxExecutions?: number;\n status: JoopScheduledPaymentStatus;\n reference?: string;\n description?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentExecution {\n id: string;\n paymentId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: 'success' | 'failed';\n reference: string;\n error?: string;\n}\n\nconst MS: Record<JoopRecurrenceFrequency, number | null> = {\n once: null,\n daily: 86_400_000,\n weekly: 7 * 86_400_000,\n biweekly: 14 * 86_400_000,\n monthly: null, // computed via Date logic\n quarterly: null,\n annually: null,\n};\n\nexport class JoopScheduledPaymentService {\n private _payments = new Map<string, JoopScheduledPayment>();\n private _executions: JoopPaymentExecution[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopScheduledPayment[]>([]);\n private _due$ = new JoopSubject<JoopScheduledPayment>();\n\n // ── Schedule ──────────────────────────────────────────────────────────────\n\n schedule(data: Omit<JoopScheduledPayment, 'id' | 'nextExecutionDate' | 'executionCount' | 'createdAt' | 'updatedAt' | 'status'>): JoopScheduledPayment {\n const p: JoopScheduledPayment = {\n ...data,\n id: _uid(),\n nextExecutionDate: data.startDate,\n executionCount: 0,\n status: 'active',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._payments.set(p.id, p);\n this._emit();\n return { ...p };\n }\n\n update(id: string, patch: Partial<Omit<JoopScheduledPayment, 'id' | 'createdAt'>>): JoopScheduledPayment {\n const p = this._get(id);\n const updated = { ...p, ...patch, updatedAt: Date.now() };\n this._payments.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n cancel(id: string): void { this.update(id, { status: 'cancelled' }); }\n pause(id: string): void { this.update(id, { status: 'paused' }); }\n resume(id: string): void { this.update(id, { status: 'active' }); }\n\n // ── Query ─────────────────────────────────────────────────────────────────\n\n get(id: string): JoopScheduledPayment | undefined {\n const p = this._payments.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopScheduledPayment[] {\n return Array.from(this._payments.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopScheduledPayment[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getDue(asOf: Date = new Date()): JoopScheduledPayment[] {\n return this.getActive().filter(p => p.nextExecutionDate <= asOf.getTime());\n }\n\n getUpcoming(days = 30, asOf: Date = new Date()): JoopScheduledPayment[] {\n const cutoff = asOf.getTime() + days * 86_400_000;\n return this.getActive().filter(p => p.nextExecutionDate <= cutoff);\n }\n\n // ── Execution ────────────────────────────────────────────────────────────\n\n recordExecution(paymentId: string, status: 'success' | 'failed', error?: string): JoopPaymentExecution {\n const p = this._get(paymentId);\n const exec: JoopPaymentExecution = {\n id: _uid(),\n paymentId,\n executedAt: Date.now(),\n amount: p.amount,\n currency: p.currency,\n status,\n reference: `REF${Date.now().toString(36).toUpperCase()}`,\n error,\n };\n this._executions.push(exec);\n\n p.executionCount++;\n p.lastExecutionDate = exec.executedAt;\n\n if (status === 'failed') {\n p.status = 'failed';\n } else if (p.frequency === 'once' || (p.maxExecutions && p.executionCount >= p.maxExecutions)) {\n p.status = 'completed';\n } else {\n p.nextExecutionDate = this.computeNextDate(p.nextExecutionDate, p.frequency);\n if (p.endDate && p.nextExecutionDate > p.endDate) p.status = 'completed';\n }\n\n this._payments.set(paymentId, p);\n this._emit();\n return exec;\n }\n\n getExecutionHistory(paymentId: string): JoopPaymentExecution[] {\n return this._executions.filter(e => e.paymentId === paymentId);\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(current: number, frequency: JoopRecurrenceFrequency): number {\n const ms = MS[frequency];\n if (ms !== null && ms !== undefined) return current + ms;\n\n const d = new Date(current);\n switch (frequency) {\n case 'monthly':\n d.setMonth(d.getMonth() + 1);\n break;\n case 'quarterly':\n d.setMonth(d.getMonth() + 3);\n break;\n case 'annually':\n d.setFullYear(d.getFullYear() + 1);\n break;\n case 'once':\n return current;\n }\n return d.getTime();\n }\n\n getSchedulePreview(startDate: number, frequency: JoopRecurrenceFrequency, count = 5, endDate?: number): number[] {\n const dates: number[] = [];\n let next = startDate;\n while (dates.length < count) {\n if (endDate && next > endDate) break;\n dates.push(next);\n if (frequency === 'once') break;\n next = this.computeNextDate(next, frequency);\n }\n return dates;\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n due$() { return this._due$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopScheduledPayment {\n const p = this._payments.get(id);\n if (!p) throw new Error(`Scheduled payment '${id}' not found`);\n return p;\n }\n\n private _emit(): void { this._payments$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopCardStatus = 'active' | 'frozen' | 'blocked' | 'expired' | 'pending';\nexport type JoopCardType = 'physical' | 'virtual';\nexport type JoopManagedCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unknown';\n\nexport interface JoopCardSpendingLimits {\n daily?: number;\n weekly?: number;\n monthly?: number;\n perTransaction?: number;\n}\n\nexport interface JoopCardControls {\n onlinePayments: boolean;\n internationalPayments: boolean;\n contactlessPayments: boolean;\n atmWithdrawals: boolean;\n ecommercePayments: boolean;\n}\n\nexport interface JoopManagedCard {\n id: string;\n cardNumber: string; // masked, e.g. **** **** **** 1234\n last4: string;\n network: JoopManagedCardNetwork;\n type: JoopCardType;\n holderName: string;\n expiryMonth: number; // 1-12\n expiryYear: number; // full year, e.g. 2027\n status: JoopCardStatus;\n accountId: string;\n spendingLimits: JoopCardSpendingLimits;\n controls: JoopCardControls;\n currency?: string;\n createdAt: number;\n updatedAt: number;\n frozenAt?: number;\n frozenReason?: string;\n blockedAt?: number;\n}\n\nexport interface JoopCardTransactionCheck {\n allowed: boolean;\n reason?: string;\n}\n\nconst DEFAULT_CONTROLS: JoopCardControls = {\n onlinePayments: true,\n internationalPayments: false,\n contactlessPayments: true,\n atmWithdrawals: true,\n ecommercePayments: true,\n};\n\nexport class JoopCardManagementService {\n private _cards = new Map<string, JoopManagedCard>();\n private _cards$ = new JoopBehaviorSubject<JoopManagedCard[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopManagedCard, 'id' | 'createdAt' | 'updatedAt'>): JoopManagedCard {\n const card: JoopManagedCard = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now() };\n this._cards.set(card.id, card);\n this._emit();\n return { ...card };\n }\n\n get(id: string): JoopManagedCard | undefined {\n const c = this._cards.get(id);\n return c ? { ...c } : undefined;\n }\n\n getAll(): JoopManagedCard[] {\n return Array.from(this._cards.values()).map(c => ({ ...c }));\n }\n\n getByAccount(accountId: string): JoopManagedCard[] {\n return this.getAll().filter(c => c.accountId === accountId);\n }\n\n getActive(): JoopManagedCard[] {\n return this.getAll().filter(c => c.status === 'active');\n }\n\n remove(id: string): void {\n this._cards.delete(id);\n this._emit();\n }\n\n // ── Card Controls ──────────────────────────────────────────────────────────\n\n freeze(id: string, reason?: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status === 'blocked') throw new Error('Cannot freeze a blocked card');\n return this._update(id, { status: 'frozen', frozenAt: Date.now(), frozenReason: reason });\n }\n\n unfreeze(id: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status !== 'frozen') throw new Error('Card is not frozen');\n return this._update(id, { status: 'active', frozenAt: undefined, frozenReason: undefined });\n }\n\n block(id: string): JoopManagedCard {\n return this._update(id, { status: 'blocked', blockedAt: Date.now() });\n }\n\n // ── Limits & Controls ─────────────────────────────────────────────────────\n\n setSpendingLimits(id: string, limits: JoopCardSpendingLimits): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { spendingLimits: { ...c.spendingLimits, ...limits } });\n }\n\n setControls(id: string, controls: Partial<JoopCardControls>): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { controls: { ...c.controls, ...controls } });\n }\n\n // ── Virtual Card ──────────────────────────────────────────────────────────\n\n generateVirtual(accountId: string, holderName: string, options: { expiryMonths?: number; currency?: string } = {}): JoopManagedCard {\n const expiryMonths = options.expiryMonths ?? 12;\n const now = new Date();\n const expiry = new Date(now.getFullYear(), now.getMonth() + expiryMonths, 1);\n const last4 = String(Math.floor(1000 + Math.random() * 9000));\n const bin = '4' + Array.from({ length: 11 }, () => Math.floor(Math.random() * 10)).join('');\n const cardNumber = `**** **** **** ${last4}`;\n\n return this.add({\n cardNumber,\n last4,\n network: 'visa',\n type: 'virtual',\n holderName: holderName.toUpperCase(),\n expiryMonth: expiry.getMonth() + 1,\n expiryYear: expiry.getFullYear(),\n status: 'active',\n accountId,\n currency: options.currency ?? 'USD',\n spendingLimits: {},\n controls: { ...DEFAULT_CONTROLS, internationalPayments: true },\n });\n }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n isExpired(id: string): boolean {\n const c = this._require(id);\n const now = new Date();\n const expiry = new Date(c.expiryYear, c.expiryMonth - 1, 1);\n return expiry <= new Date(now.getFullYear(), now.getMonth(), 1);\n }\n\n canTransact(id: string, amount: number, type: keyof Omit<JoopCardControls, 'ecommercePayments'> | 'ecommerce'): JoopCardTransactionCheck {\n const c = this._require(id);\n\n if (c.status !== 'active') return { allowed: false, reason: `Card is ${c.status}` };\n if (this.isExpired(id)) return { allowed: false, reason: 'Card is expired' };\n\n const controlMap: Record<string, keyof JoopCardControls> = {\n onlinePayments: 'onlinePayments',\n internationalPayments: 'internationalPayments',\n contactlessPayments: 'contactlessPayments',\n atmWithdrawals: 'atmWithdrawals',\n ecommerce: 'ecommercePayments',\n };\n const controlKey = controlMap[type];\n if (controlKey && !c.controls[controlKey]) return { allowed: false, reason: `${type} is disabled on this card` };\n\n if (c.spendingLimits.perTransaction && amount > c.spendingLimits.perTransaction) {\n return { allowed: false, reason: `Amount exceeds per-transaction limit of ${c.spendingLimits.perTransaction}` };\n }\n\n return { allowed: true };\n }\n\n validatePin(pin: string): boolean {\n return /^\\d{4,6}$/.test(pin);\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n cards$() { return this._cards$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopManagedCard {\n const c = this._cards.get(id);\n if (!c) throw new Error(`Card '${id}' not found`);\n return c;\n }\n\n private _update(id: string, patch: Partial<JoopManagedCard>): JoopManagedCard {\n const c = this._require(id);\n const updated = { ...c, ...patch, updatedAt: Date.now() };\n this._cards.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n private _emit(): void {\n this._cards$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopStatementFormat = 'text' | 'csv' | 'html';\nexport type JoopTransactionType = 'credit' | 'debit';\n\nexport interface JoopStatementTransaction {\n id: string;\n date: number;\n description: string;\n type: JoopTransactionType;\n amount: number;\n currency: string;\n reference?: string;\n category?: string;\n}\n\nexport interface JoopStatementEntry extends JoopStatementTransaction {\n runningBalance: number;\n}\n\nexport interface JoopStatementOptions {\n accountId: string;\n accountName?: string;\n accountNumber?: string;\n currency: string;\n openingBalance: number;\n fromDate: number;\n toDate: number;\n transactions: JoopStatementTransaction[];\n}\n\nexport interface JoopStatement {\n accountId: string;\n accountName: string;\n accountNumber: string;\n currency: string;\n fromDate: number;\n toDate: number;\n openingBalance: number;\n closingBalance: number;\n totalCredits: number;\n totalDebits: number;\n transactionCount: number;\n entries: JoopStatementEntry[];\n generatedAt: number;\n}\n\nexport class JoopStatementGeneratorService {\n\n generate(options: JoopStatementOptions): JoopStatement {\n const sorted = [...options.transactions]\n .filter(t => t.date >= options.fromDate && t.date <= options.toDate)\n .sort((a, b) => a.date - b.date);\n\n let balance = options.openingBalance;\n let totalCredits = 0;\n let totalDebits = 0;\n\n const entries: JoopStatementEntry[] = sorted.map(tx => {\n if (tx.type === 'credit') {\n balance += tx.amount;\n totalCredits += tx.amount;\n } else {\n balance -= tx.amount;\n totalDebits += tx.amount;\n }\n return { ...tx, runningBalance: parseFloat(balance.toFixed(2)) };\n });\n\n return {\n accountId: options.accountId,\n accountName: options.accountName ?? '',\n accountNumber: options.accountNumber ?? '',\n currency: options.currency,\n fromDate: options.fromDate,\n toDate: options.toDate,\n openingBalance: options.openingBalance,\n closingBalance: parseFloat(balance.toFixed(2)),\n totalCredits: parseFloat(totalCredits.toFixed(2)),\n totalDebits: parseFloat(totalDebits.toFixed(2)),\n transactionCount: entries.length,\n entries,\n generatedAt: Date.now(),\n };\n }\n\n render(statement: JoopStatement, format: JoopStatementFormat = 'text'): string {\n switch (format) {\n case 'csv': return this._renderCsv(statement);\n case 'html': return this._renderHtml(statement);\n default: return this._renderText(statement);\n }\n }\n\n // ── Summary ────────────────────────────────────────────────────────────────\n\n getSummary(statement: JoopStatement): Record<string, number> {\n const summary: Record<string, number> = {};\n for (const entry of statement.entries) {\n const cat = entry.category ?? 'Uncategorized';\n summary[cat] = (summary[cat] ?? 0) + entry.amount;\n }\n return summary;\n }\n\n getTopCategories(statement: JoopStatement, limit = 5): Array<{ category: string; total: number }> {\n const summary = this.getSummary(statement);\n return Object.entries(summary)\n .sort(([, a], [, b]) => b - a)\n .slice(0, limit)\n .map(([category, total]) => ({ category, total: parseFloat(total.toFixed(2)) }));\n }\n\n // ── Renderers ─────────────────────────────────────────────────────────────\n\n private _renderText(s: JoopStatement): string {\n const lines: string[] = [];\n const sep = '─'.repeat(70);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n\n lines.push(sep);\n lines.push(`ACCOUNT STATEMENT`);\n lines.push(`Account: ${s.accountName} (${s.accountNumber})`);\n lines.push(`Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`);\n lines.push(`Generated: ${new Date(s.generatedAt).toISOString()}`);\n lines.push(sep);\n lines.push(`Opening Balance: ${fmt(s.openingBalance)}`);\n lines.push('');\n lines.push(`${'Date'.padEnd(12)}${'Description'.padEnd(32)}${'Debit'.padStart(12)}${'Credit'.padStart(12)}${'Balance'.padStart(14)}`);\n lines.push('─'.repeat(70));\n\n for (const e of s.entries) {\n const d = e.type === 'debit' ? e.amount.toFixed(2) : '';\n const c = e.type === 'credit' ? e.amount.toFixed(2) : '';\n lines.push(`${fmtDate(e.date).padEnd(12)}${e.description.slice(0, 30).padEnd(32)}${d.padStart(12)}${c.padStart(12)}${e.runningBalance.toFixed(2).padStart(14)}`);\n }\n\n lines.push('─'.repeat(70));\n lines.push(`${''.padEnd(44)}${'Total Debits:'.padStart(12)} ${fmt(s.totalDebits)}`);\n lines.push(`${''.padEnd(44)}${'Total Credits:'.padStart(12)} ${fmt(s.totalCredits)}`);\n lines.push(`${''.padEnd(44)}${'Closing Balance:'.padStart(12)} ${fmt(s.closingBalance)}`);\n lines.push(sep);\n\n return lines.join('\\n');\n }\n\n private _renderCsv(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const rows: string[] = [\n `Account ID,${s.accountId}`,\n `Account Name,${s.accountName}`,\n `Account Number,${s.accountNumber}`,\n `Currency,${s.currency}`,\n `Period,${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`,\n `Opening Balance,${s.openingBalance}`,\n `Closing Balance,${s.closingBalance}`,\n '',\n 'Date,Description,Type,Amount,Currency,Reference,Category,Running Balance',\n ...s.entries.map(e =>\n [fmtDate(e.date), _csvEscape(e.description), e.type, e.amount, e.currency, e.reference ?? '', e.category ?? '', e.runningBalance].join(',')\n ),\n ];\n return rows.join('\\n');\n }\n\n private _renderHtml(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n\n const rows = s.entries.map(e => `\n <tr>\n <td>${fmtDate(e.date)}</td>\n <td>${_htmlEscape(e.description)}</td>\n <td>${e.type === 'debit' ? fmt(e.amount) : ''}</td>\n <td>${e.type === 'credit' ? fmt(e.amount) : ''}</td>\n <td>${fmt(e.runningBalance)}</td>\n <td>${e.category ?? ''}</td>\n </tr>`).join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Account Statement</title>\n<style>\n body { font-family: Arial, sans-serif; font-size: 13px; margin: 20px; }\n h2 { margin-bottom: 4px; }\n .meta { color: #555; margin-bottom: 16px; }\n table { width: 100%; border-collapse: collapse; }\n th, td { padding: 6px 10px; border: 1px solid #ddd; text-align: left; }\n th { background: #f5f5f5; font-weight: 600; }\n .summary { margin-top: 16px; font-weight: bold; }\n tr:nth-child(even) { background: #fafafa; }\n</style>\n</head>\n<body>\n<h2>Account Statement</h2>\n<div class=\"meta\">\n <div>Account: ${_htmlEscape(s.accountName)} (${_htmlEscape(s.accountNumber)})</div>\n <div>Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}</div>\n <div>Generated: ${new Date(s.generatedAt).toISOString()}</div>\n</div>\n<table>\n <thead>\n <tr><th>Date</th><th>Description</th><th>Debit</th><th>Credit</th><th>Balance</th><th>Category</th></tr>\n </thead>\n <tbody>\n <tr><td colspan=\"4\"><strong>Opening Balance</strong></td><td><strong>${fmt(s.openingBalance)}</strong></td><td></td></tr>\n ${rows}\n <tr class=\"summary\">\n <td colspan=\"2\">Totals</td>\n <td>${fmt(s.totalDebits)}</td>\n <td>${fmt(s.totalCredits)}</td>\n <td>${fmt(s.closingBalance)}</td>\n <td></td>\n </tr>\n </tbody>\n</table>\n</body>\n</html>`;\n }\n}\n\nfunction _csvEscape(v: string): string {\n if (v.includes(',') || v.includes('\"') || v.includes('\\n')) return `\"${v.replace(/\"/g, '\"\"')}\"`;\n return v;\n}\n\nfunction _htmlEscape(v: string): string {\n return v.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationType = 'info' | 'success' | 'warning' | 'error' | 'transfer' | 'security' | 'promo' | 'system';\nexport type JoopNotificationPriority = 'low' | 'normal' | 'high' | 'urgent';\n\nexport interface JoopNotification {\n id: string;\n type: JoopNotificationType;\n title: string;\n body: string;\n priority: JoopNotificationPriority;\n category?: string;\n imageUrl?: string;\n actionUrl?: string;\n actionLabel?: string;\n metadata?: Record<string, unknown>;\n isRead: boolean;\n isDismissed: boolean;\n createdAt: number;\n readAt?: number;\n expiresAt?: number;\n}\n\nexport interface JoopNotificationSummary {\n total: number;\n unread: number;\n byType: Record<JoopNotificationType, number>;\n byPriority: Record<JoopNotificationPriority, number>;\n}\n\nexport class JoopNotificationCenterService {\n private _notifications: JoopNotification[] = [];\n private _notifications$ = new JoopBehaviorSubject<JoopNotification[]>([]);\n private _maxItems: number;\n\n constructor(maxItems = 500) {\n this._maxItems = maxItems;\n }\n\n // ── Add ───────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopNotification, 'id' | 'isRead' | 'isDismissed' | 'createdAt'>): JoopNotification {\n const n: JoopNotification = {\n ...data,\n id: _uid(),\n isRead: false,\n isDismissed: false,\n createdAt: Date.now(),\n };\n this._notifications.unshift(n); // newest first\n if (this._notifications.length > this._maxItems) this._notifications.pop();\n this._emit();\n return { ...n };\n }\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n get(id: string): JoopNotification | undefined {\n return this._notifications.find(n => n.id === id);\n }\n\n getAll(includeExpired = false): JoopNotification[] {\n const now = Date.now();\n return this._notifications\n .filter(n => !n.isDismissed && (includeExpired || !n.expiresAt || n.expiresAt > now))\n .map(n => ({ ...n }));\n }\n\n getUnread(): JoopNotification[] {\n return this.getAll().filter(n => !n.isRead);\n }\n\n getByType(type: JoopNotificationType): JoopNotification[] {\n return this.getAll().filter(n => n.type === type);\n }\n\n getByCategory(category: string): JoopNotification[] {\n return this.getAll().filter(n => n.category === category);\n }\n\n getByPriority(priority: JoopNotificationPriority): JoopNotification[] {\n return this.getAll().filter(n => n.priority === priority);\n }\n\n // ── Mark read ─────────────────────────────────────────────────────────────\n\n markRead(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isRead) return;\n n.isRead = true;\n n.readAt = Date.now();\n this._emit();\n }\n\n markAllRead(): void {\n const now = Date.now();\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isRead) { n.isRead = true; n.readAt = now; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Dismiss ───────────────────────────────────────────────────────────────\n\n dismiss(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isDismissed) return;\n n.isDismissed = true;\n this._emit();\n }\n\n dismissAll(): void {\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isDismissed) { n.isDismissed = true; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Counts ────────────────────────────────────────────────────────────────\n\n unreadCount(): number { return this.getUnread().length; }\n\n getSummary(): JoopNotificationSummary {\n const all = this.getAll();\n const byType = {} as Record<JoopNotificationType, number>;\n const byPriority = {} as Record<JoopNotificationPriority, number>;\n\n for (const n of all) {\n byType[n.type] = (byType[n.type] ?? 0) + 1;\n byPriority[n.priority] = (byPriority[n.priority] ?? 0) + 1;\n }\n\n return { total: all.length, unread: this.unreadCount(), byType, byPriority };\n }\n\n // ── Cleanup ───────────────────────────────────────────────────────────────\n\n purgeExpired(): number {\n const before = this._notifications.length;\n const now = Date.now();\n this._notifications = this._notifications.filter(n => !n.expiresAt || n.expiresAt > now);\n const removed = before - this._notifications.length;\n if (removed > 0) this._emit();\n return removed;\n }\n\n clear(): void {\n this._notifications = [];\n this._emit();\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n notifications$() { return this._notifications$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _emit(): void { this._notifications$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopDisputeStatus = 'open' | 'under-review' | 'resolved' | 'rejected' | 'escalated' | 'closed';\nexport type JoopDisputeReason =\n | 'unauthorized-transaction'\n | 'duplicate-charge'\n | 'goods-not-received'\n | 'goods-not-as-described'\n | 'amount-mismatch'\n | 'cancelled-subscription'\n | 'atm-withdrawal-discrepancy'\n | 'other';\n\nexport interface JoopDisputeEvidence {\n id: string;\n type: 'screenshot' | 'receipt' | 'email' | 'document' | 'photo' | 'other';\n name: string;\n url?: string;\n base64?: string;\n uploadedAt: number;\n}\n\nexport interface JoopDispute {\n id: string;\n referenceNumber: string;\n transactionId?: string;\n transactionDate?: number;\n amount: number;\n currency: string;\n merchantName?: string;\n reason: JoopDisputeReason;\n description: string;\n status: JoopDisputeStatus;\n evidence: JoopDisputeEvidence[];\n resolution?: string;\n rejectionReason?: string;\n escalationReason?: string;\n assignedTo?: string;\n createdAt: number;\n updatedAt: number;\n resolvedAt?: number;\n}\n\nexport interface JoopDisputeStats {\n total: number;\n open: number;\n underReview: number;\n resolved: number;\n rejected: number;\n escalated: number;\n totalAmount: number;\n}\n\nexport class JoopDisputeService {\n private _disputes = new Map<string, JoopDispute>();\n private _disputes$ = new JoopBehaviorSubject<JoopDispute[]>([]);\n private _counter = 1;\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: Omit<JoopDispute, 'id' | 'referenceNumber' | 'status' | 'evidence' | 'createdAt' | 'updatedAt'>): JoopDispute {\n const dispute: JoopDispute = {\n ...data,\n id: _uid(),\n referenceNumber: this._generateRef(),\n status: 'open',\n evidence: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._disputes.set(dispute.id, dispute);\n this._emit();\n return { ...dispute };\n }\n\n update(id: string, patch: Partial<Pick<JoopDispute, 'description' | 'reason' | 'merchantName' | 'assignedTo'>>): JoopDispute {\n const d = this._require(id);\n Object.assign(d, patch, { updatedAt: Date.now() });\n this._emit();\n return { ...d };\n }\n\n get(id: string): JoopDispute | undefined {\n const d = this._disputes.get(id);\n return d ? { ...d, evidence: [...d.evidence] } : undefined;\n }\n\n getByRef(ref: string): JoopDispute | undefined {\n const d = Array.from(this._disputes.values()).find(d => d.referenceNumber === ref);\n return d ? { ...d } : undefined;\n }\n\n getAll(): JoopDispute[] {\n return Array.from(this._disputes.values()).map(d => ({ ...d, evidence: [...d.evidence] }));\n }\n\n getByStatus(status: JoopDisputeStatus): JoopDispute[] {\n return this.getAll().filter(d => d.status === status);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n startReview(id: string, assignedTo?: string): JoopDispute {\n return this._transition(id, 'under-review', d => { if (assignedTo) d.assignedTo = assignedTo; });\n }\n\n resolve(id: string, resolution: string): JoopDispute {\n return this._transition(id, 'resolved', d => { d.resolution = resolution; d.resolvedAt = Date.now(); });\n }\n\n reject(id: string, reason: string): JoopDispute {\n return this._transition(id, 'rejected', d => { d.rejectionReason = reason; d.resolvedAt = Date.now(); });\n }\n\n escalate(id: string, reason: string): JoopDispute {\n return this._transition(id, 'escalated', d => { d.escalationReason = reason; });\n }\n\n close(id: string): JoopDispute {\n return this._transition(id, 'closed');\n }\n\n // ── Evidence ─────────────────────────────────────────────────────────────\n\n addEvidence(disputeId: string, evidence: Omit<JoopDisputeEvidence, 'id' | 'uploadedAt'>): JoopDisputeEvidence {\n const d = this._require(disputeId);\n if (d.status === 'resolved' || d.status === 'rejected' || d.status === 'closed') {\n throw new Error(`Cannot add evidence to a ${d.status} dispute`);\n }\n const e: JoopDisputeEvidence = { ...evidence, id: _uid(), uploadedAt: Date.now() };\n d.evidence.push(e);\n d.updatedAt = Date.now();\n this._emit();\n return { ...e };\n }\n\n removeEvidence(disputeId: string, evidenceId: string): void {\n const d = this._require(disputeId);\n const before = d.evidence.length;\n d.evidence = d.evidence.filter(e => e.id !== evidenceId);\n if (d.evidence.length < before) { d.updatedAt = Date.now(); this._emit(); }\n }\n\n // ── Stats ────────────────────────────────────────────────────────────────\n\n getStats(): JoopDisputeStats {\n const all = this.getAll();\n return {\n total: all.length,\n open: all.filter(d => d.status === 'open').length,\n underReview: all.filter(d => d.status === 'under-review').length,\n resolved: all.filter(d => d.status === 'resolved').length,\n rejected: all.filter(d => d.status === 'rejected').length,\n escalated: all.filter(d => d.status === 'escalated').length,\n totalAmount: all.reduce((s, d) => s + d.amount, 0),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n disputes$() { return this._disputes$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopDispute {\n const d = this._disputes.get(id);\n if (!d) throw new Error(`Dispute '${id}' not found`);\n return d;\n }\n\n private _transition(id: string, status: JoopDisputeStatus, mutate?: (d: JoopDispute) => void): JoopDispute {\n const d = this._require(id);\n d.status = status;\n d.updatedAt = Date.now();\n if (mutate) mutate(d);\n this._emit();\n return { ...d };\n }\n\n private _generateRef(): string {\n const n = String(this._counter++).padStart(6, '0');\n return `DSP-${new Date().getFullYear()}-${n}`;\n }\n\n private _emit(): void {\n this._disputes$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBillerCategory =\n | 'electricity'\n | 'water'\n | 'gas'\n | 'internet'\n | 'mobile'\n | 'insurance'\n | 'tax'\n | 'subscription'\n | 'rent'\n | 'loan'\n | 'other';\n\nexport type JoopBillStatus = 'pending' | 'paid' | 'overdue' | 'cancelled';\nexport type JoopBillPaymentStatus = 'success' | 'failed' | 'pending' | 'reversed';\n\nexport interface JoopBiller {\n id: string;\n name: string;\n category: JoopBillerCategory;\n accountNumber?: string;\n reference?: string;\n currency: string;\n defaultAmount?: number;\n dueDayOfMonth?: number; // 1-28\n logoUrl?: string;\n notes?: string;\n isActive: boolean;\n createdAt: number;\n}\n\nexport interface JoopBill {\n id: string;\n billerId: string;\n billerName: string;\n amount: number;\n currency: string;\n dueDate: number;\n status: JoopBillStatus;\n reference?: string;\n createdAt: number;\n}\n\nexport interface JoopBillPayment {\n id: string;\n billerId: string;\n billId?: string;\n billerName: string;\n amount: number;\n currency: string;\n status: JoopBillPaymentStatus;\n reference: string;\n fromAccount?: string;\n paidAt: number;\n errorMessage?: string;\n}\n\nexport interface JoopBillPaymentSummary {\n totalPaidThisMonth: number;\n totalPaidThisYear: number;\n paymentCount: number;\n billerCount: number;\n currency: string;\n}\n\nexport class JoopBillPaymentService {\n private _billers = new Map<string, JoopBiller>();\n private _bills = new Map<string, JoopBill>();\n private _payments: JoopBillPayment[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopBillPayment[]>([]);\n\n // ── Billers ───────────────────────────────────────────────────────────────\n\n addBiller(data: Omit<JoopBiller, 'id' | 'createdAt' | 'isActive'>): JoopBiller {\n const biller: JoopBiller = { ...data, id: _uid(), isActive: true, createdAt: Date.now() };\n this._billers.set(biller.id, biller);\n return { ...biller };\n }\n\n updateBiller(id: string, patch: Partial<Omit<JoopBiller, 'id' | 'createdAt'>>): JoopBiller {\n const b = this._requireBiller(id);\n Object.assign(b, patch);\n return { ...b };\n }\n\n removeBiller(id: string): void { this._billers.delete(id); }\n\n getBiller(id: string): JoopBiller | undefined {\n const b = this._billers.get(id);\n return b ? { ...b } : undefined;\n }\n\n getBillers(category?: JoopBillerCategory): JoopBiller[] {\n const all = Array.from(this._billers.values()).filter(b => b.isActive).map(b => ({ ...b }));\n return category ? all.filter(b => b.category === category) : all;\n }\n\n // ── Bills ─────────────────────────────────────────────────────────────────\n\n addBill(data: Omit<JoopBill, 'id' | 'createdAt' | 'status'>): JoopBill {\n const biller = this._billers.get(data.billerId);\n const bill: JoopBill = { ...data, id: _uid(), billerName: biller?.name ?? data.billerName, status: 'pending', createdAt: Date.now() };\n this._bills.set(bill.id, bill);\n return { ...bill };\n }\n\n getBills(billerId?: string): JoopBill[] {\n const all = Array.from(this._bills.values()).map(b => ({ ...b }));\n return billerId ? all.filter(b => b.billerId === billerId) : all;\n }\n\n getOverdueBills(asOf: number = Date.now()): JoopBill[] {\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate < asOf);\n }\n\n getUpcomingBills(days = 7, asOf: number = Date.now()): JoopBill[] {\n const cutoff = asOf + days * 86_400_000;\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate >= asOf && b.dueDate <= cutoff);\n }\n\n // ── Payments ─────────────────────────────────────────────────────────────\n\n pay(billerId: string, amount: number, options: { fromAccount?: string; billId?: string; reference?: string } = {}): JoopBillPayment {\n const biller = this._requireBiller(billerId);\n const payment: JoopBillPayment = {\n id: _uid(),\n billerId,\n billId: options.billId,\n billerName: biller.name,\n amount,\n currency: biller.currency,\n status: 'success',\n reference: options.reference ?? `PAY${Date.now().toString(36).toUpperCase()}`,\n fromAccount: options.fromAccount,\n paidAt: Date.now(),\n };\n this._payments.push(payment);\n\n // Mark bill as paid if billId given\n if (options.billId) {\n const bill = this._bills.get(options.billId);\n if (bill) bill.status = 'paid';\n }\n\n this._payments$.next([...this._payments]);\n return { ...payment };\n }\n\n getPaymentHistory(billerId?: string): JoopBillPayment[] {\n return billerId ? this._payments.filter(p => p.billerId === billerId).map(p => ({ ...p })) : this._payments.map(p => ({ ...p }));\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(): JoopBillPaymentSummary {\n const now = new Date();\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).getTime();\n const yearStart = new Date(now.getFullYear(), 0, 1).getTime();\n const successful = this._payments.filter(p => p.status === 'success');\n\n return {\n totalPaidThisMonth: successful.filter(p => p.paidAt >= monthStart).reduce((s, p) => s + p.amount, 0),\n totalPaidThisYear: successful.filter(p => p.paidAt >= yearStart).reduce((s, p) => s + p.amount, 0),\n paymentCount: successful.length,\n billerCount: this._billers.size,\n currency: 'MIXED',\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _requireBiller(id: string): JoopBiller {\n const b = this._billers.get(id);\n if (!b) throw new Error(`Biller '${id}' not found`);\n return b;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopPaymentUriScheme = 'upi' | 'bitcoin' | 'ethereum' | 'payto' | 'sepa' | 'generic';\n\nexport interface JoopUpiParams {\n pa: string; // payee VPA\n pn?: string; // payee name\n am?: number; // amount\n cu?: string; // currency (default INR)\n tn?: string; // transaction note\n tr?: string; // transaction reference\n mc?: string; // merchant code\n}\n\nexport interface JoopBitcoinParams {\n address: string;\n amount?: number; // BTC\n label?: string;\n message?: string;\n}\n\nexport interface JoopEthereumParams {\n address: string;\n value?: number; // ETH in wei or ETH depending on unit\n gas?: number;\n data?: string;\n}\n\nexport interface JoopPayToParams {\n payId: string; // PayID or BSB+account\n amount?: number;\n currency?: string;\n description?: string;\n}\n\nexport interface JoopSepaParams {\n iban: string;\n bic?: string;\n name?: string;\n amount?: number;\n currency?: string;\n reference?: string;\n purpose?: string;\n}\n\nexport interface JoopPaymentUri {\n scheme: JoopPaymentUriScheme;\n raw: string;\n isValid: boolean;\n errors: string[];\n upi?: JoopUpiParams;\n bitcoin?: JoopBitcoinParams;\n ethereum?: JoopEthereumParams;\n payto?: JoopPayToParams;\n sepa?: JoopSepaParams;\n generic?: { recipient?: string; amount?: number; currency?: string; reference?: string };\n}\n\nexport class JoopPaymentUriService {\n\n // ── Parse ─────────────────────────────────────────────────────────────────\n\n parse(uri: string): JoopPaymentUri {\n const raw = uri.trim();\n\n if (raw.toLowerCase().startsWith('upi://')) return this._parseUpi(raw);\n if (raw.toLowerCase().startsWith('bitcoin:')) return this._parseBitcoin(raw);\n if (raw.toLowerCase().startsWith('ethereum:')) return this._parseEthereum(raw);\n if (raw.toLowerCase().startsWith('payto:')) return this._parsePayTo(raw);\n if (raw.toLowerCase().startsWith('sepa:')) return this._parseSepa(raw);\n\n return { scheme: 'generic', raw, isValid: false, errors: [`Unknown URI scheme: \"${raw.split(':')[0]}\"`] };\n }\n\n // ── Generate ─────────────────────────────────────────────────────────────\n\n generateUpi(params: JoopUpiParams): string {\n if (!params.pa) throw new Error('pa (payee VPA) is required');\n const q = new URLSearchParams();\n q.set('pa', params.pa);\n if (params.pn) q.set('pn', params.pn);\n if (params.am !== undefined) q.set('am', String(params.am));\n if (params.cu) q.set('cu', params.cu);\n if (params.tn) q.set('tn', params.tn);\n if (params.tr) q.set('tr', params.tr);\n if (params.mc) q.set('mc', params.mc);\n return `upi://pay?${q.toString()}`;\n }\n\n generateBitcoin(params: JoopBitcoinParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', String(params.amount));\n if (params.label) q.set('label', params.label);\n if (params.message) q.set('message', params.message);\n const qs = q.toString();\n return `bitcoin:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generateEthereum(params: JoopEthereumParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.value !== undefined) q.set('value', String(params.value));\n if (params.gas !== undefined) q.set('gas', String(params.gas));\n if (params.data) q.set('data', params.data);\n const qs = q.toString();\n return `ethereum:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generatePayTo(params: JoopPayToParams): string {\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', `${params.currency ?? 'AUD'}:${params.amount}`);\n if (params.description) q.set('message', params.description);\n const qs = q.toString();\n return `payto://${params.payId}${qs ? `?${qs}` : ''}`;\n }\n\n generateSepa(params: JoopSepaParams): string {\n const fields = [\n 'BCD', '002', '1', 'SCT',\n params.bic ?? '',\n params.name ?? '',\n params.iban,\n params.amount ? `${params.currency ?? 'EUR'}${params.amount.toFixed(2)}` : '',\n params.purpose ?? '',\n params.reference ?? '',\n ].join('\\n');\n return fields; // EPC QR code payload (not a URI scheme but standard for SEPA)\n }\n\n // ── Validate ─────────────────────────────────────────────────────────────\n\n isValid(uri: string): boolean { return this.parse(uri).isValid; }\n\n getScheme(uri: string): JoopPaymentUriScheme | null {\n const parsed = this.parse(uri);\n return parsed.isValid ? parsed.scheme : null;\n }\n\n // ── Parsers ──────────────────────────────────────────────────────────────\n\n private _parseUpi(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n // upi://pay?pa=vpa&pn=Name&am=100&cu=INR\n const url = new URL(raw);\n if (url.pathname !== 'pay' && url.host !== 'pay') {\n const path = (url.pathname || url.host || '').replace(/^\\//, '');\n if (path && path !== 'pay') errors.push(`Unknown UPI action: ${path}`);\n }\n const pa = url.searchParams.get('pa');\n if (!pa) errors.push('pa (payee VPA) is required');\n else if (!/^[\\w.\\-+]+@[\\w]+$/.test(pa)) errors.push('Invalid VPA format');\n\n const am = url.searchParams.get('am');\n if (am && isNaN(Number(am))) errors.push('am (amount) must be a number');\n\n const params: JoopUpiParams = {\n pa: pa ?? '',\n pn: url.searchParams.get('pn') ?? undefined,\n am: am ? Number(am) : undefined,\n cu: url.searchParams.get('cu') ?? 'INR',\n tn: url.searchParams.get('tn') ?? undefined,\n tr: url.searchParams.get('tr') ?? undefined,\n mc: url.searchParams.get('mc') ?? undefined,\n };\n return { scheme: 'upi', raw, isValid: errors.length === 0, errors, upi: params };\n } catch (e) {\n return { scheme: 'upi', raw, isValid: false, errors: ['Invalid UPI URI'] };\n }\n }\n\n private _parseBitcoin(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('bitcoin:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Bitcoin address is required');\n else if (!/^(bc1|[13])[a-zA-Z0-9]{25,62}$/.test(address)) errors.push('Invalid Bitcoin address format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n if (amount !== undefined && isNaN(amount)) errors.push('amount must be a number');\n\n const params: JoopBitcoinParams = { address, amount, label: q.get('label') ?? undefined, message: q.get('message') ?? undefined };\n return { scheme: 'bitcoin', raw, isValid: errors.length === 0, errors, bitcoin: params };\n }\n\n private _parseEthereum(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('ethereum:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Ethereum address is required');\n else if (!/^0x[0-9a-fA-F]{40}$/.test(address)) errors.push('Invalid Ethereum address (expected 0x + 40 hex chars)');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const value = q.get('value') ? Number(q.get('value')) : undefined;\n const params: JoopEthereumParams = { address, value, gas: q.get('gas') ? Number(q.get('gas')) : undefined, data: q.get('data') ?? undefined };\n return { scheme: 'ethereum', raw, isValid: errors.length === 0, errors, ethereum: params };\n }\n\n private _parsePayTo(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n const url = new URL(raw);\n const payId = url.hostname + (url.pathname || '');\n if (!payId) errors.push('PayID is required');\n\n const amountParam = url.searchParams.get('amount');\n let amount: number | undefined;\n let currency: string | undefined;\n if (amountParam) {\n const match = amountParam.match(/^([A-Z]{3}):?([\\d.]+)$/);\n if (match) { currency = match[1]; amount = Number(match[2]); }\n else errors.push('amount format: CCY:amount (e.g. AUD:50.00)');\n }\n const params: JoopPayToParams = { payId, amount, currency, description: url.searchParams.get('message') ?? undefined };\n return { scheme: 'payto', raw, isValid: errors.length === 0, errors, payto: params };\n } catch {\n return { scheme: 'payto', raw, isValid: false, errors: ['Invalid PayTo URI'] };\n }\n }\n\n private _parseSepa(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n // SEPA \"sepa:IBAN?name=X&amount=100&currency=EUR&reference=Y\"\n const [ibanPart, queryPart] = raw.slice('sepa:'.length).split('?');\n const iban = ibanPart.trim().replace(/\\s/g, '');\n if (!iban) errors.push('IBAN is required');\n else if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{11,30}$/.test(iban)) errors.push('Invalid IBAN format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n const params: JoopSepaParams = {\n iban, bic: q.get('bic') ?? undefined, name: q.get('name') ?? undefined,\n amount, currency: q.get('currency') ?? 'EUR',\n reference: q.get('reference') ?? undefined, purpose: q.get('purpose') ?? undefined,\n };\n return { scheme: 'sepa', raw, isValid: errors.length === 0, errors, sepa: params };\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopMandateType = 'nach' | 'upi-autopay' | 'standing-instruction' | 'direct-debit';\nexport type JoopMandateStatus = 'pending' | 'active' | 'paused' | 'cancelled' | 'expired' | 'failed';\nexport type JoopMandateFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly' | 'as-presented';\nexport type JoopMandateExecutionStatus = 'success' | 'failed' | 'pending';\n\nexport interface JoopMandate {\n id: string;\n ref: string;\n type: JoopMandateType;\n status: JoopMandateStatus;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n executionCount: number;\n lastExecutedAt?: number;\n nextExecutionAt?: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopMandateExecution {\n id: string;\n mandateId: string;\n amount: number;\n status: JoopMandateExecutionStatus;\n date: number;\n failureReason?: string;\n}\n\nexport class JoopMandateService {\n private _mandates = new Map<string, JoopMandate>();\n private _executions = new Map<string, JoopMandateExecution[]>();\n private _counter = 0;\n private _change$ = new JoopSubject<JoopMandate>();\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: {\n type: JoopMandateType;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n }): JoopMandate {\n if (data.maxAmount <= 0) throw new Error('maxAmount must be positive');\n const now = Date.now();\n const mandate: JoopMandate = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'pending',\n executionCount: 0,\n createdAt: now,\n updatedAt: now,\n nextExecutionAt: this._computeNextDate({ frequency: data.frequency, startDate: data.startDate } as JoopMandate, data.startDate),\n ...data,\n };\n this._mandates.set(mandate.id, mandate);\n this._executions.set(mandate.id, []);\n return { ...mandate };\n }\n\n get(id: string): JoopMandate | undefined {\n const m = this._mandates.get(id);\n return m ? { ...m } : undefined;\n }\n\n getAll(): JoopMandate[] {\n return Array.from(this._mandates.values()).map(m => ({ ...m }));\n }\n\n // ── State transitions ─────────────────────────────────────────────────────\n\n activate(id: string): JoopMandate { return this._transition(id, 'active'); }\n cancel(id: string): JoopMandate { return this._transition(id, 'cancelled'); }\n pause(id: string): JoopMandate { return this._transition(id, 'paused', m => { if (m.status !== 'active') throw new Error('Only active mandates can be paused'); }); }\n resume(id: string): JoopMandate { return this._transition(id, 'active', m => { if (m.status !== 'paused') throw new Error('Only paused mandates can be resumed'); }); }\n fail(id: string): JoopMandate { return this._transition(id, 'failed'); }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getActive(): JoopMandate[] { return this._byStatus('active'); }\n\n getByAccount(accountId: string): JoopMandate[] {\n return this.getAll().filter(m => m.accountId === accountId);\n }\n\n getByStatus(status: JoopMandateStatus): JoopMandate[] { return this._byStatus(status); }\n\n getDue(asOf: number = Date.now()): JoopMandate[] {\n return this.getActive().filter(m => m.nextExecutionAt !== undefined && m.nextExecutionAt <= asOf && !this.isExpired(m));\n }\n\n isExpired(mandate: JoopMandate): boolean {\n return mandate.endDate !== undefined && Date.now() > mandate.endDate;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n recordExecution(mandateId: string, amount: number, status: JoopMandateExecutionStatus, failureReason?: string): JoopMandateExecution {\n const m = this._require(mandateId);\n if (amount > m.maxAmount) throw new Error(`Execution amount ${amount} exceeds mandate max ${m.maxAmount}`);\n\n const exec: JoopMandateExecution = { id: _uid(), mandateId, amount, status, date: Date.now(), failureReason };\n this._executions.get(mandateId)!.push(exec);\n\n if (status === 'success') {\n m.executionCount++;\n m.lastExecutedAt = exec.date;\n m.nextExecutionAt = this.computeNextDate(m, exec.date);\n }\n if (status === 'failed' && !failureReason) exec.failureReason = 'Unknown';\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...exec };\n }\n\n getExecutions(mandateId: string): JoopMandateExecution[] {\n return [...(this._executions.get(mandateId) ?? [])];\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(mandate: JoopMandate, fromDate: number = Date.now()): number | undefined {\n return this._computeNextDate(mandate, fromDate);\n }\n\n // ── Observable ────────────────────────────────────────────────────────────\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopMandate {\n const m = this._mandates.get(id);\n if (!m) throw new Error(`Mandate '${id}' not found`);\n return m;\n }\n\n private _transition(id: string, status: JoopMandateStatus, validate?: (m: JoopMandate) => void): JoopMandate {\n const m = this._require(id);\n if (validate) validate(m);\n m.status = status;\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...m };\n }\n\n private _byStatus(status: JoopMandateStatus): JoopMandate[] {\n return this.getAll().filter(m => m.status === status);\n }\n\n private _computeNextDate(mandate: Pick<JoopMandate, 'frequency' | 'startDate'>, from: number): number | undefined {\n const d = new Date(from);\n switch (mandate.frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n case 'as-presented': return undefined;\n }\n return d.getTime();\n }\n\n private _generateRef(): string {\n this._counter++;\n return `MND-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopSplitMethod = 'equal' | 'percentage' | 'exact' | 'shares';\nexport type JoopSplitStatus = 'open' | 'partial' | 'settled' | 'cancelled';\nexport type JoopSplitParticipantStatus = 'pending' | 'paid' | 'partial';\n\nexport interface JoopSplitParticipant {\n id: string;\n name: string;\n share: number; // amount owed\n paid: number; // amount paid so far\n status: JoopSplitParticipantStatus;\n}\n\nexport interface JoopSplitExpense {\n id: string;\n title: string;\n totalAmount: number;\n currency: string;\n paidBy: string; // name of person who fronted the expense\n method: JoopSplitMethod;\n participants: JoopSplitParticipant[];\n status: JoopSplitStatus;\n notes?: string;\n createdAt: number;\n settledAt?: number;\n}\n\nexport interface JoopSplitSettlement {\n from: string;\n to: string;\n amount: number;\n}\n\nexport interface JoopSplitBalance {\n name: string;\n owes: number; // total owed to others\n owed: number; // total others owe you\n net: number; // positive = you are owed, negative = you owe\n}\n\nexport class JoopSplitPaymentService {\n private _expenses = new Map<string, JoopSplitExpense>();\n private _change$ = new JoopSubject<JoopSplitExpense>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n create(\n title: string,\n totalAmount: number,\n paidBy: string,\n participantNames: string[],\n options: {\n method?: JoopSplitMethod;\n currency?: string;\n notes?: string;\n amounts?: number[]; // for 'exact'\n percentages?: number[]; // for 'percentage'\n shares?: number[]; // for 'shares'\n } = {},\n ): JoopSplitExpense {\n if (totalAmount <= 0) throw new Error('totalAmount must be positive');\n if (participantNames.length === 0) throw new Error('At least one participant required');\n\n const method = options.method ?? 'equal';\n const shares = this._computeShares(totalAmount, participantNames.length, method, options);\n\n const participants: JoopSplitParticipant[] = participantNames.map((name, i) => ({\n id: _uid(), name, share: shares[i], paid: 0, status: 'pending',\n }));\n\n const expense: JoopSplitExpense = {\n id: _uid(), title, totalAmount, currency: options.currency ?? 'USD',\n paidBy, method, participants, status: 'open',\n notes: options.notes, createdAt: Date.now(),\n };\n this._expenses.set(expense.id, expense);\n return this._snapshot(expense);\n }\n\n // ── Payment recording ─────────────────────────────────────────────────────\n\n recordPayment(expenseId: string, participantId: string, amount: number): JoopSplitExpense {\n const e = this._require(expenseId);\n if (e.status === 'settled' || e.status === 'cancelled') throw new Error(`Expense is ${e.status}`);\n const p = e.participants.find(x => x.id === participantId);\n if (!p) throw new Error(`Participant '${participantId}' not found`);\n if (amount <= 0) throw new Error('Payment amount must be positive');\n\n p.paid = _round(p.paid + amount);\n p.paid = Math.min(p.paid, p.share); // cap at share\n p.status = p.paid >= p.share ? 'paid' : 'partial';\n\n this._updateStatus(e);\n this._change$.next(this._snapshot(e));\n return this._snapshot(e);\n }\n\n // ── Status ────────────────────────────────────────────────────────────────\n\n settle(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'settled';\n e.settledAt = Date.now();\n this._change$.next(this._snapshot(e));\n }\n\n cancel(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'cancelled';\n this._change$.next(this._snapshot(e));\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopSplitExpense | undefined {\n const e = this._expenses.get(id);\n return e ? this._snapshot(e) : undefined;\n }\n\n getAll(): JoopSplitExpense[] {\n return Array.from(this._expenses.values()).map(e => this._snapshot(e));\n }\n\n getOpen(): JoopSplitExpense[] {\n return this.getAll().filter(e => e.status === 'open' || e.status === 'partial');\n }\n\n // ── Settlements ───────────────────────────────────────────────────────────\n\n getSettlements(expenseId: string): JoopSplitSettlement[] {\n const e = this._require(expenseId);\n // Each participant who hasn't fully paid owes the difference to paidBy\n return e.participants\n .filter(p => p.paid < p.share && p.name !== e.paidBy)\n .map(p => ({ from: p.name, to: e.paidBy, amount: _round(p.share - p.paid) }));\n }\n\n getSimplifiedSettlements(expenseId: string): JoopSplitSettlement[] {\n return this.getSettlements(expenseId);\n }\n\n // ── Balance ───────────────────────────────────────────────────────────────\n\n getBalance(name: string): JoopSplitBalance {\n let owes = 0;\n let owed = 0;\n\n for (const e of this.getOpen()) {\n const p = e.participants.find(x => x.name === name);\n if (p && e.paidBy !== name) owes += Math.max(0, p.share - p.paid);\n if (e.paidBy === name) {\n for (const other of e.participants) {\n if (other.name !== name) owed += Math.max(0, other.share - other.paid);\n }\n }\n }\n\n return { name, owes: _round(owes), owed: _round(owed), net: _round(owed - owes) };\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(expenseId: string): { total: number; paid: number; remaining: number; participantCount: number; status: JoopSplitStatus } {\n const e = this._require(expenseId);\n const paid = e.participants.reduce((s, p) => s + p.paid, 0);\n return {\n total: e.totalAmount,\n paid: _round(paid),\n remaining: _round(e.totalAmount - paid),\n participantCount: e.participants.length,\n status: e.status,\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _computeShares(total: number, n: number, method: JoopSplitMethod, opts: { amounts?: number[]; percentages?: number[]; shares?: number[] }): number[] {\n switch (method) {\n case 'equal': {\n const each = _round(total / n);\n const arr = Array(n).fill(each);\n // Fix rounding: add/subtract diff on first participant\n const diff = _round(total - arr.reduce((s, x) => s + x, 0));\n arr[0] = _round(arr[0] + diff);\n return arr;\n }\n case 'exact': {\n const amounts = opts.amounts ?? [];\n if (amounts.length !== n) throw new Error('amounts length must match participant count');\n const sum = amounts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - total) > 0.01) throw new Error('Exact amounts must sum to totalAmount');\n return amounts.map(a => _round(a));\n }\n case 'percentage': {\n const pcts = opts.percentages ?? [];\n if (pcts.length !== n) throw new Error('percentages length must match participant count');\n const sum = pcts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - 100) > 0.01) throw new Error('Percentages must sum to 100');\n return pcts.map(p => _round((p / 100) * total));\n }\n case 'shares': {\n const sh = opts.shares ?? Array(n).fill(1);\n if (sh.length !== n) throw new Error('shares length must match participant count');\n const totalShares = sh.reduce((s, x) => s + x, 0);\n return sh.map(s => _round((s / totalShares) * total));\n }\n }\n }\n\n private _updateStatus(e: JoopSplitExpense): void {\n const allPaid = e.participants.every(p => p.status === 'paid');\n const nonePaid = e.participants.every(p => p.paid === 0);\n if (allPaid) { e.status = 'settled'; e.settledAt = Date.now(); }\n else if (nonePaid) e.status = 'open';\n else e.status = 'partial';\n }\n\n private _require(id: string): JoopSplitExpense {\n const e = this._expenses.get(id);\n if (!e) throw new Error(`Expense '${id}' not found`);\n return e;\n }\n\n private _snapshot(e: JoopSplitExpense): JoopSplitExpense {\n return { ...e, participants: e.participants.map(p => ({ ...p })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\nfunction _round(n: number): number { return parseFloat(n.toFixed(2)); }\n","import { JoopSubject } from '../events';\n\nexport type JoopChequeStatus =\n | 'available' | 'issued' | 'presented' | 'cleared' | 'bounced' | 'stopped' | 'cancelled' | 'expired';\n\nexport interface JoopChequeLeaf {\n chequeNumber: string;\n chequebookId: string;\n accountId: string;\n status: JoopChequeStatus;\n issuedTo?: string;\n amount?: number;\n issuedAt?: number;\n presentedAt?: number;\n clearedAt?: number;\n stoppedAt?: number;\n stopReason?: string;\n bounceReason?: string;\n expiresAt?: number;\n notes?: string;\n}\n\nexport interface JoopChequebook {\n id: string;\n accountId: string;\n seriesStart: string;\n seriesEnd: string;\n leaves: JoopChequeLeaf[];\n issuedAt: number;\n isActive: boolean;\n}\n\nexport interface JoopChequebookStats {\n total: number;\n available: number;\n issued: number;\n presented: number;\n cleared: number;\n bounced: number;\n stopped: number;\n cancelled: number;\n expired: number;\n}\n\nexport class JoopChequebookService {\n private _books = new Map<string, JoopChequebook>();\n private _leafIndex = new Map<string, JoopChequeLeaf>(); // chequeNumber → leaf\n private _change$ = new JoopSubject<JoopChequeLeaf>();\n\n // ── Chequebook management ─────────────────────────────────────────────────\n\n addChequebook(accountId: string, seriesStart: string, seriesEnd: string): JoopChequebook {\n const leaves = this._generateLeaves(accountId, 'pending-id', seriesStart, seriesEnd);\n const book: JoopChequebook = {\n id: _uid(), accountId, seriesStart, seriesEnd,\n leaves: [], issuedAt: Date.now(), isActive: true,\n };\n // patch chequebookId\n leaves.forEach(l => { l.chequebookId = book.id; book.leaves.push(l); this._leafIndex.set(l.chequeNumber, l); });\n this._books.set(book.id, book);\n return this._snapshotBook(book);\n }\n\n getChequebook(id: string): JoopChequebook | undefined {\n const b = this._books.get(id);\n return b ? this._snapshotBook(b) : undefined;\n }\n\n getByAccount(accountId: string): JoopChequebook[] {\n return Array.from(this._books.values()).filter(b => b.accountId === accountId).map(b => this._snapshotBook(b));\n }\n\n deactivateChequebook(id: string): void {\n const b = this._books.get(id);\n if (!b) throw new Error(`Chequebook '${id}' not found`);\n b.isActive = false;\n }\n\n // ── Leaf operations ───────────────────────────────────────────────────────\n\n issueCheque(chequeNumber: string, issuedTo: string, amount: number, options: { expiresAt?: number; notes?: string } = {}): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'available') throw new Error(`Cheque ${chequeNumber} is not available (status: ${leaf.status})`);\n if (amount <= 0) throw new Error('Amount must be positive');\n leaf.status = 'issued';\n leaf.issuedTo = issuedTo;\n leaf.amount = amount;\n leaf.issuedAt = Date.now();\n leaf.expiresAt = options.expiresAt;\n leaf.notes = options.notes;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n stopPayment(chequeNumber: string, reason: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot stop a cleared cheque');\n if (leaf.status === 'stopped') throw new Error('Cheque is already stopped');\n leaf.status = 'stopped';\n leaf.stoppedAt = Date.now();\n leaf.stopReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markPresented(chequeNumber: string, presentedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'issued') throw new Error(`Cheque must be in 'issued' status to present (current: ${leaf.status})`);\n leaf.status = 'presented';\n leaf.presentedAt = presentedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markCleared(chequeNumber: string, clearedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented') throw new Error(`Cheque must be in 'presented' status to clear (current: ${leaf.status})`);\n leaf.status = 'cleared';\n leaf.clearedAt = clearedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markBounced(chequeNumber: string, reason = 'Insufficient funds'): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented' && leaf.status !== 'issued') throw new Error(`Cannot bounce cheque in status '${leaf.status}'`);\n leaf.status = 'bounced';\n leaf.bounceReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n cancelCheque(chequeNumber: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot cancel a cleared cheque');\n leaf.status = 'cancelled';\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLeaf(chequeNumber: string): JoopChequeLeaf | undefined {\n const l = this._leafIndex.get(chequeNumber);\n return l ? { ...l } : undefined;\n }\n\n getByStatus(status: JoopChequeStatus, accountId?: string): JoopChequeLeaf[] {\n let leaves = Array.from(this._leafIndex.values()).filter(l => l.status === status);\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n return leaves.map(l => ({ ...l }));\n }\n\n getAvailableLeaves(accountId?: string): JoopChequeLeaf[] {\n return this.getByStatus('available', accountId);\n }\n\n isValid(chequeNumber: string): boolean {\n const leaf = this._leafIndex.get(chequeNumber);\n if (!leaf) return false;\n if (!['available', 'issued'].includes(leaf.status)) return false;\n if (leaf.expiresAt && Date.now() > leaf.expiresAt) return false;\n return true;\n }\n\n getStats(accountId?: string): JoopChequebookStats {\n let leaves = Array.from(this._leafIndex.values());\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n const count = (s: JoopChequeStatus) => leaves.filter(l => l.status === s).length;\n return {\n total: leaves.length,\n available: count('available'), issued: count('issued'), presented: count('presented'),\n cleared: count('cleared'), bounced: count('bounced'), stopped: count('stopped'),\n cancelled: count('cancelled'), expired: count('expired'),\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _requireLeaf(chequeNumber: string): JoopChequeLeaf {\n const l = this._leafIndex.get(chequeNumber);\n if (!l) throw new Error(`Cheque '${chequeNumber}' not found`);\n return l;\n }\n\n private _generateLeaves(accountId: string, chequebookId: string, start: string, end: string): JoopChequeLeaf[] {\n const startNum = parseInt(start, 10);\n const endNum = parseInt(end, 10);\n if (isNaN(startNum) || isNaN(endNum) || endNum < startNum) throw new Error('Invalid cheque series range');\n const padLen = start.length;\n const leaves: JoopChequeLeaf[] = [];\n for (let n = startNum; n <= endNum; n++) {\n leaves.push({ chequeNumber: String(n).padStart(padLen, '0'), chequebookId, accountId, status: 'available' });\n }\n return leaves;\n }\n\n private _snapshotBook(b: JoopChequebook): JoopChequebook {\n return { ...b, leaves: b.leaves.map(l => ({ ...l })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopInsuranceType = 'life' | 'health' | 'auto' | 'home' | 'travel' | 'business' | 'other';\nexport type JoopPolicyStatus = 'active' | 'expired' | 'cancelled' | 'lapsed' | 'pending';\nexport type JoopClaimStatus = 'submitted' | 'under-review' | 'approved' | 'rejected' | 'paid' | 'withdrawn';\nexport type JoopPremiumFrequency = 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\n\nexport interface JoopInsurancePolicy {\n id: string;\n type: JoopInsuranceType;\n policyNumber: string;\n insurer: string;\n holderName: string;\n coverageAmount: number;\n premiumAmount: number;\n premiumFrequency: JoopPremiumFrequency;\n status: JoopPolicyStatus;\n startDate: number;\n endDate: number;\n nextPremiumDate?: number;\n deductible?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopInsuranceClaim {\n id: string;\n claimNumber: string;\n policyId: string;\n amount: number;\n status: JoopClaimStatus;\n description: string;\n documents: string[];\n submittedAt: number;\n resolvedAt?: number;\n paidAmount?: number;\n rejectionReason?: string;\n}\n\nexport interface JoopPremiumPayment {\n id: string;\n policyId: string;\n amount: number;\n date: number;\n method?: string;\n}\n\nconst FREQ_MONTHS: Record<JoopPremiumFrequency, number> = {\n monthly: 1, quarterly: 3, 'half-yearly': 6, yearly: 12,\n};\n\nexport class JoopInsuranceService {\n private _policies = new Map<string, JoopInsurancePolicy>();\n private _claims = new Map<string, JoopInsuranceClaim>();\n private _payments = new Map<string, JoopPremiumPayment[]>(); // policyId → payments\n private _claimCounter = 0;\n private _change$ = new JoopSubject<JoopInsurancePolicy>();\n\n // ── Policies ──────────────────────────────────────────────────────────────\n\n addPolicy(data: Omit<JoopInsurancePolicy, 'id' | 'createdAt' | 'updatedAt'>): JoopInsurancePolicy {\n if (data.coverageAmount <= 0) throw new Error('coverageAmount must be positive');\n if (data.premiumAmount <= 0) throw new Error('premiumAmount must be positive');\n if (data.endDate <= data.startDate) throw new Error('endDate must be after startDate');\n const now = Date.now();\n const policy: JoopInsurancePolicy = { ...data, id: _uid(), createdAt: now, updatedAt: now };\n this._policies.set(policy.id, policy);\n this._payments.set(policy.id, []);\n this._change$.next({ ...policy });\n return { ...policy };\n }\n\n updatePolicy(id: string, patch: Partial<Omit<JoopInsurancePolicy, 'id' | 'createdAt'>>): JoopInsurancePolicy {\n const p = this._require(id);\n Object.assign(p, patch, { updatedAt: Date.now() });\n this._change$.next({ ...p });\n return { ...p };\n }\n\n cancelPolicy(id: string, reason?: string): JoopInsurancePolicy {\n const p = this._require(id);\n if (p.status === 'cancelled') throw new Error('Policy is already cancelled');\n p.status = 'cancelled';\n if (reason) p.notes = reason;\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n renewPolicy(id: string, newEndDate: number): JoopInsurancePolicy {\n const p = this._require(id);\n if (newEndDate <= p.endDate) throw new Error('newEndDate must be after current endDate');\n p.endDate = newEndDate;\n p.status = 'active';\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n getPolicy(id: string): JoopInsurancePolicy | undefined {\n const p = this._policies.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopInsurancePolicy[] {\n return Array.from(this._policies.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getByType(type: JoopInsuranceType): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.type === type);\n }\n\n getExpiring(withinDays: number, asOf = Date.now()): JoopInsurancePolicy[] {\n const cutoff = asOf + withinDays * 86_400_000;\n return this.getActive().filter(p => p.endDate <= cutoff && p.endDate > asOf);\n }\n\n // ── Claims ────────────────────────────────────────────────────────────────\n\n fileClaim(policyId: string, amount: number, description: string, documents: string[] = []): JoopInsuranceClaim {\n const p = this._require(policyId);\n if (p.status !== 'active') throw new Error(`Cannot file claim on a ${p.status} policy`);\n if (amount <= 0) throw new Error('Claim amount must be positive');\n if (amount > p.coverageAmount) throw new Error(`Claim amount exceeds coverage (${p.coverageAmount})`);\n this._claimCounter++;\n const claim: JoopInsuranceClaim = {\n id: _uid(),\n claimNumber: `CLM-${new Date().getFullYear()}-${String(this._claimCounter).padStart(6, '0')}`,\n policyId, amount, description, documents,\n status: 'submitted', submittedAt: Date.now(),\n };\n this._claims.set(claim.id, claim);\n return { ...claim };\n }\n\n updateClaim(id: string, status: JoopClaimStatus, options: { paidAmount?: number; rejectionReason?: string } = {}): JoopInsuranceClaim {\n const c = this._requireClaim(id);\n c.status = status;\n if (status === 'paid' || status === 'rejected' || status === 'withdrawn') c.resolvedAt = Date.now();\n if (options.paidAmount !== undefined) c.paidAmount = options.paidAmount;\n if (options.rejectionReason) c.rejectionReason = options.rejectionReason;\n return { ...c };\n }\n\n getClaims(policyId?: string): JoopInsuranceClaim[] {\n const all = Array.from(this._claims.values()).map(c => ({ ...c }));\n return policyId ? all.filter(c => c.policyId === policyId) : all;\n }\n\n // ── Premium payments ──────────────────────────────────────────────────────\n\n recordPremiumPayment(policyId: string, amount: number, method?: string): JoopPremiumPayment {\n this._require(policyId);\n const payment: JoopPremiumPayment = { id: _uid(), policyId, amount, date: Date.now(), method };\n this._payments.get(policyId)!.push(payment);\n // Advance nextPremiumDate\n const p = this._policies.get(policyId)!;\n const base = p.nextPremiumDate ?? Date.now();\n const d = new Date(base);\n d.setMonth(d.getMonth() + FREQ_MONTHS[p.premiumFrequency]);\n p.nextPremiumDate = d.getTime();\n p.updatedAt = Date.now();\n return { ...payment };\n }\n\n getPremiumHistory(policyId: string): JoopPremiumPayment[] {\n return [...(this._payments.get(policyId) ?? [])];\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getTotalCoverage(): number {\n return this.getActive().reduce((s, p) => s + p.coverageAmount, 0);\n }\n\n getTotalAnnualPremium(): number {\n const YEARLY_FACTOR: Record<JoopPremiumFrequency, number> = {\n monthly: 12, quarterly: 4, 'half-yearly': 2, yearly: 1,\n };\n return this.getActive().reduce((s, p) => s + p.premiumAmount * YEARLY_FACTOR[p.premiumFrequency], 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopInsurancePolicy {\n const p = this._policies.get(id);\n if (!p) throw new Error(`Policy '${id}' not found`);\n return p;\n }\n\n private _requireClaim(id: string): JoopInsuranceClaim {\n const c = this._claims.get(id);\n if (!c) throw new Error(`Claim '${id}' not found`);\n return c;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopRemittanceStatus = 'initiated' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'returned';\nexport type JoopRemittanceChannel = 'swift' | 'sepa' | 'ach' | 'wire' | 'crypto' | 'mobile-money' | 'cash-pickup';\n\nexport interface JoopRemittanceQuote {\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n estimatedArrivalMs: number;\n channel: JoopRemittanceChannel;\n}\n\nexport interface JoopRemittance {\n id: string;\n ref: string;\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n status: JoopRemittanceStatus;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientBankCode?: string;\n recipientCountry: string;\n purposeCode?: string;\n notes?: string;\n initiatedAt: number;\n completedAt?: number;\n estimatedArrival?: number;\n}\n\nconst DEFAULT_FEES: Record<JoopRemittanceChannel, number> = {\n swift: 25, sepa: 0.5, ach: 0.25, wire: 20, crypto: 1, 'mobile-money': 2, 'cash-pickup': 5,\n};\n\nconst ARRIVAL_MS: Record<JoopRemittanceChannel, number> = {\n swift: 3 * 86_400_000, sepa: 86_400_000, ach: 2 * 86_400_000, wire: 86_400_000,\n crypto: 30 * 60_000, 'mobile-money': 10 * 60_000, 'cash-pickup': 2 * 60_000,\n};\n\nexport class JoopRemittanceService {\n private _remittances = new Map<string, JoopRemittance>();\n private _rates = new Map<string, number>(); // \"USD:EUR\" → rate\n private _fees = new Map<string, number>(); // channel → flat fee override\n private _counter = 0;\n private _change$ = new JoopSubject<JoopRemittance>();\n\n // ── FX rates & fees ───────────────────────────────────────────────────────\n\n setExchangeRate(from: string, to: string, rate: number): void {\n this._rates.set(_rateKey(from, to), rate);\n this._rates.set(_rateKey(to, from), parseFloat((1 / rate).toFixed(6)));\n }\n\n getExchangeRate(from: string, to: string): number | null {\n return this._rates.get(_rateKey(from, to)) ?? null;\n }\n\n setChannelFee(channel: JoopRemittanceChannel, fee: number): void {\n this._fees.set(channel, fee);\n }\n\n getFee(channel: JoopRemittanceChannel): number {\n return this._fees.get(channel) ?? DEFAULT_FEES[channel];\n }\n\n // ── Quote ─────────────────────────────────────────────────────────────────\n\n getQuote(\n sendAmount: number,\n sendCurrency: string,\n receiveCurrency: string,\n channel: JoopRemittanceChannel = 'swift',\n ): JoopRemittanceQuote {\n if (sendAmount <= 0) throw new Error('sendAmount must be positive');\n const rate = sendCurrency === receiveCurrency ? 1 : (this._rates.get(_rateKey(sendCurrency, receiveCurrency)) ?? null);\n if (rate === null) throw new Error(`No exchange rate set for ${sendCurrency} → ${receiveCurrency}`);\n const fee = this.getFee(channel);\n const receiveAmount = parseFloat(((sendAmount - fee) * rate).toFixed(2));\n if (receiveAmount <= 0) throw new Error('Send amount is too small to cover the fee');\n return {\n sendAmount, sendCurrency, receiveAmount, receiveCurrency,\n exchangeRate: rate, fee,\n totalDebit: parseFloat((sendAmount + fee).toFixed(2)),\n estimatedArrivalMs: ARRIVAL_MS[channel],\n channel,\n };\n }\n\n // ── Initiate ──────────────────────────────────────────────────────────────\n\n initiate(data: {\n sendAmount: number;\n sendCurrency: string;\n receiveCurrency: string;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientCountry: string;\n recipientBankCode?: string;\n purposeCode?: string;\n notes?: string;\n }): JoopRemittance {\n const quote = this.getQuote(data.sendAmount, data.sendCurrency, data.receiveCurrency, data.channel);\n const now = Date.now();\n const remittance: JoopRemittance = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'initiated',\n ...quote,\n senderName: data.senderName,\n senderAccount: data.senderAccount,\n recipientName: data.recipientName,\n recipientAccount: data.recipientAccount,\n recipientBankCode: data.recipientBankCode,\n recipientCountry: data.recipientCountry,\n purposeCode: data.purposeCode,\n notes: data.notes,\n initiatedAt: now,\n estimatedArrival: now + quote.estimatedArrivalMs,\n };\n this._remittances.set(remittance.id, remittance);\n this._change$.next({ ...remittance });\n return { ...remittance };\n }\n\n // ── Status management ─────────────────────────────────────────────────────\n\n cancel(id: string): JoopRemittance {\n return this._transition(id, 'cancelled', r => {\n if (!['initiated', 'processing'].includes(r.status)) throw new Error(`Cannot cancel remittance in '${r.status}' status`);\n });\n }\n\n updateStatus(id: string, status: JoopRemittanceStatus, options: { notes?: string } = {}): JoopRemittance {\n return this._transition(id, status, r => {\n if (options.notes) r.notes = options.notes;\n if (status === 'completed') r.completedAt = Date.now();\n });\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getById(id: string): JoopRemittance | undefined {\n const r = this._remittances.get(id);\n return r ? { ...r } : undefined;\n }\n\n getByRef(ref: string): JoopRemittance | undefined {\n return Array.from(this._remittances.values()).find(r => r.ref === ref);\n }\n\n getByStatus(status: JoopRemittanceStatus): JoopRemittance[] {\n return Array.from(this._remittances.values()).filter(r => r.status === status).map(r => ({ ...r }));\n }\n\n getHistory(limit?: number): JoopRemittance[] {\n const all = Array.from(this._remittances.values()).sort((a, b) => b.initiatedAt - a.initiatedAt);\n return (limit ? all.slice(0, limit) : all).map(r => ({ ...r }));\n }\n\n getTotalSent(currency?: string): number {\n return Array.from(this._remittances.values())\n .filter(r => r.status === 'completed' && (!currency || r.sendCurrency === currency))\n .reduce((s, r) => s + r.sendAmount, 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _transition(id: string, status: JoopRemittanceStatus, mutate?: (r: JoopRemittance) => void): JoopRemittance {\n const r = this._remittances.get(id);\n if (!r) throw new Error(`Remittance '${id}' not found`);\n if (mutate) mutate(r);\n r.status = status;\n this._change$.next({ ...r });\n return { ...r };\n }\n\n private _generateRef(): string {\n this._counter++;\n return `RMT-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _rateKey(from: string, to: string): string { return `${from.toUpperCase()}:${to.toUpperCase()}`; }\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopVirtualAccountStatus = 'active' | 'inactive' | 'closed';\nexport type JoopVirtualAccountPurpose = 'collection' | 'escrow' | 'payroll' | 'vendor' | 'customer' | 'project' | 'other';\n\nexport interface JoopVirtualAccount {\n id: string;\n accountNumber: string;\n iban?: string;\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n status: JoopVirtualAccountStatus;\n currency: string;\n collectedAmount: number;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopVirtualCredit {\n id: string;\n virtualAccountId: string;\n amount: number;\n currency: string;\n senderName?: string;\n senderRef?: string;\n receivedAt: number;\n notes?: string;\n}\n\nexport class JoopVirtualAccountService {\n private _accounts = new Map<string, JoopVirtualAccount>();\n private _credits = new Map<string, JoopVirtualCredit[]>(); // vaId → credits\n private _counter = 0;\n private _change$ = new JoopSubject<JoopVirtualAccount>();\n\n // ── Create / manage ───────────────────────────────────────────────────────\n\n create(data: {\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n currency?: string;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n ibanPrefix?: string;\n }): JoopVirtualAccount {\n const now = Date.now();\n const accountNumber = this.generateAccountNumber();\n const va: JoopVirtualAccount = {\n id: _uid(),\n accountNumber,\n iban: data.ibanPrefix ? `${data.ibanPrefix}${accountNumber}` : undefined,\n parentAccountId: data.parentAccountId,\n label: data.label,\n purpose: data.purpose,\n status: 'active',\n currency: data.currency ?? 'USD',\n collectedAmount: 0,\n expectedAmount: data.expectedAmount,\n reference: data.reference,\n expiresAt: data.expiresAt,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n };\n this._accounts.set(va.id, va);\n this._credits.set(va.id, []);\n this._change$.next({ ...va });\n return { ...va };\n }\n\n close(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'closed');\n }\n\n deactivate(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'inactive');\n }\n\n activate(id: string): JoopVirtualAccount {\n const va = this._require(id);\n if (va.status === 'closed') throw new Error('Cannot activate a closed virtual account');\n return this._setStatus(id, 'active');\n }\n\n update(id: string, patch: Partial<Pick<JoopVirtualAccount, 'label' | 'expectedAmount' | 'reference' | 'expiresAt' | 'metadata'>>): JoopVirtualAccount {\n const va = this._require(id);\n Object.assign(va, patch, { updatedAt: Date.now() });\n this._change$.next({ ...va });\n return { ...va };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopVirtualAccount | undefined {\n const va = this._accounts.get(id);\n return va ? { ...va } : undefined;\n }\n\n getAll(): JoopVirtualAccount[] {\n return Array.from(this._accounts.values()).map(va => ({ ...va }));\n }\n\n getActive(parentAccountId?: string): JoopVirtualAccount[] {\n let list = this.getAll().filter(va => va.status === 'active');\n if (parentAccountId) list = list.filter(va => va.parentAccountId === parentAccountId);\n return list;\n }\n\n getByReference(reference: string): JoopVirtualAccount | undefined {\n return Array.from(this._accounts.values()).find(va => va.reference === reference);\n }\n\n getByPurpose(purpose: JoopVirtualAccountPurpose): JoopVirtualAccount[] {\n return this.getAll().filter(va => va.purpose === purpose);\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopVirtualAccount[] {\n const cutoff = asOf + withinMs;\n return this.getActive().filter(va => va.expiresAt !== undefined && va.expiresAt <= cutoff && va.expiresAt > asOf);\n }\n\n // ── Credits ───────────────────────────────────────────────────────────────\n\n recordCredit(virtualAccountId: string, amount: number, options: { currency?: string; senderName?: string; senderRef?: string; notes?: string } = {}): JoopVirtualCredit {\n const va = this._require(virtualAccountId);\n if (va.status !== 'active') throw new Error(`Virtual account is ${va.status}`);\n if (amount <= 0) throw new Error('Credit amount must be positive');\n\n const credit: JoopVirtualCredit = {\n id: _uid(), virtualAccountId, amount,\n currency: options.currency ?? va.currency,\n senderName: options.senderName,\n senderRef: options.senderRef,\n receivedAt: Date.now(),\n notes: options.notes,\n };\n this._credits.get(virtualAccountId)!.push(credit);\n va.collectedAmount = parseFloat((va.collectedAmount + amount).toFixed(2));\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...credit };\n }\n\n getCredits(virtualAccountId: string): JoopVirtualCredit[] {\n return [...(this._credits.get(virtualAccountId) ?? [])];\n }\n\n getTotalCollected(virtualAccountId: string): number {\n const va = this._require(virtualAccountId);\n return va.collectedAmount;\n }\n\n isFullyCollected(virtualAccountId: string): boolean {\n const va = this._require(virtualAccountId);\n return va.expectedAmount !== undefined && va.collectedAmount >= va.expectedAmount;\n }\n\n // ── Utilities ─────────────────────────────────────────────────────────────\n\n generateAccountNumber(prefix = 'VA'): string {\n this._counter++;\n return `${prefix}${String(Date.now()).slice(-8)}${String(this._counter).padStart(4, '0')}`;\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopVirtualAccount {\n const va = this._accounts.get(id);\n if (!va) throw new Error(`Virtual account '${id}' not found`);\n return va;\n }\n\n private _setStatus(id: string, status: JoopVirtualAccountStatus): JoopVirtualAccount {\n const va = this._require(id);\n va.status = status;\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...va };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopAccountType = 'asset' | 'liability' | 'equity' | 'revenue' | 'expense';\n\nexport interface JoopLedgerAccount {\n code: string;\n name: string;\n type: JoopAccountType;\n description?: string;\n createdAt: number;\n}\n\nexport interface JoopJournalLine {\n accountCode: string;\n debit: number;\n credit: number;\n description?: string;\n}\n\nexport interface JoopJournalEntry {\n id: string;\n ref: string;\n description: string;\n date: number;\n lines: JoopJournalLine[];\n postedAt: number;\n postedBy?: string;\n tags?: string[];\n}\n\nexport interface JoopTrialBalanceRow {\n code: string;\n name: string;\n type: JoopAccountType;\n totalDebits: number;\n totalCredits: number;\n balance: number;\n}\n\nexport interface JoopTrialBalance {\n asOf: number;\n rows: JoopTrialBalanceRow[];\n totalDebits: number;\n totalCredits: number;\n isBalanced: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\n/** Debit-normal account types (debits increase balance). */\nconst DEBIT_NORMAL = new Set<JoopAccountType>(['asset', 'expense']);\n\nexport class JoopLedgerService {\n private _accounts = new Map<string, JoopLedgerAccount>();\n private _entries: JoopJournalEntry[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopJournalEntry>();\n\n // ── Accounts ─────────────────────────────────────────────────────────────\n\n addAccount(code: string, name: string, type: JoopAccountType, description?: string): JoopLedgerAccount {\n if (!code.trim()) throw new Error('Account code required');\n if (this._accounts.has(code)) throw new Error(`Account ${code} already exists`);\n const account: JoopLedgerAccount = { code, name, type, description, createdAt: Date.now() };\n this._accounts.set(code, account);\n return account;\n }\n\n getAccount(code: string): JoopLedgerAccount | undefined {\n return this._accounts.get(code);\n }\n\n getAccounts(): JoopLedgerAccount[] {\n return Array.from(this._accounts.values());\n }\n\n removeAccount(code: string): void {\n if (!this._accounts.has(code)) throw new Error(`Account ${code} not found`);\n const hasEntries = this._entries.some(e => e.lines.some(l => l.accountCode === code));\n if (hasEntries) throw new Error(`Cannot remove account ${code} — it has journal entries`);\n this._accounts.delete(code);\n }\n\n // ── Journal ───────────────────────────────────────────────────────────────\n\n postEntry(\n description: string,\n lines: JoopJournalLine[],\n opts: { date?: number; postedBy?: string; tags?: string[] } = {}\n ): JoopJournalEntry {\n if (lines.length < 2) throw new Error('A journal entry requires at least 2 lines');\n\n for (const l of lines) {\n if (!this._accounts.has(l.accountCode)) throw new Error(`Unknown account: ${l.accountCode}`);\n if (l.debit < 0 || l.credit < 0) throw new Error('Debit/credit amounts must be non-negative');\n }\n\n const totalDebits = _round(lines.reduce((s, l) => s + l.debit, 0));\n const totalCredits = _round(lines.reduce((s, l) => s + l.credit, 0));\n if (totalDebits !== totalCredits) {\n throw new Error(`Journal entry does not balance — debits ${totalDebits} ≠ credits ${totalCredits}`);\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `JE-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const entry: JoopJournalEntry = {\n id: _uid(),\n ref,\n description,\n date: opts.date ?? Date.now(),\n lines: lines.map(l => ({ ...l, debit: _round(l.debit), credit: _round(l.credit) })),\n postedAt: Date.now(),\n postedBy: opts.postedBy,\n tags: opts.tags,\n };\n\n this._entries.push(entry);\n this._change$.next(entry);\n return entry;\n }\n\n getEntry(id: string): JoopJournalEntry | undefined {\n return this._entries.find(e => e.id === id);\n }\n\n getJournal(from?: number, to?: number): JoopJournalEntry[] {\n return this._entries\n .filter(e => (from === undefined || e.date >= from) && (to === undefined || e.date <= to))\n .sort((a, b) => a.date - b.date);\n }\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n getBalance(code: string): number {\n const acct = this._accounts.get(code);\n if (!acct) throw new Error(`Account ${code} not found`);\n\n let debits = 0;\n let credits = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === code) {\n debits += line.debit;\n credits += line.credit;\n }\n }\n }\n\n // Debit-normal accounts: balance = debits - credits\n // Credit-normal accounts: balance = credits - debits\n return _round(DEBIT_NORMAL.has(acct.type) ? debits - credits : credits - debits);\n }\n\n getTrialBalance(): JoopTrialBalance {\n const rows: JoopTrialBalanceRow[] = [];\n let totalDebits = 0;\n let totalCredits = 0;\n\n for (const acct of this._accounts.values()) {\n let d = 0, c = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === acct.code) {\n d += line.debit;\n c += line.credit;\n }\n }\n }\n const balance = _round(DEBIT_NORMAL.has(acct.type) ? d - c : c - d);\n rows.push({ code: acct.code, name: acct.name, type: acct.type, totalDebits: _round(d), totalCredits: _round(c), balance });\n totalDebits += d;\n totalCredits += c;\n }\n\n totalDebits = _round(totalDebits);\n totalCredits = _round(totalCredits);\n\n return { asOf: Date.now(), rows, totalDebits, totalCredits, isBalanced: totalDebits === totalCredits };\n }\n\n getBalancesByType(type: JoopAccountType): Record<string, number> {\n const result: Record<string, number> = {};\n for (const acct of this._accounts.values()) {\n if (acct.type === type) result[acct.code] = this.getBalance(acct.code);\n }\n return result;\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopReconItemSource = 'internal' | 'bank';\nexport type JoopReconMatchStatus = 'matched' | 'unmatched' | 'disputed';\n\nexport interface JoopReconItem {\n id: string;\n source: JoopReconItemSource;\n date: number;\n amount: number;\n description: string;\n reference?: string;\n}\n\nexport interface JoopReconMatch {\n id: string;\n internalId: string;\n bankId: string;\n matchedAt: number;\n isManual: boolean;\n difference: number;\n}\n\nexport interface JoopReconSession {\n id: string;\n accountId: string;\n startedAt: number;\n closedAt?: number;\n internalItems: JoopReconItem[];\n bankItems: JoopReconItem[];\n matches: JoopReconMatch[];\n}\n\nexport interface JoopReconSummary {\n sessionId: string;\n totalInternal: number;\n totalBank: number;\n matchedPairs: number;\n unmatchedInternal: number;\n unmatchedBank: number;\n totalDifference: number;\n isReconciled: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport class JoopReconciliationService {\n private _sessions = new Map<string, JoopReconSession>();\n private _change$ = new JoopSubject<JoopReconSession>();\n\n // ── Sessions ──────────────────────────────────────────────────────────────\n\n createSession(\n accountId: string,\n bankItems: Omit<JoopReconItem, 'id' | 'source'>[],\n internalItems: Omit<JoopReconItem, 'id' | 'source'>[] = []\n ): JoopReconSession {\n const session: JoopReconSession = {\n id: _uid(),\n accountId,\n startedAt: Date.now(),\n internalItems: internalItems.map(i => ({ ...i, id: _uid(), source: 'internal' as const })),\n bankItems: bankItems.map(i => ({ ...i, id: _uid(), source: 'bank' as const })),\n matches: [],\n };\n this._sessions.set(session.id, session);\n return session;\n }\n\n getSession(id: string): JoopReconSession | undefined {\n return this._sessions.get(id);\n }\n\n closeSession(id: string): JoopReconSession {\n const s = this._get(id);\n s.closedAt = Date.now();\n this._change$.next(s);\n return s;\n }\n\n addInternalItems(sessionId: string, items: Omit<JoopReconItem, 'id' | 'source'>[]): JoopReconSession {\n const s = this._get(sessionId);\n for (const item of items) s.internalItems.push({ ...item, id: _uid(), source: 'internal' });\n this._change$.next(s);\n return s;\n }\n\n // ── Matching ──────────────────────────────────────────────────────────────\n\n autoMatch(sessionId: string, toleranceAmount = 0, toleranceDays = 3): JoopReconMatch[] {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n const newMatches: JoopReconMatch[] = [];\n const dayMs = 86_400_000;\n\n for (const intItem of s.internalItems) {\n if (matchedInternalIds.has(intItem.id)) continue;\n for (const bankItem of s.bankItems) {\n if (matchedBankIds.has(bankItem.id)) continue;\n const amountDiff = Math.abs(intItem.amount - bankItem.amount);\n const daysDiff = Math.abs(intItem.date - bankItem.date) / dayMs;\n if (amountDiff <= toleranceAmount && daysDiff <= toleranceDays) {\n const match: JoopReconMatch = {\n id: _uid(),\n internalId: intItem.id,\n bankId: bankItem.id,\n matchedAt: Date.now(),\n isManual: false,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n matchedInternalIds.add(intItem.id);\n matchedBankIds.add(bankItem.id);\n newMatches.push(match);\n break;\n }\n }\n }\n\n if (newMatches.length) this._change$.next(s);\n return newMatches;\n }\n\n manualMatch(sessionId: string, internalId: string, bankId: string): JoopReconMatch {\n const s = this._get(sessionId);\n const intItem = s.internalItems.find(i => i.id === internalId);\n const bankItem = s.bankItems.find(i => i.id === bankId);\n if (!intItem) throw new Error(`Internal item ${internalId} not found`);\n if (!bankItem) throw new Error(`Bank item ${bankId} not found`);\n if (s.matches.some(m => m.internalId === internalId || m.bankId === bankId)) {\n throw new Error('One or both items are already matched');\n }\n const match: JoopReconMatch = {\n id: _uid(),\n internalId,\n bankId,\n matchedAt: Date.now(),\n isManual: true,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n this._change$.next(s);\n return match;\n }\n\n unmatch(sessionId: string, matchId: string): void {\n const s = this._get(sessionId);\n const idx = s.matches.findIndex(m => m.id === matchId);\n if (idx === -1) throw new Error(`Match ${matchId} not found`);\n s.matches.splice(idx, 1);\n this._change$.next(s);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getUnmatched(sessionId: string): { internal: JoopReconItem[]; bank: JoopReconItem[] } {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n return {\n internal: s.internalItems.filter(i => !matchedInternalIds.has(i.id)),\n bank: s.bankItems.filter(i => !matchedBankIds.has(i.id)),\n };\n }\n\n getSummary(sessionId: string): JoopReconSummary {\n const s = this._get(sessionId);\n const unmatched = this.getUnmatched(sessionId);\n const totalDifference = s.matches.reduce((sum, m) => sum + m.difference, 0);\n return {\n sessionId,\n totalInternal: s.internalItems.length,\n totalBank: s.bankItems.length,\n matchedPairs: s.matches.length,\n unmatchedInternal: unmatched.internal.length,\n unmatchedBank: unmatched.bank.length,\n totalDifference: Math.round(totalDifference * 100) / 100,\n isReconciled: unmatched.internal.length === 0 && unmatched.bank.length === 0,\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopReconSession {\n const s = this._sessions.get(id);\n if (!s) throw new Error(`Reconciliation session ${id} not found`);\n return s;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLimitType = 'per-transaction' | 'daily' | 'weekly' | 'monthly' | 'yearly';\nexport type JoopLimitScope = 'account' | 'user' | 'card' | 'channel';\n\nexport interface JoopLimit {\n id: string;\n scope: JoopLimitScope;\n scopeId: string;\n type: JoopLimitType;\n maxAmount: number;\n currency: string;\n enabled: boolean;\n createdAt: number;\n notes?: string;\n}\n\nexport interface JoopLimitCheckResult {\n allowed: boolean;\n limit: JoopLimit;\n currentUsage: number;\n remaining: number;\n requestedAmount: number;\n reason?: string;\n}\n\nexport interface JoopUsageRecord {\n limitId: string;\n amount: number;\n recordedAt: number;\n reference?: string;\n}\n\nexport interface JoopUsageSummary {\n scope: JoopLimitScope;\n scopeId: string;\n limits: Array<{\n limitId: string;\n type: JoopLimitType;\n maxAmount: number;\n used: number;\n remaining: number;\n utilizationPercent: number;\n }>;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _periodStart(type: JoopLimitType, now: number): number {\n const d = new Date(now);\n switch (type) {\n case 'per-transaction': return 0; // always fresh\n case 'daily': return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n case 'weekly': {\n const day = d.getDay(); // 0=Sun\n const mon = new Date(d.getFullYear(), d.getMonth(), d.getDate() - ((day + 6) % 7));\n return mon.getTime();\n }\n case 'monthly': return new Date(d.getFullYear(), d.getMonth(), 1).getTime();\n case 'yearly': return new Date(d.getFullYear(), 0, 1).getTime();\n }\n}\n\nexport class JoopLimitManagementService {\n private _limits = new Map<string, JoopLimit>();\n private _usage: JoopUsageRecord[] = [];\n private _change$ = new JoopSubject<JoopLimit>();\n\n // ── Limit CRUD ────────────────────────────────────────────────────────────\n\n setLimit(\n scope: JoopLimitScope,\n scopeId: string,\n type: JoopLimitType,\n maxAmount: number,\n currency = 'USD',\n notes?: string\n ): JoopLimit {\n if (maxAmount <= 0) throw new Error('maxAmount must be positive');\n const existing = this._findLimit(scope, scopeId, type, currency);\n if (existing) {\n existing.maxAmount = maxAmount;\n existing.notes = notes;\n this._change$.next(existing);\n return existing;\n }\n const limit: JoopLimit = {\n id: _uid(), scope, scopeId, type, maxAmount, currency, enabled: true, createdAt: Date.now(), notes,\n };\n this._limits.set(limit.id, limit);\n this._change$.next(limit);\n return limit;\n }\n\n getLimit(id: string): JoopLimit | undefined {\n return this._limits.get(id);\n }\n\n getLimits(scope?: JoopLimitScope, scopeId?: string): JoopLimit[] {\n return Array.from(this._limits.values()).filter(l =>\n (scope === undefined || l.scope === scope) &&\n (scopeId === undefined || l.scopeId === scopeId)\n );\n }\n\n removeLimit(limitId: string): void {\n if (!this._limits.has(limitId)) throw new Error(`Limit ${limitId} not found`);\n this._limits.delete(limitId);\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n enableLimit(limitId: string): void { this._toggle(limitId, true); }\n disableLimit(limitId: string): void { this._toggle(limitId, false); }\n\n // ── Check & Record ────────────────────────────────────────────────────────\n\n checkLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD'): JoopLimitCheckResult | null {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit || !limit.enabled) return null;\n\n const usage = this._currentUsage(limit, Date.now());\n const remaining = Math.max(0, limit.maxAmount - usage);\n const allowed = amount <= remaining;\n\n return {\n allowed,\n limit,\n currentUsage: usage,\n remaining,\n requestedAmount: amount,\n reason: allowed ? undefined : `${type} limit of ${limit.maxAmount} ${currency} exceeded (used: ${usage})`,\n };\n }\n\n checkAllLimits(scope: JoopLimitScope, scopeId: string, amount: number, currency = 'USD'): JoopLimitCheckResult[] {\n const results: JoopLimitCheckResult[] = [];\n for (const limit of this._limits.values()) {\n if (limit.scope === scope && limit.scopeId === scopeId && limit.currency === currency && limit.enabled) {\n const check = this.checkLimit(scope, scopeId, limit.type, amount, currency);\n if (check) results.push(check);\n }\n }\n return results;\n }\n\n recordUsage(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD', reference?: string): void {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit) return;\n this._usage.push({ limitId: limit.id, amount, recordedAt: Date.now(), reference });\n }\n\n resetUsage(limitId: string): void {\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n getUsageSummary(scope: JoopLimitScope, scopeId: string): JoopUsageSummary {\n const limits = this.getLimits(scope, scopeId);\n const now = Date.now();\n return {\n scope,\n scopeId,\n limits: limits.map(l => {\n const used = this._currentUsage(l, now);\n const remaining = Math.max(0, l.maxAmount - used);\n return {\n limitId: l.id,\n type: l.type,\n maxAmount: l.maxAmount,\n used,\n remaining,\n utilizationPercent: Math.round((used / l.maxAmount) * 100 * 100) / 100,\n };\n }),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _findLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, currency: string): JoopLimit | undefined {\n for (const l of this._limits.values()) {\n if (l.scope === scope && l.scopeId === scopeId && l.type === type && l.currency === currency) return l;\n }\n return undefined;\n }\n\n private _currentUsage(limit: JoopLimit, now: number): number {\n if (limit.type === 'per-transaction') return 0;\n const periodStart = _periodStart(limit.type, now);\n return this._usage\n .filter(u => u.limitId === limit.id && u.recordedAt >= periodStart)\n .reduce((s, u) => s + u.amount, 0);\n }\n\n private _toggle(limitId: string, enabled: boolean): void {\n const l = this._limits.get(limitId);\n if (!l) throw new Error(`Limit ${limitId} not found`);\n l.enabled = enabled;\n this._change$.next(l);\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopStandingOrderStatus = 'active' | 'paused' | 'cancelled' | 'completed';\nexport type JoopStandingOrderFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\nexport type JoopExecutionStatus = 'success' | 'failed' | 'skipped';\n\nexport interface JoopStandingOrder {\n id: string;\n ref: string;\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n status: JoopStandingOrderStatus;\n nextExecutionAt?: number;\n executionCount: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n createdAt: number;\n}\n\nexport interface JoopStandingOrderExecution {\n id: string;\n orderId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: JoopExecutionStatus;\n failureReason?: string;\n transactionRef?: string;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _computeNextDate(current: number, frequency: JoopStandingOrderFrequency): number {\n const d = new Date(current);\n switch (frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n }\n return d.getTime();\n}\n\nexport class JoopStandingOrderService {\n private _orders: JoopStandingOrder[] = [];\n private _executions: JoopStandingOrderExecution[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopStandingOrder>();\n\n // ── CRUD ──────────────────────────────────────────────────────────────────\n\n create(params: {\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency?: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n }): JoopStandingOrder {\n if (params.amount <= 0) throw new Error('amount must be positive');\n if (!params.fromAccount.trim()) throw new Error('fromAccount required');\n if (!params.toAccount.trim()) throw new Error('toAccount required');\n if (params.endDate !== undefined && params.endDate <= params.startDate) {\n throw new Error('endDate must be after startDate');\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `SO-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const order: JoopStandingOrder = {\n id: _uid(),\n ref,\n fromAccount: params.fromAccount,\n toAccount: params.toAccount,\n toBeneficiaryName: params.toBeneficiaryName,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n frequency: params.frequency,\n startDate: params.startDate,\n endDate: params.endDate,\n status: 'active',\n nextExecutionAt: params.startDate,\n executionCount: 0,\n maxExecutions: params.maxExecutions,\n reference: params.reference,\n notes: params.notes,\n createdAt: Date.now(),\n };\n\n this._orders.push(order);\n this._change$.next(order);\n return order;\n }\n\n update(id: string, patch: Partial<Pick<JoopStandingOrder, 'amount' | 'toBeneficiaryName' | 'endDate' | 'maxExecutions' | 'reference' | 'notes'>>): JoopStandingOrder {\n const o = this._get(id);\n if (patch.amount !== undefined && patch.amount <= 0) throw new Error('amount must be positive');\n Object.assign(o, patch);\n this._change$.next(o);\n return o;\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n pause(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot pause order with status ${o.status}`);\n o.status = 'paused';\n this._change$.next(o);\n return o;\n }\n\n resume(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'paused') throw new Error(`Cannot resume order with status ${o.status}`);\n o.status = 'active';\n this._change$.next(o);\n return o;\n }\n\n cancel(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status === 'cancelled') throw new Error('Order is already cancelled');\n o.status = 'cancelled';\n this._change$.next(o);\n return o;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n execute(id: string, status: JoopExecutionStatus = 'success', opts: { failureReason?: string; transactionRef?: string } = {}): JoopStandingOrderExecution {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot execute order with status ${o.status}`);\n\n const exec: JoopStandingOrderExecution = {\n id: _uid(),\n orderId: id,\n executedAt: Date.now(),\n amount: o.amount,\n currency: o.currency,\n status,\n failureReason: opts.failureReason,\n transactionRef: opts.transactionRef,\n };\n\n this._executions.push(exec);\n\n if (status === 'success') {\n o.executionCount += 1;\n const next = _computeNextDate(o.nextExecutionAt ?? Date.now(), o.frequency);\n if ((o.endDate && next > o.endDate) || (o.maxExecutions && o.executionCount >= o.maxExecutions)) {\n o.status = 'completed';\n o.nextExecutionAt = undefined;\n } else {\n o.nextExecutionAt = next;\n }\n }\n\n this._change$.next(o);\n return exec;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopStandingOrder | undefined {\n return this._orders.find(o => o.id === id);\n }\n\n getAll(): JoopStandingOrder[] {\n return [...this._orders];\n }\n\n getActive(): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active');\n }\n\n getByAccount(accountId: string): JoopStandingOrder[] {\n return this._orders.filter(o => o.fromAccount === accountId || o.toAccount === accountId);\n }\n\n getDue(asOf = Date.now()): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active' && o.nextExecutionAt !== undefined && o.nextExecutionAt <= asOf);\n }\n\n getExecutions(orderId: string): JoopStandingOrderExecution[] {\n return this._executions.filter(e => e.orderId === orderId);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopStandingOrder {\n const o = this._orders.find(x => x.id === id);\n if (!o) throw new Error(`Standing order ${id} not found`);\n return o;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLoanAccountStatus = 'active' | 'closed' | 'defaulted' | 'written-off';\nexport type JoopRepaymentStatus = 'pending' | 'paid' | 'partial' | 'overdue' | 'waived';\nexport type JoopLoanPaymentAllocation = 'interest' | 'principal' | 'penalty';\n\nexport interface JoopLoanAccount {\n id: string;\n ref: string;\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n outstandingPrincipal: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt: number;\n status: JoopLoanAccountStatus;\n emiAmount: number;\n currency: string;\n nextDueDate: number;\n totalPaid: number;\n penaltyRatePercent: number;\n notes?: string;\n}\n\nexport interface JoopInstallment {\n installmentNumber: number;\n dueDate: number;\n principalComponent: number;\n interestComponent: number;\n totalDue: number;\n outstandingAfter: number;\n status: JoopRepaymentStatus;\n paidAmount: number;\n paidAt?: number;\n}\n\nexport interface JoopLoanPayment {\n id: string;\n loanId: string;\n amount: number;\n paidAt: number;\n interestPaid: number;\n principalPaid: number;\n penaltyPaid: number;\n reference?: string;\n}\n\nexport interface JoopLoanStatement {\n loan: JoopLoanAccount;\n schedule: JoopInstallment[];\n payments: JoopLoanPayment[];\n outstandingPrincipal: number;\n accruedInterest: number;\n totalOverdue: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nfunction _addMonths(ts: number, months: number): number {\n const d = new Date(ts);\n d.setMonth(d.getMonth() + months);\n return d.getTime();\n}\n\nfunction _calcEmi(principal: number, annualRate: number, tenureMonths: number): number {\n if (annualRate === 0) return _round(principal / tenureMonths);\n const r = annualRate / 100 / 12;\n return _round(principal * r * Math.pow(1 + r, tenureMonths) / (Math.pow(1 + r, tenureMonths) - 1));\n}\n\nfunction _buildSchedule(loanId: string, principal: number, annualRate: number, tenureMonths: number, startDate: number, emi: number): JoopInstallment[] {\n const schedule: JoopInstallment[] = [];\n let outstanding = principal;\n const r = annualRate / 100 / 12;\n for (let i = 1; i <= tenureMonths; i++) {\n const interest = _round(outstanding * r);\n const principalC = i < tenureMonths ? _round(emi - interest) : _round(outstanding); // last EMI clears balance\n const total = _round(interest + principalC);\n outstanding = _round(outstanding - principalC);\n if (outstanding < 0) outstanding = 0;\n schedule.push({\n installmentNumber: i,\n dueDate: _addMonths(startDate, i),\n principalComponent: principalC,\n interestComponent: interest,\n totalDue: total,\n outstandingAfter: outstanding,\n status: 'pending',\n paidAmount: 0,\n });\n }\n return schedule;\n}\n\nexport class JoopLoanServicingService {\n private _loans: JoopLoanAccount[] = [];\n private _schedules = new Map<string, JoopInstallment[]>();\n private _payments = new Map<string, JoopLoanPayment[]>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopLoanAccount>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n createLoan(params: {\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt?: number;\n currency?: string;\n penaltyRatePercent?: number;\n notes?: string;\n }): JoopLoanAccount {\n if (params.principalAmount <= 0) throw new Error('principalAmount must be positive');\n if (params.annualInterestRatePercent < 0) throw new Error('annualInterestRatePercent must be non-negative');\n if (params.tenureMonths <= 0) throw new Error('tenureMonths must be positive');\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `LN-${year}-${String(this._seq).padStart(6, '0')}`;\n const disbursedAt = params.disbursedAt ?? Date.now();\n const emi = _calcEmi(params.principalAmount, params.annualInterestRatePercent, params.tenureMonths);\n\n const loan: JoopLoanAccount = {\n id: _uid(),\n ref,\n borrowerName: params.borrowerName,\n borrowerId: params.borrowerId,\n principalAmount: params.principalAmount,\n outstandingPrincipal: params.principalAmount,\n annualInterestRatePercent: params.annualInterestRatePercent,\n tenureMonths: params.tenureMonths,\n disbursedAt,\n status: 'active',\n emiAmount: emi,\n currency: params.currency ?? 'USD',\n nextDueDate: _addMonths(disbursedAt, 1),\n totalPaid: 0,\n penaltyRatePercent: params.penaltyRatePercent ?? 2,\n notes: params.notes,\n };\n\n this._loans.push(loan);\n this._schedules.set(loan.id, _buildSchedule(loan.id, params.principalAmount, params.annualInterestRatePercent, params.tenureMonths, disbursedAt, emi));\n this._payments.set(loan.id, []);\n this._change$.next(loan);\n return loan;\n }\n\n // ── Payments ──────────────────────────────────────────────────────────────\n\n recordPayment(loanId: string, amount: number, opts: { paidAt?: number; reference?: string } = {}): JoopLoanPayment {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Cannot record payment on loan with status ${loan.status}`);\n if (amount <= 0) throw new Error('amount must be positive');\n\n const schedule = this._schedules.get(loanId)!;\n const paidAt = opts.paidAt ?? Date.now();\n let remaining = amount;\n let interestPaid = 0;\n let principalPaid = 0;\n\n // Apply to oldest pending/overdue/partial installments first\n for (const inst of schedule) {\n if (remaining <= 0) break;\n if (inst.status === 'paid' || inst.status === 'waived') continue;\n\n const owed = _round(inst.totalDue - inst.paidAmount);\n const apply = Math.min(remaining, owed);\n\n // Split apply into interest vs principal proportionally\n const instTotal = inst.interestComponent + inst.principalComponent;\n const intShare = instTotal > 0 ? _round(apply * (inst.interestComponent / instTotal)) : 0;\n const priShare = _round(apply - intShare);\n\n interestPaid += intShare;\n principalPaid += priShare;\n\n inst.paidAmount = _round(inst.paidAmount + apply);\n remaining = _round(remaining - apply);\n\n if (Math.abs(inst.paidAmount - inst.totalDue) < 0.01) {\n inst.status = 'paid';\n inst.paidAt = paidAt;\n } else {\n inst.status = 'partial';\n }\n }\n\n // Any remaining amount goes directly to principal (prepayment)\n if (remaining > 0) {\n principalPaid += remaining;\n remaining = 0;\n }\n\n interestPaid = _round(interestPaid);\n principalPaid = _round(principalPaid);\n\n loan.outstandingPrincipal = _round(loan.outstandingPrincipal - principalPaid);\n if (loan.outstandingPrincipal < 0) loan.outstandingPrincipal = 0;\n loan.totalPaid = _round(loan.totalPaid + amount);\n\n // Advance nextDueDate\n const nextPending = schedule.find(i => i.status !== 'paid' && i.status !== 'waived');\n loan.nextDueDate = nextPending?.dueDate ?? loan.nextDueDate;\n\n if (loan.outstandingPrincipal === 0) {\n loan.status = 'closed';\n }\n\n const payment: JoopLoanPayment = {\n id: _uid(),\n loanId,\n amount,\n paidAt,\n interestPaid,\n principalPaid,\n penaltyPaid: 0,\n reference: opts.reference,\n };\n\n this._payments.get(loanId)!.push(payment);\n this._change$.next(loan);\n return payment;\n }\n\n waveInstallment(loanId: string, installmentNumber: number): void {\n const schedule = this._schedules.get(loanId);\n if (!schedule) throw new Error(`Loan ${loanId} not found`);\n const inst = schedule.find(i => i.installmentNumber === installmentNumber);\n if (!inst) throw new Error(`Installment ${installmentNumber} not found`);\n inst.status = 'waived';\n inst.paidAt = Date.now();\n }\n\n markDefaulted(loanId: string): JoopLoanAccount {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Loan is not active`);\n loan.status = 'defaulted';\n this._change$.next(loan);\n return loan;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLoan(id: string): JoopLoanAccount | undefined {\n return this._loans.find(l => l.id === id);\n }\n\n getAll(): JoopLoanAccount[] { return [...this._loans]; }\n\n getActive(): JoopLoanAccount[] { return this._loans.filter(l => l.status === 'active'); }\n\n getByBorrower(borrowerId: string): JoopLoanAccount[] {\n return this._loans.filter(l => l.borrowerId === borrowerId);\n }\n\n getSchedule(loanId: string): JoopInstallment[] {\n return this._schedules.get(loanId) ?? [];\n }\n\n getPendingInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status !== 'paid' && i.status !== 'waived');\n }\n\n getOverdueInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status === 'overdue');\n }\n\n getOutstandingBalance(loanId: string): number {\n return this._get(loanId).outstandingPrincipal;\n }\n\n getAccruedInterest(loanId: string, asOf = Date.now()): number {\n const loan = this._get(loanId);\n const daysSinceDue = Math.max(0, (asOf - loan.nextDueDate) / 86_400_000);\n if (daysSinceDue <= 0) return 0;\n return _round(loan.outstandingPrincipal * (loan.annualInterestRatePercent / 100 / 365) * daysSinceDue);\n }\n\n getLoanStatement(loanId: string): JoopLoanStatement {\n const loan = this._get(loanId);\n const schedule = this._schedules.get(loanId)!;\n const payments = this._payments.get(loanId)!;\n this._markOverdue(loanId);\n const totalOverdue = schedule\n .filter(i => i.status === 'overdue')\n .reduce((s, i) => s + _round(i.totalDue - i.paidAmount), 0);\n return {\n loan,\n schedule,\n payments,\n outstandingPrincipal: loan.outstandingPrincipal,\n accruedInterest: this.getAccruedInterest(loanId),\n totalOverdue: _round(totalOverdue),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopLoanAccount {\n const l = this._loans.find(x => x.id === id);\n if (!l) throw new Error(`Loan ${id} not found`);\n return l;\n }\n\n private _markOverdue(loanId: string): void {\n const now = Date.now();\n const schedule = this._schedules.get(loanId);\n if (!schedule) return;\n for (const inst of schedule) {\n if ((inst.status === 'pending' || inst.status === 'partial') && inst.dueDate < now) {\n inst.status = 'overdue';\n }\n }\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopWalletStatus = 'active' | 'frozen' | 'closed';\nexport type JoopWalletTxnType = 'topup' | 'transfer-out' | 'transfer-in' | 'payment' | 'refund' | 'cashback' | 'withdrawal' | 'fee';\n\nexport interface JoopWallet {\n id: string;\n userId: string;\n label?: string;\n currency: string;\n balance: number;\n status: JoopWalletStatus;\n createdAt: number;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport interface JoopWalletTransaction {\n id: string;\n walletId: string;\n type: JoopWalletTxnType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n description: string;\n reference?: string;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface JoopTransferResult {\n fromTxn: JoopWalletTransaction;\n toTxn: JoopWalletTransaction;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport class JoopDigitalWalletService {\n private _wallets = new Map<string, JoopWallet>();\n private _transactions: JoopWalletTransaction[] = [];\n private _balance$ = new JoopBehaviorSubject<{ walletId: string; balance: number } | null>(null);\n\n // ── Wallet lifecycle ──────────────────────────────────────────────────────\n\n createWallet(userId: string, opts: { label?: string; currency?: string; dailyLimit?: number; monthlyLimit?: number } = {}): JoopWallet {\n const wallet: JoopWallet = {\n id: _uid(),\n userId,\n label: opts.label,\n currency: opts.currency ?? 'USD',\n balance: 0,\n status: 'active',\n createdAt: Date.now(),\n dailyLimit: opts.dailyLimit,\n monthlyLimit: opts.monthlyLimit,\n };\n this._wallets.set(wallet.id, wallet);\n return wallet;\n }\n\n freeze(walletId: string): JoopWallet {\n const w = this._getActive(walletId);\n w.status = 'frozen';\n return w;\n }\n\n unfreeze(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Cannot unfreeze a closed wallet');\n w.status = 'active';\n return w;\n }\n\n close(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Wallet already closed');\n if (w.balance > 0) throw new Error('Cannot close wallet with positive balance — withdraw funds first');\n w.status = 'closed';\n return w;\n }\n\n updateLimits(walletId: string, limits: { dailyLimit?: number; monthlyLimit?: number }): JoopWallet {\n const w = this._get(walletId);\n if (limits.dailyLimit !== undefined) w.dailyLimit = limits.dailyLimit;\n if (limits.monthlyLimit !== undefined) w.monthlyLimit = limits.monthlyLimit;\n return w;\n }\n\n // ── Funds ─────────────────────────────────────────────────────────────────\n\n topUp(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n return this._record(w, 'topup', amount, opts.description ?? 'Top-up', opts.reference);\n }\n\n withdraw(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n return this._record(w, 'withdrawal', -amount, opts.description ?? 'Withdrawal', opts.reference);\n }\n\n pay(walletId: string, amount: number, merchantId: string, merchantName: string, opts: { reference?: string; metadata?: Record<string, unknown> } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n const txn = this._record(w, 'payment', -amount, `Payment to ${merchantName}`, opts.reference);\n txn.counterpartyId = merchantId;\n txn.counterpartyName = merchantName;\n if (opts.metadata) txn.metadata = opts.metadata;\n return txn;\n }\n\n transfer(fromWalletId: string, toWalletId: string, amount: number, opts: { note?: string; reference?: string } = {}): JoopTransferResult {\n if (amount <= 0) throw new Error('amount must be positive');\n if (fromWalletId === toWalletId) throw new Error('Cannot transfer to the same wallet');\n const from = this._getActive(fromWalletId);\n const to = this._getActive(toWalletId);\n this._assertSufficientBalance(from, amount);\n if (from.currency !== to.currency) throw new Error('Cross-currency transfers not supported — use FX service');\n\n const fromTxn = this._record(from, 'transfer-out', -amount, opts.note ?? `Transfer to ${to.userId}`, opts.reference);\n fromTxn.counterpartyId = toWalletId;\n const toTxn = this._record(to, 'transfer-in', amount, opts.note ?? `Transfer from ${from.userId}`, opts.reference);\n toTxn.counterpartyId = fromWalletId;\n return { fromTxn, toTxn };\n }\n\n refund(originalTxnId: string, opts: { amount?: number; reason?: string } = {}): JoopWalletTransaction {\n const original = this._transactions.find(t => t.id === originalTxnId);\n if (!original) throw new Error(`Transaction ${originalTxnId} not found`);\n if (original.type !== 'payment') throw new Error('Can only refund payment transactions');\n const w = this._getActive(original.walletId);\n const amount = opts.amount ?? Math.abs(original.amount);\n if (amount > Math.abs(original.amount)) throw new Error('Refund exceeds original payment amount');\n return this._record(w, 'refund', amount, opts.reason ?? `Refund for ${originalTxnId}`, originalTxnId);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getWallet(id: string): JoopWallet | undefined {\n return this._wallets.get(id);\n }\n\n getWalletsByUser(userId: string): JoopWallet[] {\n return Array.from(this._wallets.values()).filter(w => w.userId === userId);\n }\n\n getBalance(walletId: string): number {\n return this._get(walletId).balance;\n }\n\n getTransactions(walletId: string, limit?: number): JoopWalletTransaction[] {\n const all = this._transactions.filter(t => t.walletId === walletId).sort((a, b) => b.createdAt - a.createdAt);\n return limit ? all.slice(0, limit) : all;\n }\n\n getTotalSpent(walletId: string, from?: number, to?: number): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'payment' &&\n (from === undefined || t.createdAt >= from) &&\n (to === undefined || t.createdAt <= to))\n .reduce((s, t) => s + Math.abs(t.amount), 0)\n );\n }\n\n getTotalTopUp(walletId: string): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'topup')\n .reduce((s, t) => s + t.amount, 0)\n );\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n balance$() { return this._balance$; }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopWallet {\n const w = this._wallets.get(id);\n if (!w) throw new Error(`Wallet ${id} not found`);\n return w;\n }\n\n private _getActive(id: string): JoopWallet {\n const w = this._get(id);\n if (w.status !== 'active') throw new Error(`Wallet is ${w.status}`);\n return w;\n }\n\n private _assertSufficientBalance(w: JoopWallet, amount: number): void {\n if (w.balance < amount) throw new Error(`Insufficient balance — available: ${w.balance}, requested: ${amount}`);\n }\n\n private _record(w: JoopWallet, type: JoopWalletTxnType, amount: number, description: string, reference?: string): JoopWalletTransaction {\n const balanceBefore = w.balance;\n w.balance = _round(w.balance + amount);\n const txn: JoopWalletTransaction = {\n id: _uid(),\n walletId: w.id,\n type,\n amount,\n balanceBefore,\n balanceAfter: w.balance,\n description,\n reference,\n createdAt: Date.now(),\n };\n this._transactions.push(txn);\n this._balance$.next({ walletId: w.id, balance: w.balance });\n return txn;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopForwardType = 'buy' | 'sell';\nexport type JoopForwardStatus = 'open' | 'settled' | 'cancelled' | 'expired';\n\nexport interface JoopFxForward {\n id: string;\n ref: string;\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n spotRateAtCreation: number;\n maturityDate: number;\n status: JoopForwardStatus;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n settledAt?: number;\n settlementSpotRate?: number;\n pnl?: number;\n notes?: string;\n}\n\nexport interface JoopForwardSettlement {\n forwardId: string;\n ref: string;\n settledAt: number;\n contractRate: number;\n spotRate: number;\n notionalAmount: number;\n baseCurrency: string;\n quoteCurrency: string;\n pnl: number;\n}\n\nexport interface JoopFxExposure {\n currency: string;\n type: JoopForwardType;\n totalNotional: number;\n contractCount: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 4): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nexport class JoopFxForwardService {\n private _forwards: JoopFxForward[] = [];\n private _settlements: JoopForwardSettlement[] = [];\n private _spotRates = new Map<string, number>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopFxForward>();\n\n // ── Spot rates ────────────────────────────────────────────────────────────\n\n setSpotRate(baseCurrency: string, quoteCurrency: string, rate: number): void {\n if (rate <= 0) throw new Error('rate must be positive');\n this._spotRates.set(`${baseCurrency}:${quoteCurrency}`, rate);\n this._spotRates.set(`${quoteCurrency}:${baseCurrency}`, _round(1 / rate));\n }\n\n getSpotRate(baseCurrency: string, quoteCurrency: string): number | undefined {\n if (baseCurrency === quoteCurrency) return 1;\n return this._spotRates.get(`${baseCurrency}:${quoteCurrency}`);\n }\n\n // ── Forward contracts ─────────────────────────────────────────────────────\n\n createForward(params: {\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n maturityDate: number;\n counterpartyId?: string;\n counterpartyName?: string;\n notes?: string;\n }): JoopFxForward {\n if (params.notionalAmount <= 0) throw new Error('notionalAmount must be positive');\n if (params.contractRate <= 0) throw new Error('contractRate must be positive');\n if (params.maturityDate <= Date.now()) throw new Error('maturityDate must be in the future');\n\n const spotRate = this.getSpotRate(params.baseCurrency, params.quoteCurrency) ?? params.contractRate;\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `FWD-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const forward: JoopFxForward = {\n id: _uid(),\n ref,\n type: params.type,\n baseCurrency: params.baseCurrency,\n quoteCurrency: params.quoteCurrency,\n notionalAmount: params.notionalAmount,\n contractRate: params.contractRate,\n spotRateAtCreation: spotRate,\n maturityDate: params.maturityDate,\n status: 'open',\n counterpartyId: params.counterpartyId,\n counterpartyName: params.counterpartyName,\n createdAt: Date.now(),\n notes: params.notes,\n };\n\n this._forwards.push(forward);\n this._change$.next(forward);\n return forward;\n }\n\n settleForward(id: string, spotRate?: number): JoopForwardSettlement {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot settle forward with status ${fwd.status}`);\n\n const rate = spotRate ?? this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n\n // PnL = (contractRate - spotRate) * notional for a sell forward\n // (spotRate - contractRate) * notional for a buy forward\n const pnl = fwd.type === 'sell'\n ? _round((fwd.contractRate - rate) * fwd.notionalAmount, 2)\n : _round((rate - fwd.contractRate) * fwd.notionalAmount, 2);\n\n fwd.status = 'settled';\n fwd.settledAt = Date.now();\n fwd.settlementSpotRate = rate;\n fwd.pnl = pnl;\n\n const settlement: JoopForwardSettlement = {\n forwardId: id,\n ref: fwd.ref,\n settledAt: fwd.settledAt,\n contractRate: fwd.contractRate,\n spotRate: rate,\n notionalAmount: fwd.notionalAmount,\n baseCurrency: fwd.baseCurrency,\n quoteCurrency: fwd.quoteCurrency,\n pnl,\n };\n\n this._settlements.push(settlement);\n this._change$.next(fwd);\n return settlement;\n }\n\n cancelForward(id: string, notes?: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot cancel forward with status ${fwd.status}`);\n fwd.status = 'cancelled';\n if (notes) fwd.notes = notes;\n this._change$.next(fwd);\n return fwd;\n }\n\n expireForward(id: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot expire forward with status ${fwd.status}`);\n if (fwd.maturityDate > Date.now()) throw new Error('Forward has not yet matured');\n fwd.status = 'expired';\n this._change$.next(fwd);\n return fwd;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopFxForward | undefined {\n return this._forwards.find(f => f.id === id);\n }\n\n getAll(status?: JoopForwardStatus): JoopFxForward[] {\n return status ? this._forwards.filter(f => f.status === status) : [...this._forwards];\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopFxForward[] {\n return this._forwards.filter(f => f.status === 'open' && f.maturityDate <= asOf + withinMs && f.maturityDate > asOf);\n }\n\n getSettlements(): JoopForwardSettlement[] { return [...this._settlements]; }\n\n getSettlement(forwardId: string): JoopForwardSettlement | undefined {\n return this._settlements.find(s => s.forwardId === forwardId);\n }\n\n getExposure(currency: string, type?: JoopForwardType): JoopFxExposure[] {\n const open = this._forwards.filter(f =>\n f.status === 'open' &&\n (f.baseCurrency === currency || f.quoteCurrency === currency) &&\n (type === undefined || f.type === type)\n );\n\n const map = new Map<string, JoopFxExposure>();\n for (const f of open) {\n const key = `${currency}:${f.type}`;\n const cur = map.get(key) ?? { currency, type: f.type, totalNotional: 0, contractCount: 0 };\n cur.totalNotional += f.notionalAmount;\n cur.contractCount += 1;\n map.set(key, cur);\n }\n return Array.from(map.values());\n }\n\n getTotalPnL(): number {\n return _round(this._settlements.reduce((s, settlement) => s + settlement.pnl, 0), 2);\n }\n\n getMarkToMarket(id: string): number {\n const fwd = this._get(id);\n if (fwd.status !== 'open') return fwd.pnl ?? 0;\n const spot = this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n return fwd.type === 'sell'\n ? _round((fwd.contractRate - spot) * fwd.notionalAmount, 2)\n : _round((spot - fwd.contractRate) * fwd.notionalAmount, 2);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopFxForward {\n const f = this._forwards.find(x => x.id === id);\n if (!f) throw new Error(`Forward ${id} not found`);\n return f;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/banking/masking.utility.ts","../../src/banking/custom-mask.utility.ts","../../src/banking/iban.utility.ts","../../src/banking/currency.utility.ts","../../src/banking/amount.utility.ts","../../src/banking/transaction.utility.ts","../../src/banking/receipt.service.ts","../../src/banking/luhn.utility.ts","../../src/events/index.ts","../../src/banking/fraud-detection.ts","../../src/banking/open-banking.ts","../../src/banking/payment-orchestrator.ts","../../src/banking/statement-parser.ts","../../src/banking/beneficiary.service.ts","../../src/banking/scheduled-payment.service.ts","../../src/banking/card-management.service.ts","../../src/banking/statement-generator.service.ts","../../src/banking/notification-center.service.ts","../../src/banking/dispute.service.ts","../../src/banking/bill-payment.service.ts","../../src/banking/payment-uri.service.ts","../../src/banking/mandate.service.ts","../../src/banking/split-payment.service.ts","../../src/banking/chequebook.service.ts","../../src/banking/insurance.service.ts","../../src/banking/remittance.service.ts","../../src/banking/virtual-account.service.ts","../../src/banking/ledger.service.ts","../../src/banking/reconciliation.service.ts","../../src/banking/limit-management.service.ts","../../src/banking/standing-order.service.ts","../../src/banking/loan-servicing.service.ts","../../src/banking/digital-wallet.service.ts","../../src/banking/fx-forward.service.ts"],"names":["_uid","n","d","_round"],"mappings":"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EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EACpE,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,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","file":"index.mjs","sourcesContent":["export function maskCard(cardNumber: string, showLast = 4): string {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < showLast) return cardNumber;\n const masked = '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n return masked.replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function formatCard(cardNumber: string): string {\n return cardNumber.replace(/\\D/g, '').replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function maskIban(iban: string, showChars = 8): string {\n const clean = iban.replace(/\\s/g, '');\n if (clean.length <= showChars) return iban;\n return clean.slice(0, 4) + '*'.repeat(clean.length - showChars) + clean.slice(-4);\n}\n\nexport function maskAccountNumber(account: string, showLast = 4): string {\n const clean = account.replace(/\\D/g, '');\n if (clean.length <= showLast) return clean;\n return '*'.repeat(clean.length - showLast) + clean.slice(-showLast);\n}\n\nexport function maskEmail(email: string): string {\n const [user, domain] = email.split('@');\n if (!domain || user.length < 3) return '***@' + (domain ?? '');\n return user[0] + '*'.repeat(user.length - 2) + user[user.length - 1] + '@' + domain;\n}\n\nexport function maskPhone(phone: string, showLast = 4): string {\n const digits = phone.replace(/\\D/g, '');\n if (digits.length <= showLast) return phone;\n return '*'.repeat(digits.length - showLast) + digits.slice(-showLast);\n}\n\nexport function maskName(name: string): string {\n const parts = name.trim().split(/\\s+/);\n return parts.map((p, i) => i === 0 ? p : p[0] + '*'.repeat(p.length - 1)).join(' ');\n}\n\n// ── Singapore / Malaysia NRIC ───────────────────────────────────────────────\n\nconst NRIC_SG_REGEX = /^[STFGM]\\d{7}[A-Z]$/i;\n// Singapore checksum weights and checksums\nconst NRIC_WEIGHTS = [2, 7, 6, 5, 4, 3, 2];\nconst NRIC_SG_ST = ['J','Z','I','H','G','F','E','D','C','B','A'];\nconst NRIC_SG_FG = ['X','W','U','T','R','Q','P','N','M','L','K'];\nconst NRIC_SG_M = ['K','L','J','N','P','Q','R','T','U','W','X'];\n\nexport function validateNric(nric: string): boolean {\n const clean = nric.trim().toUpperCase();\n if (!NRIC_SG_REGEX.test(clean)) return false;\n const prefix = clean[0];\n const digits = clean.slice(1, 8).split('').map(Number);\n const suffix = clean[8];\n const sum = digits.reduce((acc, d, i) => acc + d * NRIC_WEIGHTS[i], 0);\n const offset = (prefix === 'G' || prefix === 'T' || prefix === 'S') ? 0 : (prefix === 'F' ? 0 : 0);\n const mod = (sum + (prefix === 'G' || prefix === 'T' ? 4 : prefix === 'M' ? 3 : 0)) % 11;\n let table: string[];\n if (prefix === 'S' || prefix === 'T') table = NRIC_SG_ST;\n else if (prefix === 'F' || prefix === 'G') table = NRIC_SG_FG;\n else table = NRIC_SG_M;\n void offset;\n return table[mod] === suffix;\n}\n\nexport function maskNric(nric: string): string {\n const clean = nric.trim().toUpperCase();\n if (clean.length < 5) return nric;\n return clean[0] + '*'.repeat(clean.length - 4) + clean.slice(-3);\n}\n\n// Malaysia MyKad (IC): YYMMDD-PB-NNNG\nconst MYKAD_REGEX = /^\\d{12}$|^\\d{6}-\\d{2}-\\d{4}$/;\n\nexport function validateMyKad(ic: string): boolean {\n return MYKAD_REGEX.test(ic.replace(/\\s/g, ''));\n}\n\nexport function maskMyKad(ic: string): string {\n const clean = ic.replace(/[-\\s]/g, '');\n if (clean.length !== 12) return ic;\n // Show birth year (first 2) + state code (pos 6-7), mask the rest → always 12 chars\n return clean.slice(0, 2) + '****' + clean.slice(6, 8) + '****';\n}\n\nexport function formatMyKad(ic: string): string {\n const clean = ic.replace(/\\D/g, '');\n if (clean.length !== 12) return ic;\n return `${clean.slice(0, 6)}-${clean.slice(6, 8)}-${clean.slice(8)}`;\n}\n","// Custom masking — flexible pattern-based masking for any string value\n\n/** Mask a string showing the first N and last M characters, masking everything in between.\n * maskRange('1234567890', 2, 4) → '12****7890'\n * maskRange('1234567890', 0, 4) → '******7890'\n * maskRange('1234567890', 2, 0) → '12********'\n */\nexport function maskRange(\n value: string,\n firstVisible: number,\n lastVisible: number,\n maskChar = '*',\n): string {\n const len = value.length;\n const first = Math.max(0, Math.min(firstVisible, len));\n const last = Math.max(0, Math.min(lastVisible, len - first));\n const midLen = Math.max(0, len - first - last);\n return value.slice(0, first) + maskChar.repeat(midLen) + value.slice(len - last || len);\n}\n\n/** Show only the last N characters.\n * maskShowLast('1234567890', 4) → '******7890'\n */\nexport function maskShowLast(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, 0, n, maskChar);\n}\n\n/** Show only the first N characters.\n * maskShowFirst('1234567890', 3) → '123*******'\n */\nexport function maskShowFirst(value: string, n: number, maskChar = '*'): string {\n return maskRange(value, n, 0, maskChar);\n}\n\n/** Pattern-based masking using a format string.\n * '#' = reveal original character, 'X' = mask.\n * maskPattern('4532015112830366', '####XXXXXXXX####') → '4532********0366'\n * maskPattern('ABCPG1234C', 'XX*****XX*') → 'AB*****34*' (any non-# char = mask)\n *\n * Pattern characters:\n * '#' — show original character\n * '*' / 'X' / 'x' — replace with maskChar\n * Any other char is passed through as-is (separator)\n */\nexport function maskPattern(value: string, pattern: string, maskChar = '*'): string {\n let result = '';\n let vi = 0;\n for (let i = 0; i < pattern.length; i++) {\n const pc = pattern[i];\n if (pc === '#') {\n result += vi < value.length ? value[vi++] : '';\n } else if (pc === '*' || pc === 'X' || pc === 'x') {\n result += vi < value.length ? maskChar : '';\n vi++;\n } else {\n // separator / literal — pass through (skip one source char if aligned)\n result += pc;\n }\n }\n return result;\n}\n\n/** Keep middle characters visible, mask the edges.\n * maskKeepMiddle('1234567890', 4) → '***4567***'\n */\nexport function maskKeepMiddle(value: string, visibleCount: number, maskChar = '*'): string {\n const len = value.length;\n const half = Math.floor(visibleCount / 2);\n const start = Math.max(0, Math.floor((len - visibleCount) / 2));\n const end = start + visibleCount;\n return maskChar.repeat(start) + value.slice(start, end) + maskChar.repeat(Math.max(0, len - end));\n}\n\n/** Mask every other character (interleaved masking).\n * maskInterleaved('1234567890') → '1*3*5*7*9*'\n */\nexport function maskInterleaved(value: string, maskChar = '*'): string {\n return value.split('').map((c, i) => i % 2 === 0 ? c : maskChar).join('');\n}\n\n/** Mask all but keep separators in place (useful for formatted IBANs, phones etc).\n * maskKeepSeparators('GB29 NWBK 6016 1331', 4) → 'GB29 **** **** 1331'\n */\nexport function maskKeepSeparators(value: string, lastVisible: number, separators = ' -', maskChar = '*'): string {\n const stripped = value.split('').filter(c => !separators.includes(c)).join('');\n const maskedStripped = maskShowLast(stripped, lastVisible, maskChar);\n let mi = 0;\n return value.split('').map(c => separators.includes(c) ? c : maskedStripped[mi++] ?? '').join('');\n}\n","const IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22,\n BR: 29, BY: 28, CH: 21, CR: 22, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28,\n EE: 20, EG: 29, ES: 24, FI: 18, FO: 18, FR: 27, GB: 22, GE: 22, GI: 23,\n GL: 18, GR: 27, GT: 28, HR: 21, HU: 28, IE: 22, IL: 23, IQ: 23, IS: 26,\n IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LC: 32, LI: 21, LT: 20, LU: 20,\n LV: 21, LY: 25, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30,\n NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29, RO: 24, RS: 22,\n SA: 24, SC: 31, SD: 18, SE: 24, SI: 19, SK: 24, SM: 27, ST: 25, SV: 28,\n TL: 23, TN: 24, TR: 26, UA: 29, VA: 22, VG: 24, XK: 20,\n};\n\nexport function validateIban(iban: string): boolean {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n const country = clean.slice(0, 2);\n if (!IBAN_LENGTHS[country] || clean.length !== IBAN_LENGTHS[country]) return false;\n\n const numeric = (clean.slice(4) + clean.slice(0, 4))\n .split('')\n .map(c => c.charCodeAt(0) >= 65 ? (c.charCodeAt(0) - 55).toString() : c)\n .join('');\n\n let remainder = 0;\n for (const ch of numeric) remainder = (remainder * 10 + parseInt(ch)) % 97;\n return remainder === 1;\n}\n\nexport function formatIban(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().replace(/(.{4})/g, '$1 ').trim();\n}\n\nexport function getIbanCountry(iban: string): string {\n return iban.replace(/\\s/g, '').toUpperCase().slice(0, 2);\n}\n\nexport function parseIban(iban: string): { country: string; checkDigits: string; bban: string } | null {\n const clean = iban.replace(/\\s/g, '').toUpperCase();\n if (!validateIban(clean)) return null;\n return { country: clean.slice(0, 2), checkDigits: clean.slice(2, 4), bban: clean.slice(4) };\n}\n\nexport function getSupportedIbanCountries(): string[] {\n return Object.keys(IBAN_LENGTHS).sort();\n}\n","export interface JoopCurrencyFormatOptions {\n currency: string;\n locale?: string;\n showSymbol?: boolean;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport function formatCurrency(amount: number | string, options: JoopCurrencyFormatOptions): string {\n const num = typeof amount === 'string' ? parseFloat(amount.replace(/[,\\s]/g, '')) : amount;\n if (!isFinite(num)) return '—';\n\n return new Intl.NumberFormat(options.locale ?? 'en-US', {\n style: options.showSymbol === false ? 'decimal' : 'currency',\n currency: options.showSymbol === false ? undefined : options.currency,\n minimumFractionDigits: options.minimumFractionDigits ?? 2,\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\n }).format(num);\n}\n\nexport function parseCurrencyString(value: string): number {\n const cleaned = value.replace(/[^0-9.\\-]/g, '');\n const num = parseFloat(cleaned);\n return isNaN(num) ? 0 : num;\n}\n\nexport function convertCurrency(amount: number, rate: number, decimals = 2): number {\n return parseFloat((amount * rate).toFixed(decimals));\n}\n\nexport function getCurrencySymbol(currency: string, locale = 'en-US'): string {\n const formatted = new Intl.NumberFormat(locale, { style: 'currency', currency }).format(0);\n return formatted.replace(/[\\d\\s.,]/g, '').trim();\n}\n\nexport function formatAmount(amount: number, decimals = 2, locale = 'en-US'): string {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(amount);\n}\n","export function safeAdd(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) + Math.round(b * f)) / f;\n}\n\nexport function safeSubtract(a: number, b: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return (Math.round(a * f) - Math.round(b * f)) / f;\n}\n\nexport function safeMultiply(a: number, b: number, decimals = 2): number {\n return parseFloat((a * b).toFixed(decimals));\n}\n\nexport function safeDivide(a: number, b: number, decimals = 2): number {\n if (b === 0) throw new Error('Division by zero');\n return parseFloat((a / b).toFixed(decimals));\n}\n\nexport function roundAmount(amount: number, decimals = 2): number {\n const f = Math.pow(10, decimals);\n return Math.round(amount * f) / f;\n}\n\nexport function isValidAmount(value: unknown): boolean {\n if (typeof value === 'string') {\n const clean = value.replace(/[,\\s]/g, '');\n return /^-?\\d+(\\.\\d+)?$/.test(clean) && isFinite(parseFloat(clean));\n }\n return typeof value === 'number' && isFinite(value);\n}\n\nexport function clampAmount(amount: number, min: number, max: number): number {\n return Math.min(Math.max(amount, min), max);\n}\n\nexport function toMinorUnits(amount: number, decimalPlaces = 2): number {\n return Math.round(amount * Math.pow(10, decimalPlaces));\n}\n\nexport function fromMinorUnits(amount: number, decimalPlaces = 2): number {\n return amount / Math.pow(10, decimalPlaces);\n}\n\nexport function sumAmounts(...amounts: number[]): number {\n const f = 100;\n return amounts.reduce((acc, a) => acc + Math.round(a * f), 0) / f;\n}\n","export interface JoopTransactionRef {\n id: string;\n timestamp: number;\n prefix: string;\n full: string;\n}\n\nexport function generateTransactionId(prefix = 'TXN'): JoopTransactionRef {\n const timestamp = Date.now();\n const randomBytes = new Uint8Array(8);\n crypto.getRandomValues(randomBytes);\n const randomHex = Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n return { id: randomHex, timestamp, prefix, full: `${prefix}-${timestamp}-${randomHex}` };\n}\n\nexport function generateReferenceNumber(length = 12): string {\n const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n}\n\nexport function parseTransactionId(id: string): { prefix: string; timestamp: number; random: string } | null {\n const parts = id.split('-');\n if (parts.length < 3) return null;\n const timestamp = parseInt(parts[1]);\n if (isNaN(timestamp)) return null;\n return { prefix: parts[0], timestamp, random: parts.slice(2).join('-') };\n}\n\nexport function isValidTransactionId(id: string): boolean {\n return parseTransactionId(id) !== null;\n}\n\nexport function generateBatchId(): string {\n const arr = new Uint8Array(12);\n crypto.getRandomValues(arr);\n return 'BATCH-' + Array.from(arr).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();\n}\n","export interface JoopReceiptLine {\n label: string;\n value: string;\n bold?: boolean;\n}\n\nexport interface JoopReceiptData {\n title: string;\n referenceNumber: string;\n timestamp: string;\n lines: JoopReceiptLine[];\n footer?: string;\n}\n\nexport class JoopReceiptService {\n build(data: JoopReceiptData): JoopReceiptData { return data; }\n\n toText(data: JoopReceiptData): string {\n const div = '─'.repeat(40);\n return [\n div,\n data.title.toUpperCase().padStart(Math.ceil((40 + data.title.length) / 2)),\n div,\n `Ref : ${data.referenceNumber}`,\n `Date: ${data.timestamp}`,\n div,\n ...data.lines.map(l => l.label.padEnd(22) + l.value),\n div,\n ...(data.footer ? [data.footer] : []),\n ].join('\\n');\n }\n\n toJson(data: JoopReceiptData): string {\n return JSON.stringify(data, null, 2);\n }\n\n toHtml(data: JoopReceiptData): string {\n const rows = data.lines.map(l =>\n `<tr><td>${l.label}</td><td${l.bold ? ' style=\"font-weight:bold\"' : ''}>${l.value}</td></tr>`\n ).join('');\n return `<div class=\"joop-receipt\">\n <h2>${data.title}</h2>\n <p>Ref: ${data.referenceNumber} &nbsp;|&nbsp; ${data.timestamp}</p>\n <table>${rows}</table>${data.footer ? `\\n <p class=\"footer\">${data.footer}</p>` : ''}\n</div>`;\n }\n}\n","// ── Luhn algorithm & card type detection ──────────────────────────────────\n\nexport type JoopCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unionpay' | 'jcb' | 'diners' | 'maestro' | 'unknown';\n\nexport interface JoopCardInfo {\n network: JoopCardNetwork;\n valid: boolean;\n lengths: number[];\n cvvLength: number;\n formatted: string;\n}\n\nconst CARD_PATTERNS: Array<{ network: JoopCardNetwork; pattern: RegExp; lengths: number[]; cvvLength: number }> = [\n { network: 'amex', pattern: /^3[47]/, lengths: [15], cvvLength: 4 },\n { network: 'diners', pattern: /^3(?:0[0-5]|[68])/, lengths: [14], cvvLength: 3 },\n { network: 'discover', pattern: /^6(?:011|5[0-9]{2})/, lengths: [16], cvvLength: 3 },\n { network: 'jcb', pattern: /^(?:2131|1800|35)/, lengths: [16], cvvLength: 3 },\n { network: 'maestro', pattern: /^(?:5018|5020|5038|6304|6759|676[1-3])/, lengths: [12,13,14,15,16,17,18,19], cvvLength: 3 },\n { network: 'mastercard', pattern: /^5[1-5]|^2[2-7]/, lengths: [16], cvvLength: 3 },\n { network: 'unionpay', pattern: /^62/, lengths: [16,17,18,19], cvvLength: 3 },\n { network: 'visa', pattern: /^4/, lengths: [13,16,19], cvvLength: 3 },\n];\n\n/** Validate a card number using the Luhn algorithm */\nexport function validateLuhn(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < 8) return false;\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/** Compute the Luhn check digit for a partial card number */\nexport function luhnCheckDigit(partial: string): number {\n const digits = partial.replace(/\\D/g, '');\n let sum = 0;\n let double = true;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = parseInt(digits[i], 10);\n if (double) { d *= 2; if (d > 9) d -= 9; }\n sum += d;\n double = !double;\n }\n return (10 - (sum % 10)) % 10;\n}\n\n/** Detect the card network from the card number prefix */\nexport function getCardNetwork(cardNumber: string): JoopCardNetwork {\n const digits = cardNumber.replace(/\\D/g, '');\n for (const card of CARD_PATTERNS) {\n if (card.pattern.test(digits)) return card.network;\n }\n return 'unknown';\n}\n\n/** Get full card validation info */\nexport function getCardInfo(cardNumber: string): JoopCardInfo {\n const digits = cardNumber.replace(/\\D/g, '');\n const match = CARD_PATTERNS.find(c => c.pattern.test(digits));\n const network = match?.network ?? 'unknown';\n const lengths = match?.lengths ?? [13, 14, 15, 16, 19];\n const cvvLength = match?.cvvLength ?? 3;\n const valid = lengths.includes(digits.length) && validateLuhn(digits);\n const formatted = formatCardNumber(digits);\n return { network, valid, lengths, cvvLength, formatted };\n}\n\n/** Format card number with spaces (e.g. 4111 1111 1111 1111 or 3714 496353 98431 for Amex) */\nexport function formatCardNumber(cardNumber: string): string {\n const digits = cardNumber.replace(/\\D/g, '');\n const network = getCardNetwork(digits);\n if (network === 'amex') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{5})$/, '$1 $2 $3');\n }\n if (network === 'diners') {\n return digits.replace(/^(\\d{4})(\\d{6})(\\d{4})$/, '$1 $2 $3');\n }\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ');\n}\n\n/** Validate card expiry (MM/YY or MM/YYYY) */\nexport function isCardExpired(month: number | string, year: number | string): boolean {\n const m = parseInt(String(month), 10);\n let y = parseInt(String(year), 10);\n if (y < 100) y += 2000;\n const now = new Date();\n const expiry = new Date(y, m - 1, 1);\n expiry.setMonth(expiry.getMonth() + 1); // expire at end of month\n return expiry <= now;\n}\n\n/** Validate a CVV/CVC value */\nexport function validateCvv(cvv: string, network: JoopCardNetwork = 'unknown'): boolean {\n const digits = cvv.replace(/\\D/g, '');\n const expectedLength = network === 'amex' ? 4 : 3;\n return digits.length === expectedLength;\n}\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopTransactionSignal {\n transactionId: string;\n amount: number;\n currency: string;\n timestamp: number;\n deviceId?: string;\n ipAddress?: string;\n latitude?: number;\n longitude?: number;\n cardBin?: string;\n merchantCategory?: string;\n channel?: 'web' | 'mobile' | 'atm' | 'pos';\n userId?: string;\n}\n\nexport interface JoopFraudSignalResult {\n name: string;\n score: number;\n triggered: boolean;\n detail?: string;\n}\n\nexport type JoopFraudLevel = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface JoopFraudResult {\n transactionId: string;\n score: number;\n level: JoopFraudLevel;\n signals: JoopFraudSignalResult[];\n recommendation: 'allow' | 'review' | 'challenge' | 'block';\n timestamp: number;\n}\n\nexport interface JoopFraudConfig {\n velocityWindowMs?: number;\n velocityCountThreshold?: number;\n velocityAmountThreshold?: number;\n largeAmountThreshold?: number;\n geoDistanceThresholdKm?: number;\n alertThreshold?: number;\n maxHistorySize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction _haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = (lat2 - lat1) * Math.PI / 180;\n const dLon = (lon2 - lon1) * Math.PI / 180;\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\nfunction _scoreToLevel(score: number): JoopFraudLevel {\n if (score <= 30) return 'low';\n if (score <= 60) return 'medium';\n if (score <= 80) return 'high';\n return 'critical';\n}\n\nfunction _levelToRecommendation(level: JoopFraudLevel): 'allow' | 'review' | 'challenge' | 'block' {\n switch (level) {\n case 'low': return 'allow';\n case 'medium': return 'review';\n case 'high': return 'challenge';\n case 'critical': return 'block';\n }\n}\n\n// ---------------------------------------------------------------------------\n// JoopFraudDetection\n// ---------------------------------------------------------------------------\n\nexport class JoopFraudDetection {\n private readonly _cfg: Required<JoopFraudConfig>;\n private _history: JoopTransactionSignal[] = [];\n private _alertHandlers: Array<(result: JoopFraudResult) => void> = [];\n\n // Expose a reactive subject so callers can subscribe to every evaluation result\n readonly result$: JoopBehaviorSubject<JoopFraudResult | null>;\n\n constructor(config: JoopFraudConfig = {}) {\n this._cfg = {\n velocityWindowMs: config.velocityWindowMs ?? 3_600_000,\n velocityCountThreshold: config.velocityCountThreshold ?? 10,\n velocityAmountThreshold: config.velocityAmountThreshold ?? 5_000,\n largeAmountThreshold: config.largeAmountThreshold ?? 10_000,\n geoDistanceThresholdKm: config.geoDistanceThresholdKm ?? 500,\n alertThreshold: config.alertThreshold ?? 70,\n maxHistorySize: config.maxHistorySize ?? 1_000,\n };\n this.result$ = new JoopBehaviorSubject<JoopFraudResult | null>(null);\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n evaluate(signal: JoopTransactionSignal): JoopFraudResult {\n const signals: JoopFraudSignalResult[] = [\n this._velocityCount(signal),\n this._velocityAmount(signal),\n this._largeAmount(signal),\n this._geoDistance(signal),\n this._timeAnomaly(signal),\n ];\n\n const raw = signals.reduce((sum, s) => sum + s.score, 0);\n const score = Math.min(100, Math.round(raw));\n const level = _scoreToLevel(score);\n\n const result: JoopFraudResult = {\n transactionId: signal.transactionId,\n score,\n level,\n signals,\n recommendation: _levelToRecommendation(level),\n timestamp: Date.now(),\n };\n\n this.result$.next(result);\n return result;\n }\n\n addSignal(signal: JoopTransactionSignal): void {\n this._history.push(signal);\n if (this._history.length > this._cfg.maxHistorySize) {\n this._history.shift();\n }\n\n const result = this.evaluate(signal);\n if (result.score >= this._cfg.alertThreshold) {\n for (const handler of this._alertHandlers) {\n try { handler(result); } catch { /* swallow handler errors */ }\n }\n }\n }\n\n clearHistory(userId?: string): void {\n if (userId === undefined) {\n this._history = [];\n } else {\n this._history = this._history.filter(s => s.userId !== userId);\n }\n }\n\n onAlert(handler: (result: JoopFraudResult) => void): () => void {\n this._alertHandlers.push(handler);\n return () => {\n this._alertHandlers = this._alertHandlers.filter(h => h !== handler);\n };\n }\n\n // -------------------------------------------------------------------------\n // Signal evaluators\n // -------------------------------------------------------------------------\n\n /** Velocity: count of transactions by same user/device in window — max 30 pts */\n private _velocityCount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const count = recent.length;\n const threshold = this._cfg.velocityCountThreshold;\n\n if (count === 0) {\n return { name: 'velocity_count', score: 0, triggered: false };\n }\n\n const ratio = Math.min(count / threshold, 1);\n const score = Math.round(ratio * 30);\n return {\n name: 'velocity_count',\n score,\n triggered: count >= threshold,\n detail: `${count} transactions in window (threshold ${threshold})`,\n };\n }\n\n /** Velocity: total amount by same user/device in window — max 25 pts */\n private _velocityAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const windowStart = signal.timestamp - this._cfg.velocityWindowMs;\n const recent = this._history.filter(s =>\n s.timestamp >= windowStart &&\n s.currency === signal.currency &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n const total = recent.reduce((sum, s) => sum + s.amount, 0) + signal.amount;\n const threshold = this._cfg.velocityAmountThreshold;\n\n if (total <= 0) {\n return { name: 'velocity_amount', score: 0, triggered: false };\n }\n\n const ratio = Math.min(total / threshold, 1);\n const score = Math.round(ratio * 25);\n return {\n name: 'velocity_amount',\n score,\n triggered: total >= threshold,\n detail: `${total.toFixed(2)} ${signal.currency} in window (threshold ${threshold})`,\n };\n }\n\n /** Large single amount — max 20 pts */\n private _largeAmount(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const threshold = this._cfg.largeAmountThreshold;\n if (signal.amount < threshold) {\n return { name: 'large_amount', score: 0, triggered: false };\n }\n const ratio = Math.min(signal.amount / (threshold * 3), 1);\n const score = Math.round(10 + ratio * 10); // 10–20 pts once over threshold\n return {\n name: 'large_amount',\n score,\n triggered: true,\n detail: `Amount ${signal.amount} ${signal.currency} exceeds threshold ${threshold}`,\n };\n }\n\n /** Geo distance from last transaction by same user — max 15 pts */\n private _geoDistance(signal: JoopTransactionSignal): JoopFraudSignalResult {\n if (signal.latitude === undefined || signal.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const previous = [...this._history]\n .reverse()\n .find(s =>\n s.latitude !== undefined &&\n s.longitude !== undefined &&\n (signal.userId ? s.userId === signal.userId : s.deviceId === signal.deviceId)\n );\n\n if (!previous || previous.latitude === undefined || previous.longitude === undefined) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const km = _haversine(previous.latitude, previous.longitude, signal.latitude, signal.longitude);\n const threshold = this._cfg.geoDistanceThresholdKm;\n\n if (km < threshold) {\n return { name: 'geo_distance', score: 0, triggered: false };\n }\n\n const ratio = Math.min(km / (threshold * 4), 1);\n const score = Math.round(ratio * 15);\n return {\n name: 'geo_distance',\n score,\n triggered: true,\n detail: `${km.toFixed(0)} km from last transaction (threshold ${threshold} km)`,\n };\n }\n\n /** Time anomaly: unusual hours 02:00–05:00 local time — max 10 pts */\n private _timeAnomaly(signal: JoopTransactionSignal): JoopFraudSignalResult {\n const hour = new Date(signal.timestamp).getHours();\n if (hour >= 2 && hour < 5) {\n return {\n name: 'time_anomaly',\n score: 10,\n triggered: true,\n detail: `Transaction at unusual hour ${hour}:xx (02–05 local)`,\n };\n }\n return { name: 'time_anomaly', score: 0, triggered: false };\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\n// ---------------------------------------------------------------------------\n// Interfaces and types\n// ---------------------------------------------------------------------------\n\nexport interface JoopOBCredentials {\n clientId: string;\n clientSecret: string;\n baseUrl: string;\n tokenUrl: string;\n}\n\nexport type JoopOBConsentStatus =\n | 'AwaitingAuthorisation'\n | 'Authorised'\n | 'Rejected'\n | 'Consumed'\n | 'Expired';\n\nexport type JoopOBPaymentStatus =\n | 'Pending'\n | 'AcceptedSettlementInProcess'\n | 'AcceptedSettlementCompleted'\n | 'Rejected'\n | 'Cancelled';\n\nexport type JoopOBAccountType = 'Personal' | 'Business';\n\nexport interface JoopOBAccount {\n accountId: string;\n iban?: string;\n currency: string;\n accountType: JoopOBAccountType;\n nickname?: string;\n balance?: {\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n };\n}\n\nexport interface JoopOBTransaction {\n transactionId: string;\n accountId: string;\n amount: number;\n currency: string;\n creditDebitIndicator: 'Credit' | 'Debit';\n status: 'Booked' | 'Pending';\n bookingDateTime: string;\n description?: string;\n merchantName?: string;\n reference?: string;\n}\n\nexport interface JoopOBPaymentRequest {\n reference: string;\n amount: number;\n currency: string;\n creditorName: string;\n creditorIban: string;\n debtorIban?: string;\n remittanceInfo?: string;\n}\n\nexport interface JoopOBConsentRequest {\n scopes: Array<\n | 'ReadAccountsBasic'\n | 'ReadAccountsDetail'\n | 'ReadBalances'\n | 'ReadTransactionsDetail'\n | 'ReadTransactionsCredits'\n | 'ReadTransactionsDebits'\n >;\n expirationDateTime?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal token state\n// ---------------------------------------------------------------------------\n\ninterface _TokenState {\n accessToken: string;\n expiresAt: number; // epoch ms\n}\n\n// ---------------------------------------------------------------------------\n// OBIE-spec raw response shapes (minimal subset)\n// ---------------------------------------------------------------------------\n\ninterface _OBIEAccountsResponse {\n Data: {\n Account: Array<{\n AccountId: string;\n Currency: string;\n AccountType: string;\n Nickname?: string;\n Account?: Array<{ Identification?: string }>;\n }>;\n };\n}\n\ninterface _OBIETransactionsResponse {\n Data: {\n Transaction: Array<{\n TransactionId: string;\n AccountId: string;\n Amount: { Amount: string; Currency: string };\n CreditDebitIndicator: string;\n Status: string;\n BookingDateTime: string;\n TransactionInformation?: string;\n MerchantDetails?: { MerchantName?: string };\n Reference?: string;\n }>;\n };\n}\n\ninterface _OBIEConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n Links?: { Self?: string };\n Risk?: Record<string, unknown>;\n}\n\ninterface _OBIEPaymentConsentResponse {\n Data: {\n ConsentId: string;\n Status: string;\n };\n}\n\ninterface _OBIEPaymentResponse {\n Data: {\n DomesticPaymentId: string;\n Status: string;\n ConsentId: string;\n };\n}\n\ninterface _OBIEPaymentStatusResponse {\n Data: { Status: string };\n}\n\ninterface _OBIEConsentStatusResponse {\n Data: { Status: string };\n}\n\n// ---------------------------------------------------------------------------\n// JoopOpenBankingClient\n// ---------------------------------------------------------------------------\n\nexport class JoopOpenBankingClient {\n private readonly _credentials: JoopOBCredentials;\n private _token: _TokenState | null = null;\n\n /** Reactive authentication state — true once a valid token is held */\n readonly authenticated$: JoopBehaviorSubject<boolean>;\n\n constructor(credentials: JoopOBCredentials) {\n this._credentials = credentials;\n this.authenticated$ = new JoopBehaviorSubject<boolean>(false);\n }\n\n // -------------------------------------------------------------------------\n // Authentication\n // -------------------------------------------------------------------------\n\n async authenticate(): Promise<void> {\n const token = await this._fetchToken();\n this._token = token;\n this.authenticated$.next(true);\n }\n\n // -------------------------------------------------------------------------\n // Accounts & balances\n // -------------------------------------------------------------------------\n\n async getAccounts(consentId: string): Promise<JoopOBAccount[]> {\n const raw = await this._request<_OBIEAccountsResponse>('GET', '/accounts', undefined, consentId);\n return (raw.Data.Account ?? []).map(a => ({\n accountId: a.AccountId,\n iban: a.Account?.[0]?.Identification,\n currency: a.Currency,\n accountType: (a.AccountType as JoopOBAccountType) ?? 'Personal',\n nickname: a.Nickname,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Transactions\n // -------------------------------------------------------------------------\n\n async getTransactions(\n accountId: string,\n consentId: string,\n fromDate?: string,\n toDate?: string,\n ): Promise<JoopOBTransaction[]> {\n const params = new URLSearchParams();\n if (fromDate) params.set('fromBookingDateTime', fromDate);\n if (toDate) params.set('toBookingDateTime', toDate);\n const query = params.toString() ? `?${params.toString()}` : '';\n const raw = await this._request<_OBIETransactionsResponse>(\n 'GET',\n `/accounts/${accountId}/transactions${query}`,\n undefined,\n consentId,\n );\n return (raw.Data.Transaction ?? []).map(t => ({\n transactionId: t.TransactionId,\n accountId: t.AccountId,\n amount: parseFloat(t.Amount.Amount),\n currency: t.Amount.Currency,\n creditDebitIndicator: t.CreditDebitIndicator as 'Credit' | 'Debit',\n status: t.Status as 'Booked' | 'Pending',\n bookingDateTime: t.BookingDateTime,\n description: t.TransactionInformation,\n merchantName: t.MerchantDetails?.MerchantName,\n reference: t.Reference,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Consents\n // -------------------------------------------------------------------------\n\n async createConsent(\n request: JoopOBConsentRequest,\n ): Promise<{ consentId: string; authorisationUrl: string; status: JoopOBConsentStatus }> {\n const body = {\n Data: {\n Permissions: request.scopes,\n ...(request.expirationDateTime ? { ExpirationDateTime: request.expirationDateTime } : {}),\n },\n Risk: {},\n };\n const raw = await this._request<_OBIEConsentResponse>('POST', '/account-access-consents', body);\n const consentId = raw.Data.ConsentId;\n // Build OBIE authorisation URL (redirect-based)\n const authorisationUrl =\n `${this._credentials.baseUrl.replace(/\\/open-banking.*$/, '')}/oauth2/authorize` +\n `?response_type=code%20id_token` +\n `&client_id=${encodeURIComponent(this._credentials.clientId)}` +\n `&request=${encodeURIComponent(consentId)}`;\n return {\n consentId,\n authorisationUrl,\n status: raw.Data.Status as JoopOBConsentStatus,\n };\n }\n\n async getConsentStatus(consentId: string): Promise<JoopOBConsentStatus> {\n const raw = await this._request<_OBIEConsentStatusResponse>(\n 'GET',\n `/account-access-consents/${consentId}`,\n );\n return raw.Data.Status as JoopOBConsentStatus;\n }\n\n async revokeConsent(consentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/account-access-consents/${consentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Payments\n // -------------------------------------------------------------------------\n\n async initiatePayment(\n request: JoopOBPaymentRequest,\n ): Promise<{ paymentId: string; status: JoopOBPaymentStatus; consentId: string }> {\n // Step 1: create payment consent\n const consentBody = {\n Data: {\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const consentRaw = await this._request<_OBIEPaymentConsentResponse>(\n 'POST',\n '/domestic-payment-consents',\n consentBody,\n );\n const consentId = consentRaw.Data.ConsentId;\n\n // Step 2: submit payment using the consent\n const paymentBody = {\n Data: {\n ConsentId: consentId,\n Initiation: _buildInitiation(request),\n },\n Risk: { PaymentContextCode: 'TransferToThirdParty' },\n };\n const paymentRaw = await this._request<_OBIEPaymentResponse>(\n 'POST',\n '/domestic-payments',\n paymentBody,\n );\n return {\n paymentId: paymentRaw.Data.DomesticPaymentId,\n status: paymentRaw.Data.Status as JoopOBPaymentStatus,\n consentId,\n };\n }\n\n async getPaymentStatus(paymentId: string): Promise<JoopOBPaymentStatus> {\n const raw = await this._request<_OBIEPaymentStatusResponse>(\n 'GET',\n `/domestic-payments/${paymentId}`,\n );\n return raw.Data.Status as JoopOBPaymentStatus;\n }\n\n async cancelPayment(paymentId: string): Promise<void> {\n await this._request<unknown>('DELETE', `/domestic-payments/${paymentId}`);\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private async _getToken(): Promise<string> {\n if (this._token && Date.now() < this._token.expiresAt - 30_000) {\n return this._token.accessToken;\n }\n const state = await this._fetchToken();\n this._token = state;\n this.authenticated$.next(true);\n return state.accessToken;\n }\n\n private async _fetchToken(): Promise<_TokenState> {\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this._credentials.clientId,\n client_secret: this._credentials.clientSecret,\n scope: 'accounts payments',\n });\n\n const res = await fetch(this._credentials.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!res.ok) {\n throw new Error(`[JoopOpenBankingClient] Token request failed: ${res.status} ${res.statusText}`);\n }\n\n const json = await res.json() as { access_token: string; expires_in: number };\n return {\n accessToken: json.access_token,\n expiresAt: Date.now() + json.expires_in * 1_000,\n };\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n consentId?: string,\n ): Promise<T> {\n const token = await this._getToken();\n const url = `${this._credentials.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'x-fapi-interaction-id': _generateInteractionId(),\n 'x-fapi-financial-id': this._credentials.clientId,\n };\n if (consentId) {\n headers['x-ob-consent-id'] = consentId;\n }\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => '');\n throw new Error(\n `[JoopOpenBankingClient] ${method} ${path} failed: ${res.status} ${res.statusText} — ${errorText}`,\n );\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _buildInitiation(req: JoopOBPaymentRequest): Record<string, unknown> {\n return {\n InstructionIdentification: req.reference,\n EndToEndIdentification: req.reference,\n InstructedAmount: {\n Amount: req.amount.toFixed(2),\n Currency: req.currency,\n },\n CreditorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.creditorIban,\n Name: req.creditorName,\n },\n ...(req.debtorIban\n ? {\n DebtorAccount: {\n SchemeName: 'UK.OBIE.IBAN',\n Identification: req.debtorIban,\n },\n }\n : {}),\n ...(req.remittanceInfo\n ? { RemittanceInformation: { Unstructured: req.remittanceInfo } }\n : {}),\n };\n}\n\nfunction _generateInteractionId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Format as UUID v4-like string\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\n\n// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopPaymentStep =\n | 'idle'\n | 'initiating'\n | 'awaiting_3ds'\n | 'processing_3ds'\n | 'authorised'\n | 'settled'\n | 'failed'\n | 'cancelled';\n\nexport interface JoopPaymentSession {\n sessionId: string;\n paymentId: string;\n amount: number;\n currency: string;\n step: JoopPaymentStep;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentRequest {\n amount: number;\n currency: string;\n cardNumber: string;\n cardExpiry: string;\n cvv: string;\n merchantId: string;\n reference: string;\n returnUrl?: string;\n notifyUrl?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface JoopThreeDsResult {\n transactionId: string;\n status: 'Y' | 'N' | 'U' | 'A';\n eci: string;\n cavv?: string;\n}\n\nexport interface JoopPaymentOrchestratorConfig {\n gatewayUrl: string;\n merchantId: string;\n apiKey: string;\n timeoutMs?: number;\n pollIntervalMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal gateway response shapes\n// ---------------------------------------------------------------------------\n\ninterface _GatewayInitiateResponse {\n paymentId: string;\n status: string;\n requires3ds?: boolean;\n threeDsUrl?: string;\n threeDsData?: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\ninterface _GatewayStatusResponse {\n paymentId: string;\n status: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Step → terminal/error checks\n// ---------------------------------------------------------------------------\n\nconst _TERMINAL_STEPS = new Set<JoopPaymentStep>(['authorised', 'settled', 'failed', 'cancelled']);\n\n// ---------------------------------------------------------------------------\n// JoopPaymentOrchestrator\n// ---------------------------------------------------------------------------\n\nexport class JoopPaymentOrchestrator {\n private readonly _cfg: Required<JoopPaymentOrchestratorConfig>;\n private readonly _sessions = new Map<string, JoopBehaviorSubject<JoopPaymentSession>>();\n\n constructor(config: JoopPaymentOrchestratorConfig) {\n this._cfg = {\n gatewayUrl: config.gatewayUrl,\n merchantId: config.merchantId,\n apiKey: config.apiKey,\n timeoutMs: config.timeoutMs ?? 30_000,\n pollIntervalMs: config.pollIntervalMs ?? 2_000,\n };\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n async initiate(request: JoopPaymentRequest): Promise<JoopPaymentSession> {\n const sessionId = this._generateSessionId();\n const now = Date.now();\n\n // Mask card number — keep only last 4 digits in session\n const maskedCard = `****${request.cardNumber.replace(/\\s/g, '').slice(-4)}`;\n\n const session: JoopPaymentSession = {\n sessionId,\n paymentId: '',\n amount: request.amount,\n currency: request.currency,\n step: 'initiating',\n createdAt: now,\n updatedAt: now,\n };\n\n const subject = new JoopBehaviorSubject<JoopPaymentSession>(session);\n this._sessions.set(sessionId, subject);\n\n try {\n const raw = await this._fetch<_GatewayInitiateResponse>('POST', '/payments', {\n amount: request.amount,\n currency: request.currency,\n cardNumber: maskedCard, // send masked to gateway after capture\n cardExpiry: request.cardExpiry,\n cvv: request.cvv,\n merchantId: request.merchantId,\n reference: request.reference,\n returnUrl: request.returnUrl,\n notifyUrl: request.notifyUrl,\n metadata: request.metadata,\n });\n\n const updated = this._updateSession(subject, {\n paymentId: raw.paymentId,\n step: raw.requires3ds ? 'awaiting_3ds' : 'authorised',\n threeDsUrl: raw.threeDsUrl,\n threeDsData: raw.threeDsData,\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n\n return updated;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, {\n step: 'failed',\n errorMessage: errMsg,\n });\n }\n }\n\n async handle3ds(sessionId: string, result: JoopThreeDsResult): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (result.status === 'N') {\n return this._updateSession(subject, {\n step: 'failed',\n errorCode: 'AUTH_FAILED_3DS',\n errorMessage: '3DS authentication was declined by the card issuer.',\n });\n }\n\n this._updateSession(subject, { step: 'processing_3ds' });\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/3ds`,\n {\n transactionId: result.transactionId,\n status: result.status,\n eci: result.eci,\n cavv: result.cavv,\n },\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async poll(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'GET',\n `/payments/${current.paymentId}`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async confirm(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n const raw = await this._fetch<_GatewayStatusResponse>(\n 'POST',\n `/payments/${current.paymentId}/confirm`,\n );\n return this._updateSession(subject, {\n step: _mapGatewayStatus(raw.status),\n errorCode: raw.errorCode,\n errorMessage: raw.errorMessage,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n async cancel(sessionId: string): Promise<JoopPaymentSession> {\n const subject = this._requireSession(sessionId);\n const current = subject.getValue();\n\n if (_TERMINAL_STEPS.has(current.step)) {\n return current;\n }\n\n try {\n await this._fetch<unknown>('DELETE', `/payments/${current.paymentId}`);\n return this._updateSession(subject, { step: 'cancelled' });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n return this._updateSession(subject, { step: 'failed', errorMessage: errMsg });\n }\n }\n\n getSession(sessionId: string): JoopPaymentSession | null {\n return this._sessions.get(sessionId)?.getValue() ?? null;\n }\n\n session$(sessionId: string): JoopObservable<JoopPaymentSession> {\n const existing = this._sessions.get(sessionId);\n if (existing) return existing.asObservable();\n\n // Return an observable that never emits if session doesn't exist yet;\n // callers should call initiate() first.\n return new JoopObservable<JoopPaymentSession>(() => () => { /* no-op unsubscribe */ });\n }\n\n destroy(): void {\n this._sessions.clear();\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private _requireSession(sessionId: string): JoopBehaviorSubject<JoopPaymentSession> {\n const subject = this._sessions.get(sessionId);\n if (!subject) throw new Error(`[JoopPaymentOrchestrator] Unknown sessionId: ${sessionId}`);\n return subject;\n }\n\n private _updateSession(\n subject: JoopBehaviorSubject<JoopPaymentSession>,\n patch: Partial<JoopPaymentSession>,\n ): JoopPaymentSession {\n const next: JoopPaymentSession = { ...subject.getValue(), ...patch, updatedAt: Date.now() };\n subject.next(next);\n return next;\n }\n\n private _generateSessionId(): string {\n const bytes = new Uint8Array(18);\n crypto.getRandomValues(bytes);\n // Base64url encode (no +, /, =)\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n\n private async _fetch<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this._cfg.gatewayUrl}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this._cfg.timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this._cfg.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-Merchant-Id': this._cfg.merchantId,\n },\n signal: controller.signal,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[JoopPaymentOrchestrator] ${method} ${path}: ${res.status} — ${text}`);\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level helpers\n// ---------------------------------------------------------------------------\n\nfunction _mapGatewayStatus(status: string): JoopPaymentStep {\n switch (status?.toLowerCase()) {\n case 'authorised':\n case 'authorized':\n return 'authorised';\n case 'settled':\n case 'captured':\n return 'settled';\n case 'failed':\n case 'declined':\n case 'error':\n return 'failed';\n case 'cancelled':\n case 'canceled':\n case 'voided':\n return 'cancelled';\n case 'pending':\n case 'processing':\n return 'processing_3ds';\n default:\n return 'processing_3ds';\n }\n}\n","// ---------------------------------------------------------------------------\n// Types and interfaces\n// ---------------------------------------------------------------------------\n\nexport type JoopTxnType = 'credit' | 'debit' | 'fee' | 'interest' | 'transfer' | 'unknown';\n\nexport interface JoopTransaction {\n id: string;\n date: string;\n valueDate?: string;\n amount: number;\n type: JoopTxnType;\n currency: string;\n description: string;\n reference?: string;\n balance?: number;\n counterpartyName?: string;\n counterpartyIban?: string;\n category?: string;\n raw?: string;\n}\n\nexport interface JoopStatementResult {\n format: 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown';\n accountId?: string;\n currency?: string;\n openingBalance?: number;\n closingBalance?: number;\n transactions: JoopTransaction[];\n parseErrors: string[];\n}\n\nexport interface JoopCsvStatementConfig {\n delimiter?: string;\n dateColumn?: string | number;\n amountColumn?: string | number;\n creditColumn?: string | number;\n debitColumn?: string | number;\n descriptionColumn?: string | number;\n referenceColumn?: string | number;\n balanceColumn?: string | number;\n dateFormat?: string;\n hasHeader?: boolean;\n skipRows?: number;\n}\n\n// ---------------------------------------------------------------------------\n// JoopStatementParser\n// ---------------------------------------------------------------------------\n\nexport class JoopStatementParser {\n\n // -------------------------------------------------------------------------\n // Auto-detect and dispatch\n // -------------------------------------------------------------------------\n\n parse(text: string, csvConfig?: JoopCsvStatementConfig): JoopStatementResult {\n const format = JoopStatementParser.detectFormat(text);\n switch (format) {\n case 'MT940': return this.parseMT940(text);\n case 'OFX': return this.parseOFX(text);\n case 'QIF': return this.parseQIF(text);\n case 'CSV': return this.parseCsv(text, csvConfig);\n default:\n return {\n format: 'unknown',\n transactions: [],\n parseErrors: ['Unable to detect statement format.'],\n };\n }\n }\n\n static detectFormat(text: string): 'MT940' | 'OFX' | 'QIF' | 'CSV' | 'unknown' {\n const trimmed = text.trimStart();\n if (trimmed.startsWith(':20:') || trimmed.includes('\\n:20:')) return 'MT940';\n if (trimmed.includes('OFXHEADER:') || trimmed.includes('<OFX>')) return 'OFX';\n if (/^[DTPMNLC!\\^]/m.test(trimmed) && trimmed.includes('^')) return 'QIF';\n // Heuristic: at least one line contains delimiter-separated fields\n const firstLines = trimmed.split('\\n').slice(0, 5).join('\\n');\n if (/[,;\\t]/.test(firstLines)) return 'CSV';\n return 'unknown';\n }\n\n // -------------------------------------------------------------------------\n // MT940\n // -------------------------------------------------------------------------\n\n parseMT940(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'MT940',\n transactions: [],\n parseErrors: [],\n };\n\n // Normalise line endings\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n // Extract individual fields using tag markers\n const fieldRegex = /:(\\d{2}[A-Z]?):([\\s\\S]*?)(?=\\n:\\d{2}[A-Z]?:|$)/g;\n const fields = new Map<string, string[]>();\n let m: RegExpExecArray | null;\n while ((m = fieldRegex.exec(lines)) !== null) {\n const tag = m[1];\n const value = m[2].trim();\n const existing = fields.get(tag) ?? [];\n existing.push(value);\n fields.set(tag, existing);\n }\n\n // :25: account\n const acct = fields.get('25')?.[0];\n if (acct) {\n result.accountId = acct.includes('/') ? acct.split('/')[1] : acct;\n }\n\n // :60F: or :60M: opening balance — format: C/DYYMMDDCUR,Amount\n const ob = fields.get('60F')?.[0] ?? fields.get('60M')?.[0];\n if (ob) {\n const parsed = _parseMT940Balance(ob);\n if (parsed) {\n result.currency = parsed.currency;\n result.openingBalance = parsed.amount;\n }\n }\n\n // :62F: or :62M: closing balance\n const cb = fields.get('62F')?.[0] ?? fields.get('62M')?.[0];\n if (cb) {\n const parsed = _parseMT940Balance(cb);\n if (parsed) result.closingBalance = parsed.amount;\n }\n\n // :61: / :86: pairs\n const tag61 = fields.get('61') ?? [];\n const tag86 = fields.get('86') ?? [];\n\n tag61.forEach((line61, idx) => {\n const narrative = tag86[idx] ?? '';\n try {\n const txn = _parseMT940Transaction(line61, narrative, result.accountId, result.currency, idx);\n if (txn) result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`MT940 :61: index ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // OFX / QFX (SGML format)\n // -------------------------------------------------------------------------\n\n parseOFX(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'OFX',\n transactions: [],\n parseErrors: [],\n };\n\n const tag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(text)?.[1]?.trim();\n };\n\n result.accountId = tag('ACCTID') ?? tag('BANKID');\n result.currency = tag('CURDEF') ?? tag('CURRENCY');\n\n const ledgerBal = tag('BALAMT');\n if (ledgerBal !== undefined) result.closingBalance = parseFloat(ledgerBal);\n\n // Extract all STMTTRN blocks\n const txnBlockRe = /<STMTTRN>([\\s\\S]*?)<\\/STMTTRN>/gi;\n let blockMatch: RegExpExecArray | null;\n let idx = 0;\n\n while ((blockMatch = txnBlockRe.exec(text)) !== null) {\n const block = blockMatch[1];\n const bTag = (name: string): string | undefined => {\n const re = new RegExp(`<${name}>([^<\\\\n\\\\r]*)`, 'i');\n return re.exec(block)?.[1]?.trim();\n };\n\n try {\n const trnType = bTag('TRNTYPE') ?? '';\n const dtPosted = bTag('DTPOSTED') ?? '';\n const dtAvail = bTag('DTAVAIL');\n const amtStr = bTag('TRNAMT') ?? '0';\n const fitId = bTag('FITID') ?? String(idx);\n const name = bTag('NAME');\n const memo = bTag('MEMO');\n const refNum = bTag('REFNUM') ?? bTag('CHECKNUM');\n\n const rawAmount = parseFloat(amtStr);\n const amount = Math.abs(rawAmount);\n const type = _ofxTrnType(trnType, rawAmount);\n\n const date = _parseOFXDate(dtPosted);\n const valueDate = dtAvail ? _parseOFXDate(dtAvail) : undefined;\n\n const txn: JoopTransaction = {\n id: _stableId(result.accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: result.currency ?? 'USD',\n description: memo ?? name ?? '',\n reference: refNum,\n counterpartyName: name,\n raw: block,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`OFX STMTTRN index ${idx}: ${String(e)}`);\n }\n idx++;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // QIF (Quicken Interchange Format)\n // -------------------------------------------------------------------------\n\n parseQIF(text: string): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'QIF',\n transactions: [],\n parseErrors: [],\n };\n\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n let current: Partial<{\n date: string;\n amount: number;\n payee: string;\n memo: string;\n ref: string;\n cleared: string;\n }> = {};\n let idx = 0;\n\n for (const line of lines) {\n if (line.startsWith('!')) continue; // header / account type line\n if (line === '^') {\n // End of record — commit\n if (current.date !== undefined && current.amount !== undefined) {\n try {\n const amount = Math.abs(current.amount);\n const type: JoopTxnType = current.amount < 0 ? 'debit' : 'credit';\n const txn: JoopTransaction = {\n id: _stableId(undefined, current.date, amount, idx),\n date: current.date,\n amount,\n type,\n currency: 'USD', // QIF doesn't carry currency\n description: current.memo ?? current.payee ?? '',\n reference: current.ref,\n counterpartyName: current.payee,\n raw: undefined,\n };\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`QIF record ${idx}: ${String(e)}`);\n }\n idx++;\n }\n current = {};\n continue;\n }\n\n const code = line[0];\n const value = line.slice(1).trim();\n\n switch (code) {\n case 'D': current.date = _parseQIFDate(value); break;\n case 'T': current.amount = parseFloat(value.replace(/,/g, '')); break;\n case 'P': current.payee = value; break;\n case 'M': current.memo = value; break;\n case 'N': current.ref = value; break;\n case 'L': /* category — skip for now */ break;\n case 'C': current.cleared = value; break;\n }\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // CSV\n // -------------------------------------------------------------------------\n\n parseCsv(text: string, config: JoopCsvStatementConfig = {}): JoopStatementResult {\n const result: JoopStatementResult = {\n format: 'CSV',\n transactions: [],\n parseErrors: [],\n };\n\n const delimiter = config.delimiter ?? _detectDelimiter(text);\n const hasHeader = config.hasHeader ?? true;\n const skipRows = config.skipRows ?? 0;\n\n const rawRows = text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .split('\\n')\n .filter(l => l.trim().length > 0);\n\n const allRows = rawRows.slice(skipRows);\n if (allRows.length === 0) {\n result.parseErrors.push('CSV: no data rows found.');\n return result;\n }\n\n const headerRow: string[] | undefined = hasHeader ? _splitCsvRow(allRows[0], delimiter) : undefined;\n const dataRows = hasHeader ? allRows.slice(1) : allRows;\n\n const resolve = (col: string | number | undefined): number => {\n if (col === undefined) return -1;\n if (typeof col === 'number') return col;\n return headerRow ? headerRow.findIndex(h => h.toLowerCase() === col.toLowerCase()) : -1;\n };\n\n const dateIdx = resolve(config.dateColumn ?? _guessColumn(headerRow, ['date', 'transaction date', 'txn date']));\n const amtIdx = resolve(config.amountColumn ?? _guessColumn(headerRow, ['amount', 'value']));\n const crIdx = resolve(config.creditColumn ?? _guessColumn(headerRow, ['credit', 'credits']));\n const drIdx = resolve(config.debitColumn ?? _guessColumn(headerRow, ['debit', 'debits']));\n const descIdx = resolve(config.descriptionColumn ?? _guessColumn(headerRow, ['description', 'details', 'narrative', 'memo']));\n const refIdx = resolve(config.referenceColumn ?? _guessColumn(headerRow, ['reference', 'ref', 'cheque no', 'check no']));\n const balIdx = resolve(config.balanceColumn ?? _guessColumn(headerRow, ['balance', 'running balance']));\n\n dataRows.forEach((row, idx) => {\n if (!row.trim()) return;\n const cols = _splitCsvRow(row, delimiter);\n try {\n const rawDate = dateIdx >= 0 ? cols[dateIdx] ?? '' : '';\n const rawDesc = descIdx >= 0 ? cols[descIdx] ?? '' : '';\n const rawRef = refIdx >= 0 ? cols[refIdx] ?? '' : undefined;\n const rawBal = balIdx >= 0 ? cols[balIdx] ?? '' : undefined;\n\n const date = _parseCsvDate(rawDate.trim(), config.dateFormat);\n\n // Determine amount and type\n let amount: number;\n let type: JoopTxnType;\n\n if (crIdx >= 0 || drIdx >= 0) {\n const crAmt = crIdx >= 0 ? _parseAmount(cols[crIdx] ?? '') : 0;\n const drAmt = drIdx >= 0 ? _parseAmount(cols[drIdx] ?? '') : 0;\n if (crAmt > 0) { amount = crAmt; type = 'credit'; }\n else if (drAmt > 0) { amount = drAmt; type = 'debit'; }\n else { amount = 0; type = 'unknown'; }\n } else if (amtIdx >= 0) {\n const raw = _parseAmount(cols[amtIdx] ?? '');\n amount = Math.abs(raw);\n type = raw < 0 ? 'debit' : (raw > 0 ? 'credit' : 'unknown');\n } else {\n result.parseErrors.push(`CSV row ${idx}: no amount column found.`);\n return;\n }\n\n const txn: JoopTransaction = {\n id: _stableId(undefined, date, amount, idx),\n date,\n amount,\n type,\n currency: 'USD',\n description: rawDesc.replace(/^\"|\"$/g, ''),\n reference: rawRef?.replace(/^\"|\"$/g, ''),\n balance: rawBal ? _parseAmount(rawBal) : undefined,\n raw: row,\n };\n\n result.transactions.push(txn);\n } catch (e) {\n result.parseErrors.push(`CSV row ${idx}: ${String(e)}`);\n }\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// MT940 helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseMT940Balance(value: string): { currency: string; amount: number } | null {\n // Format: C|D YYMMDD CUR AMOUNT (comma as decimal separator)\n const m = /^[CD](\\d{6})([A-Z]{3})([\\d,]+)/.exec(value.replace(/\\s/g, ''));\n if (!m) return null;\n const indicator = value[0] === 'D' ? -1 : 1;\n return {\n currency: m[2],\n amount: indicator * parseFloat(m[3].replace(',', '.')),\n };\n}\n\nfunction _parseMT940Transaction(\n line61: string,\n narrative: string,\n accountId: string | undefined,\n currency: string | undefined,\n idx: number,\n): JoopTransaction | null {\n // :61: format: YYMMDD[MMDD]C|D[Rd]Amount[FReference//BankRef]\n // Example: 2301151216CR500,00NTRFREF123//BANKREF\n const re = /^(\\d{6})(\\d{4})?([CD])(R?)([A-Z]?)(\\d[\\d,]+)(.*)$/;\n const m = re.exec(line61.replace(/\\s/g, ''));\n if (!m) return null;\n\n const yymmdd = m[1];\n const mmddOpt = m[2]; // optional value date\n const cdFlag = m[3]; // C or D\n const _reversal = m[4]; // R prefix means reversal\n // m[5] is the swift funds code (single letter), not needed\n const amtStr = m[6];\n const rest = m[7] ?? '';\n\n const year = parseInt(yymmdd.slice(0, 2)) + 2000;\n const month = yymmdd.slice(2, 4);\n const day = yymmdd.slice(4, 6);\n const date = `${year}-${month}-${day}`;\n\n let valueDate: string | undefined;\n if (mmddOpt) {\n const vmm = mmddOpt.slice(0, 2);\n const vdd = mmddOpt.slice(2, 4);\n valueDate = `${year}-${vmm}-${vdd}`;\n }\n\n const amount = parseFloat(amtStr.replace(',', '.'));\n const type: JoopTxnType = cdFlag === 'C' ? 'credit' : 'debit';\n\n // Reference extraction: after the swift code letter, up to // or end\n const refMatch = /^([^/]{1,16})(?:\\/\\/(.+))?$/.exec(rest);\n const reference = refMatch?.[1]?.trim() || undefined;\n\n // Narrative from :86: tag — use entire content as description\n const description = narrative.replace(/\\n/g, ' ').trim() || reference || '';\n\n return {\n id: _stableId(accountId, date, amount, idx),\n date,\n valueDate,\n amount,\n type,\n currency: currency ?? 'USD',\n description,\n reference,\n raw: line61 + (narrative ? '\\n' + narrative : ''),\n };\n}\n\n// ---------------------------------------------------------------------------\n// OFX helpers\n// ---------------------------------------------------------------------------\n\nfunction _ofxTrnType(trnType: string, rawAmount: number): JoopTxnType {\n switch (trnType.toUpperCase()) {\n case 'CREDIT': return 'credit';\n case 'DEBIT': return 'debit';\n case 'FEE': return 'fee';\n case 'INT': return 'interest';\n case 'XFER': return 'transfer';\n case 'DEP': return 'credit';\n case 'PAYMENT': return 'debit';\n case 'ATM':\n case 'POS': return rawAmount < 0 ? 'debit' : 'credit';\n default: return rawAmount < 0 ? 'debit' : 'credit';\n }\n}\n\nfunction _parseOFXDate(value: string): string {\n // OFX date: YYYYMMDDHHMMSS[.mmm][TZ] — we only need YYYYMMDD\n const clean = value.slice(0, 8);\n if (clean.length < 8) return value;\n return `${clean.slice(0, 4)}-${clean.slice(4, 6)}-${clean.slice(6, 8)}`;\n}\n\n// ---------------------------------------------------------------------------\n// QIF helpers\n// ---------------------------------------------------------------------------\n\nfunction _parseQIFDate(value: string): string {\n // Common QIF date formats: M/D/YY, M/D/YYYY, D-M-YY, D.M.YYYY, MM/DD/YYYY\n const clean = value.replace(/'/g, ''); // QIF sometimes uses ' as year separator\n const parts = clean.split(/[\\-\\.\\/]/);\n if (parts.length < 3) return clean;\n\n let y = parseInt(parts[2]);\n const a = parseInt(parts[0]);\n const b = parseInt(parts[1]);\n\n if (y < 100) y += y < 30 ? 2000 : 1900;\n\n // Heuristic: if first part > 12 it must be day (D-M-Y)\n if (a > 12) {\n return `${y}-${String(b).padStart(2, '0')}-${String(a).padStart(2, '0')}`;\n }\n // Otherwise assume M/D/Y (US format)\n return `${y}-${String(a).padStart(2, '0')}-${String(b).padStart(2, '0')}`;\n}\n\n// ---------------------------------------------------------------------------\n// CSV helpers\n// ---------------------------------------------------------------------------\n\nfunction _detectDelimiter(text: string): string {\n const sample = text.slice(0, 2000);\n const counts: Record<string, number> = { ',': 0, ';': 0, '\\t': 0, '|': 0 };\n for (const ch of sample) {\n if (ch in counts) counts[ch]++;\n }\n return Object.entries(counts).sort((a, b) => b[1] - a[1])[0][0];\n}\n\nfunction _splitCsvRow(row: string, delimiter: string): string[] {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < row.length; i++) {\n const ch = row[i];\n if (ch === '\"') {\n if (inQuotes && row[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === delimiter && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n}\n\nfunction _guessColumn(header: string[] | undefined, candidates: string[]): number {\n if (!header) return -1;\n for (const c of candidates) {\n const idx = header.findIndex(h => h.toLowerCase().trim() === c.toLowerCase());\n if (idx >= 0) return idx;\n }\n return -1;\n}\n\nfunction _parseAmount(raw: string): number {\n if (!raw || !raw.trim()) return 0;\n // Strip currency symbols, spaces, parentheses-based negatives\n const negative = raw.includes('(') || raw.trimStart().startsWith('-');\n const clean = raw.replace(/[^0-9.,]/g, '');\n if (!clean) return 0;\n // Handle European format: 1.234,56 → 1234.56\n const hasEuropean = /\\d{1,3}(\\.\\d{3})+,\\d{2}$/.test(clean);\n const normalised = hasEuropean\n ? clean.replace(/\\./g, '').replace(',', '.')\n : clean.replace(/,/g, '');\n const val = parseFloat(normalised);\n return negative ? -Math.abs(val) : val;\n}\n\nfunction _parseCsvDate(raw: string, fmt?: string): string {\n if (!raw) return '';\n const format = fmt ?? _detectDateFormat(raw);\n\n const clean = raw.replace(/[^\\d]/g, '-').replace(/--+/g, '-');\n const parts = clean.split('-').filter(Boolean);\n if (parts.length < 3) return raw;\n\n let day: string, month: string, year: string;\n\n switch (format) {\n case 'DD/MM/YYYY':\n [day, month, year] = parts;\n break;\n case 'MM/DD/YYYY':\n [month, day, year] = parts;\n break;\n case 'YYYY-MM-DD':\n default:\n [year, month, day] = parts;\n }\n\n const y = parseInt(year);\n const fullYear = y < 100 ? (y < 30 ? 2000 + y : 1900 + y) : y;\n return `${fullYear}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n}\n\nfunction _detectDateFormat(sample: string): string {\n // YYYY-MM-DD or YYYY/MM/DD\n if (/^\\d{4}[^\\d]\\d{2}[^\\d]\\d{2}$/.test(sample)) return 'YYYY-MM-DD';\n // DD/MM/YYYY — day <= 12 is ambiguous; assume if separator is /\n if (/^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/.test(sample)) {\n const parts = sample.split('/');\n if (parseInt(parts[0]) > 12) return 'DD/MM/YYYY';\n return 'MM/DD/YYYY'; // default to US\n }\n if (/^\\d{1,2}-\\d{1,2}-\\d{4}$/.test(sample)) return 'DD/MM/YYYY';\n return 'YYYY-MM-DD';\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a deterministic but collision-resistant transaction ID.\n * Uses a simple djb2-style hash over the concatenated key fields + index.\n */\nfunction _stableId(accountId: string | undefined, date: string, amount: number, index: number): string {\n const key = `${accountId ?? ''}|${date}|${amount.toFixed(2)}|${index}`;\n let hash = 5381;\n for (let i = 0; i < key.length; i++) {\n hash = ((hash << 5) + hash) ^ key.charCodeAt(i);\n hash = hash >>> 0; // keep unsigned 32-bit\n }\n return `TXN-${hash.toString(16).toUpperCase().padStart(8, '0')}-${index}`;\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBeneficiaryType = 'domestic' | 'international' | 'upi' | 'mobile' | 'wallet' | 'crypto';\n\nexport interface JoopBeneficiary {\n id: string;\n name: string;\n nickname?: string;\n type: JoopBeneficiaryType;\n // Bank account details\n accountNumber?: string;\n iban?: string;\n bic?: string;\n routingNumber?: string;\n sortCode?: string;\n bankName?: string;\n bankCode?: string;\n branchCode?: string;\n // Alternative identifiers\n upiId?: string;\n mobile?: string;\n email?: string;\n walletId?: string;\n // Meta\n currency?: string;\n country?: string;\n group?: string;\n isFavorite: boolean;\n isVerified: boolean;\n transferLimit?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n lastUsedAt?: number;\n useCount: number;\n}\n\nexport interface JoopBeneficiaryValidation {\n valid: boolean;\n errors: string[];\n}\n\nexport class JoopBeneficiaryService {\n private _beneficiaries = new Map<string, JoopBeneficiary>();\n private _list$ = new JoopBehaviorSubject<JoopBeneficiary[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopBeneficiary, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): JoopBeneficiary {\n const validation = this.validate(data);\n if (!validation.valid) throw new Error(`Invalid beneficiary: ${validation.errors.join(', ')}`);\n const b: JoopBeneficiary = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now(), useCount: 0 };\n this._beneficiaries.set(b.id, b);\n this._emit();\n return { ...b };\n }\n\n update(id: string, patch: Partial<Omit<JoopBeneficiary, 'id' | 'createdAt'>>): JoopBeneficiary {\n const b = this._get(id);\n const updated = { ...b, ...patch, id, updatedAt: Date.now() };\n this._beneficiaries.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n remove(id: string): void {\n this._beneficiaries.delete(id);\n this._emit();\n }\n\n get(id: string): JoopBeneficiary | undefined {\n const b = this._beneficiaries.get(id);\n return b ? { ...b } : undefined;\n }\n\n getAll(): JoopBeneficiary[] {\n return Array.from(this._beneficiaries.values()).map(b => ({ ...b }));\n }\n\n // ── Filtering ────────────────────────────────────────────────────────────\n\n getByType(type: JoopBeneficiaryType): JoopBeneficiary[] {\n return this.getAll().filter(b => b.type === type);\n }\n\n getByGroup(group: string): JoopBeneficiary[] {\n return this.getAll().filter(b => b.group === group);\n }\n\n getFavorites(): JoopBeneficiary[] {\n return this.getAll().filter(b => b.isFavorite);\n }\n\n getRecent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .filter(b => b.lastUsedAt)\n .sort((a, b) => (b.lastUsedAt ?? 0) - (a.lastUsedAt ?? 0))\n .slice(0, limit);\n }\n\n getFrequent(limit = 5): JoopBeneficiary[] {\n return this.getAll()\n .sort((a, b) => b.useCount - a.useCount)\n .slice(0, limit);\n }\n\n search(query: string): JoopBeneficiary[] {\n const q = query.toLowerCase();\n return this.getAll().filter(b =>\n b.name.toLowerCase().includes(q) ||\n b.nickname?.toLowerCase().includes(q) ||\n b.accountNumber?.includes(q) ||\n b.iban?.toLowerCase().includes(q) ||\n b.upiId?.toLowerCase().includes(q) ||\n b.mobile?.includes(q) ||\n b.bankName?.toLowerCase().includes(q),\n );\n }\n\n // ── Actions ───────────────────────────────────────────────────────────────\n\n toggleFavorite(id: string): JoopBeneficiary {\n const b = this._get(id);\n return this.update(id, { isFavorite: !b.isFavorite });\n }\n\n verify(id: string): JoopBeneficiary {\n return this.update(id, { isVerified: true });\n }\n\n markUsed(id: string): void {\n const b = this._get(id);\n this.update(id, { lastUsedAt: Date.now(), useCount: b.useCount + 1 });\n }\n\n // ── Meta ──────────────────────────────────────────────────────────────────\n\n getGroups(): string[] {\n return [...new Set(this.getAll().map(b => b.group).filter(Boolean) as string[])].sort();\n }\n\n count(): number { return this._beneficiaries.size; }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n validate(b: Partial<JoopBeneficiary>): JoopBeneficiaryValidation {\n const errors: string[] = [];\n if (!b.name?.trim()) errors.push('name is required');\n if (!b.type) errors.push('type is required');\n\n if (b.type === 'domestic' || b.type === 'international') {\n if (!b.accountNumber && !b.iban) errors.push('accountNumber or iban required for bank transfers');\n }\n if (b.type === 'upi') {\n if (!b.upiId) errors.push('upiId required for UPI beneficiaries');\n else if (!/^[\\w.\\-]+@[\\w]+$/.test(b.upiId)) errors.push('upiId format invalid (expected user@bank)');\n }\n if (b.type === 'mobile') {\n if (!b.mobile) errors.push('mobile required for mobile transfers');\n }\n if (b.iban && !/^[A-Z]{2}\\d{2}[A-Z0-9]{4,}$/.test(b.iban.replace(/\\s/g, ''))) {\n errors.push('IBAN format invalid');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n beneficiaries$() { return this._list$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopBeneficiary {\n const b = this._beneficiaries.get(id);\n if (!b) throw new Error(`Beneficiary '${id}' not found`);\n return b;\n }\n\n private _emit(): void {\n this._list$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject, JoopSubject } from '../events';\n\nexport type JoopRecurrenceFrequency = 'once' | 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'annually';\nexport type JoopScheduledPaymentStatus = 'active' | 'paused' | 'completed' | 'cancelled' | 'failed';\n\nexport interface JoopScheduledPayment {\n id: string;\n name: string;\n fromAccount: string;\n toAccount: string;\n beneficiaryId?: string;\n amount: number;\n currency: string;\n frequency: JoopRecurrenceFrequency;\n startDate: number;\n endDate?: number;\n nextExecutionDate: number;\n lastExecutionDate?: number;\n executionCount: number;\n maxExecutions?: number;\n status: JoopScheduledPaymentStatus;\n reference?: string;\n description?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopPaymentExecution {\n id: string;\n paymentId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: 'success' | 'failed';\n reference: string;\n error?: string;\n}\n\nconst MS: Record<JoopRecurrenceFrequency, number | null> = {\n once: null,\n daily: 86_400_000,\n weekly: 7 * 86_400_000,\n biweekly: 14 * 86_400_000,\n monthly: null, // computed via Date logic\n quarterly: null,\n annually: null,\n};\n\nexport class JoopScheduledPaymentService {\n private _payments = new Map<string, JoopScheduledPayment>();\n private _executions: JoopPaymentExecution[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopScheduledPayment[]>([]);\n private _due$ = new JoopSubject<JoopScheduledPayment>();\n\n // ── Schedule ──────────────────────────────────────────────────────────────\n\n schedule(data: Omit<JoopScheduledPayment, 'id' | 'nextExecutionDate' | 'executionCount' | 'createdAt' | 'updatedAt' | 'status'>): JoopScheduledPayment {\n const p: JoopScheduledPayment = {\n ...data,\n id: _uid(),\n nextExecutionDate: data.startDate,\n executionCount: 0,\n status: 'active',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._payments.set(p.id, p);\n this._emit();\n return { ...p };\n }\n\n update(id: string, patch: Partial<Omit<JoopScheduledPayment, 'id' | 'createdAt'>>): JoopScheduledPayment {\n const p = this._get(id);\n const updated = { ...p, ...patch, updatedAt: Date.now() };\n this._payments.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n cancel(id: string): void { this.update(id, { status: 'cancelled' }); }\n pause(id: string): void { this.update(id, { status: 'paused' }); }\n resume(id: string): void { this.update(id, { status: 'active' }); }\n\n // ── Query ─────────────────────────────────────────────────────────────────\n\n get(id: string): JoopScheduledPayment | undefined {\n const p = this._payments.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopScheduledPayment[] {\n return Array.from(this._payments.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopScheduledPayment[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getDue(asOf: Date = new Date()): JoopScheduledPayment[] {\n return this.getActive().filter(p => p.nextExecutionDate <= asOf.getTime());\n }\n\n getUpcoming(days = 30, asOf: Date = new Date()): JoopScheduledPayment[] {\n const cutoff = asOf.getTime() + days * 86_400_000;\n return this.getActive().filter(p => p.nextExecutionDate <= cutoff);\n }\n\n // ── Execution ────────────────────────────────────────────────────────────\n\n recordExecution(paymentId: string, status: 'success' | 'failed', error?: string): JoopPaymentExecution {\n const p = this._get(paymentId);\n const exec: JoopPaymentExecution = {\n id: _uid(),\n paymentId,\n executedAt: Date.now(),\n amount: p.amount,\n currency: p.currency,\n status,\n reference: `REF${Date.now().toString(36).toUpperCase()}`,\n error,\n };\n this._executions.push(exec);\n\n p.executionCount++;\n p.lastExecutionDate = exec.executedAt;\n\n if (status === 'failed') {\n p.status = 'failed';\n } else if (p.frequency === 'once' || (p.maxExecutions && p.executionCount >= p.maxExecutions)) {\n p.status = 'completed';\n } else {\n p.nextExecutionDate = this.computeNextDate(p.nextExecutionDate, p.frequency);\n if (p.endDate && p.nextExecutionDate > p.endDate) p.status = 'completed';\n }\n\n this._payments.set(paymentId, p);\n this._emit();\n return exec;\n }\n\n getExecutionHistory(paymentId: string): JoopPaymentExecution[] {\n return this._executions.filter(e => e.paymentId === paymentId);\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(current: number, frequency: JoopRecurrenceFrequency): number {\n const ms = MS[frequency];\n if (ms !== null && ms !== undefined) return current + ms;\n\n const d = new Date(current);\n switch (frequency) {\n case 'monthly':\n d.setMonth(d.getMonth() + 1);\n break;\n case 'quarterly':\n d.setMonth(d.getMonth() + 3);\n break;\n case 'annually':\n d.setFullYear(d.getFullYear() + 1);\n break;\n case 'once':\n return current;\n }\n return d.getTime();\n }\n\n getSchedulePreview(startDate: number, frequency: JoopRecurrenceFrequency, count = 5, endDate?: number): number[] {\n const dates: number[] = [];\n let next = startDate;\n while (dates.length < count) {\n if (endDate && next > endDate) break;\n dates.push(next);\n if (frequency === 'once') break;\n next = this.computeNextDate(next, frequency);\n }\n return dates;\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n due$() { return this._due$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopScheduledPayment {\n const p = this._payments.get(id);\n if (!p) throw new Error(`Scheduled payment '${id}' not found`);\n return p;\n }\n\n private _emit(): void { this._payments$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopCardStatus = 'active' | 'frozen' | 'blocked' | 'expired' | 'pending';\nexport type JoopCardType = 'physical' | 'virtual';\nexport type JoopManagedCardNetwork = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unknown';\n\nexport interface JoopCardSpendingLimits {\n daily?: number;\n weekly?: number;\n monthly?: number;\n perTransaction?: number;\n}\n\nexport interface JoopCardControls {\n onlinePayments: boolean;\n internationalPayments: boolean;\n contactlessPayments: boolean;\n atmWithdrawals: boolean;\n ecommercePayments: boolean;\n}\n\nexport interface JoopManagedCard {\n id: string;\n cardNumber: string; // masked, e.g. **** **** **** 1234\n last4: string;\n network: JoopManagedCardNetwork;\n type: JoopCardType;\n holderName: string;\n expiryMonth: number; // 1-12\n expiryYear: number; // full year, e.g. 2027\n status: JoopCardStatus;\n accountId: string;\n spendingLimits: JoopCardSpendingLimits;\n controls: JoopCardControls;\n currency?: string;\n createdAt: number;\n updatedAt: number;\n frozenAt?: number;\n frozenReason?: string;\n blockedAt?: number;\n}\n\nexport interface JoopCardTransactionCheck {\n allowed: boolean;\n reason?: string;\n}\n\nconst DEFAULT_CONTROLS: JoopCardControls = {\n onlinePayments: true,\n internationalPayments: false,\n contactlessPayments: true,\n atmWithdrawals: true,\n ecommercePayments: true,\n};\n\nexport class JoopCardManagementService {\n private _cards = new Map<string, JoopManagedCard>();\n private _cards$ = new JoopBehaviorSubject<JoopManagedCard[]>([]);\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopManagedCard, 'id' | 'createdAt' | 'updatedAt'>): JoopManagedCard {\n const card: JoopManagedCard = { ...data, id: _uid(), createdAt: Date.now(), updatedAt: Date.now() };\n this._cards.set(card.id, card);\n this._emit();\n return { ...card };\n }\n\n get(id: string): JoopManagedCard | undefined {\n const c = this._cards.get(id);\n return c ? { ...c } : undefined;\n }\n\n getAll(): JoopManagedCard[] {\n return Array.from(this._cards.values()).map(c => ({ ...c }));\n }\n\n getByAccount(accountId: string): JoopManagedCard[] {\n return this.getAll().filter(c => c.accountId === accountId);\n }\n\n getActive(): JoopManagedCard[] {\n return this.getAll().filter(c => c.status === 'active');\n }\n\n remove(id: string): void {\n this._cards.delete(id);\n this._emit();\n }\n\n // ── Card Controls ──────────────────────────────────────────────────────────\n\n freeze(id: string, reason?: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status === 'blocked') throw new Error('Cannot freeze a blocked card');\n return this._update(id, { status: 'frozen', frozenAt: Date.now(), frozenReason: reason });\n }\n\n unfreeze(id: string): JoopManagedCard {\n const c = this._require(id);\n if (c.status !== 'frozen') throw new Error('Card is not frozen');\n return this._update(id, { status: 'active', frozenAt: undefined, frozenReason: undefined });\n }\n\n block(id: string): JoopManagedCard {\n return this._update(id, { status: 'blocked', blockedAt: Date.now() });\n }\n\n // ── Limits & Controls ─────────────────────────────────────────────────────\n\n setSpendingLimits(id: string, limits: JoopCardSpendingLimits): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { spendingLimits: { ...c.spendingLimits, ...limits } });\n }\n\n setControls(id: string, controls: Partial<JoopCardControls>): JoopManagedCard {\n const c = this._require(id);\n return this._update(id, { controls: { ...c.controls, ...controls } });\n }\n\n // ── Virtual Card ──────────────────────────────────────────────────────────\n\n generateVirtual(accountId: string, holderName: string, options: { expiryMonths?: number; currency?: string } = {}): JoopManagedCard {\n const expiryMonths = options.expiryMonths ?? 12;\n const now = new Date();\n const expiry = new Date(now.getFullYear(), now.getMonth() + expiryMonths, 1);\n const last4 = String(Math.floor(1000 + Math.random() * 9000));\n const bin = '4' + Array.from({ length: 11 }, () => Math.floor(Math.random() * 10)).join('');\n const cardNumber = `**** **** **** ${last4}`;\n\n return this.add({\n cardNumber,\n last4,\n network: 'visa',\n type: 'virtual',\n holderName: holderName.toUpperCase(),\n expiryMonth: expiry.getMonth() + 1,\n expiryYear: expiry.getFullYear(),\n status: 'active',\n accountId,\n currency: options.currency ?? 'USD',\n spendingLimits: {},\n controls: { ...DEFAULT_CONTROLS, internationalPayments: true },\n });\n }\n\n // ── Validation ────────────────────────────────────────────────────────────\n\n isExpired(id: string): boolean {\n const c = this._require(id);\n const now = new Date();\n const expiry = new Date(c.expiryYear, c.expiryMonth - 1, 1);\n return expiry <= new Date(now.getFullYear(), now.getMonth(), 1);\n }\n\n canTransact(id: string, amount: number, type: keyof Omit<JoopCardControls, 'ecommercePayments'> | 'ecommerce'): JoopCardTransactionCheck {\n const c = this._require(id);\n\n if (c.status !== 'active') return { allowed: false, reason: `Card is ${c.status}` };\n if (this.isExpired(id)) return { allowed: false, reason: 'Card is expired' };\n\n const controlMap: Record<string, keyof JoopCardControls> = {\n onlinePayments: 'onlinePayments',\n internationalPayments: 'internationalPayments',\n contactlessPayments: 'contactlessPayments',\n atmWithdrawals: 'atmWithdrawals',\n ecommerce: 'ecommercePayments',\n };\n const controlKey = controlMap[type];\n if (controlKey && !c.controls[controlKey]) return { allowed: false, reason: `${type} is disabled on this card` };\n\n if (c.spendingLimits.perTransaction && amount > c.spendingLimits.perTransaction) {\n return { allowed: false, reason: `Amount exceeds per-transaction limit of ${c.spendingLimits.perTransaction}` };\n }\n\n return { allowed: true };\n }\n\n validatePin(pin: string): boolean {\n return /^\\d{4,6}$/.test(pin);\n }\n\n // ── Observables ───────────────────────────────────────────────────────────\n\n cards$() { return this._cards$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopManagedCard {\n const c = this._cards.get(id);\n if (!c) throw new Error(`Card '${id}' not found`);\n return c;\n }\n\n private _update(id: string, patch: Partial<JoopManagedCard>): JoopManagedCard {\n const c = this._require(id);\n const updated = { ...c, ...patch, updatedAt: Date.now() };\n this._cards.set(id, updated);\n this._emit();\n return { ...updated };\n }\n\n private _emit(): void {\n this._cards$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopStatementFormat = 'text' | 'csv' | 'html';\nexport type JoopTransactionType = 'credit' | 'debit';\n\nexport interface JoopStatementTransaction {\n id: string;\n date: number;\n description: string;\n type: JoopTransactionType;\n amount: number;\n currency: string;\n reference?: string;\n category?: string;\n}\n\nexport interface JoopStatementEntry extends JoopStatementTransaction {\n runningBalance: number;\n}\n\nexport interface JoopStatementOptions {\n accountId: string;\n accountName?: string;\n accountNumber?: string;\n currency: string;\n openingBalance: number;\n fromDate: number;\n toDate: number;\n transactions: JoopStatementTransaction[];\n}\n\nexport interface JoopStatement {\n accountId: string;\n accountName: string;\n accountNumber: string;\n currency: string;\n fromDate: number;\n toDate: number;\n openingBalance: number;\n closingBalance: number;\n totalCredits: number;\n totalDebits: number;\n transactionCount: number;\n entries: JoopStatementEntry[];\n generatedAt: number;\n}\n\nexport class JoopStatementGeneratorService {\n\n generate(options: JoopStatementOptions): JoopStatement {\n const sorted = [...options.transactions]\n .filter(t => t.date >= options.fromDate && t.date <= options.toDate)\n .sort((a, b) => a.date - b.date);\n\n let balance = options.openingBalance;\n let totalCredits = 0;\n let totalDebits = 0;\n\n const entries: JoopStatementEntry[] = sorted.map(tx => {\n if (tx.type === 'credit') {\n balance += tx.amount;\n totalCredits += tx.amount;\n } else {\n balance -= tx.amount;\n totalDebits += tx.amount;\n }\n return { ...tx, runningBalance: parseFloat(balance.toFixed(2)) };\n });\n\n return {\n accountId: options.accountId,\n accountName: options.accountName ?? '',\n accountNumber: options.accountNumber ?? '',\n currency: options.currency,\n fromDate: options.fromDate,\n toDate: options.toDate,\n openingBalance: options.openingBalance,\n closingBalance: parseFloat(balance.toFixed(2)),\n totalCredits: parseFloat(totalCredits.toFixed(2)),\n totalDebits: parseFloat(totalDebits.toFixed(2)),\n transactionCount: entries.length,\n entries,\n generatedAt: Date.now(),\n };\n }\n\n render(statement: JoopStatement, format: JoopStatementFormat = 'text'): string {\n switch (format) {\n case 'csv': return this._renderCsv(statement);\n case 'html': return this._renderHtml(statement);\n default: return this._renderText(statement);\n }\n }\n\n // ── Summary ────────────────────────────────────────────────────────────────\n\n getSummary(statement: JoopStatement): Record<string, number> {\n const summary: Record<string, number> = {};\n for (const entry of statement.entries) {\n const cat = entry.category ?? 'Uncategorized';\n summary[cat] = (summary[cat] ?? 0) + entry.amount;\n }\n return summary;\n }\n\n getTopCategories(statement: JoopStatement, limit = 5): Array<{ category: string; total: number }> {\n const summary = this.getSummary(statement);\n return Object.entries(summary)\n .sort(([, a], [, b]) => b - a)\n .slice(0, limit)\n .map(([category, total]) => ({ category, total: parseFloat(total.toFixed(2)) }));\n }\n\n // ── Renderers ─────────────────────────────────────────────────────────────\n\n private _renderText(s: JoopStatement): string {\n const lines: string[] = [];\n const sep = '─'.repeat(70);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n\n lines.push(sep);\n lines.push(`ACCOUNT STATEMENT`);\n lines.push(`Account: ${s.accountName} (${s.accountNumber})`);\n lines.push(`Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`);\n lines.push(`Generated: ${new Date(s.generatedAt).toISOString()}`);\n lines.push(sep);\n lines.push(`Opening Balance: ${fmt(s.openingBalance)}`);\n lines.push('');\n lines.push(`${'Date'.padEnd(12)}${'Description'.padEnd(32)}${'Debit'.padStart(12)}${'Credit'.padStart(12)}${'Balance'.padStart(14)}`);\n lines.push('─'.repeat(70));\n\n for (const e of s.entries) {\n const d = e.type === 'debit' ? e.amount.toFixed(2) : '';\n const c = e.type === 'credit' ? e.amount.toFixed(2) : '';\n lines.push(`${fmtDate(e.date).padEnd(12)}${e.description.slice(0, 30).padEnd(32)}${d.padStart(12)}${c.padStart(12)}${e.runningBalance.toFixed(2).padStart(14)}`);\n }\n\n lines.push('─'.repeat(70));\n lines.push(`${''.padEnd(44)}${'Total Debits:'.padStart(12)} ${fmt(s.totalDebits)}`);\n lines.push(`${''.padEnd(44)}${'Total Credits:'.padStart(12)} ${fmt(s.totalCredits)}`);\n lines.push(`${''.padEnd(44)}${'Closing Balance:'.padStart(12)} ${fmt(s.closingBalance)}`);\n lines.push(sep);\n\n return lines.join('\\n');\n }\n\n private _renderCsv(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const rows: string[] = [\n `Account ID,${s.accountId}`,\n `Account Name,${s.accountName}`,\n `Account Number,${s.accountNumber}`,\n `Currency,${s.currency}`,\n `Period,${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}`,\n `Opening Balance,${s.openingBalance}`,\n `Closing Balance,${s.closingBalance}`,\n '',\n 'Date,Description,Type,Amount,Currency,Reference,Category,Running Balance',\n ...s.entries.map(e =>\n [fmtDate(e.date), _csvEscape(e.description), e.type, e.amount, e.currency, e.reference ?? '', e.category ?? '', e.runningBalance].join(',')\n ),\n ];\n return rows.join('\\n');\n }\n\n private _renderHtml(s: JoopStatement): string {\n const fmtDate = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n const fmt = (n: number) => `${s.currency} ${n.toFixed(2)}`;\n\n const rows = s.entries.map(e => `\n <tr>\n <td>${fmtDate(e.date)}</td>\n <td>${_htmlEscape(e.description)}</td>\n <td>${e.type === 'debit' ? fmt(e.amount) : ''}</td>\n <td>${e.type === 'credit' ? fmt(e.amount) : ''}</td>\n <td>${fmt(e.runningBalance)}</td>\n <td>${e.category ?? ''}</td>\n </tr>`).join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Account Statement</title>\n<style>\n body { font-family: Arial, sans-serif; font-size: 13px; margin: 20px; }\n h2 { margin-bottom: 4px; }\n .meta { color: #555; margin-bottom: 16px; }\n table { width: 100%; border-collapse: collapse; }\n th, td { padding: 6px 10px; border: 1px solid #ddd; text-align: left; }\n th { background: #f5f5f5; font-weight: 600; }\n .summary { margin-top: 16px; font-weight: bold; }\n tr:nth-child(even) { background: #fafafa; }\n</style>\n</head>\n<body>\n<h2>Account Statement</h2>\n<div class=\"meta\">\n <div>Account: ${_htmlEscape(s.accountName)} (${_htmlEscape(s.accountNumber)})</div>\n <div>Period: ${fmtDate(s.fromDate)} to ${fmtDate(s.toDate)}</div>\n <div>Generated: ${new Date(s.generatedAt).toISOString()}</div>\n</div>\n<table>\n <thead>\n <tr><th>Date</th><th>Description</th><th>Debit</th><th>Credit</th><th>Balance</th><th>Category</th></tr>\n </thead>\n <tbody>\n <tr><td colspan=\"4\"><strong>Opening Balance</strong></td><td><strong>${fmt(s.openingBalance)}</strong></td><td></td></tr>\n ${rows}\n <tr class=\"summary\">\n <td colspan=\"2\">Totals</td>\n <td>${fmt(s.totalDebits)}</td>\n <td>${fmt(s.totalCredits)}</td>\n <td>${fmt(s.closingBalance)}</td>\n <td></td>\n </tr>\n </tbody>\n</table>\n</body>\n</html>`;\n }\n}\n\nfunction _csvEscape(v: string): string {\n if (v.includes(',') || v.includes('\"') || v.includes('\\n')) return `\"${v.replace(/\"/g, '\"\"')}\"`;\n return v;\n}\n\nfunction _htmlEscape(v: string): string {\n return v.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopNotificationType = 'info' | 'success' | 'warning' | 'error' | 'transfer' | 'security' | 'promo' | 'system';\nexport type JoopNotificationPriority = 'low' | 'normal' | 'high' | 'urgent';\n\nexport interface JoopNotification {\n id: string;\n type: JoopNotificationType;\n title: string;\n body: string;\n priority: JoopNotificationPriority;\n category?: string;\n imageUrl?: string;\n actionUrl?: string;\n actionLabel?: string;\n metadata?: Record<string, unknown>;\n isRead: boolean;\n isDismissed: boolean;\n createdAt: number;\n readAt?: number;\n expiresAt?: number;\n}\n\nexport interface JoopNotificationSummary {\n total: number;\n unread: number;\n byType: Record<JoopNotificationType, number>;\n byPriority: Record<JoopNotificationPriority, number>;\n}\n\nexport class JoopNotificationCenterService {\n private _notifications: JoopNotification[] = [];\n private _notifications$ = new JoopBehaviorSubject<JoopNotification[]>([]);\n private _maxItems: number;\n\n constructor(maxItems = 500) {\n this._maxItems = maxItems;\n }\n\n // ── Add ───────────────────────────────────────────────────────────────────\n\n add(data: Omit<JoopNotification, 'id' | 'isRead' | 'isDismissed' | 'createdAt'>): JoopNotification {\n const n: JoopNotification = {\n ...data,\n id: _uid(),\n isRead: false,\n isDismissed: false,\n createdAt: Date.now(),\n };\n this._notifications.unshift(n); // newest first\n if (this._notifications.length > this._maxItems) this._notifications.pop();\n this._emit();\n return { ...n };\n }\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n get(id: string): JoopNotification | undefined {\n return this._notifications.find(n => n.id === id);\n }\n\n getAll(includeExpired = false): JoopNotification[] {\n const now = Date.now();\n return this._notifications\n .filter(n => !n.isDismissed && (includeExpired || !n.expiresAt || n.expiresAt > now))\n .map(n => ({ ...n }));\n }\n\n getUnread(): JoopNotification[] {\n return this.getAll().filter(n => !n.isRead);\n }\n\n getByType(type: JoopNotificationType): JoopNotification[] {\n return this.getAll().filter(n => n.type === type);\n }\n\n getByCategory(category: string): JoopNotification[] {\n return this.getAll().filter(n => n.category === category);\n }\n\n getByPriority(priority: JoopNotificationPriority): JoopNotification[] {\n return this.getAll().filter(n => n.priority === priority);\n }\n\n // ── Mark read ─────────────────────────────────────────────────────────────\n\n markRead(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isRead) return;\n n.isRead = true;\n n.readAt = Date.now();\n this._emit();\n }\n\n markAllRead(): void {\n const now = Date.now();\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isRead) { n.isRead = true; n.readAt = now; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Dismiss ───────────────────────────────────────────────────────────────\n\n dismiss(id: string): void {\n const n = this._notifications.find(n => n.id === id);\n if (!n || n.isDismissed) return;\n n.isDismissed = true;\n this._emit();\n }\n\n dismissAll(): void {\n let changed = false;\n for (const n of this._notifications) {\n if (!n.isDismissed) { n.isDismissed = true; changed = true; }\n }\n if (changed) this._emit();\n }\n\n // ── Counts ────────────────────────────────────────────────────────────────\n\n unreadCount(): number { return this.getUnread().length; }\n\n getSummary(): JoopNotificationSummary {\n const all = this.getAll();\n const byType = {} as Record<JoopNotificationType, number>;\n const byPriority = {} as Record<JoopNotificationPriority, number>;\n\n for (const n of all) {\n byType[n.type] = (byType[n.type] ?? 0) + 1;\n byPriority[n.priority] = (byPriority[n.priority] ?? 0) + 1;\n }\n\n return { total: all.length, unread: this.unreadCount(), byType, byPriority };\n }\n\n // ── Cleanup ───────────────────────────────────────────────────────────────\n\n purgeExpired(): number {\n const before = this._notifications.length;\n const now = Date.now();\n this._notifications = this._notifications.filter(n => !n.expiresAt || n.expiresAt > now);\n const removed = before - this._notifications.length;\n if (removed > 0) this._emit();\n return removed;\n }\n\n clear(): void {\n this._notifications = [];\n this._emit();\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n notifications$() { return this._notifications$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _emit(): void { this._notifications$.next(this.getAll()); }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopDisputeStatus = 'open' | 'under-review' | 'resolved' | 'rejected' | 'escalated' | 'closed';\nexport type JoopDisputeReason =\n | 'unauthorized-transaction'\n | 'duplicate-charge'\n | 'goods-not-received'\n | 'goods-not-as-described'\n | 'amount-mismatch'\n | 'cancelled-subscription'\n | 'atm-withdrawal-discrepancy'\n | 'other';\n\nexport interface JoopDisputeEvidence {\n id: string;\n type: 'screenshot' | 'receipt' | 'email' | 'document' | 'photo' | 'other';\n name: string;\n url?: string;\n base64?: string;\n uploadedAt: number;\n}\n\nexport interface JoopDispute {\n id: string;\n referenceNumber: string;\n transactionId?: string;\n transactionDate?: number;\n amount: number;\n currency: string;\n merchantName?: string;\n reason: JoopDisputeReason;\n description: string;\n status: JoopDisputeStatus;\n evidence: JoopDisputeEvidence[];\n resolution?: string;\n rejectionReason?: string;\n escalationReason?: string;\n assignedTo?: string;\n createdAt: number;\n updatedAt: number;\n resolvedAt?: number;\n}\n\nexport interface JoopDisputeStats {\n total: number;\n open: number;\n underReview: number;\n resolved: number;\n rejected: number;\n escalated: number;\n totalAmount: number;\n}\n\nexport class JoopDisputeService {\n private _disputes = new Map<string, JoopDispute>();\n private _disputes$ = new JoopBehaviorSubject<JoopDispute[]>([]);\n private _counter = 1;\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: Omit<JoopDispute, 'id' | 'referenceNumber' | 'status' | 'evidence' | 'createdAt' | 'updatedAt'>): JoopDispute {\n const dispute: JoopDispute = {\n ...data,\n id: _uid(),\n referenceNumber: this._generateRef(),\n status: 'open',\n evidence: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this._disputes.set(dispute.id, dispute);\n this._emit();\n return { ...dispute };\n }\n\n update(id: string, patch: Partial<Pick<JoopDispute, 'description' | 'reason' | 'merchantName' | 'assignedTo'>>): JoopDispute {\n const d = this._require(id);\n Object.assign(d, patch, { updatedAt: Date.now() });\n this._emit();\n return { ...d };\n }\n\n get(id: string): JoopDispute | undefined {\n const d = this._disputes.get(id);\n return d ? { ...d, evidence: [...d.evidence] } : undefined;\n }\n\n getByRef(ref: string): JoopDispute | undefined {\n const d = Array.from(this._disputes.values()).find(d => d.referenceNumber === ref);\n return d ? { ...d } : undefined;\n }\n\n getAll(): JoopDispute[] {\n return Array.from(this._disputes.values()).map(d => ({ ...d, evidence: [...d.evidence] }));\n }\n\n getByStatus(status: JoopDisputeStatus): JoopDispute[] {\n return this.getAll().filter(d => d.status === status);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n startReview(id: string, assignedTo?: string): JoopDispute {\n return this._transition(id, 'under-review', d => { if (assignedTo) d.assignedTo = assignedTo; });\n }\n\n resolve(id: string, resolution: string): JoopDispute {\n return this._transition(id, 'resolved', d => { d.resolution = resolution; d.resolvedAt = Date.now(); });\n }\n\n reject(id: string, reason: string): JoopDispute {\n return this._transition(id, 'rejected', d => { d.rejectionReason = reason; d.resolvedAt = Date.now(); });\n }\n\n escalate(id: string, reason: string): JoopDispute {\n return this._transition(id, 'escalated', d => { d.escalationReason = reason; });\n }\n\n close(id: string): JoopDispute {\n return this._transition(id, 'closed');\n }\n\n // ── Evidence ─────────────────────────────────────────────────────────────\n\n addEvidence(disputeId: string, evidence: Omit<JoopDisputeEvidence, 'id' | 'uploadedAt'>): JoopDisputeEvidence {\n const d = this._require(disputeId);\n if (d.status === 'resolved' || d.status === 'rejected' || d.status === 'closed') {\n throw new Error(`Cannot add evidence to a ${d.status} dispute`);\n }\n const e: JoopDisputeEvidence = { ...evidence, id: _uid(), uploadedAt: Date.now() };\n d.evidence.push(e);\n d.updatedAt = Date.now();\n this._emit();\n return { ...e };\n }\n\n removeEvidence(disputeId: string, evidenceId: string): void {\n const d = this._require(disputeId);\n const before = d.evidence.length;\n d.evidence = d.evidence.filter(e => e.id !== evidenceId);\n if (d.evidence.length < before) { d.updatedAt = Date.now(); this._emit(); }\n }\n\n // ── Stats ────────────────────────────────────────────────────────────────\n\n getStats(): JoopDisputeStats {\n const all = this.getAll();\n return {\n total: all.length,\n open: all.filter(d => d.status === 'open').length,\n underReview: all.filter(d => d.status === 'under-review').length,\n resolved: all.filter(d => d.status === 'resolved').length,\n rejected: all.filter(d => d.status === 'rejected').length,\n escalated: all.filter(d => d.status === 'escalated').length,\n totalAmount: all.reduce((s, d) => s + d.amount, 0),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n disputes$() { return this._disputes$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopDispute {\n const d = this._disputes.get(id);\n if (!d) throw new Error(`Dispute '${id}' not found`);\n return d;\n }\n\n private _transition(id: string, status: JoopDisputeStatus, mutate?: (d: JoopDispute) => void): JoopDispute {\n const d = this._require(id);\n d.status = status;\n d.updatedAt = Date.now();\n if (mutate) mutate(d);\n this._emit();\n return { ...d };\n }\n\n private _generateRef(): string {\n const n = String(this._counter++).padStart(6, '0');\n return `DSP-${new Date().getFullYear()}-${n}`;\n }\n\n private _emit(): void {\n this._disputes$.next(this.getAll());\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopBillerCategory =\n | 'electricity'\n | 'water'\n | 'gas'\n | 'internet'\n | 'mobile'\n | 'insurance'\n | 'tax'\n | 'subscription'\n | 'rent'\n | 'loan'\n | 'other';\n\nexport type JoopBillStatus = 'pending' | 'paid' | 'overdue' | 'cancelled';\nexport type JoopBillPaymentStatus = 'success' | 'failed' | 'pending' | 'reversed';\n\nexport interface JoopBiller {\n id: string;\n name: string;\n category: JoopBillerCategory;\n accountNumber?: string;\n reference?: string;\n currency: string;\n defaultAmount?: number;\n dueDayOfMonth?: number; // 1-28\n logoUrl?: string;\n notes?: string;\n isActive: boolean;\n createdAt: number;\n}\n\nexport interface JoopBill {\n id: string;\n billerId: string;\n billerName: string;\n amount: number;\n currency: string;\n dueDate: number;\n status: JoopBillStatus;\n reference?: string;\n createdAt: number;\n}\n\nexport interface JoopBillPayment {\n id: string;\n billerId: string;\n billId?: string;\n billerName: string;\n amount: number;\n currency: string;\n status: JoopBillPaymentStatus;\n reference: string;\n fromAccount?: string;\n paidAt: number;\n errorMessage?: string;\n}\n\nexport interface JoopBillPaymentSummary {\n totalPaidThisMonth: number;\n totalPaidThisYear: number;\n paymentCount: number;\n billerCount: number;\n currency: string;\n}\n\nexport class JoopBillPaymentService {\n private _billers = new Map<string, JoopBiller>();\n private _bills = new Map<string, JoopBill>();\n private _payments: JoopBillPayment[] = [];\n private _payments$ = new JoopBehaviorSubject<JoopBillPayment[]>([]);\n\n // ── Billers ───────────────────────────────────────────────────────────────\n\n addBiller(data: Omit<JoopBiller, 'id' | 'createdAt' | 'isActive'>): JoopBiller {\n const biller: JoopBiller = { ...data, id: _uid(), isActive: true, createdAt: Date.now() };\n this._billers.set(biller.id, biller);\n return { ...biller };\n }\n\n updateBiller(id: string, patch: Partial<Omit<JoopBiller, 'id' | 'createdAt'>>): JoopBiller {\n const b = this._requireBiller(id);\n Object.assign(b, patch);\n return { ...b };\n }\n\n removeBiller(id: string): void { this._billers.delete(id); }\n\n getBiller(id: string): JoopBiller | undefined {\n const b = this._billers.get(id);\n return b ? { ...b } : undefined;\n }\n\n getBillers(category?: JoopBillerCategory): JoopBiller[] {\n const all = Array.from(this._billers.values()).filter(b => b.isActive).map(b => ({ ...b }));\n return category ? all.filter(b => b.category === category) : all;\n }\n\n // ── Bills ─────────────────────────────────────────────────────────────────\n\n addBill(data: Omit<JoopBill, 'id' | 'createdAt' | 'status'>): JoopBill {\n const biller = this._billers.get(data.billerId);\n const bill: JoopBill = { ...data, id: _uid(), billerName: biller?.name ?? data.billerName, status: 'pending', createdAt: Date.now() };\n this._bills.set(bill.id, bill);\n return { ...bill };\n }\n\n getBills(billerId?: string): JoopBill[] {\n const all = Array.from(this._bills.values()).map(b => ({ ...b }));\n return billerId ? all.filter(b => b.billerId === billerId) : all;\n }\n\n getOverdueBills(asOf: number = Date.now()): JoopBill[] {\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate < asOf);\n }\n\n getUpcomingBills(days = 7, asOf: number = Date.now()): JoopBill[] {\n const cutoff = asOf + days * 86_400_000;\n return this.getBills().filter(b => b.status === 'pending' && b.dueDate >= asOf && b.dueDate <= cutoff);\n }\n\n // ── Payments ─────────────────────────────────────────────────────────────\n\n pay(billerId: string, amount: number, options: { fromAccount?: string; billId?: string; reference?: string } = {}): JoopBillPayment {\n const biller = this._requireBiller(billerId);\n const payment: JoopBillPayment = {\n id: _uid(),\n billerId,\n billId: options.billId,\n billerName: biller.name,\n amount,\n currency: biller.currency,\n status: 'success',\n reference: options.reference ?? `PAY${Date.now().toString(36).toUpperCase()}`,\n fromAccount: options.fromAccount,\n paidAt: Date.now(),\n };\n this._payments.push(payment);\n\n // Mark bill as paid if billId given\n if (options.billId) {\n const bill = this._bills.get(options.billId);\n if (bill) bill.status = 'paid';\n }\n\n this._payments$.next([...this._payments]);\n return { ...payment };\n }\n\n getPaymentHistory(billerId?: string): JoopBillPayment[] {\n return billerId ? this._payments.filter(p => p.billerId === billerId).map(p => ({ ...p })) : this._payments.map(p => ({ ...p }));\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(): JoopBillPaymentSummary {\n const now = new Date();\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).getTime();\n const yearStart = new Date(now.getFullYear(), 0, 1).getTime();\n const successful = this._payments.filter(p => p.status === 'success');\n\n return {\n totalPaidThisMonth: successful.filter(p => p.paidAt >= monthStart).reduce((s, p) => s + p.amount, 0),\n totalPaidThisYear: successful.filter(p => p.paidAt >= yearStart).reduce((s, p) => s + p.amount, 0),\n paymentCount: successful.length,\n billerCount: this._billers.size,\n currency: 'MIXED',\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n payments$() { return this._payments$.asObservable(); }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private _requireBiller(id: string): JoopBiller {\n const b = this._billers.get(id);\n if (!b) throw new Error(`Biller '${id}' not found`);\n return b;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","export type JoopPaymentUriScheme = 'upi' | 'bitcoin' | 'ethereum' | 'payto' | 'sepa' | 'generic';\n\nexport interface JoopUpiParams {\n pa: string; // payee VPA\n pn?: string; // payee name\n am?: number; // amount\n cu?: string; // currency (default INR)\n tn?: string; // transaction note\n tr?: string; // transaction reference\n mc?: string; // merchant code\n}\n\nexport interface JoopBitcoinParams {\n address: string;\n amount?: number; // BTC\n label?: string;\n message?: string;\n}\n\nexport interface JoopEthereumParams {\n address: string;\n value?: number; // ETH in wei or ETH depending on unit\n gas?: number;\n data?: string;\n}\n\nexport interface JoopPayToParams {\n payId: string; // PayID or BSB+account\n amount?: number;\n currency?: string;\n description?: string;\n}\n\nexport interface JoopSepaParams {\n iban: string;\n bic?: string;\n name?: string;\n amount?: number;\n currency?: string;\n reference?: string;\n purpose?: string;\n}\n\nexport interface JoopPaymentUri {\n scheme: JoopPaymentUriScheme;\n raw: string;\n isValid: boolean;\n errors: string[];\n upi?: JoopUpiParams;\n bitcoin?: JoopBitcoinParams;\n ethereum?: JoopEthereumParams;\n payto?: JoopPayToParams;\n sepa?: JoopSepaParams;\n generic?: { recipient?: string; amount?: number; currency?: string; reference?: string };\n}\n\nexport class JoopPaymentUriService {\n\n // ── Parse ─────────────────────────────────────────────────────────────────\n\n parse(uri: string): JoopPaymentUri {\n const raw = uri.trim();\n\n if (raw.toLowerCase().startsWith('upi://')) return this._parseUpi(raw);\n if (raw.toLowerCase().startsWith('bitcoin:')) return this._parseBitcoin(raw);\n if (raw.toLowerCase().startsWith('ethereum:')) return this._parseEthereum(raw);\n if (raw.toLowerCase().startsWith('payto:')) return this._parsePayTo(raw);\n if (raw.toLowerCase().startsWith('sepa:')) return this._parseSepa(raw);\n\n return { scheme: 'generic', raw, isValid: false, errors: [`Unknown URI scheme: \"${raw.split(':')[0]}\"`] };\n }\n\n // ── Generate ─────────────────────────────────────────────────────────────\n\n generateUpi(params: JoopUpiParams): string {\n if (!params.pa) throw new Error('pa (payee VPA) is required');\n const q = new URLSearchParams();\n q.set('pa', params.pa);\n if (params.pn) q.set('pn', params.pn);\n if (params.am !== undefined) q.set('am', String(params.am));\n if (params.cu) q.set('cu', params.cu);\n if (params.tn) q.set('tn', params.tn);\n if (params.tr) q.set('tr', params.tr);\n if (params.mc) q.set('mc', params.mc);\n return `upi://pay?${q.toString()}`;\n }\n\n generateBitcoin(params: JoopBitcoinParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', String(params.amount));\n if (params.label) q.set('label', params.label);\n if (params.message) q.set('message', params.message);\n const qs = q.toString();\n return `bitcoin:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generateEthereum(params: JoopEthereumParams): string {\n if (!params.address) throw new Error('address is required');\n const q = new URLSearchParams();\n if (params.value !== undefined) q.set('value', String(params.value));\n if (params.gas !== undefined) q.set('gas', String(params.gas));\n if (params.data) q.set('data', params.data);\n const qs = q.toString();\n return `ethereum:${params.address}${qs ? `?${qs}` : ''}`;\n }\n\n generatePayTo(params: JoopPayToParams): string {\n const q = new URLSearchParams();\n if (params.amount !== undefined) q.set('amount', `${params.currency ?? 'AUD'}:${params.amount}`);\n if (params.description) q.set('message', params.description);\n const qs = q.toString();\n return `payto://${params.payId}${qs ? `?${qs}` : ''}`;\n }\n\n generateSepa(params: JoopSepaParams): string {\n const fields = [\n 'BCD', '002', '1', 'SCT',\n params.bic ?? '',\n params.name ?? '',\n params.iban,\n params.amount ? `${params.currency ?? 'EUR'}${params.amount.toFixed(2)}` : '',\n params.purpose ?? '',\n params.reference ?? '',\n ].join('\\n');\n return fields; // EPC QR code payload (not a URI scheme but standard for SEPA)\n }\n\n // ── Validate ─────────────────────────────────────────────────────────────\n\n isValid(uri: string): boolean { return this.parse(uri).isValid; }\n\n getScheme(uri: string): JoopPaymentUriScheme | null {\n const parsed = this.parse(uri);\n return parsed.isValid ? parsed.scheme : null;\n }\n\n // ── Parsers ──────────────────────────────────────────────────────────────\n\n private _parseUpi(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n // upi://pay?pa=vpa&pn=Name&am=100&cu=INR\n const url = new URL(raw);\n if (url.pathname !== 'pay' && url.host !== 'pay') {\n const path = (url.pathname || url.host || '').replace(/^\\//, '');\n if (path && path !== 'pay') errors.push(`Unknown UPI action: ${path}`);\n }\n const pa = url.searchParams.get('pa');\n if (!pa) errors.push('pa (payee VPA) is required');\n else if (!/^[\\w.\\-+]+@[\\w]+$/.test(pa)) errors.push('Invalid VPA format');\n\n const am = url.searchParams.get('am');\n if (am && isNaN(Number(am))) errors.push('am (amount) must be a number');\n\n const params: JoopUpiParams = {\n pa: pa ?? '',\n pn: url.searchParams.get('pn') ?? undefined,\n am: am ? Number(am) : undefined,\n cu: url.searchParams.get('cu') ?? 'INR',\n tn: url.searchParams.get('tn') ?? undefined,\n tr: url.searchParams.get('tr') ?? undefined,\n mc: url.searchParams.get('mc') ?? undefined,\n };\n return { scheme: 'upi', raw, isValid: errors.length === 0, errors, upi: params };\n } catch (e) {\n return { scheme: 'upi', raw, isValid: false, errors: ['Invalid UPI URI'] };\n }\n }\n\n private _parseBitcoin(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('bitcoin:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Bitcoin address is required');\n else if (!/^(bc1|[13])[a-zA-Z0-9]{25,62}$/.test(address)) errors.push('Invalid Bitcoin address format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n if (amount !== undefined && isNaN(amount)) errors.push('amount must be a number');\n\n const params: JoopBitcoinParams = { address, amount, label: q.get('label') ?? undefined, message: q.get('message') ?? undefined };\n return { scheme: 'bitcoin', raw, isValid: errors.length === 0, errors, bitcoin: params };\n }\n\n private _parseEthereum(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n const [addressPart, queryPart] = raw.slice('ethereum:'.length).split('?');\n const address = addressPart.trim();\n if (!address) errors.push('Ethereum address is required');\n else if (!/^0x[0-9a-fA-F]{40}$/.test(address)) errors.push('Invalid Ethereum address (expected 0x + 40 hex chars)');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const value = q.get('value') ? Number(q.get('value')) : undefined;\n const params: JoopEthereumParams = { address, value, gas: q.get('gas') ? Number(q.get('gas')) : undefined, data: q.get('data') ?? undefined };\n return { scheme: 'ethereum', raw, isValid: errors.length === 0, errors, ethereum: params };\n }\n\n private _parsePayTo(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n try {\n const url = new URL(raw);\n const payId = url.hostname + (url.pathname || '');\n if (!payId) errors.push('PayID is required');\n\n const amountParam = url.searchParams.get('amount');\n let amount: number | undefined;\n let currency: string | undefined;\n if (amountParam) {\n const match = amountParam.match(/^([A-Z]{3}):?([\\d.]+)$/);\n if (match) { currency = match[1]; amount = Number(match[2]); }\n else errors.push('amount format: CCY:amount (e.g. AUD:50.00)');\n }\n const params: JoopPayToParams = { payId, amount, currency, description: url.searchParams.get('message') ?? undefined };\n return { scheme: 'payto', raw, isValid: errors.length === 0, errors, payto: params };\n } catch {\n return { scheme: 'payto', raw, isValid: false, errors: ['Invalid PayTo URI'] };\n }\n }\n\n private _parseSepa(raw: string): JoopPaymentUri {\n const errors: string[] = [];\n // SEPA \"sepa:IBAN?name=X&amount=100&currency=EUR&reference=Y\"\n const [ibanPart, queryPart] = raw.slice('sepa:'.length).split('?');\n const iban = ibanPart.trim().replace(/\\s/g, '');\n if (!iban) errors.push('IBAN is required');\n else if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{11,30}$/.test(iban)) errors.push('Invalid IBAN format');\n\n const q = queryPart ? new URLSearchParams(queryPart) : new URLSearchParams();\n const amount = q.get('amount') ? Number(q.get('amount')) : undefined;\n const params: JoopSepaParams = {\n iban, bic: q.get('bic') ?? undefined, name: q.get('name') ?? undefined,\n amount, currency: q.get('currency') ?? 'EUR',\n reference: q.get('reference') ?? undefined, purpose: q.get('purpose') ?? undefined,\n };\n return { scheme: 'sepa', raw, isValid: errors.length === 0, errors, sepa: params };\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopMandateType = 'nach' | 'upi-autopay' | 'standing-instruction' | 'direct-debit';\nexport type JoopMandateStatus = 'pending' | 'active' | 'paused' | 'cancelled' | 'expired' | 'failed';\nexport type JoopMandateFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly' | 'as-presented';\nexport type JoopMandateExecutionStatus = 'success' | 'failed' | 'pending';\n\nexport interface JoopMandate {\n id: string;\n ref: string;\n type: JoopMandateType;\n status: JoopMandateStatus;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n executionCount: number;\n lastExecutedAt?: number;\n nextExecutionAt?: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopMandateExecution {\n id: string;\n mandateId: string;\n amount: number;\n status: JoopMandateExecutionStatus;\n date: number;\n failureReason?: string;\n}\n\nexport class JoopMandateService {\n private _mandates = new Map<string, JoopMandate>();\n private _executions = new Map<string, JoopMandateExecution[]>();\n private _counter = 0;\n private _change$ = new JoopSubject<JoopMandate>();\n\n // ── CRUD ─────────────────────────────────────────────────────────────────\n\n create(data: {\n type: JoopMandateType;\n accountId: string;\n payeeName: string;\n payeeRef: string;\n maxAmount: number;\n frequency: JoopMandateFrequency;\n startDate: number;\n endDate?: number;\n description?: string;\n }): JoopMandate {\n if (data.maxAmount <= 0) throw new Error('maxAmount must be positive');\n const now = Date.now();\n const mandate: JoopMandate = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'pending',\n executionCount: 0,\n createdAt: now,\n updatedAt: now,\n nextExecutionAt: this._computeNextDate({ frequency: data.frequency, startDate: data.startDate } as JoopMandate, data.startDate),\n ...data,\n };\n this._mandates.set(mandate.id, mandate);\n this._executions.set(mandate.id, []);\n return { ...mandate };\n }\n\n get(id: string): JoopMandate | undefined {\n const m = this._mandates.get(id);\n return m ? { ...m } : undefined;\n }\n\n getAll(): JoopMandate[] {\n return Array.from(this._mandates.values()).map(m => ({ ...m }));\n }\n\n // ── State transitions ─────────────────────────────────────────────────────\n\n activate(id: string): JoopMandate { return this._transition(id, 'active'); }\n cancel(id: string): JoopMandate { return this._transition(id, 'cancelled'); }\n pause(id: string): JoopMandate { return this._transition(id, 'paused', m => { if (m.status !== 'active') throw new Error('Only active mandates can be paused'); }); }\n resume(id: string): JoopMandate { return this._transition(id, 'active', m => { if (m.status !== 'paused') throw new Error('Only paused mandates can be resumed'); }); }\n fail(id: string): JoopMandate { return this._transition(id, 'failed'); }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getActive(): JoopMandate[] { return this._byStatus('active'); }\n\n getByAccount(accountId: string): JoopMandate[] {\n return this.getAll().filter(m => m.accountId === accountId);\n }\n\n getByStatus(status: JoopMandateStatus): JoopMandate[] { return this._byStatus(status); }\n\n getDue(asOf: number = Date.now()): JoopMandate[] {\n return this.getActive().filter(m => m.nextExecutionAt !== undefined && m.nextExecutionAt <= asOf && !this.isExpired(m));\n }\n\n isExpired(mandate: JoopMandate): boolean {\n return mandate.endDate !== undefined && Date.now() > mandate.endDate;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n recordExecution(mandateId: string, amount: number, status: JoopMandateExecutionStatus, failureReason?: string): JoopMandateExecution {\n const m = this._require(mandateId);\n if (amount > m.maxAmount) throw new Error(`Execution amount ${amount} exceeds mandate max ${m.maxAmount}`);\n\n const exec: JoopMandateExecution = { id: _uid(), mandateId, amount, status, date: Date.now(), failureReason };\n this._executions.get(mandateId)!.push(exec);\n\n if (status === 'success') {\n m.executionCount++;\n m.lastExecutedAt = exec.date;\n m.nextExecutionAt = this.computeNextDate(m, exec.date);\n }\n if (status === 'failed' && !failureReason) exec.failureReason = 'Unknown';\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...exec };\n }\n\n getExecutions(mandateId: string): JoopMandateExecution[] {\n return [...(this._executions.get(mandateId) ?? [])];\n }\n\n // ── Date computation ──────────────────────────────────────────────────────\n\n computeNextDate(mandate: JoopMandate, fromDate: number = Date.now()): number | undefined {\n return this._computeNextDate(mandate, fromDate);\n }\n\n // ── Observable ────────────────────────────────────────────────────────────\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopMandate {\n const m = this._mandates.get(id);\n if (!m) throw new Error(`Mandate '${id}' not found`);\n return m;\n }\n\n private _transition(id: string, status: JoopMandateStatus, validate?: (m: JoopMandate) => void): JoopMandate {\n const m = this._require(id);\n if (validate) validate(m);\n m.status = status;\n m.updatedAt = Date.now();\n this._change$.next({ ...m });\n return { ...m };\n }\n\n private _byStatus(status: JoopMandateStatus): JoopMandate[] {\n return this.getAll().filter(m => m.status === status);\n }\n\n private _computeNextDate(mandate: Pick<JoopMandate, 'frequency' | 'startDate'>, from: number): number | undefined {\n const d = new Date(from);\n switch (mandate.frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n case 'as-presented': return undefined;\n }\n return d.getTime();\n }\n\n private _generateRef(): string {\n this._counter++;\n return `MND-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopSplitMethod = 'equal' | 'percentage' | 'exact' | 'shares';\nexport type JoopSplitStatus = 'open' | 'partial' | 'settled' | 'cancelled';\nexport type JoopSplitParticipantStatus = 'pending' | 'paid' | 'partial';\n\nexport interface JoopSplitParticipant {\n id: string;\n name: string;\n share: number; // amount owed\n paid: number; // amount paid so far\n status: JoopSplitParticipantStatus;\n}\n\nexport interface JoopSplitExpense {\n id: string;\n title: string;\n totalAmount: number;\n currency: string;\n paidBy: string; // name of person who fronted the expense\n method: JoopSplitMethod;\n participants: JoopSplitParticipant[];\n status: JoopSplitStatus;\n notes?: string;\n createdAt: number;\n settledAt?: number;\n}\n\nexport interface JoopSplitSettlement {\n from: string;\n to: string;\n amount: number;\n}\n\nexport interface JoopSplitBalance {\n name: string;\n owes: number; // total owed to others\n owed: number; // total others owe you\n net: number; // positive = you are owed, negative = you owe\n}\n\nexport class JoopSplitPaymentService {\n private _expenses = new Map<string, JoopSplitExpense>();\n private _change$ = new JoopSubject<JoopSplitExpense>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n create(\n title: string,\n totalAmount: number,\n paidBy: string,\n participantNames: string[],\n options: {\n method?: JoopSplitMethod;\n currency?: string;\n notes?: string;\n amounts?: number[]; // for 'exact'\n percentages?: number[]; // for 'percentage'\n shares?: number[]; // for 'shares'\n } = {},\n ): JoopSplitExpense {\n if (totalAmount <= 0) throw new Error('totalAmount must be positive');\n if (participantNames.length === 0) throw new Error('At least one participant required');\n\n const method = options.method ?? 'equal';\n const shares = this._computeShares(totalAmount, participantNames.length, method, options);\n\n const participants: JoopSplitParticipant[] = participantNames.map((name, i) => ({\n id: _uid(), name, share: shares[i], paid: 0, status: 'pending',\n }));\n\n const expense: JoopSplitExpense = {\n id: _uid(), title, totalAmount, currency: options.currency ?? 'USD',\n paidBy, method, participants, status: 'open',\n notes: options.notes, createdAt: Date.now(),\n };\n this._expenses.set(expense.id, expense);\n return this._snapshot(expense);\n }\n\n // ── Payment recording ─────────────────────────────────────────────────────\n\n recordPayment(expenseId: string, participantId: string, amount: number): JoopSplitExpense {\n const e = this._require(expenseId);\n if (e.status === 'settled' || e.status === 'cancelled') throw new Error(`Expense is ${e.status}`);\n const p = e.participants.find(x => x.id === participantId);\n if (!p) throw new Error(`Participant '${participantId}' not found`);\n if (amount <= 0) throw new Error('Payment amount must be positive');\n\n p.paid = _round(p.paid + amount);\n p.paid = Math.min(p.paid, p.share); // cap at share\n p.status = p.paid >= p.share ? 'paid' : 'partial';\n\n this._updateStatus(e);\n this._change$.next(this._snapshot(e));\n return this._snapshot(e);\n }\n\n // ── Status ────────────────────────────────────────────────────────────────\n\n settle(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'settled';\n e.settledAt = Date.now();\n this._change$.next(this._snapshot(e));\n }\n\n cancel(expenseId: string): void {\n const e = this._require(expenseId);\n e.status = 'cancelled';\n this._change$.next(this._snapshot(e));\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopSplitExpense | undefined {\n const e = this._expenses.get(id);\n return e ? this._snapshot(e) : undefined;\n }\n\n getAll(): JoopSplitExpense[] {\n return Array.from(this._expenses.values()).map(e => this._snapshot(e));\n }\n\n getOpen(): JoopSplitExpense[] {\n return this.getAll().filter(e => e.status === 'open' || e.status === 'partial');\n }\n\n // ── Settlements ───────────────────────────────────────────────────────────\n\n getSettlements(expenseId: string): JoopSplitSettlement[] {\n const e = this._require(expenseId);\n // Each participant who hasn't fully paid owes the difference to paidBy\n return e.participants\n .filter(p => p.paid < p.share && p.name !== e.paidBy)\n .map(p => ({ from: p.name, to: e.paidBy, amount: _round(p.share - p.paid) }));\n }\n\n getSimplifiedSettlements(expenseId: string): JoopSplitSettlement[] {\n return this.getSettlements(expenseId);\n }\n\n // ── Balance ───────────────────────────────────────────────────────────────\n\n getBalance(name: string): JoopSplitBalance {\n let owes = 0;\n let owed = 0;\n\n for (const e of this.getOpen()) {\n const p = e.participants.find(x => x.name === name);\n if (p && e.paidBy !== name) owes += Math.max(0, p.share - p.paid);\n if (e.paidBy === name) {\n for (const other of e.participants) {\n if (other.name !== name) owed += Math.max(0, other.share - other.paid);\n }\n }\n }\n\n return { name, owes: _round(owes), owed: _round(owed), net: _round(owed - owes) };\n }\n\n // ── Summary ───────────────────────────────────────────────────────────────\n\n getSummary(expenseId: string): { total: number; paid: number; remaining: number; participantCount: number; status: JoopSplitStatus } {\n const e = this._require(expenseId);\n const paid = e.participants.reduce((s, p) => s + p.paid, 0);\n return {\n total: e.totalAmount,\n paid: _round(paid),\n remaining: _round(e.totalAmount - paid),\n participantCount: e.participants.length,\n status: e.status,\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _computeShares(total: number, n: number, method: JoopSplitMethod, opts: { amounts?: number[]; percentages?: number[]; shares?: number[] }): number[] {\n switch (method) {\n case 'equal': {\n const each = _round(total / n);\n const arr = Array(n).fill(each);\n // Fix rounding: add/subtract diff on first participant\n const diff = _round(total - arr.reduce((s, x) => s + x, 0));\n arr[0] = _round(arr[0] + diff);\n return arr;\n }\n case 'exact': {\n const amounts = opts.amounts ?? [];\n if (amounts.length !== n) throw new Error('amounts length must match participant count');\n const sum = amounts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - total) > 0.01) throw new Error('Exact amounts must sum to totalAmount');\n return amounts.map(a => _round(a));\n }\n case 'percentage': {\n const pcts = opts.percentages ?? [];\n if (pcts.length !== n) throw new Error('percentages length must match participant count');\n const sum = pcts.reduce((s, x) => s + x, 0);\n if (Math.abs(sum - 100) > 0.01) throw new Error('Percentages must sum to 100');\n return pcts.map(p => _round((p / 100) * total));\n }\n case 'shares': {\n const sh = opts.shares ?? Array(n).fill(1);\n if (sh.length !== n) throw new Error('shares length must match participant count');\n const totalShares = sh.reduce((s, x) => s + x, 0);\n return sh.map(s => _round((s / totalShares) * total));\n }\n }\n }\n\n private _updateStatus(e: JoopSplitExpense): void {\n const allPaid = e.participants.every(p => p.status === 'paid');\n const nonePaid = e.participants.every(p => p.paid === 0);\n if (allPaid) { e.status = 'settled'; e.settledAt = Date.now(); }\n else if (nonePaid) e.status = 'open';\n else e.status = 'partial';\n }\n\n private _require(id: string): JoopSplitExpense {\n const e = this._expenses.get(id);\n if (!e) throw new Error(`Expense '${id}' not found`);\n return e;\n }\n\n private _snapshot(e: JoopSplitExpense): JoopSplitExpense {\n return { ...e, participants: e.participants.map(p => ({ ...p })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\nfunction _round(n: number): number { return parseFloat(n.toFixed(2)); }\n","import { JoopSubject } from '../events';\n\nexport type JoopChequeStatus =\n | 'available' | 'issued' | 'presented' | 'cleared' | 'bounced' | 'stopped' | 'cancelled' | 'expired';\n\nexport interface JoopChequeLeaf {\n chequeNumber: string;\n chequebookId: string;\n accountId: string;\n status: JoopChequeStatus;\n issuedTo?: string;\n amount?: number;\n issuedAt?: number;\n presentedAt?: number;\n clearedAt?: number;\n stoppedAt?: number;\n stopReason?: string;\n bounceReason?: string;\n expiresAt?: number;\n notes?: string;\n}\n\nexport interface JoopChequebook {\n id: string;\n accountId: string;\n seriesStart: string;\n seriesEnd: string;\n leaves: JoopChequeLeaf[];\n issuedAt: number;\n isActive: boolean;\n}\n\nexport interface JoopChequebookStats {\n total: number;\n available: number;\n issued: number;\n presented: number;\n cleared: number;\n bounced: number;\n stopped: number;\n cancelled: number;\n expired: number;\n}\n\nexport class JoopChequebookService {\n private _books = new Map<string, JoopChequebook>();\n private _leafIndex = new Map<string, JoopChequeLeaf>(); // chequeNumber → leaf\n private _change$ = new JoopSubject<JoopChequeLeaf>();\n\n // ── Chequebook management ─────────────────────────────────────────────────\n\n addChequebook(accountId: string, seriesStart: string, seriesEnd: string): JoopChequebook {\n const leaves = this._generateLeaves(accountId, 'pending-id', seriesStart, seriesEnd);\n const book: JoopChequebook = {\n id: _uid(), accountId, seriesStart, seriesEnd,\n leaves: [], issuedAt: Date.now(), isActive: true,\n };\n // patch chequebookId\n leaves.forEach(l => { l.chequebookId = book.id; book.leaves.push(l); this._leafIndex.set(l.chequeNumber, l); });\n this._books.set(book.id, book);\n return this._snapshotBook(book);\n }\n\n getChequebook(id: string): JoopChequebook | undefined {\n const b = this._books.get(id);\n return b ? this._snapshotBook(b) : undefined;\n }\n\n getByAccount(accountId: string): JoopChequebook[] {\n return Array.from(this._books.values()).filter(b => b.accountId === accountId).map(b => this._snapshotBook(b));\n }\n\n deactivateChequebook(id: string): void {\n const b = this._books.get(id);\n if (!b) throw new Error(`Chequebook '${id}' not found`);\n b.isActive = false;\n }\n\n // ── Leaf operations ───────────────────────────────────────────────────────\n\n issueCheque(chequeNumber: string, issuedTo: string, amount: number, options: { expiresAt?: number; notes?: string } = {}): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'available') throw new Error(`Cheque ${chequeNumber} is not available (status: ${leaf.status})`);\n if (amount <= 0) throw new Error('Amount must be positive');\n leaf.status = 'issued';\n leaf.issuedTo = issuedTo;\n leaf.amount = amount;\n leaf.issuedAt = Date.now();\n leaf.expiresAt = options.expiresAt;\n leaf.notes = options.notes;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n stopPayment(chequeNumber: string, reason: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot stop a cleared cheque');\n if (leaf.status === 'stopped') throw new Error('Cheque is already stopped');\n leaf.status = 'stopped';\n leaf.stoppedAt = Date.now();\n leaf.stopReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markPresented(chequeNumber: string, presentedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'issued') throw new Error(`Cheque must be in 'issued' status to present (current: ${leaf.status})`);\n leaf.status = 'presented';\n leaf.presentedAt = presentedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markCleared(chequeNumber: string, clearedAt?: number): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented') throw new Error(`Cheque must be in 'presented' status to clear (current: ${leaf.status})`);\n leaf.status = 'cleared';\n leaf.clearedAt = clearedAt ?? Date.now();\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n markBounced(chequeNumber: string, reason = 'Insufficient funds'): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status !== 'presented' && leaf.status !== 'issued') throw new Error(`Cannot bounce cheque in status '${leaf.status}'`);\n leaf.status = 'bounced';\n leaf.bounceReason = reason;\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n cancelCheque(chequeNumber: string): JoopChequeLeaf {\n const leaf = this._requireLeaf(chequeNumber);\n if (leaf.status === 'cleared') throw new Error('Cannot cancel a cleared cheque');\n leaf.status = 'cancelled';\n this._change$.next({ ...leaf });\n return { ...leaf };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLeaf(chequeNumber: string): JoopChequeLeaf | undefined {\n const l = this._leafIndex.get(chequeNumber);\n return l ? { ...l } : undefined;\n }\n\n getByStatus(status: JoopChequeStatus, accountId?: string): JoopChequeLeaf[] {\n let leaves = Array.from(this._leafIndex.values()).filter(l => l.status === status);\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n return leaves.map(l => ({ ...l }));\n }\n\n getAvailableLeaves(accountId?: string): JoopChequeLeaf[] {\n return this.getByStatus('available', accountId);\n }\n\n isValid(chequeNumber: string): boolean {\n const leaf = this._leafIndex.get(chequeNumber);\n if (!leaf) return false;\n if (!['available', 'issued'].includes(leaf.status)) return false;\n if (leaf.expiresAt && Date.now() > leaf.expiresAt) return false;\n return true;\n }\n\n getStats(accountId?: string): JoopChequebookStats {\n let leaves = Array.from(this._leafIndex.values());\n if (accountId) leaves = leaves.filter(l => l.accountId === accountId);\n const count = (s: JoopChequeStatus) => leaves.filter(l => l.status === s).length;\n return {\n total: leaves.length,\n available: count('available'), issued: count('issued'), presented: count('presented'),\n cleared: count('cleared'), bounced: count('bounced'), stopped: count('stopped'),\n cancelled: count('cancelled'), expired: count('expired'),\n };\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _requireLeaf(chequeNumber: string): JoopChequeLeaf {\n const l = this._leafIndex.get(chequeNumber);\n if (!l) throw new Error(`Cheque '${chequeNumber}' not found`);\n return l;\n }\n\n private _generateLeaves(accountId: string, chequebookId: string, start: string, end: string): JoopChequeLeaf[] {\n const startNum = parseInt(start, 10);\n const endNum = parseInt(end, 10);\n if (isNaN(startNum) || isNaN(endNum) || endNum < startNum) throw new Error('Invalid cheque series range');\n const padLen = start.length;\n const leaves: JoopChequeLeaf[] = [];\n for (let n = startNum; n <= endNum; n++) {\n leaves.push({ chequeNumber: String(n).padStart(padLen, '0'), chequebookId, accountId, status: 'available' });\n }\n return leaves;\n }\n\n private _snapshotBook(b: JoopChequebook): JoopChequebook {\n return { ...b, leaves: b.leaves.map(l => ({ ...l })) };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopInsuranceType = 'life' | 'health' | 'auto' | 'home' | 'travel' | 'business' | 'other';\nexport type JoopPolicyStatus = 'active' | 'expired' | 'cancelled' | 'lapsed' | 'pending';\nexport type JoopClaimStatus = 'submitted' | 'under-review' | 'approved' | 'rejected' | 'paid' | 'withdrawn';\nexport type JoopPremiumFrequency = 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\n\nexport interface JoopInsurancePolicy {\n id: string;\n type: JoopInsuranceType;\n policyNumber: string;\n insurer: string;\n holderName: string;\n coverageAmount: number;\n premiumAmount: number;\n premiumFrequency: JoopPremiumFrequency;\n status: JoopPolicyStatus;\n startDate: number;\n endDate: number;\n nextPremiumDate?: number;\n deductible?: number;\n notes?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopInsuranceClaim {\n id: string;\n claimNumber: string;\n policyId: string;\n amount: number;\n status: JoopClaimStatus;\n description: string;\n documents: string[];\n submittedAt: number;\n resolvedAt?: number;\n paidAmount?: number;\n rejectionReason?: string;\n}\n\nexport interface JoopPremiumPayment {\n id: string;\n policyId: string;\n amount: number;\n date: number;\n method?: string;\n}\n\nconst FREQ_MONTHS: Record<JoopPremiumFrequency, number> = {\n monthly: 1, quarterly: 3, 'half-yearly': 6, yearly: 12,\n};\n\nexport class JoopInsuranceService {\n private _policies = new Map<string, JoopInsurancePolicy>();\n private _claims = new Map<string, JoopInsuranceClaim>();\n private _payments = new Map<string, JoopPremiumPayment[]>(); // policyId → payments\n private _claimCounter = 0;\n private _change$ = new JoopSubject<JoopInsurancePolicy>();\n\n // ── Policies ──────────────────────────────────────────────────────────────\n\n addPolicy(data: Omit<JoopInsurancePolicy, 'id' | 'createdAt' | 'updatedAt'>): JoopInsurancePolicy {\n if (data.coverageAmount <= 0) throw new Error('coverageAmount must be positive');\n if (data.premiumAmount <= 0) throw new Error('premiumAmount must be positive');\n if (data.endDate <= data.startDate) throw new Error('endDate must be after startDate');\n const now = Date.now();\n const policy: JoopInsurancePolicy = { ...data, id: _uid(), createdAt: now, updatedAt: now };\n this._policies.set(policy.id, policy);\n this._payments.set(policy.id, []);\n this._change$.next({ ...policy });\n return { ...policy };\n }\n\n updatePolicy(id: string, patch: Partial<Omit<JoopInsurancePolicy, 'id' | 'createdAt'>>): JoopInsurancePolicy {\n const p = this._require(id);\n Object.assign(p, patch, { updatedAt: Date.now() });\n this._change$.next({ ...p });\n return { ...p };\n }\n\n cancelPolicy(id: string, reason?: string): JoopInsurancePolicy {\n const p = this._require(id);\n if (p.status === 'cancelled') throw new Error('Policy is already cancelled');\n p.status = 'cancelled';\n if (reason) p.notes = reason;\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n renewPolicy(id: string, newEndDate: number): JoopInsurancePolicy {\n const p = this._require(id);\n if (newEndDate <= p.endDate) throw new Error('newEndDate must be after current endDate');\n p.endDate = newEndDate;\n p.status = 'active';\n p.updatedAt = Date.now();\n this._change$.next({ ...p });\n return { ...p };\n }\n\n getPolicy(id: string): JoopInsurancePolicy | undefined {\n const p = this._policies.get(id);\n return p ? { ...p } : undefined;\n }\n\n getAll(): JoopInsurancePolicy[] {\n return Array.from(this._policies.values()).map(p => ({ ...p }));\n }\n\n getActive(): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.status === 'active');\n }\n\n getByType(type: JoopInsuranceType): JoopInsurancePolicy[] {\n return this.getAll().filter(p => p.type === type);\n }\n\n getExpiring(withinDays: number, asOf = Date.now()): JoopInsurancePolicy[] {\n const cutoff = asOf + withinDays * 86_400_000;\n return this.getActive().filter(p => p.endDate <= cutoff && p.endDate > asOf);\n }\n\n // ── Claims ────────────────────────────────────────────────────────────────\n\n fileClaim(policyId: string, amount: number, description: string, documents: string[] = []): JoopInsuranceClaim {\n const p = this._require(policyId);\n if (p.status !== 'active') throw new Error(`Cannot file claim on a ${p.status} policy`);\n if (amount <= 0) throw new Error('Claim amount must be positive');\n if (amount > p.coverageAmount) throw new Error(`Claim amount exceeds coverage (${p.coverageAmount})`);\n this._claimCounter++;\n const claim: JoopInsuranceClaim = {\n id: _uid(),\n claimNumber: `CLM-${new Date().getFullYear()}-${String(this._claimCounter).padStart(6, '0')}`,\n policyId, amount, description, documents,\n status: 'submitted', submittedAt: Date.now(),\n };\n this._claims.set(claim.id, claim);\n return { ...claim };\n }\n\n updateClaim(id: string, status: JoopClaimStatus, options: { paidAmount?: number; rejectionReason?: string } = {}): JoopInsuranceClaim {\n const c = this._requireClaim(id);\n c.status = status;\n if (status === 'paid' || status === 'rejected' || status === 'withdrawn') c.resolvedAt = Date.now();\n if (options.paidAmount !== undefined) c.paidAmount = options.paidAmount;\n if (options.rejectionReason) c.rejectionReason = options.rejectionReason;\n return { ...c };\n }\n\n getClaims(policyId?: string): JoopInsuranceClaim[] {\n const all = Array.from(this._claims.values()).map(c => ({ ...c }));\n return policyId ? all.filter(c => c.policyId === policyId) : all;\n }\n\n // ── Premium payments ──────────────────────────────────────────────────────\n\n recordPremiumPayment(policyId: string, amount: number, method?: string): JoopPremiumPayment {\n this._require(policyId);\n const payment: JoopPremiumPayment = { id: _uid(), policyId, amount, date: Date.now(), method };\n this._payments.get(policyId)!.push(payment);\n // Advance nextPremiumDate\n const p = this._policies.get(policyId)!;\n const base = p.nextPremiumDate ?? Date.now();\n const d = new Date(base);\n d.setMonth(d.getMonth() + FREQ_MONTHS[p.premiumFrequency]);\n p.nextPremiumDate = d.getTime();\n p.updatedAt = Date.now();\n return { ...payment };\n }\n\n getPremiumHistory(policyId: string): JoopPremiumPayment[] {\n return [...(this._payments.get(policyId) ?? [])];\n }\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n getTotalCoverage(): number {\n return this.getActive().reduce((s, p) => s + p.coverageAmount, 0);\n }\n\n getTotalAnnualPremium(): number {\n const YEARLY_FACTOR: Record<JoopPremiumFrequency, number> = {\n monthly: 12, quarterly: 4, 'half-yearly': 2, yearly: 1,\n };\n return this.getActive().reduce((s, p) => s + p.premiumAmount * YEARLY_FACTOR[p.premiumFrequency], 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopInsurancePolicy {\n const p = this._policies.get(id);\n if (!p) throw new Error(`Policy '${id}' not found`);\n return p;\n }\n\n private _requireClaim(id: string): JoopInsuranceClaim {\n const c = this._claims.get(id);\n if (!c) throw new Error(`Claim '${id}' not found`);\n return c;\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopRemittanceStatus = 'initiated' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'returned';\nexport type JoopRemittanceChannel = 'swift' | 'sepa' | 'ach' | 'wire' | 'crypto' | 'mobile-money' | 'cash-pickup';\n\nexport interface JoopRemittanceQuote {\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n estimatedArrivalMs: number;\n channel: JoopRemittanceChannel;\n}\n\nexport interface JoopRemittance {\n id: string;\n ref: string;\n sendAmount: number;\n sendCurrency: string;\n receiveAmount: number;\n receiveCurrency: string;\n exchangeRate: number;\n fee: number;\n totalDebit: number;\n status: JoopRemittanceStatus;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientBankCode?: string;\n recipientCountry: string;\n purposeCode?: string;\n notes?: string;\n initiatedAt: number;\n completedAt?: number;\n estimatedArrival?: number;\n}\n\nconst DEFAULT_FEES: Record<JoopRemittanceChannel, number> = {\n swift: 25, sepa: 0.5, ach: 0.25, wire: 20, crypto: 1, 'mobile-money': 2, 'cash-pickup': 5,\n};\n\nconst ARRIVAL_MS: Record<JoopRemittanceChannel, number> = {\n swift: 3 * 86_400_000, sepa: 86_400_000, ach: 2 * 86_400_000, wire: 86_400_000,\n crypto: 30 * 60_000, 'mobile-money': 10 * 60_000, 'cash-pickup': 2 * 60_000,\n};\n\nexport class JoopRemittanceService {\n private _remittances = new Map<string, JoopRemittance>();\n private _rates = new Map<string, number>(); // \"USD:EUR\" → rate\n private _fees = new Map<string, number>(); // channel → flat fee override\n private _counter = 0;\n private _change$ = new JoopSubject<JoopRemittance>();\n\n // ── FX rates & fees ───────────────────────────────────────────────────────\n\n setExchangeRate(from: string, to: string, rate: number): void {\n this._rates.set(_rateKey(from, to), rate);\n this._rates.set(_rateKey(to, from), parseFloat((1 / rate).toFixed(6)));\n }\n\n getExchangeRate(from: string, to: string): number | null {\n return this._rates.get(_rateKey(from, to)) ?? null;\n }\n\n setChannelFee(channel: JoopRemittanceChannel, fee: number): void {\n this._fees.set(channel, fee);\n }\n\n getFee(channel: JoopRemittanceChannel): number {\n return this._fees.get(channel) ?? DEFAULT_FEES[channel];\n }\n\n // ── Quote ─────────────────────────────────────────────────────────────────\n\n getQuote(\n sendAmount: number,\n sendCurrency: string,\n receiveCurrency: string,\n channel: JoopRemittanceChannel = 'swift',\n ): JoopRemittanceQuote {\n if (sendAmount <= 0) throw new Error('sendAmount must be positive');\n const rate = sendCurrency === receiveCurrency ? 1 : (this._rates.get(_rateKey(sendCurrency, receiveCurrency)) ?? null);\n if (rate === null) throw new Error(`No exchange rate set for ${sendCurrency} → ${receiveCurrency}`);\n const fee = this.getFee(channel);\n const receiveAmount = parseFloat(((sendAmount - fee) * rate).toFixed(2));\n if (receiveAmount <= 0) throw new Error('Send amount is too small to cover the fee');\n return {\n sendAmount, sendCurrency, receiveAmount, receiveCurrency,\n exchangeRate: rate, fee,\n totalDebit: parseFloat((sendAmount + fee).toFixed(2)),\n estimatedArrivalMs: ARRIVAL_MS[channel],\n channel,\n };\n }\n\n // ── Initiate ──────────────────────────────────────────────────────────────\n\n initiate(data: {\n sendAmount: number;\n sendCurrency: string;\n receiveCurrency: string;\n channel: JoopRemittanceChannel;\n senderName: string;\n senderAccount: string;\n recipientName: string;\n recipientAccount: string;\n recipientCountry: string;\n recipientBankCode?: string;\n purposeCode?: string;\n notes?: string;\n }): JoopRemittance {\n const quote = this.getQuote(data.sendAmount, data.sendCurrency, data.receiveCurrency, data.channel);\n const now = Date.now();\n const remittance: JoopRemittance = {\n id: _uid(),\n ref: this._generateRef(),\n status: 'initiated',\n ...quote,\n senderName: data.senderName,\n senderAccount: data.senderAccount,\n recipientName: data.recipientName,\n recipientAccount: data.recipientAccount,\n recipientBankCode: data.recipientBankCode,\n recipientCountry: data.recipientCountry,\n purposeCode: data.purposeCode,\n notes: data.notes,\n initiatedAt: now,\n estimatedArrival: now + quote.estimatedArrivalMs,\n };\n this._remittances.set(remittance.id, remittance);\n this._change$.next({ ...remittance });\n return { ...remittance };\n }\n\n // ── Status management ─────────────────────────────────────────────────────\n\n cancel(id: string): JoopRemittance {\n return this._transition(id, 'cancelled', r => {\n if (!['initiated', 'processing'].includes(r.status)) throw new Error(`Cannot cancel remittance in '${r.status}' status`);\n });\n }\n\n updateStatus(id: string, status: JoopRemittanceStatus, options: { notes?: string } = {}): JoopRemittance {\n return this._transition(id, status, r => {\n if (options.notes) r.notes = options.notes;\n if (status === 'completed') r.completedAt = Date.now();\n });\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getById(id: string): JoopRemittance | undefined {\n const r = this._remittances.get(id);\n return r ? { ...r } : undefined;\n }\n\n getByRef(ref: string): JoopRemittance | undefined {\n return Array.from(this._remittances.values()).find(r => r.ref === ref);\n }\n\n getByStatus(status: JoopRemittanceStatus): JoopRemittance[] {\n return Array.from(this._remittances.values()).filter(r => r.status === status).map(r => ({ ...r }));\n }\n\n getHistory(limit?: number): JoopRemittance[] {\n const all = Array.from(this._remittances.values()).sort((a, b) => b.initiatedAt - a.initiatedAt);\n return (limit ? all.slice(0, limit) : all).map(r => ({ ...r }));\n }\n\n getTotalSent(currency?: string): number {\n return Array.from(this._remittances.values())\n .filter(r => r.status === 'completed' && (!currency || r.sendCurrency === currency))\n .reduce((s, r) => s + r.sendAmount, 0);\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _transition(id: string, status: JoopRemittanceStatus, mutate?: (r: JoopRemittance) => void): JoopRemittance {\n const r = this._remittances.get(id);\n if (!r) throw new Error(`Remittance '${id}' not found`);\n if (mutate) mutate(r);\n r.status = status;\n this._change$.next({ ...r });\n return { ...r };\n }\n\n private _generateRef(): string {\n this._counter++;\n return `RMT-${new Date().getFullYear()}-${String(this._counter).padStart(6, '0')}`;\n }\n}\n\nfunction _rateKey(from: string, to: string): string { return `${from.toUpperCase()}:${to.toUpperCase()}`; }\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopVirtualAccountStatus = 'active' | 'inactive' | 'closed';\nexport type JoopVirtualAccountPurpose = 'collection' | 'escrow' | 'payroll' | 'vendor' | 'customer' | 'project' | 'other';\n\nexport interface JoopVirtualAccount {\n id: string;\n accountNumber: string;\n iban?: string;\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n status: JoopVirtualAccountStatus;\n currency: string;\n collectedAmount: number;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface JoopVirtualCredit {\n id: string;\n virtualAccountId: string;\n amount: number;\n currency: string;\n senderName?: string;\n senderRef?: string;\n receivedAt: number;\n notes?: string;\n}\n\nexport class JoopVirtualAccountService {\n private _accounts = new Map<string, JoopVirtualAccount>();\n private _credits = new Map<string, JoopVirtualCredit[]>(); // vaId → credits\n private _counter = 0;\n private _change$ = new JoopSubject<JoopVirtualAccount>();\n\n // ── Create / manage ───────────────────────────────────────────────────────\n\n create(data: {\n parentAccountId: string;\n label: string;\n purpose: JoopVirtualAccountPurpose;\n currency?: string;\n expectedAmount?: number;\n reference?: string;\n expiresAt?: number;\n metadata?: Record<string, string>;\n ibanPrefix?: string;\n }): JoopVirtualAccount {\n const now = Date.now();\n const accountNumber = this.generateAccountNumber();\n const va: JoopVirtualAccount = {\n id: _uid(),\n accountNumber,\n iban: data.ibanPrefix ? `${data.ibanPrefix}${accountNumber}` : undefined,\n parentAccountId: data.parentAccountId,\n label: data.label,\n purpose: data.purpose,\n status: 'active',\n currency: data.currency ?? 'USD',\n collectedAmount: 0,\n expectedAmount: data.expectedAmount,\n reference: data.reference,\n expiresAt: data.expiresAt,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n };\n this._accounts.set(va.id, va);\n this._credits.set(va.id, []);\n this._change$.next({ ...va });\n return { ...va };\n }\n\n close(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'closed');\n }\n\n deactivate(id: string): JoopVirtualAccount {\n return this._setStatus(id, 'inactive');\n }\n\n activate(id: string): JoopVirtualAccount {\n const va = this._require(id);\n if (va.status === 'closed') throw new Error('Cannot activate a closed virtual account');\n return this._setStatus(id, 'active');\n }\n\n update(id: string, patch: Partial<Pick<JoopVirtualAccount, 'label' | 'expectedAmount' | 'reference' | 'expiresAt' | 'metadata'>>): JoopVirtualAccount {\n const va = this._require(id);\n Object.assign(va, patch, { updatedAt: Date.now() });\n this._change$.next({ ...va });\n return { ...va };\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopVirtualAccount | undefined {\n const va = this._accounts.get(id);\n return va ? { ...va } : undefined;\n }\n\n getAll(): JoopVirtualAccount[] {\n return Array.from(this._accounts.values()).map(va => ({ ...va }));\n }\n\n getActive(parentAccountId?: string): JoopVirtualAccount[] {\n let list = this.getAll().filter(va => va.status === 'active');\n if (parentAccountId) list = list.filter(va => va.parentAccountId === parentAccountId);\n return list;\n }\n\n getByReference(reference: string): JoopVirtualAccount | undefined {\n return Array.from(this._accounts.values()).find(va => va.reference === reference);\n }\n\n getByPurpose(purpose: JoopVirtualAccountPurpose): JoopVirtualAccount[] {\n return this.getAll().filter(va => va.purpose === purpose);\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopVirtualAccount[] {\n const cutoff = asOf + withinMs;\n return this.getActive().filter(va => va.expiresAt !== undefined && va.expiresAt <= cutoff && va.expiresAt > asOf);\n }\n\n // ── Credits ───────────────────────────────────────────────────────────────\n\n recordCredit(virtualAccountId: string, amount: number, options: { currency?: string; senderName?: string; senderRef?: string; notes?: string } = {}): JoopVirtualCredit {\n const va = this._require(virtualAccountId);\n if (va.status !== 'active') throw new Error(`Virtual account is ${va.status}`);\n if (amount <= 0) throw new Error('Credit amount must be positive');\n\n const credit: JoopVirtualCredit = {\n id: _uid(), virtualAccountId, amount,\n currency: options.currency ?? va.currency,\n senderName: options.senderName,\n senderRef: options.senderRef,\n receivedAt: Date.now(),\n notes: options.notes,\n };\n this._credits.get(virtualAccountId)!.push(credit);\n va.collectedAmount = parseFloat((va.collectedAmount + amount).toFixed(2));\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...credit };\n }\n\n getCredits(virtualAccountId: string): JoopVirtualCredit[] {\n return [...(this._credits.get(virtualAccountId) ?? [])];\n }\n\n getTotalCollected(virtualAccountId: string): number {\n const va = this._require(virtualAccountId);\n return va.collectedAmount;\n }\n\n isFullyCollected(virtualAccountId: string): boolean {\n const va = this._require(virtualAccountId);\n return va.expectedAmount !== undefined && va.collectedAmount >= va.expectedAmount;\n }\n\n // ── Utilities ─────────────────────────────────────────────────────────────\n\n generateAccountNumber(prefix = 'VA'): string {\n this._counter++;\n return `${prefix}${String(Date.now()).slice(-8)}${String(this._counter).padStart(4, '0')}`;\n }\n\n change$() { return this._change$.asObservable(); }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _require(id: string): JoopVirtualAccount {\n const va = this._accounts.get(id);\n if (!va) throw new Error(`Virtual account '${id}' not found`);\n return va;\n }\n\n private _setStatus(id: string, status: JoopVirtualAccountStatus): JoopVirtualAccount {\n const va = this._require(id);\n va.status = status;\n va.updatedAt = Date.now();\n this._change$.next({ ...va });\n return { ...va };\n }\n}\n\nfunction _uid(): string { return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; }\n","import { JoopSubject } from '../events';\n\nexport type JoopAccountType = 'asset' | 'liability' | 'equity' | 'revenue' | 'expense';\n\nexport interface JoopLedgerAccount {\n code: string;\n name: string;\n type: JoopAccountType;\n description?: string;\n createdAt: number;\n}\n\nexport interface JoopJournalLine {\n accountCode: string;\n debit: number;\n credit: number;\n description?: string;\n}\n\nexport interface JoopJournalEntry {\n id: string;\n ref: string;\n description: string;\n date: number;\n lines: JoopJournalLine[];\n postedAt: number;\n postedBy?: string;\n tags?: string[];\n}\n\nexport interface JoopTrialBalanceRow {\n code: string;\n name: string;\n type: JoopAccountType;\n totalDebits: number;\n totalCredits: number;\n balance: number;\n}\n\nexport interface JoopTrialBalance {\n asOf: number;\n rows: JoopTrialBalanceRow[];\n totalDebits: number;\n totalCredits: number;\n isBalanced: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\n/** Debit-normal account types (debits increase balance). */\nconst DEBIT_NORMAL = new Set<JoopAccountType>(['asset', 'expense']);\n\nexport class JoopLedgerService {\n private _accounts = new Map<string, JoopLedgerAccount>();\n private _entries: JoopJournalEntry[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopJournalEntry>();\n\n // ── Accounts ─────────────────────────────────────────────────────────────\n\n addAccount(code: string, name: string, type: JoopAccountType, description?: string): JoopLedgerAccount {\n if (!code.trim()) throw new Error('Account code required');\n if (this._accounts.has(code)) throw new Error(`Account ${code} already exists`);\n const account: JoopLedgerAccount = { code, name, type, description, createdAt: Date.now() };\n this._accounts.set(code, account);\n return account;\n }\n\n getAccount(code: string): JoopLedgerAccount | undefined {\n return this._accounts.get(code);\n }\n\n getAccounts(): JoopLedgerAccount[] {\n return Array.from(this._accounts.values());\n }\n\n removeAccount(code: string): void {\n if (!this._accounts.has(code)) throw new Error(`Account ${code} not found`);\n const hasEntries = this._entries.some(e => e.lines.some(l => l.accountCode === code));\n if (hasEntries) throw new Error(`Cannot remove account ${code} — it has journal entries`);\n this._accounts.delete(code);\n }\n\n // ── Journal ───────────────────────────────────────────────────────────────\n\n postEntry(\n description: string,\n lines: JoopJournalLine[],\n opts: { date?: number; postedBy?: string; tags?: string[] } = {}\n ): JoopJournalEntry {\n if (lines.length < 2) throw new Error('A journal entry requires at least 2 lines');\n\n for (const l of lines) {\n if (!this._accounts.has(l.accountCode)) throw new Error(`Unknown account: ${l.accountCode}`);\n if (l.debit < 0 || l.credit < 0) throw new Error('Debit/credit amounts must be non-negative');\n }\n\n const totalDebits = _round(lines.reduce((s, l) => s + l.debit, 0));\n const totalCredits = _round(lines.reduce((s, l) => s + l.credit, 0));\n if (totalDebits !== totalCredits) {\n throw new Error(`Journal entry does not balance — debits ${totalDebits} ≠ credits ${totalCredits}`);\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `JE-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const entry: JoopJournalEntry = {\n id: _uid(),\n ref,\n description,\n date: opts.date ?? Date.now(),\n lines: lines.map(l => ({ ...l, debit: _round(l.debit), credit: _round(l.credit) })),\n postedAt: Date.now(),\n postedBy: opts.postedBy,\n tags: opts.tags,\n };\n\n this._entries.push(entry);\n this._change$.next(entry);\n return entry;\n }\n\n getEntry(id: string): JoopJournalEntry | undefined {\n return this._entries.find(e => e.id === id);\n }\n\n getJournal(from?: number, to?: number): JoopJournalEntry[] {\n return this._entries\n .filter(e => (from === undefined || e.date >= from) && (to === undefined || e.date <= to))\n .sort((a, b) => a.date - b.date);\n }\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n getBalance(code: string): number {\n const acct = this._accounts.get(code);\n if (!acct) throw new Error(`Account ${code} not found`);\n\n let debits = 0;\n let credits = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === code) {\n debits += line.debit;\n credits += line.credit;\n }\n }\n }\n\n // Debit-normal accounts: balance = debits - credits\n // Credit-normal accounts: balance = credits - debits\n return _round(DEBIT_NORMAL.has(acct.type) ? debits - credits : credits - debits);\n }\n\n getTrialBalance(): JoopTrialBalance {\n const rows: JoopTrialBalanceRow[] = [];\n let totalDebits = 0;\n let totalCredits = 0;\n\n for (const acct of this._accounts.values()) {\n let d = 0, c = 0;\n for (const entry of this._entries) {\n for (const line of entry.lines) {\n if (line.accountCode === acct.code) {\n d += line.debit;\n c += line.credit;\n }\n }\n }\n const balance = _round(DEBIT_NORMAL.has(acct.type) ? d - c : c - d);\n rows.push({ code: acct.code, name: acct.name, type: acct.type, totalDebits: _round(d), totalCredits: _round(c), balance });\n totalDebits += d;\n totalCredits += c;\n }\n\n totalDebits = _round(totalDebits);\n totalCredits = _round(totalCredits);\n\n return { asOf: Date.now(), rows, totalDebits, totalCredits, isBalanced: totalDebits === totalCredits };\n }\n\n getBalancesByType(type: JoopAccountType): Record<string, number> {\n const result: Record<string, number> = {};\n for (const acct of this._accounts.values()) {\n if (acct.type === type) result[acct.code] = this.getBalance(acct.code);\n }\n return result;\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopReconItemSource = 'internal' | 'bank';\nexport type JoopReconMatchStatus = 'matched' | 'unmatched' | 'disputed';\n\nexport interface JoopReconItem {\n id: string;\n source: JoopReconItemSource;\n date: number;\n amount: number;\n description: string;\n reference?: string;\n}\n\nexport interface JoopReconMatch {\n id: string;\n internalId: string;\n bankId: string;\n matchedAt: number;\n isManual: boolean;\n difference: number;\n}\n\nexport interface JoopReconSession {\n id: string;\n accountId: string;\n startedAt: number;\n closedAt?: number;\n internalItems: JoopReconItem[];\n bankItems: JoopReconItem[];\n matches: JoopReconMatch[];\n}\n\nexport interface JoopReconSummary {\n sessionId: string;\n totalInternal: number;\n totalBank: number;\n matchedPairs: number;\n unmatchedInternal: number;\n unmatchedBank: number;\n totalDifference: number;\n isReconciled: boolean;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport class JoopReconciliationService {\n private _sessions = new Map<string, JoopReconSession>();\n private _change$ = new JoopSubject<JoopReconSession>();\n\n // ── Sessions ──────────────────────────────────────────────────────────────\n\n createSession(\n accountId: string,\n bankItems: Omit<JoopReconItem, 'id' | 'source'>[],\n internalItems: Omit<JoopReconItem, 'id' | 'source'>[] = []\n ): JoopReconSession {\n const session: JoopReconSession = {\n id: _uid(),\n accountId,\n startedAt: Date.now(),\n internalItems: internalItems.map(i => ({ ...i, id: _uid(), source: 'internal' as const })),\n bankItems: bankItems.map(i => ({ ...i, id: _uid(), source: 'bank' as const })),\n matches: [],\n };\n this._sessions.set(session.id, session);\n return session;\n }\n\n getSession(id: string): JoopReconSession | undefined {\n return this._sessions.get(id);\n }\n\n closeSession(id: string): JoopReconSession {\n const s = this._get(id);\n s.closedAt = Date.now();\n this._change$.next(s);\n return s;\n }\n\n addInternalItems(sessionId: string, items: Omit<JoopReconItem, 'id' | 'source'>[]): JoopReconSession {\n const s = this._get(sessionId);\n for (const item of items) s.internalItems.push({ ...item, id: _uid(), source: 'internal' });\n this._change$.next(s);\n return s;\n }\n\n // ── Matching ──────────────────────────────────────────────────────────────\n\n autoMatch(sessionId: string, toleranceAmount = 0, toleranceDays = 3): JoopReconMatch[] {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n const newMatches: JoopReconMatch[] = [];\n const dayMs = 86_400_000;\n\n for (const intItem of s.internalItems) {\n if (matchedInternalIds.has(intItem.id)) continue;\n for (const bankItem of s.bankItems) {\n if (matchedBankIds.has(bankItem.id)) continue;\n const amountDiff = Math.abs(intItem.amount - bankItem.amount);\n const daysDiff = Math.abs(intItem.date - bankItem.date) / dayMs;\n if (amountDiff <= toleranceAmount && daysDiff <= toleranceDays) {\n const match: JoopReconMatch = {\n id: _uid(),\n internalId: intItem.id,\n bankId: bankItem.id,\n matchedAt: Date.now(),\n isManual: false,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n matchedInternalIds.add(intItem.id);\n matchedBankIds.add(bankItem.id);\n newMatches.push(match);\n break;\n }\n }\n }\n\n if (newMatches.length) this._change$.next(s);\n return newMatches;\n }\n\n manualMatch(sessionId: string, internalId: string, bankId: string): JoopReconMatch {\n const s = this._get(sessionId);\n const intItem = s.internalItems.find(i => i.id === internalId);\n const bankItem = s.bankItems.find(i => i.id === bankId);\n if (!intItem) throw new Error(`Internal item ${internalId} not found`);\n if (!bankItem) throw new Error(`Bank item ${bankId} not found`);\n if (s.matches.some(m => m.internalId === internalId || m.bankId === bankId)) {\n throw new Error('One or both items are already matched');\n }\n const match: JoopReconMatch = {\n id: _uid(),\n internalId,\n bankId,\n matchedAt: Date.now(),\n isManual: true,\n difference: intItem.amount - bankItem.amount,\n };\n s.matches.push(match);\n this._change$.next(s);\n return match;\n }\n\n unmatch(sessionId: string, matchId: string): void {\n const s = this._get(sessionId);\n const idx = s.matches.findIndex(m => m.id === matchId);\n if (idx === -1) throw new Error(`Match ${matchId} not found`);\n s.matches.splice(idx, 1);\n this._change$.next(s);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getUnmatched(sessionId: string): { internal: JoopReconItem[]; bank: JoopReconItem[] } {\n const s = this._get(sessionId);\n const matchedInternalIds = new Set(s.matches.map(m => m.internalId));\n const matchedBankIds = new Set(s.matches.map(m => m.bankId));\n return {\n internal: s.internalItems.filter(i => !matchedInternalIds.has(i.id)),\n bank: s.bankItems.filter(i => !matchedBankIds.has(i.id)),\n };\n }\n\n getSummary(sessionId: string): JoopReconSummary {\n const s = this._get(sessionId);\n const unmatched = this.getUnmatched(sessionId);\n const totalDifference = s.matches.reduce((sum, m) => sum + m.difference, 0);\n return {\n sessionId,\n totalInternal: s.internalItems.length,\n totalBank: s.bankItems.length,\n matchedPairs: s.matches.length,\n unmatchedInternal: unmatched.internal.length,\n unmatchedBank: unmatched.bank.length,\n totalDifference: Math.round(totalDifference * 100) / 100,\n isReconciled: unmatched.internal.length === 0 && unmatched.bank.length === 0,\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopReconSession {\n const s = this._sessions.get(id);\n if (!s) throw new Error(`Reconciliation session ${id} not found`);\n return s;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLimitType = 'per-transaction' | 'daily' | 'weekly' | 'monthly' | 'yearly';\nexport type JoopLimitScope = 'account' | 'user' | 'card' | 'channel';\n\nexport interface JoopLimit {\n id: string;\n scope: JoopLimitScope;\n scopeId: string;\n type: JoopLimitType;\n maxAmount: number;\n currency: string;\n enabled: boolean;\n createdAt: number;\n notes?: string;\n}\n\nexport interface JoopLimitCheckResult {\n allowed: boolean;\n limit: JoopLimit;\n currentUsage: number;\n remaining: number;\n requestedAmount: number;\n reason?: string;\n}\n\nexport interface JoopUsageRecord {\n limitId: string;\n amount: number;\n recordedAt: number;\n reference?: string;\n}\n\nexport interface JoopUsageSummary {\n scope: JoopLimitScope;\n scopeId: string;\n limits: Array<{\n limitId: string;\n type: JoopLimitType;\n maxAmount: number;\n used: number;\n remaining: number;\n utilizationPercent: number;\n }>;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _periodStart(type: JoopLimitType, now: number): number {\n const d = new Date(now);\n switch (type) {\n case 'per-transaction': return 0; // always fresh\n case 'daily': return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n case 'weekly': {\n const day = d.getDay(); // 0=Sun\n const mon = new Date(d.getFullYear(), d.getMonth(), d.getDate() - ((day + 6) % 7));\n return mon.getTime();\n }\n case 'monthly': return new Date(d.getFullYear(), d.getMonth(), 1).getTime();\n case 'yearly': return new Date(d.getFullYear(), 0, 1).getTime();\n }\n}\n\nexport class JoopLimitManagementService {\n private _limits = new Map<string, JoopLimit>();\n private _usage: JoopUsageRecord[] = [];\n private _change$ = new JoopSubject<JoopLimit>();\n\n // ── Limit CRUD ────────────────────────────────────────────────────────────\n\n setLimit(\n scope: JoopLimitScope,\n scopeId: string,\n type: JoopLimitType,\n maxAmount: number,\n currency = 'USD',\n notes?: string\n ): JoopLimit {\n if (maxAmount <= 0) throw new Error('maxAmount must be positive');\n const existing = this._findLimit(scope, scopeId, type, currency);\n if (existing) {\n existing.maxAmount = maxAmount;\n existing.notes = notes;\n this._change$.next(existing);\n return existing;\n }\n const limit: JoopLimit = {\n id: _uid(), scope, scopeId, type, maxAmount, currency, enabled: true, createdAt: Date.now(), notes,\n };\n this._limits.set(limit.id, limit);\n this._change$.next(limit);\n return limit;\n }\n\n getLimit(id: string): JoopLimit | undefined {\n return this._limits.get(id);\n }\n\n getLimits(scope?: JoopLimitScope, scopeId?: string): JoopLimit[] {\n return Array.from(this._limits.values()).filter(l =>\n (scope === undefined || l.scope === scope) &&\n (scopeId === undefined || l.scopeId === scopeId)\n );\n }\n\n removeLimit(limitId: string): void {\n if (!this._limits.has(limitId)) throw new Error(`Limit ${limitId} not found`);\n this._limits.delete(limitId);\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n enableLimit(limitId: string): void { this._toggle(limitId, true); }\n disableLimit(limitId: string): void { this._toggle(limitId, false); }\n\n // ── Check & Record ────────────────────────────────────────────────────────\n\n checkLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD'): JoopLimitCheckResult | null {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit || !limit.enabled) return null;\n\n const usage = this._currentUsage(limit, Date.now());\n const remaining = Math.max(0, limit.maxAmount - usage);\n const allowed = amount <= remaining;\n\n return {\n allowed,\n limit,\n currentUsage: usage,\n remaining,\n requestedAmount: amount,\n reason: allowed ? undefined : `${type} limit of ${limit.maxAmount} ${currency} exceeded (used: ${usage})`,\n };\n }\n\n checkAllLimits(scope: JoopLimitScope, scopeId: string, amount: number, currency = 'USD'): JoopLimitCheckResult[] {\n const results: JoopLimitCheckResult[] = [];\n for (const limit of this._limits.values()) {\n if (limit.scope === scope && limit.scopeId === scopeId && limit.currency === currency && limit.enabled) {\n const check = this.checkLimit(scope, scopeId, limit.type, amount, currency);\n if (check) results.push(check);\n }\n }\n return results;\n }\n\n recordUsage(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, amount: number, currency = 'USD', reference?: string): void {\n const limit = this._findLimit(scope, scopeId, type, currency);\n if (!limit) return;\n this._usage.push({ limitId: limit.id, amount, recordedAt: Date.now(), reference });\n }\n\n resetUsage(limitId: string): void {\n this._usage = this._usage.filter(u => u.limitId !== limitId);\n }\n\n getUsageSummary(scope: JoopLimitScope, scopeId: string): JoopUsageSummary {\n const limits = this.getLimits(scope, scopeId);\n const now = Date.now();\n return {\n scope,\n scopeId,\n limits: limits.map(l => {\n const used = this._currentUsage(l, now);\n const remaining = Math.max(0, l.maxAmount - used);\n return {\n limitId: l.id,\n type: l.type,\n maxAmount: l.maxAmount,\n used,\n remaining,\n utilizationPercent: Math.round((used / l.maxAmount) * 100 * 100) / 100,\n };\n }),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _findLimit(scope: JoopLimitScope, scopeId: string, type: JoopLimitType, currency: string): JoopLimit | undefined {\n for (const l of this._limits.values()) {\n if (l.scope === scope && l.scopeId === scopeId && l.type === type && l.currency === currency) return l;\n }\n return undefined;\n }\n\n private _currentUsage(limit: JoopLimit, now: number): number {\n if (limit.type === 'per-transaction') return 0;\n const periodStart = _periodStart(limit.type, now);\n return this._usage\n .filter(u => u.limitId === limit.id && u.recordedAt >= periodStart)\n .reduce((s, u) => s + u.amount, 0);\n }\n\n private _toggle(limitId: string, enabled: boolean): void {\n const l = this._limits.get(limitId);\n if (!l) throw new Error(`Limit ${limitId} not found`);\n l.enabled = enabled;\n this._change$.next(l);\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopStandingOrderStatus = 'active' | 'paused' | 'cancelled' | 'completed';\nexport type JoopStandingOrderFrequency = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'half-yearly' | 'yearly';\nexport type JoopExecutionStatus = 'success' | 'failed' | 'skipped';\n\nexport interface JoopStandingOrder {\n id: string;\n ref: string;\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n status: JoopStandingOrderStatus;\n nextExecutionAt?: number;\n executionCount: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n createdAt: number;\n}\n\nexport interface JoopStandingOrderExecution {\n id: string;\n orderId: string;\n executedAt: number;\n amount: number;\n currency: string;\n status: JoopExecutionStatus;\n failureReason?: string;\n transactionRef?: string;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _computeNextDate(current: number, frequency: JoopStandingOrderFrequency): number {\n const d = new Date(current);\n switch (frequency) {\n case 'daily': d.setDate(d.getDate() + 1); break;\n case 'weekly': d.setDate(d.getDate() + 7); break;\n case 'biweekly': d.setDate(d.getDate() + 14); break;\n case 'monthly': d.setMonth(d.getMonth() + 1); break;\n case 'quarterly': d.setMonth(d.getMonth() + 3); break;\n case 'half-yearly': d.setMonth(d.getMonth() + 6); break;\n case 'yearly': d.setFullYear(d.getFullYear() + 1); break;\n }\n return d.getTime();\n}\n\nexport class JoopStandingOrderService {\n private _orders: JoopStandingOrder[] = [];\n private _executions: JoopStandingOrderExecution[] = [];\n private _seq = 0;\n private _change$ = new JoopSubject<JoopStandingOrder>();\n\n // ── CRUD ──────────────────────────────────────────────────────────────────\n\n create(params: {\n fromAccount: string;\n toAccount: string;\n toBeneficiaryName: string;\n amount: number;\n currency?: string;\n frequency: JoopStandingOrderFrequency;\n startDate: number;\n endDate?: number;\n maxExecutions?: number;\n reference?: string;\n notes?: string;\n }): JoopStandingOrder {\n if (params.amount <= 0) throw new Error('amount must be positive');\n if (!params.fromAccount.trim()) throw new Error('fromAccount required');\n if (!params.toAccount.trim()) throw new Error('toAccount required');\n if (params.endDate !== undefined && params.endDate <= params.startDate) {\n throw new Error('endDate must be after startDate');\n }\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `SO-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const order: JoopStandingOrder = {\n id: _uid(),\n ref,\n fromAccount: params.fromAccount,\n toAccount: params.toAccount,\n toBeneficiaryName: params.toBeneficiaryName,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n frequency: params.frequency,\n startDate: params.startDate,\n endDate: params.endDate,\n status: 'active',\n nextExecutionAt: params.startDate,\n executionCount: 0,\n maxExecutions: params.maxExecutions,\n reference: params.reference,\n notes: params.notes,\n createdAt: Date.now(),\n };\n\n this._orders.push(order);\n this._change$.next(order);\n return order;\n }\n\n update(id: string, patch: Partial<Pick<JoopStandingOrder, 'amount' | 'toBeneficiaryName' | 'endDate' | 'maxExecutions' | 'reference' | 'notes'>>): JoopStandingOrder {\n const o = this._get(id);\n if (patch.amount !== undefined && patch.amount <= 0) throw new Error('amount must be positive');\n Object.assign(o, patch);\n this._change$.next(o);\n return o;\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n pause(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot pause order with status ${o.status}`);\n o.status = 'paused';\n this._change$.next(o);\n return o;\n }\n\n resume(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status !== 'paused') throw new Error(`Cannot resume order with status ${o.status}`);\n o.status = 'active';\n this._change$.next(o);\n return o;\n }\n\n cancel(id: string): JoopStandingOrder {\n const o = this._get(id);\n if (o.status === 'cancelled') throw new Error('Order is already cancelled');\n o.status = 'cancelled';\n this._change$.next(o);\n return o;\n }\n\n // ── Execution ─────────────────────────────────────────────────────────────\n\n execute(id: string, status: JoopExecutionStatus = 'success', opts: { failureReason?: string; transactionRef?: string } = {}): JoopStandingOrderExecution {\n const o = this._get(id);\n if (o.status !== 'active') throw new Error(`Cannot execute order with status ${o.status}`);\n\n const exec: JoopStandingOrderExecution = {\n id: _uid(),\n orderId: id,\n executedAt: Date.now(),\n amount: o.amount,\n currency: o.currency,\n status,\n failureReason: opts.failureReason,\n transactionRef: opts.transactionRef,\n };\n\n this._executions.push(exec);\n\n if (status === 'success') {\n o.executionCount += 1;\n const next = _computeNextDate(o.nextExecutionAt ?? Date.now(), o.frequency);\n if ((o.endDate && next > o.endDate) || (o.maxExecutions && o.executionCount >= o.maxExecutions)) {\n o.status = 'completed';\n o.nextExecutionAt = undefined;\n } else {\n o.nextExecutionAt = next;\n }\n }\n\n this._change$.next(o);\n return exec;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopStandingOrder | undefined {\n return this._orders.find(o => o.id === id);\n }\n\n getAll(): JoopStandingOrder[] {\n return [...this._orders];\n }\n\n getActive(): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active');\n }\n\n getByAccount(accountId: string): JoopStandingOrder[] {\n return this._orders.filter(o => o.fromAccount === accountId || o.toAccount === accountId);\n }\n\n getDue(asOf = Date.now()): JoopStandingOrder[] {\n return this._orders.filter(o => o.status === 'active' && o.nextExecutionAt !== undefined && o.nextExecutionAt <= asOf);\n }\n\n getExecutions(orderId: string): JoopStandingOrderExecution[] {\n return this._executions.filter(e => e.orderId === orderId);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopStandingOrder {\n const o = this._orders.find(x => x.id === id);\n if (!o) throw new Error(`Standing order ${id} not found`);\n return o;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopLoanAccountStatus = 'active' | 'closed' | 'defaulted' | 'written-off';\nexport type JoopRepaymentStatus = 'pending' | 'paid' | 'partial' | 'overdue' | 'waived';\nexport type JoopLoanPaymentAllocation = 'interest' | 'principal' | 'penalty';\n\nexport interface JoopLoanAccount {\n id: string;\n ref: string;\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n outstandingPrincipal: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt: number;\n status: JoopLoanAccountStatus;\n emiAmount: number;\n currency: string;\n nextDueDate: number;\n totalPaid: number;\n penaltyRatePercent: number;\n notes?: string;\n}\n\nexport interface JoopInstallment {\n installmentNumber: number;\n dueDate: number;\n principalComponent: number;\n interestComponent: number;\n totalDue: number;\n outstandingAfter: number;\n status: JoopRepaymentStatus;\n paidAmount: number;\n paidAt?: number;\n}\n\nexport interface JoopLoanPayment {\n id: string;\n loanId: string;\n amount: number;\n paidAt: number;\n interestPaid: number;\n principalPaid: number;\n penaltyPaid: number;\n reference?: string;\n}\n\nexport interface JoopLoanStatement {\n loan: JoopLoanAccount;\n schedule: JoopInstallment[];\n payments: JoopLoanPayment[];\n outstandingPrincipal: number;\n accruedInterest: number;\n totalOverdue: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 2): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nfunction _addMonths(ts: number, months: number): number {\n const d = new Date(ts);\n d.setMonth(d.getMonth() + months);\n return d.getTime();\n}\n\nfunction _calcEmi(principal: number, annualRate: number, tenureMonths: number): number {\n if (annualRate === 0) return _round(principal / tenureMonths);\n const r = annualRate / 100 / 12;\n return _round(principal * r * Math.pow(1 + r, tenureMonths) / (Math.pow(1 + r, tenureMonths) - 1));\n}\n\nfunction _buildSchedule(loanId: string, principal: number, annualRate: number, tenureMonths: number, startDate: number, emi: number): JoopInstallment[] {\n const schedule: JoopInstallment[] = [];\n let outstanding = principal;\n const r = annualRate / 100 / 12;\n for (let i = 1; i <= tenureMonths; i++) {\n const interest = _round(outstanding * r);\n const principalC = i < tenureMonths ? _round(emi - interest) : _round(outstanding); // last EMI clears balance\n const total = _round(interest + principalC);\n outstanding = _round(outstanding - principalC);\n if (outstanding < 0) outstanding = 0;\n schedule.push({\n installmentNumber: i,\n dueDate: _addMonths(startDate, i),\n principalComponent: principalC,\n interestComponent: interest,\n totalDue: total,\n outstandingAfter: outstanding,\n status: 'pending',\n paidAmount: 0,\n });\n }\n return schedule;\n}\n\nexport class JoopLoanServicingService {\n private _loans: JoopLoanAccount[] = [];\n private _schedules = new Map<string, JoopInstallment[]>();\n private _payments = new Map<string, JoopLoanPayment[]>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopLoanAccount>();\n\n // ── Create ────────────────────────────────────────────────────────────────\n\n createLoan(params: {\n borrowerName: string;\n borrowerId: string;\n principalAmount: number;\n annualInterestRatePercent: number;\n tenureMonths: number;\n disbursedAt?: number;\n currency?: string;\n penaltyRatePercent?: number;\n notes?: string;\n }): JoopLoanAccount {\n if (params.principalAmount <= 0) throw new Error('principalAmount must be positive');\n if (params.annualInterestRatePercent < 0) throw new Error('annualInterestRatePercent must be non-negative');\n if (params.tenureMonths <= 0) throw new Error('tenureMonths must be positive');\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `LN-${year}-${String(this._seq).padStart(6, '0')}`;\n const disbursedAt = params.disbursedAt ?? Date.now();\n const emi = _calcEmi(params.principalAmount, params.annualInterestRatePercent, params.tenureMonths);\n\n const loan: JoopLoanAccount = {\n id: _uid(),\n ref,\n borrowerName: params.borrowerName,\n borrowerId: params.borrowerId,\n principalAmount: params.principalAmount,\n outstandingPrincipal: params.principalAmount,\n annualInterestRatePercent: params.annualInterestRatePercent,\n tenureMonths: params.tenureMonths,\n disbursedAt,\n status: 'active',\n emiAmount: emi,\n currency: params.currency ?? 'USD',\n nextDueDate: _addMonths(disbursedAt, 1),\n totalPaid: 0,\n penaltyRatePercent: params.penaltyRatePercent ?? 2,\n notes: params.notes,\n };\n\n this._loans.push(loan);\n this._schedules.set(loan.id, _buildSchedule(loan.id, params.principalAmount, params.annualInterestRatePercent, params.tenureMonths, disbursedAt, emi));\n this._payments.set(loan.id, []);\n this._change$.next(loan);\n return loan;\n }\n\n // ── Payments ──────────────────────────────────────────────────────────────\n\n recordPayment(loanId: string, amount: number, opts: { paidAt?: number; reference?: string } = {}): JoopLoanPayment {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Cannot record payment on loan with status ${loan.status}`);\n if (amount <= 0) throw new Error('amount must be positive');\n\n const schedule = this._schedules.get(loanId)!;\n const paidAt = opts.paidAt ?? Date.now();\n let remaining = amount;\n let interestPaid = 0;\n let principalPaid = 0;\n\n // Apply to oldest pending/overdue/partial installments first\n for (const inst of schedule) {\n if (remaining <= 0) break;\n if (inst.status === 'paid' || inst.status === 'waived') continue;\n\n const owed = _round(inst.totalDue - inst.paidAmount);\n const apply = Math.min(remaining, owed);\n\n // Split apply into interest vs principal proportionally\n const instTotal = inst.interestComponent + inst.principalComponent;\n const intShare = instTotal > 0 ? _round(apply * (inst.interestComponent / instTotal)) : 0;\n const priShare = _round(apply - intShare);\n\n interestPaid += intShare;\n principalPaid += priShare;\n\n inst.paidAmount = _round(inst.paidAmount + apply);\n remaining = _round(remaining - apply);\n\n if (Math.abs(inst.paidAmount - inst.totalDue) < 0.01) {\n inst.status = 'paid';\n inst.paidAt = paidAt;\n } else {\n inst.status = 'partial';\n }\n }\n\n // Any remaining amount goes directly to principal (prepayment)\n if (remaining > 0) {\n principalPaid += remaining;\n remaining = 0;\n }\n\n interestPaid = _round(interestPaid);\n principalPaid = _round(principalPaid);\n\n loan.outstandingPrincipal = _round(loan.outstandingPrincipal - principalPaid);\n if (loan.outstandingPrincipal < 0) loan.outstandingPrincipal = 0;\n loan.totalPaid = _round(loan.totalPaid + amount);\n\n // Advance nextDueDate\n const nextPending = schedule.find(i => i.status !== 'paid' && i.status !== 'waived');\n loan.nextDueDate = nextPending?.dueDate ?? loan.nextDueDate;\n\n if (loan.outstandingPrincipal === 0) {\n loan.status = 'closed';\n }\n\n const payment: JoopLoanPayment = {\n id: _uid(),\n loanId,\n amount,\n paidAt,\n interestPaid,\n principalPaid,\n penaltyPaid: 0,\n reference: opts.reference,\n };\n\n this._payments.get(loanId)!.push(payment);\n this._change$.next(loan);\n return payment;\n }\n\n waveInstallment(loanId: string, installmentNumber: number): void {\n const schedule = this._schedules.get(loanId);\n if (!schedule) throw new Error(`Loan ${loanId} not found`);\n const inst = schedule.find(i => i.installmentNumber === installmentNumber);\n if (!inst) throw new Error(`Installment ${installmentNumber} not found`);\n inst.status = 'waived';\n inst.paidAt = Date.now();\n }\n\n markDefaulted(loanId: string): JoopLoanAccount {\n const loan = this._get(loanId);\n if (loan.status !== 'active') throw new Error(`Loan is not active`);\n loan.status = 'defaulted';\n this._change$.next(loan);\n return loan;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getLoan(id: string): JoopLoanAccount | undefined {\n return this._loans.find(l => l.id === id);\n }\n\n getAll(): JoopLoanAccount[] { return [...this._loans]; }\n\n getActive(): JoopLoanAccount[] { return this._loans.filter(l => l.status === 'active'); }\n\n getByBorrower(borrowerId: string): JoopLoanAccount[] {\n return this._loans.filter(l => l.borrowerId === borrowerId);\n }\n\n getSchedule(loanId: string): JoopInstallment[] {\n return this._schedules.get(loanId) ?? [];\n }\n\n getPendingInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status !== 'paid' && i.status !== 'waived');\n }\n\n getOverdueInstallments(loanId: string): JoopInstallment[] {\n this._markOverdue(loanId);\n return (this._schedules.get(loanId) ?? []).filter(i => i.status === 'overdue');\n }\n\n getOutstandingBalance(loanId: string): number {\n return this._get(loanId).outstandingPrincipal;\n }\n\n getAccruedInterest(loanId: string, asOf = Date.now()): number {\n const loan = this._get(loanId);\n const daysSinceDue = Math.max(0, (asOf - loan.nextDueDate) / 86_400_000);\n if (daysSinceDue <= 0) return 0;\n return _round(loan.outstandingPrincipal * (loan.annualInterestRatePercent / 100 / 365) * daysSinceDue);\n }\n\n getLoanStatement(loanId: string): JoopLoanStatement {\n const loan = this._get(loanId);\n const schedule = this._schedules.get(loanId)!;\n const payments = this._payments.get(loanId)!;\n this._markOverdue(loanId);\n const totalOverdue = schedule\n .filter(i => i.status === 'overdue')\n .reduce((s, i) => s + _round(i.totalDue - i.paidAmount), 0);\n return {\n loan,\n schedule,\n payments,\n outstandingPrincipal: loan.outstandingPrincipal,\n accruedInterest: this.getAccruedInterest(loanId),\n totalOverdue: _round(totalOverdue),\n };\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopLoanAccount {\n const l = this._loans.find(x => x.id === id);\n if (!l) throw new Error(`Loan ${id} not found`);\n return l;\n }\n\n private _markOverdue(loanId: string): void {\n const now = Date.now();\n const schedule = this._schedules.get(loanId);\n if (!schedule) return;\n for (const inst of schedule) {\n if ((inst.status === 'pending' || inst.status === 'partial') && inst.dueDate < now) {\n inst.status = 'overdue';\n }\n }\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopWalletStatus = 'active' | 'frozen' | 'closed';\nexport type JoopWalletTxnType = 'topup' | 'transfer-out' | 'transfer-in' | 'payment' | 'refund' | 'cashback' | 'withdrawal' | 'fee';\n\nexport interface JoopWallet {\n id: string;\n userId: string;\n label?: string;\n currency: string;\n balance: number;\n status: JoopWalletStatus;\n createdAt: number;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport interface JoopWalletTransaction {\n id: string;\n walletId: string;\n type: JoopWalletTxnType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n description: string;\n reference?: string;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface JoopTransferResult {\n fromTxn: JoopWalletTransaction;\n toTxn: JoopWalletTransaction;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport class JoopDigitalWalletService {\n private _wallets = new Map<string, JoopWallet>();\n private _transactions: JoopWalletTransaction[] = [];\n private _balance$ = new JoopBehaviorSubject<{ walletId: string; balance: number } | null>(null);\n\n // ── Wallet lifecycle ──────────────────────────────────────────────────────\n\n createWallet(userId: string, opts: { label?: string; currency?: string; dailyLimit?: number; monthlyLimit?: number } = {}): JoopWallet {\n const wallet: JoopWallet = {\n id: _uid(),\n userId,\n label: opts.label,\n currency: opts.currency ?? 'USD',\n balance: 0,\n status: 'active',\n createdAt: Date.now(),\n dailyLimit: opts.dailyLimit,\n monthlyLimit: opts.monthlyLimit,\n };\n this._wallets.set(wallet.id, wallet);\n return wallet;\n }\n\n freeze(walletId: string): JoopWallet {\n const w = this._getActive(walletId);\n w.status = 'frozen';\n return w;\n }\n\n unfreeze(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Cannot unfreeze a closed wallet');\n w.status = 'active';\n return w;\n }\n\n close(walletId: string): JoopWallet {\n const w = this._get(walletId);\n if (w.status === 'closed') throw new Error('Wallet already closed');\n if (w.balance > 0) throw new Error('Cannot close wallet with positive balance — withdraw funds first');\n w.status = 'closed';\n return w;\n }\n\n updateLimits(walletId: string, limits: { dailyLimit?: number; monthlyLimit?: number }): JoopWallet {\n const w = this._get(walletId);\n if (limits.dailyLimit !== undefined) w.dailyLimit = limits.dailyLimit;\n if (limits.monthlyLimit !== undefined) w.monthlyLimit = limits.monthlyLimit;\n return w;\n }\n\n // ── Funds ─────────────────────────────────────────────────────────────────\n\n topUp(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n return this._record(w, 'topup', amount, opts.description ?? 'Top-up', opts.reference);\n }\n\n withdraw(walletId: string, amount: number, opts: { reference?: string; description?: string } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n return this._record(w, 'withdrawal', -amount, opts.description ?? 'Withdrawal', opts.reference);\n }\n\n pay(walletId: string, amount: number, merchantId: string, merchantName: string, opts: { reference?: string; metadata?: Record<string, unknown> } = {}): JoopWalletTransaction {\n if (amount <= 0) throw new Error('amount must be positive');\n const w = this._getActive(walletId);\n this._assertSufficientBalance(w, amount);\n const txn = this._record(w, 'payment', -amount, `Payment to ${merchantName}`, opts.reference);\n txn.counterpartyId = merchantId;\n txn.counterpartyName = merchantName;\n if (opts.metadata) txn.metadata = opts.metadata;\n return txn;\n }\n\n transfer(fromWalletId: string, toWalletId: string, amount: number, opts: { note?: string; reference?: string } = {}): JoopTransferResult {\n if (amount <= 0) throw new Error('amount must be positive');\n if (fromWalletId === toWalletId) throw new Error('Cannot transfer to the same wallet');\n const from = this._getActive(fromWalletId);\n const to = this._getActive(toWalletId);\n this._assertSufficientBalance(from, amount);\n if (from.currency !== to.currency) throw new Error('Cross-currency transfers not supported — use FX service');\n\n const fromTxn = this._record(from, 'transfer-out', -amount, opts.note ?? `Transfer to ${to.userId}`, opts.reference);\n fromTxn.counterpartyId = toWalletId;\n const toTxn = this._record(to, 'transfer-in', amount, opts.note ?? `Transfer from ${from.userId}`, opts.reference);\n toTxn.counterpartyId = fromWalletId;\n return { fromTxn, toTxn };\n }\n\n refund(originalTxnId: string, opts: { amount?: number; reason?: string } = {}): JoopWalletTransaction {\n const original = this._transactions.find(t => t.id === originalTxnId);\n if (!original) throw new Error(`Transaction ${originalTxnId} not found`);\n if (original.type !== 'payment') throw new Error('Can only refund payment transactions');\n const w = this._getActive(original.walletId);\n const amount = opts.amount ?? Math.abs(original.amount);\n if (amount > Math.abs(original.amount)) throw new Error('Refund exceeds original payment amount');\n return this._record(w, 'refund', amount, opts.reason ?? `Refund for ${originalTxnId}`, originalTxnId);\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n getWallet(id: string): JoopWallet | undefined {\n return this._wallets.get(id);\n }\n\n getWalletsByUser(userId: string): JoopWallet[] {\n return Array.from(this._wallets.values()).filter(w => w.userId === userId);\n }\n\n getBalance(walletId: string): number {\n return this._get(walletId).balance;\n }\n\n getTransactions(walletId: string, limit?: number): JoopWalletTransaction[] {\n const all = this._transactions.filter(t => t.walletId === walletId).sort((a, b) => b.createdAt - a.createdAt);\n return limit ? all.slice(0, limit) : all;\n }\n\n getTotalSpent(walletId: string, from?: number, to?: number): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'payment' &&\n (from === undefined || t.createdAt >= from) &&\n (to === undefined || t.createdAt <= to))\n .reduce((s, t) => s + Math.abs(t.amount), 0)\n );\n }\n\n getTotalTopUp(walletId: string): number {\n return _round(\n this._transactions\n .filter(t => t.walletId === walletId && t.type === 'topup')\n .reduce((s, t) => s + t.amount, 0)\n );\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n balance$() { return this._balance$; }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _get(id: string): JoopWallet {\n const w = this._wallets.get(id);\n if (!w) throw new Error(`Wallet ${id} not found`);\n return w;\n }\n\n private _getActive(id: string): JoopWallet {\n const w = this._get(id);\n if (w.status !== 'active') throw new Error(`Wallet is ${w.status}`);\n return w;\n }\n\n private _assertSufficientBalance(w: JoopWallet, amount: number): void {\n if (w.balance < amount) throw new Error(`Insufficient balance — available: ${w.balance}, requested: ${amount}`);\n }\n\n private _record(w: JoopWallet, type: JoopWalletTxnType, amount: number, description: string, reference?: string): JoopWalletTransaction {\n const balanceBefore = w.balance;\n w.balance = _round(w.balance + amount);\n const txn: JoopWalletTransaction = {\n id: _uid(),\n walletId: w.id,\n type,\n amount,\n balanceBefore,\n balanceAfter: w.balance,\n description,\n reference,\n createdAt: Date.now(),\n };\n this._transactions.push(txn);\n this._balance$.next({ walletId: w.id, balance: w.balance });\n return txn;\n }\n}\n","import { JoopSubject } from '../events';\n\nexport type JoopForwardType = 'buy' | 'sell';\nexport type JoopForwardStatus = 'open' | 'settled' | 'cancelled' | 'expired';\n\nexport interface JoopFxForward {\n id: string;\n ref: string;\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n spotRateAtCreation: number;\n maturityDate: number;\n status: JoopForwardStatus;\n counterpartyId?: string;\n counterpartyName?: string;\n createdAt: number;\n settledAt?: number;\n settlementSpotRate?: number;\n pnl?: number;\n notes?: string;\n}\n\nexport interface JoopForwardSettlement {\n forwardId: string;\n ref: string;\n settledAt: number;\n contractRate: number;\n spotRate: number;\n notionalAmount: number;\n baseCurrency: string;\n quoteCurrency: string;\n pnl: number;\n}\n\nexport interface JoopFxExposure {\n currency: string;\n type: JoopForwardType;\n totalNotional: number;\n contractCount: number;\n}\n\nfunction _uid(): string {\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction _round(n: number, dp = 4): number {\n return Math.round(n * 10 ** dp) / 10 ** dp;\n}\n\nexport class JoopFxForwardService {\n private _forwards: JoopFxForward[] = [];\n private _settlements: JoopForwardSettlement[] = [];\n private _spotRates = new Map<string, number>();\n private _seq = 0;\n private _change$ = new JoopSubject<JoopFxForward>();\n\n // ── Spot rates ────────────────────────────────────────────────────────────\n\n setSpotRate(baseCurrency: string, quoteCurrency: string, rate: number): void {\n if (rate <= 0) throw new Error('rate must be positive');\n this._spotRates.set(`${baseCurrency}:${quoteCurrency}`, rate);\n this._spotRates.set(`${quoteCurrency}:${baseCurrency}`, _round(1 / rate));\n }\n\n getSpotRate(baseCurrency: string, quoteCurrency: string): number | undefined {\n if (baseCurrency === quoteCurrency) return 1;\n return this._spotRates.get(`${baseCurrency}:${quoteCurrency}`);\n }\n\n // ── Forward contracts ─────────────────────────────────────────────────────\n\n createForward(params: {\n type: JoopForwardType;\n baseCurrency: string;\n quoteCurrency: string;\n notionalAmount: number;\n contractRate: number;\n maturityDate: number;\n counterpartyId?: string;\n counterpartyName?: string;\n notes?: string;\n }): JoopFxForward {\n if (params.notionalAmount <= 0) throw new Error('notionalAmount must be positive');\n if (params.contractRate <= 0) throw new Error('contractRate must be positive');\n if (params.maturityDate <= Date.now()) throw new Error('maturityDate must be in the future');\n\n const spotRate = this.getSpotRate(params.baseCurrency, params.quoteCurrency) ?? params.contractRate;\n\n this._seq += 1;\n const year = new Date().getFullYear();\n const ref = `FWD-${year}-${String(this._seq).padStart(6, '0')}`;\n\n const forward: JoopFxForward = {\n id: _uid(),\n ref,\n type: params.type,\n baseCurrency: params.baseCurrency,\n quoteCurrency: params.quoteCurrency,\n notionalAmount: params.notionalAmount,\n contractRate: params.contractRate,\n spotRateAtCreation: spotRate,\n maturityDate: params.maturityDate,\n status: 'open',\n counterpartyId: params.counterpartyId,\n counterpartyName: params.counterpartyName,\n createdAt: Date.now(),\n notes: params.notes,\n };\n\n this._forwards.push(forward);\n this._change$.next(forward);\n return forward;\n }\n\n settleForward(id: string, spotRate?: number): JoopForwardSettlement {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot settle forward with status ${fwd.status}`);\n\n const rate = spotRate ?? this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n\n // PnL = (contractRate - spotRate) * notional for a sell forward\n // (spotRate - contractRate) * notional for a buy forward\n const pnl = fwd.type === 'sell'\n ? _round((fwd.contractRate - rate) * fwd.notionalAmount, 2)\n : _round((rate - fwd.contractRate) * fwd.notionalAmount, 2);\n\n fwd.status = 'settled';\n fwd.settledAt = Date.now();\n fwd.settlementSpotRate = rate;\n fwd.pnl = pnl;\n\n const settlement: JoopForwardSettlement = {\n forwardId: id,\n ref: fwd.ref,\n settledAt: fwd.settledAt,\n contractRate: fwd.contractRate,\n spotRate: rate,\n notionalAmount: fwd.notionalAmount,\n baseCurrency: fwd.baseCurrency,\n quoteCurrency: fwd.quoteCurrency,\n pnl,\n };\n\n this._settlements.push(settlement);\n this._change$.next(fwd);\n return settlement;\n }\n\n cancelForward(id: string, notes?: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot cancel forward with status ${fwd.status}`);\n fwd.status = 'cancelled';\n if (notes) fwd.notes = notes;\n this._change$.next(fwd);\n return fwd;\n }\n\n expireForward(id: string): JoopFxForward {\n const fwd = this._get(id);\n if (fwd.status !== 'open') throw new Error(`Cannot expire forward with status ${fwd.status}`);\n if (fwd.maturityDate > Date.now()) throw new Error('Forward has not yet matured');\n fwd.status = 'expired';\n this._change$.next(fwd);\n return fwd;\n }\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n get(id: string): JoopFxForward | undefined {\n return this._forwards.find(f => f.id === id);\n }\n\n getAll(status?: JoopForwardStatus): JoopFxForward[] {\n return status ? this._forwards.filter(f => f.status === status) : [...this._forwards];\n }\n\n getExpiring(withinMs: number, asOf = Date.now()): JoopFxForward[] {\n return this._forwards.filter(f => f.status === 'open' && f.maturityDate <= asOf + withinMs && f.maturityDate > asOf);\n }\n\n getSettlements(): JoopForwardSettlement[] { return [...this._settlements]; }\n\n getSettlement(forwardId: string): JoopForwardSettlement | undefined {\n return this._settlements.find(s => s.forwardId === forwardId);\n }\n\n getExposure(currency: string, type?: JoopForwardType): JoopFxExposure[] {\n const open = this._forwards.filter(f =>\n f.status === 'open' &&\n (f.baseCurrency === currency || f.quoteCurrency === currency) &&\n (type === undefined || f.type === type)\n );\n\n const map = new Map<string, JoopFxExposure>();\n for (const f of open) {\n const key = `${currency}:${f.type}`;\n const cur = map.get(key) ?? { currency, type: f.type, totalNotional: 0, contractCount: 0 };\n cur.totalNotional += f.notionalAmount;\n cur.contractCount += 1;\n map.set(key, cur);\n }\n return Array.from(map.values());\n }\n\n getTotalPnL(): number {\n return _round(this._settlements.reduce((s, settlement) => s + settlement.pnl, 0), 2);\n }\n\n getMarkToMarket(id: string): number {\n const fwd = this._get(id);\n if (fwd.status !== 'open') return fwd.pnl ?? 0;\n const spot = this.getSpotRate(fwd.baseCurrency, fwd.quoteCurrency) ?? fwd.contractRate;\n return fwd.type === 'sell'\n ? _round((fwd.contractRate - spot) * fwd.notionalAmount, 2)\n : _round((spot - fwd.contractRate) * fwd.notionalAmount, 2);\n }\n\n // ── Observable ───────────────────────────────────────────────────────────\n\n change$() { return this._change$; }\n\n private _get(id: string): JoopFxForward {\n const f = this._forwards.find(x => x.id === id);\n if (!f) throw new Error(`Forward ${id} not found`);\n return f;\n }\n}\n"]}