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
75 // wareneingang 19% and 7%
76 pid_buy_n := string("8e3b7c42e3173ed85f3d4736e82afb4d")
77 pid_buy_s := string("0cfd2ceb45fff89b9d1b7ce3af66cdf3")
78 pid_misc := string("e3acc2865dbf931e41cf2b90240de5c2")
79 pid_rep := string("b1d04ad157cac569f4299d4ddf94ed6f")
80 pid_room := string("4394ed4ffa7266f8f8731080926a7a61")
81 pid_cap := string("4196ee026d1bdb785df2c975fca91ae0")
82 // abziehbare vst 19% and 7%
83 aid_vst_n := string("7c449e13125d6b93043f963628106db2")
84 aid_vst_s := string("006643c1c0a91f2b40614c75a49c6295")
88 aid_rec_n := string("f3e905732b729ba096a50dab60559ce7")
89 aid_rec_s := string("66c1b04bd897766cb2be538094e1db6a")
90 aid_tip := string("1d20024badc11a99a8e1cf3a9a64a501")
91 aid_dep := string("9772f4e231f6f5e3100132cc53eb3447")
94 aid_ust_n := string("e4bd6ff52408be8076f24aeb105893d9")
95 aid_ust_s := string("38bf40d16529f2a1e611c073c6c1dc9c")
105 accnt := make(map[string]amap)
107 for ac := range data.Accnt {
108 aid := data.Accnt[ac].AccountId
109 pid := data.Accnt[ac].ParentId
112 pid,ac,0,false,false,
118 case pid == pid_buy_n || pid == pid_misc || pid == pid_rep || pid == pid_room || pid == pid_cap:
122 case pid == pid_buy_s:
126 // mathc pid: verschiedene kosten, reparatur/instandhaltung
127 // raumkosten + anlage/kapitalkonten
131 case aid == aid_vst_n:
136 case aid == aid_vst_s:
143 // match pid: erloeskonten
145 case aid == aid_ust_n:
149 case aid == aid_ust_s:
156 // check transactions
157 for tc := range data.Trn {
158 for tsc := range data.Trn[tc].Spl {
159 aid := data.Trn[tc].Spl[tsc].AccountId
163 switch accnt[aid].taxval {
165 ret=check_buy(&data.Trn[tc],aid_vst_n)
167 ret=check_buy(&data.Trn[tc],aid_vst_s)
169 anum := accnt[aid].num
171 fmt.Println("Problem:", data.Accnt[anum].Name,data.Trn[tc].Date)
179 func check_buy(ta *Transaction,id string) bool {
180 for sc := range ta.Spl {
181 if ta.Spl[sc].AccountId == id {