Skip to content

Commit 21a8eb1

Browse files
committed
Version 1.0.0
1 parent 7c30fac commit 21a8eb1

9 files changed

Lines changed: 137 additions & 296 deletions

File tree

Package.resolved

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,22 @@ let package = Package(
1313
targets: ["LStXML2Code"]),
1414
.executable(name: "BMF2Code", targets: ["BMF2Code"])
1515
],
16+
dependencies: [
17+
.package(
18+
url: "https://github.com/bastie/JavApi4Swift.git",
19+
from: "0.7.3"
20+
)
21+
],
1622
targets: [
1723
// Targets are the basic building blocks of a package, defining a module or a test suite.
1824
// Targets can depend on other targets in this package and products from dependencies.
1925
.target(
2026
name: "LStXML2Code"),
2127
.testTarget(
2228
name: "LStXML2CodeTests",
23-
dependencies: ["LStXML2Code"]),
29+
dependencies: ["LStXML2Code",
30+
.product(name: "JavApi", package: "JavApi4Swift")
31+
]),
2432
.executableTarget(
2533
name: "BMF2Code",
2634
dependencies: ["LStXML2Code"]),

Sources/BMF2Code/BMF2Code.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import Foundation
66
import LStXML2Code
77

88
@main
9+
/// Quelletxtgenerator zur Nutzung des durch das BMF bereitgestellten Pseudo-Quelltext zur Berechnung der Lohnsteuerabzüge bei der Einkommensteuer.
910
public struct BMF2Code {
10-
11-
public static let VERSION = "0.2.1"
11+
/// Interne Version
12+
public static let VERSION = "1.0.0"
1213

1314

1415
// MARK: main entry point
16+
/// Einsprungspunkt der Kommandozeilenanwendung
1517
static func main () {
1618
var cmdLineArgs = CommandLine.arguments
1719
#if DEBUG
@@ -78,6 +80,11 @@ public struct BMF2Code {
7880

7981
// MARK: handling argument
8082
// handwritten parameter evaluation
83+
/// Evaluierung der Parameter
84+
/// - Parameters:
85+
/// - Parameter arguments die Argumente to verarbeitet werden sollen
86+
/// - Parameter reversedCall Information, ob die Funktion sich selbst aufgerufen hat
87+
/// - Returns lediglich die benötigten Parameter zur weiteren Verarbeitung
8188
func evalArgs (arguments : [String], reversedCall : Bool = false) -> [String:String] {
8289
let supportedLang = ["java", "swift"]
8390
let supportedLanguages = "\(supportedLang)".replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").replacingOccurrences(of: "\"", with: "")

Sources/BMF2Code/JavaEncoding.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import LStXML2Code
66
import Foundation
77

8+
9+
/// Java8 Encoding
10+
///
11+
/// Das ``JavaEncoding`` nutzt den durch das [ITZBund](https://www.itzbund.de) verwendete
12+
/// Java8 Quelltext in den exec Anweisungen.
813
open class JavaEncoding : AbstractTreeEncoding {
914
public func encode(_ value: AbstractTree) throws -> Data? {
1015

@@ -25,6 +30,9 @@ open class JavaEncoding : AbstractTreeEncoding {
2530
var result = ""
2631

2732
var intend = 0
33+
34+
/// Durchlaufen des Baumes zur Quelltextgenerierung
35+
/// - Parameter node der aktuell zu betrachtende Baumknoten
2836
open func traverse (node : Node) {
2937
var output = ""
3038
for _ in 0..<intend {
@@ -214,8 +222,4 @@ open class JavaEncoding : AbstractTreeEncoding {
214222
}
215223

216224
}
217-
218-
219225
}
220-
221-

Sources/BMF2Code/SwiftEncoding.swift

Lines changed: 10 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import LStXML2Code
66
import Foundation
77

8+
9+
/// ``SwiftEncoding`` unter Verwendung der [JavApi⁴Swift](https://github.com/bastie/JavApi4Swift) Version 0.7.3 oder höher
10+
///
11+
/// Basis sind die Java8 Anweisungen die das [ITZBund](https://www.itzbund.de) verwendet und durch die **JavApi⁴Swift** abgebildet werden.
812
open class SwiftEncoding : AbstractTreeEncoding {
913
public func encode(_ value: AbstractTree) throws -> Data? {
1014

@@ -13,17 +17,21 @@ open class SwiftEncoding : AbstractTreeEncoding {
1317
/// Generated with BMF2Code v\(BMF2Code.VERSION) @\(Date())
1418
1519
import Foundation
20+
import JavApi
21+
22+
public typealias BigDecimal = java.math.BigDecimal
23+
1624
1725
""")
1826
traverse(node: root)
1927

20-
result.append (getAdditionalTypes())
28+
// not good but work - modify source after generation
2129

2230
// add initalizer
2331
let parts = result.split(separator: "{",maxSplits: 1)
2432
result = "\(parts[0]) {\n\n"
2533
result.append(" public init (\n")
26-
for (offset,name) in inputVars.keys.enumerated() {
34+
for (offset,name) in Array(inputVars.keys).sorted(by: {$0 < $1}).enumerated() {
2735
result.append(" ")
2836
let type = inputVars[name]!
2937
result.append("\(name) : \(type) = \(type)()")
@@ -40,7 +48,6 @@ open class SwiftEncoding : AbstractTreeEncoding {
4048
result.append("}")
4149
result.append("\n\(parts[1])")
4250

43-
4451
let asString = result //"\(value.getRoot())"
4552
return asString.data(using: .utf8)
4653
}
@@ -311,118 +318,4 @@ open class SwiftEncoding : AbstractTreeEncoding {
311318
}
312319
return swiftType
313320
}
314-
315-
public func getAdditionalTypes() -> String {
316-
var result = ""
317-
// MARK: additional Type BigInteger
318-
result.append(
319-
"""
320-
321-
/// BigDecimal implementation in Swift - see JavApi⁴Swift project
322-
public struct BigDecimal : CustomStringConvertible {
323-
324-
private var scale : Int = Int.max
325-
private var roundingMode : Int = ROUND_UNSET
326-
327-
public static let ZERO = BigDecimal(0.0)
328-
public static let ONE = BigDecimal(1.0)
329-
public static let ROUND_UP = 0
330-
public static let ROUND_DOWN = 1
331-
public static let ROUND_UNSET = -1
332-
333-
private var value : Double
334-
public init (_ newValue : Double = 0.0) {
335-
self.value = newValue
336-
}
337-
public init (_ newValue : Int) {
338-
self.value = Double(newValue)
339-
}
340-
public init (_ newValue : Int64) {
341-
self.value = Double(newValue)
342-
}
343-
344-
public static func valueOf (_ newValue : Int) -> BigDecimal {
345-
return BigDecimal(newValue)
346-
}
347-
public static func valueOf (_ newValue : Int64) -> BigDecimal {
348-
return BigDecimal(newValue)
349-
}
350-
public static func valueOf (_ newValue : Double) -> BigDecimal {
351-
return BigDecimal(newValue)
352-
}
353-
354-
public func subtract (_ bd : BigDecimal) -> BigDecimal {
355-
let value : Double = self.value - bd.value
356-
var result = BigDecimal(value)
357-
result.scale = self.scale
358-
result.roundingMode = self.roundingMode
359-
return result
360-
}
361-
362-
public func multiply (_ bd : BigDecimal) -> BigDecimal{
363-
let value : Double = self.value * bd.value
364-
var result = BigDecimal(value)
365-
result.scale = self.scale
366-
result.roundingMode = self.roundingMode
367-
return result
368-
}
369-
public func divide (_ bd : BigDecimal) -> BigDecimal{
370-
let value : Double = self.value / bd.value
371-
var result = BigDecimal(value)
372-
result.scale = max(self.scale,bd.scale)
373-
result.roundingMode = self.roundingMode
374-
return result
375-
}
376-
public func divide (_ bd : BigDecimal, _ accuracy : Int, _ round : Int) -> BigDecimal{
377-
let value : Double = self.value / bd.value
378-
var result = BigDecimal(value)
379-
result.scale = self.scale
380-
result.roundingMode = self.roundingMode
381-
return result
382-
}
383-
public func add (_ bd : BigDecimal) -> BigDecimal{
384-
let value : Double = self.value + bd.value
385-
var result = BigDecimal(value)
386-
result.scale = self.scale
387-
result.roundingMode = self.roundingMode
388-
return result
389-
}
390-
public func setScale (_ newScale : Int, _ roundingMode : Int = BigDecimal.ROUND_UNSET) -> BigDecimal {
391-
var result = BigDecimal(self.value)
392-
result.scale = newScale
393-
result.roundingMode = roundingMode
394-
return result
395-
}
396-
397-
public func compareTo (_ bg : BigDecimal) -> Int {
398-
if self.roundingMode == BigDecimal.ROUND_UNSET && bg.roundingMode == BigDecimal.ROUND_UNSET {
399-
if self.value == bg.value {return 0}
400-
if self.value > bg.value {return 1}
401-
return -1
402-
}
403-
let newScale = max (self.scale, bg.scale)
404-
let factor : Int = (pow (10,newScale) as NSDecimalNumber).intValue
405-
let quotiend : Double = Double(factor)
406-
407-
let roundedSelf = Int (Double(Int(self.value * quotiend)) / quotiend)
408-
let roundedBg = Int (Double(Int(bg.value * quotiend)) / quotiend)
409-
410-
if roundedSelf == roundedBg {return 0}
411-
if roundedSelf > roundedBg {return 1}
412-
return -1
413-
}
414-
415-
public func longValue () -> Int64 {
416-
return Int64(self.value)
417-
}
418-
}
419-
""")
420-
421-
422-
// ----------------
423-
return result
424-
}
425-
426321
}
427-
428-

Sources/LStXML2Code/LStXML2Code.docc/Architecture.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Die Architektur ist darauf ausgelegt die unterliegende XML Struktur der eingeles
88

99
### Überführen des XML in eine Struktur
1010

11-
Swift unterstützt mit dem Protokoll `Codable` das (nicht ganz so) einfache Serialisieren und Deserialisieren von mehr oder weniger komplexen Strukturen. Da das Eingabeformat ein valides XML Dokument ist nutzen wir zum Einlesen statt einem `Decoder` den SAX-Parser ``PAPXmlParser``.
11+
Swift unterstützt mit dem Protokoll `Codable` das (nicht ganz so) einfache Serialisieren und Deserialisieren von mehr oder weniger komplexen Strukturen. Da das Eingabeformat ein valides XML Dokument ist nutzen wir zum Einlesen statt einem `Decoder` den SAX-Parser `PAPXmlParser`.
1212

13-
Aufgabe des ``PAPXmlParser`` ist es die XML Struktur in eine Baumstruktur zu überführen, den ``PAPTree``. Der ``PAPTree`` ist als interne IO-Struktur nach außen nicht sichtbar sondern wird über die Transformation in den ``AbstractTree`` überführt. Der ``PAPTree`` implemetiert hierfür das Protokoll `Encodable`. Dies geschieht über die Implementation der Schnittstelle `Encodable` in ``AbstractTreeEncoder``, welche jedoch die eigentlich Aufgabe in die Implementierung ``AbstractTreeEncoding`` delegiert.
13+
Aufgabe des `PAPXmlParser` ist es die XML Struktur in eine Baumstruktur zu überführen, den ``PAPTree``. Der ``PAPTree`` ist als interne IO-Struktur nach außen nicht sichtbar sondern wird über die Transformation in den ``AbstractTree`` überführt. Der ``PAPTree`` implemetiert hierfür das Protokoll `Encodable`. Dies geschieht über die Implementation der Schnittstelle `Encodable` in ``AbstractTreeEncoder``, welche jedoch die eigentlich Aufgabe in die Implementierung ``AbstractTreeEncoding`` delegiert.
1414

1515
**Nur die ``AbstractTreeEncoding`` Implementation bedarf einer Anpassung, bei nicht strukturellen Änderungen dess XML.**
1616

Tests/LStXML2CodeTests/LStXML2CodeTests.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import XCTest
22
@testable import LStXML2Code
33

4+
import JavApi
5+
46
final class LStXML2CodeTests: XCTestCase {
57
func testExample() throws {
6-
let calculator = Lohnsteuer2023AbJuliBig(LZZ: 1, STKL : 1, RE4:BigDecimal(2500000))
8+
let calculator = Lohnsteuer2023AbJuliBig(LZZ: 1,RE4: java.math.BigDecimal(2500000),STKL: 1)
79
calculator.MAIN()
10+
/*
811
print (
912
"""
1013
BK = \(calculator.BK)
@@ -25,6 +28,27 @@ final class LStXML2CodeTests: XCTestCase {
2528
WVFRBO = \(calculator.WVFRBO)
2629
WVFRBM = \(calculator.WVFRBM)
2730
""")
31+
*/
32+
33+
// must be set
34+
XCTAssertEqual(calculator.VFRB, 123000)
35+
XCTAssertEqual(calculator.LSTLZZ, 176700)
36+
XCTAssertEqual(calculator.WVFRB, 834700)
37+
// must be zero
38+
XCTAssertEqual(calculator.BK, 0)
39+
XCTAssertEqual(calculator.BKS, 0)
40+
XCTAssertEqual(calculator.BKV, 0)
41+
XCTAssertEqual(calculator.SOLZLZZ, 0)
42+
XCTAssertEqual(calculator.SOLZS, 0)
43+
XCTAssertEqual(calculator.SOLZV, 0)
44+
XCTAssertEqual(calculator.STS, 0)
45+
XCTAssertEqual(calculator.STV, 0)
46+
XCTAssertEqual(calculator.VKVLZZ, 0)
47+
XCTAssertEqual(calculator.VKVSONST, 0)
48+
XCTAssertEqual(calculator.VFRBS1, 0)
49+
XCTAssertEqual(calculator.VFRBS2, 0)
50+
XCTAssertEqual(calculator.WVFRBO, 0)
51+
XCTAssertEqual(calculator.WVFRBM, 0)
2852
}
2953
}
3054

0 commit comments

Comments
 (0)