Implement bank transfer app flows

This commit is contained in:
2026-06-08 00:03:57 +05:00
parent ef877217ad
commit 9b281d48a7
127 changed files with 8008 additions and 90 deletions
+52
View File
@@ -0,0 +1,52 @@
import Foundation
struct PaymvQrResult {
let account: String
let amount: String?
let merchantName: String?
let purpose: String?
}
enum PaymvQrParser {
static func parse(_ qr: String) -> PaymvQrResult? {
let tlvs = parseTLV(qr)
// Tag 26: merchant account info sub-tag 03 = account number
var account: String?
if let tag26 = tlvs["26"] {
let sub = parseTLV(tag26)
account = sub["03"]
}
guard let acc = account, !acc.isEmpty else { return nil }
let amount = tlvs["54"]
let name = tlvs["59"]
// Tag 62: additional data sub-tag 08 = purpose/reference
var purpose: String?
if let tag62 = tlvs["62"] {
let sub = parseTLV(tag62)
purpose = sub["08"]
}
return PaymvQrResult(account: acc, amount: amount, merchantName: name, purpose: purpose)
}
private static func parseTLV(_ s: String) -> [String: String] {
var result: [String: String] = [:]
var idx = s.startIndex
while s.distance(from: idx, to: s.endIndex) >= 4 {
let idEnd = s.index(idx, offsetBy: 2)
let lenEnd = s.index(idEnd, offsetBy: 2)
let id = String(s[idx..<idEnd])
guard let len = Int(s[idEnd..<lenEnd]) else { break }
idx = lenEnd
guard s.distance(from: idx, to: s.endIndex) >= len else { break }
let valEnd = s.index(idx, offsetBy: len)
result[id] = String(s[idx..<valEnd])
idx = valEnd
}
return result
}
}