11 XMLName xml.Name `xml:"account"`
12 Name string `xml:"name"`
13 AccountId string `xml:"id"`
14 ParentId string `xml:"parent"`
18 XMLName xml.Name `xml:"split"`
20 Value string `xml:"value"`
21 Quantity string `xml:"quantity"`
22 AccountId string `xml:"account"`
25 type Transaction struct {
26 XMLName xml.Name `xml:"transaction"`
28 Date string `xml:"date-posted>date"`
29 Description string `xml:"description"`
30 Spl []Split `xml:"splits>split"`
33 type ParsedData struct {
34 XMLName xml.Name `xml:"gnc-v2"`
35 DataCnt []string `xml:"count-data"`
36 Accnt []Account `xml:"book>account"`
37 Trn []Transaction `xml:"book>transaction"`
46 file, err := os.Open("c13_skr03.gnucash")
48 fmt.Println("Error opening file:", err)
54 xmldata, err := ioutil.ReadAll(file)
56 fmt.Println("Error reading file:", err)
61 err = xml.Unmarshal(xmldata,&data)
63 fmt.Println("Error unmarshaling xml data:", err)
67 // whooha, this is our data!
68 fmt.Println("Parsed accounts:",len(data.Accnt))
69 fmt.Println("Parsed transactions:",len(data.Trn))
72 // hardcoded account ids we have to look at
74 // wareneingang 19% and 7%
75 pid_buy_n := string("8e3b7c42e3173ed85f3d4736e82afb4d")
76 pid_buy_s := string("0cfd2ceb45fff89b9d1b7ce3af66cdf3")
77 // abziehbare vst 19% and 7%
78 aid_vst_n := string("7c449e13125d6b93043f963628106db2")
79 aid_vst_s := string("006643c1c0a91f2b40614c75a49c6295")
89 accnt := make(map[string]amap)
91 for ac := range data.Accnt {
92 aid := data.Accnt[ac].AccountId
93 pid := data.Accnt[ac].ParentId
100 case pid == pid_buy_n:
104 //accnt[aid].taxval=19
105 //accnt[aid].buy=true
106 case pid == pid_buy_s:
108 //accnt[aid].buy=true
109 case aid == aid_vst_n:
110 //accnt[aid].taxval=19
111 //accnt[aid].buy=true
112 //accnt[aid].tax=true
113 case aid == aid_vst_s:
115 //accnt[aid].buy=true
116 //accnt[aid].tax=true
117 // there will be more assignments later on!
121 // check transactions
122 for tc := range data.Trn {
123 for tsc := range data.Trn[tc].Spl {
124 aid := data.Trn[tc].Spl[tsc].AccountId
128 switch accnt[aid].taxval {
130 ret=check_buy(&data.Trn[tc],aid_vst_n)
132 ret=check_buy(&data.Trn[tc],aid_vst_s)
134 anum := accnt[aid].num
136 fmt.Println("Problem:", data.Accnt[anum].Name)
144 func check_buy(ta *Transaction,id string) bool {
145 for sc := range ta.Spl {
146 if ta.Spl[sc].AccountId == id {