107 lines
2.7 KiB
Swift
107 lines
2.7 KiB
Swift
import Foundation
|
|
|
|
struct BmlSession: Codable {
|
|
let accessToken: String
|
|
let deviceId: String
|
|
let refreshToken: String
|
|
let expiresAt: Int64 // Unix millis; 0 = unknown
|
|
|
|
var isExpired: Bool {
|
|
expiresAt > 0 && Int64(Date().timeIntervalSince1970 * 1000) >= expiresAt
|
|
}
|
|
}
|
|
|
|
struct BmlProfile: Codable, Identifiable {
|
|
let profileId: String
|
|
let name: String
|
|
let type: String // "Profile" or "Business"
|
|
let profileType: String // "default" or "business"
|
|
let autoActivated: Bool
|
|
|
|
var id: String { profileId }
|
|
}
|
|
|
|
struct BmlOtpChannel: Codable {
|
|
let channel: String
|
|
let description: String
|
|
let masked: String
|
|
}
|
|
|
|
enum BmlActivationResult {
|
|
case success(BmlSession, [BankAccount])
|
|
case needsBusinessOtp([BmlOtpChannel])
|
|
}
|
|
|
|
struct BmlUserInfo {
|
|
let fullName: String
|
|
let email: String
|
|
let mobile: String
|
|
let customerId: String
|
|
let idCard: String
|
|
let birthdate: String
|
|
}
|
|
|
|
struct BmlLoanDetail {
|
|
let loanAmount: Double
|
|
let outstandingAmt: Double
|
|
let repayAmount: Double
|
|
let intRate: Double
|
|
let loanStatus: String
|
|
let startDate: String
|
|
let endDate: String
|
|
let noOfRepayOverdue: Int
|
|
let overdueAmount: Double
|
|
}
|
|
|
|
struct BmlWalletToken {
|
|
let token: String
|
|
let expiry: String
|
|
let appCode: String
|
|
let serviceCode: String
|
|
let data: String
|
|
let validUntil: String
|
|
}
|
|
|
|
struct BmlForeignLimit: Codable {
|
|
let type: String
|
|
let used: Double
|
|
let totalLimit: Double
|
|
let generalCap: Double
|
|
let generalRemaining: Double
|
|
let medicalRemaining: Double
|
|
let isAtmEnabled: Bool
|
|
let isPosEnabled: Bool
|
|
let atmRemaining: Double
|
|
let atmLimit: Double
|
|
let ecomRemaining: Double
|
|
let ecomLimit: Double
|
|
let posRemaining: Double
|
|
let posLimit: Double
|
|
}
|
|
|
|
enum BmlError: LocalizedError {
|
|
case networkError(String)
|
|
case loginFailed(String)
|
|
case otpFailed(String)
|
|
case serverError(String)
|
|
case sessionExpired
|
|
case profileActivationFailed(String)
|
|
case oauthFailed(String)
|
|
case invalidResponse
|
|
case endpointNotFound
|
|
|
|
var errorDescription: String? {
|
|
switch self {
|
|
case .networkError(let msg): return "Network error: \(msg)"
|
|
case .loginFailed(let msg): return "Login failed: \(msg)"
|
|
case .otpFailed(let msg): return "OTP failed: \(msg)"
|
|
case .serverError(let msg): return msg
|
|
case .sessionExpired: return "Session expired."
|
|
case .profileActivationFailed(let msg): return "Profile activation failed: \(msg)"
|
|
case .oauthFailed(let msg): return "OAuth failed: \(msg)"
|
|
case .invalidResponse: return "Unexpected server response."
|
|
case .endpointNotFound: return "Endpoint not found."
|
|
}
|
|
}
|
|
}
|