taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit 4dcd94c12f2d8e3af2aeca3e6dee1a2ccccec08d
parent 62115090e487a1b862298e77834e35b913c95c6a
Author: Marc Stibane <marc@taler.net>
Date:   Thu, 13 Mar 2025 15:36:33 +0100

OIMcurrency

Diffstat:
MTalerWallet.xcodeproj/project.pbxproj | 6++++++
ATalerWallet1/Helper/OIMcurrency.swift | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj @@ -302,6 +302,8 @@ 4EE77E822C06E513007C9064 /* WithdrawAcceptView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE77E802C06E513007C9064 /* WithdrawAcceptView.swift */; }; 4EE9864F2CE26E0F00F75634 /* DepositAmountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9864E2CE26E0F00F75634 /* DepositAmountView.swift */; }; 4EE986502CE26E0F00F75634 /* DepositAmountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9864E2CE26E0F00F75634 /* DepositAmountView.swift */; }; + 4EE9E1FA2D7D516800365E72 /* OIMcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9E1F92D7D516800365E72 /* OIMcurrency.swift */; }; + 4EE9E1FB2D7D516800365E72 /* OIMcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9E1F92D7D516800365E72 /* OIMcurrency.swift */; }; 4EE9E1FD2D7E3C8000365E72 /* UserDefaults+oimMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9E1FC2D7E3C8000365E72 /* UserDefaults+oimMode.swift */; }; 4EE9E1FE2D7E3C8000365E72 /* UserDefaults+oimMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE9E1FC2D7E3C8000365E72 /* UserDefaults+oimMode.swift */; }; 4EEBEFB02C8982180020D340 /* View+innerSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EEBEFAF2C8982180020D340 /* View+innerSize.swift */; }; @@ -524,6 +526,7 @@ 4EE77E7E2C0280E5007C9064 /* Taler_Wallet InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = "Taler_Wallet InfoPlist.xcstrings"; sourceTree = "<group>"; }; 4EE77E802C06E513007C9064 /* WithdrawAcceptView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WithdrawAcceptView.swift; sourceTree = "<group>"; }; 4EE9864E2CE26E0F00F75634 /* DepositAmountView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DepositAmountView.swift; sourceTree = "<group>"; }; + 4EE9E1F92D7D516800365E72 /* OIMcurrency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OIMcurrency.swift; sourceTree = "<group>"; }; 4EE9E1FC2D7E3C8000365E72 /* UserDefaults+oimMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+oimMode.swift"; sourceTree = "<group>"; }; 4EEBEFAF2C8982180020D340 /* View+innerSize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+innerSize.swift"; sourceTree = "<group>"; }; 4EEC118C2B83DE4700146CFF /* AmountInputV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmountInputV.swift; sourceTree = "<group>"; }; @@ -743,6 +746,7 @@ 4E16E12229F3BB99008B9C86 /* CurrencySpecification.swift */, 4EAD117529F672FA008EDD0B /* KeyboardResponder.swift */, 4E363CC12A2621C200D7E98C /* LocalizedAlertError.swift */, + 4EE9E1F92D7D516800365E72 /* OIMcurrency.swift */, 4E578E912A481D8600F21F1C /* Controller+playSound.swift */, 4EB095062989CB7C0043A8A1 /* TalerDater.swift */, 4EB095072989CB7C0043A8A1 /* TalerStrings.swift */, @@ -1363,6 +1367,7 @@ E37AA62E2AF19BE0003850CF /* RefundURIView.swift in Sources */, 4E7F85172D63185E00954C30 /* Environment+EdgeInsets.swift in Sources */, 4E3EAE5F2A990778009F1BE8 /* QRSheet.swift in Sources */, + 4EE9E1FA2D7D516800365E72 /* OIMcurrency.swift in Sources */, 4E3EAE602A990778009F1BE8 /* P2pReceiveURIView.swift in Sources */, 4E3EAE612A990778009F1BE8 /* ListStyle.swift in Sources */, 4EED38552D140C1400F6C038 /* TabBarModel.swift in Sources */, @@ -1507,6 +1512,7 @@ E37AA62F2AF19BE0003850CF /* RefundURIView.swift in Sources */, 4E7F85182D63185E00954C30 /* Environment+EdgeInsets.swift in Sources */, 4EEC157A29F9427F00D46A03 /* QRSheet.swift in Sources */, + 4EE9E1FB2D7D516800365E72 /* OIMcurrency.swift in Sources */, 4E3B4BC12A41E6C200CC88B8 /* P2pReceiveURIView.swift in Sources */, 4E6EDD872A363D8D0031D520 /* ListStyle.swift in Sources */, 4EED38562D140C1400F6C038 /* TabBarModel.swift in Sources */, diff --git a/TalerWallet1/Helper/OIMcurrency.swift b/TalerWallet1/Helper/OIMcurrency.swift @@ -0,0 +1,98 @@ +/* + * This file is part of GNU Taler, ©2022-25 Taler Systems S.A. + * See LICENSE.md + */ +/** + * @author Marc Stibane + */ +import Foundation + +public typealias OIMdenominations = [Int] +public typealias OIMnotesCoins = (OIMdenominations, OIMdenominations) // number of notes and coins + +// 6 banknotes, 8 coins of which 6 are fractionals < 100 +public let OIMeuros = OIMcurrency(bankNotes: [20000, 10000, 5000, 2000, 1000, 500], + noteWidth: 384, + noteHeight: 352, + bankCoins: [200, 100, 50, 20, 10, 5, 2, 1], + coinSizes: [258, 232, 242, 222, 198, 212, 188, 162], + noteBase: "EUR", coinBase: "eur") + +// 5 banknotes, 5 coins (all fractionals) +public let OIMleones = OIMcurrency(bankNotes: [2000, 1000, 500, 200, 100], + noteWidth: 400, + noteHeight: 296, + bankCoins: [ 50, 25, 10, 5, 1], + coinSizes: [270, 250, 240, 228, 208], + // [ 260mm 270px, 240mm 250px, 230mm 240px, 225mm 228px, 200mm 208px] + noteBase: "SLE", coinBase: "sle") + +// 6 banknotes, 6 coins of which 5 are fractionals < 100 +public let OIMdollars = OIMcurrency(bankNotes: [10000, 5000, 2000, 1000, 500, 200], // XXX x 265 + noteWidth: 400, + noteHeight: 265, + bankCoins: [100, 50, 25, 10, 5, 1], + coinSizes: [265, 306, 243, 180, 212, 190], + noteBase: "USD", coinBase: "usd") +// MARK: - +public struct OIMcurrency: Sendable { + let bankNotes: OIMdenominations // values of each banknote, in cents + let noteWidth: CGFloat + let noteHeight: CGFloat + let bankCoins: OIMdenominations // values of each coin, decending + let coinSizes: [CGFloat] // coin sizes in points + let noteBase: String + let coinBase: String + + func coinSize(_ value: Int) -> CGFloat? { + for (index, element) in bankCoins.enumerated() { + if element == value { + if index < coinSizes.count { + return coinSizes[index] + } + } + } + return nil + } + + func coinName(_ value: Int) -> String? { + if bankCoins.contains(value) { + return coinBase + "-" + String(value) + } + return nil + } + + func noteName(_ value: Int) -> String? { + if bankNotes.contains(value) { + return noteBase + "-" + String(value) + } + return nil + } + + /// spreads out the input value into banknotes and coins of the currency + func notesCoins(_ intVal: Int) -> OIMnotesCoins { + var notes: OIMdenominations = [] + var coins: OIMdenominations = [] + + var value = intVal + for (index, element) in bankNotes.enumerated() { + var count = 0 + while value >= element { + value = value - element + count += 1 + } + notes.append(count) + } + + for (index, element) in bankCoins.enumerated() { + var count = 0 + while value >= element { + value = value - element + count += 1 + } + coins.append(count) + } + return (notes, coins) + } +} +