commit 4dcd94c12f2d8e3af2aeca3e6dee1a2ccccec08d
parent 62115090e487a1b862298e77834e35b913c95c6a
Author: Marc Stibane <marc@taler.net>
Date: Thu, 13 Mar 2025 15:36:33 +0100
OIMcurrency
Diffstat:
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)
+ }
+}
+