1use serde::{Serialize, Deserialize};
2use validator::Validate;
3use std::fmt::Display;
4use std::fmt::Formatter;
5use crate::header::Festschreibung;
6use chrono::NaiveDate;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Validate)]
9#[serde(rename_all = "camelCase")]
10pub struct Buchung {
11 pub umsatz: f64,
15 pub soll_haben_kennzeichen: SollHabenKennzeichen,
21 pub wkz_umsatz: String,
24 #[serde(skip_serializing_if = "Option::is_none")]
28 pub kurs: Option<f64>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub basis_umsatz: Option<f64>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub wkz_basis_umsatz: Option<String>,
33 pub konto: u32,
34 pub gegenkonto: u32,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub bu_schlüssel: Option<u32>,
37 pub beleg_datum: NaiveDate,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub belegfeld1: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub belegfeld2: Option<String>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub skonto: Option<f64>,
47 #[validate(length(min = 0, max = 60))]
48 pub buchungstext: Option<String>,
49 #[validate(range(min = 0, max = 1))]
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub postensperre: Option<u8>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub diverse_adressnummer: Option<String>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub geschäftspartner_bank: Option<String>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub sachverhalt: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub zinssperre: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub beleg_link: Option<String>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub beleg_info_art1: Option<String>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub beleg_info_inhalt1: Option<String>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub beleg_info_art2: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub beleg_info_inhalt2: Option<String>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub beleg_info_art3: Option<String>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub beleg_info_inhalt3: Option<String>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub beleg_info_art4: Option<String>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub beleg_info_inhalt4: Option<String>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub beleg_info_art5: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub beleg_info_inhalt5: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub beleg_info_art6: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub beleg_info_inhalt6: Option<String>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub beleg_info_art7: Option<String>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub beleg_info_inhalt7: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub beleg_info_art8: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub beleg_info_inhalt8: Option<String>,
94 #[validate(length(min = 0, max = 36))]
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub kost1_kostenstelle: Option<String>,
97 #[validate(length(min = 0, max = 36))]
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub kost2_kostenstelle: Option<String>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub kost_menge: Option<f64>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub eu_ustid: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub eu_steuersatz: Option<f64>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub abweichende_versteuerungsart: Option<String>,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 pub sachverhalt_l_l: Option<String>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 pub funktionsergänzung_l_l: Option<String>,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 pub bu_49_hauptfunktiontyp: Option<String>,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub bu_49_hauptfunktionsnummer: Option<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub bu_49_funktionsergänzung: Option<String>,
118 #[validate(length(min = 0, max = 20))]
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub zusatzinformation_art1: Option<String>,
121 #[validate(length(min = 0, max = 210))]
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub zusatzinformation_inhalt1: Option<String>,
124 #[validate(length(min = 0, max = 20))]
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub zusatzinformation_art2: Option<String>,
127 #[validate(length(min = 0, max = 210))]
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub zusatzinformation_inhalt2: Option<String>,
130 #[validate(length(min = 0, max = 20))]
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub zusatzinformation_art3: Option<String>,
133 #[validate(length(min = 0, max = 210))]
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub zusatzinformation_inhalt3: Option<String>,
136 #[validate(length(min = 0, max = 20))]
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub zusatzinformation_art4: Option<String>,
139 #[validate(length(min = 0, max = 210))]
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub zusatzinformation_inhalt4: Option<String>,
142 #[validate(length(min = 0, max = 20))]
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub zusatzinformation_art5: Option<String>,
145 #[validate(length(min = 0, max = 210))]
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub zusatzinformation_inhalt5: Option<String>,
148 #[validate(length(min = 0, max = 20))]
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub zusatzinformation_art6: Option<String>,
151 #[validate(length(min = 0, max = 210))]
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub zusatzinformation_inhalt6: Option<String>,
154 #[validate(length(min = 0, max = 20))]
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub zusatzinformation_art7: Option<String>,
157 #[validate(length(min = 0, max = 210))]
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub zusatzinformation_inhalt7: Option<String>,
160 #[validate(length(min = 0, max = 20))]
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub zusatzinformation_art8: Option<String>,
163 #[validate(length(min = 0, max = 210))]
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub zusatzinformation_inhalt8: Option<String>,
166 #[validate(length(min = 0, max = 20))]
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub zusatzinformation_art9: Option<String>,
169 #[validate(length(min = 0, max = 210))]
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub zusatzinformation_inhalt9: Option<String>,
172 #[validate(length(min = 0, max = 20))]
173 #[serde(skip_serializing_if = "Option::is_none")]
174 pub zusatzinformation_art10: Option<String>,
175 #[validate(length(min = 0, max = 210))]
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub zusatzinformation_inhalt10: Option<String>,
178 #[validate(length(min = 0, max = 20))]
179 #[serde(skip_serializing_if = "Option::is_none")]
180 pub zusatzinformation_art11: Option<String>,
181 #[validate(length(min = 0, max = 210))]
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub zusatzinformation_inhalt11: Option<String>,
184 #[validate(length(min = 0, max = 20))]
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub zusatzinformation_art12: Option<String>,
187 #[validate(length(min = 0, max = 210))]
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub zusatzinformation_inhalt12: Option<String>,
190 #[validate(length(min = 0, max = 20))]
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub zusatzinformation_art13: Option<String>,
193 #[validate(length(min = 0, max = 210))]
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub zusatzinformation_inhalt13: Option<String>,
196 #[validate(length(min = 0, max = 20))]
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub zusatzinformation_art14: Option<String>,
199 #[validate(length(min = 0, max = 210))]
200 #[serde(skip_serializing_if = "Option::is_none")]
201 pub zusatzinformation_inhalt14: Option<String>,
202 #[validate(length(min = 0, max = 20))]
203 #[serde(skip_serializing_if = "Option::is_none")]
204 pub zusatzinformation_art15: Option<String>,
205 #[validate(length(min = 0, max = 210))]
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub zusatzinformation_inhalt15: Option<String>,
208 #[validate(length(min = 0, max = 20))]
209 #[serde(skip_serializing_if = "Option::is_none")]
210 pub zusatzinformation_art16: Option<String>,
211 #[validate(length(min = 0, max = 210))]
212 #[serde(skip_serializing_if = "Option::is_none")]
213 pub zusatzinformation_inhalt16: Option<String>,
214 #[validate(length(min = 0, max = 20))]
215 #[serde(skip_serializing_if = "Option::is_none")]
216 pub zusatzinformation_art17: Option<String>,
217 #[validate(length(min = 0, max = 210))]
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub zusatzinformation_inhalt17: Option<String>,
220 #[validate(length(min = 0, max = 20))]
221 #[serde(skip_serializing_if = "Option::is_none")]
222 pub zusatzinformation_art18: Option<String>,
223 #[validate(length(min = 0, max = 210))]
224 #[serde(skip_serializing_if = "Option::is_none")]
225 pub zusatzinformation_inhalt18: Option<String>,
226 #[validate(length(min = 0, max = 20))]
227 #[serde(skip_serializing_if = "Option::is_none")]
228 pub zusatzinformation_art19: Option<String>,
229 #[validate(length(min = 0, max = 210))]
230 #[serde(skip_serializing_if = "Option::is_none")]
231 pub zusatzinformation_inhalt19: Option<String>,
232 #[validate(length(min = 0, max = 20))]
233 #[serde(skip_serializing_if = "Option::is_none")]
234 pub zusatzinformation_art20: Option<String>,
235 #[validate(length(min = 0, max = 210))]
236 #[serde(skip_serializing_if = "Option::is_none")]
237 pub zusatzinformation_inhalt20: Option<String>,
238 #[serde(skip_serializing_if = "Option::is_none")]
239 pub stück: Option<f64>,
240 #[serde(skip_serializing_if = "Option::is_none")]
241 pub gewicht: Option<f64>,
242 #[serde(skip_serializing_if = "Option::is_none")]
243 pub zahlweise: Option<String>,
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub forderungsart: Option<String>,
246 #[validate(range(min = 0, max = 2099))]
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub forderungsjahr: Option<u16>,
249 #[serde(skip_serializing_if = "Option::is_none")]
250 pub veranlagungsjahr: Option<u16>,
251 #[serde(skip_serializing_if = "Option::is_none")]
252 pub zugeordnete_fälligkeit: Option<String>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub skontotyp: Option<String>,
256 #[serde(skip_serializing_if = "Option::is_none")]
257 pub auftragsnummer: Option<String>,
258 #[serde(skip_serializing_if = "Option::is_none")]
259 pub buchungstyp: Option<String>,
260 #[serde(skip_serializing_if = "Option::is_none")]
261 pub ust_schlüssel_anzahlung: Option<u8>,
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub eu_mitgliedstaat_anzahlung: Option<String>,
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub sachverhalt_l_l_anzahlung: Option<String>,
266 #[serde(skip_serializing_if = "Option::is_none")]
267 pub eu_steuersatz_anzahlung: Option<f64>,
268 #[serde(skip_serializing_if = "Option::is_none")]
269 pub erlöskonto_anzahlung: Option<u32>,
270 #[serde(skip_serializing_if = "Option::is_none")]
271 pub herkunft_kz: Option<String>,
272 #[serde(skip_serializing_if = "Option::is_none")]
273 pub leerfeld: Option<String>,
274 #[serde(skip_serializing_if = "Option::is_none")]
276 pub kost_datum: Option<String>,
277 #[serde(skip_serializing_if = "Option::is_none")]
278 pub sepa_mandatsreferenz: Option<String>,
279 #[serde(skip_serializing_if = "Option::is_none")]
283 pub skontosperre: Option<u8>,
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub gesellschaftername: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
287 pub beteiligtennummer: Option<String>,
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub identifikationsnummer: Option<String>,
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub zeichennummer: Option<String>,
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub postensperre_bis: Option<String>,
294 #[serde(skip_serializing_if = "Option::is_none")]
295 pub bezeichnung_so_bil_sachverhalt: Option<String>,
296 #[serde(skip_serializing_if = "Option::is_none")]
297 pub kennzeichen_so_bil_buchung: Option<String>,
298 #[serde(skip_serializing_if = "Option::is_none")]
304 pub festschreibung: Option<Festschreibung>,
305 #[serde(skip_serializing_if = "Option::is_none")]
306 pub leistungsdatum: Option<String>,
307 #[serde(skip_serializing_if = "Option::is_none")]
309 pub datum_zuord_steuerperiode: Option<String>,
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub fälligkeit: Option<String>,
312 #[serde(skip_serializing_if = "Option::is_none")]
315 pub generalumkehr: Option<String>,
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub steuersatz: Option<f64>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub land: Option<String>,
321 #[serde(skip_serializing_if = "Option::is_none")]
322 pub abrechnungsreferenz: Option<String>,
323 #[serde(skip_serializing_if = "Option::is_none")]
324 pub bvv_position: Option<String>,
325 #[serde(skip_serializing_if = "Option::is_none")]
332 pub eu_ustid_ursprung: Option<String>,
333 #[serde(skip_serializing_if = "Option::is_none")]
337 pub eu_steuersatz_ursprung: Option<f64>,
338}
339
340impl Default for Buchung {
341 fn default() -> Self {
342 Buchung {
343 umsatz: 0.0,
344 soll_haben_kennzeichen: SollHabenKennzeichen::default(),
345 wkz_umsatz: "EUR".to_string(),
346 kurs: None,
347 basis_umsatz: None,
348 wkz_basis_umsatz: None,
349 konto: 0,
350 gegenkonto: 0,
351 bu_schlüssel: None,
352 beleg_datum: chrono::Local::today().naive_local(),
353 belegfeld1: None,
354 belegfeld2: None,
355 skonto: None,
356 buchungstext: None,
357 postensperre: None,
358 diverse_adressnummer: None,
359 geschäftspartner_bank: None,
360 sachverhalt: None,
361 zinssperre: None,
362 beleg_link: None,
363 beleg_info_art1: None,
364 beleg_info_inhalt1: None,
365 beleg_info_art2: None,
366 beleg_info_inhalt2: None,
367 beleg_info_art3: None,
368 beleg_info_inhalt3: None,
369 beleg_info_art4: None,
370 beleg_info_inhalt4: None,
371 beleg_info_art5: None,
372 beleg_info_inhalt5: None,
373 beleg_info_art6: None,
374 beleg_info_inhalt6: None,
375 beleg_info_art7: None,
376 beleg_info_inhalt7: None,
377 beleg_info_art8: None,
378 beleg_info_inhalt8: None,
379 kost1_kostenstelle: None,
380 kost2_kostenstelle: None,
381 kost_menge: None,
382 eu_ustid: None,
383 eu_steuersatz: None,
384 abweichende_versteuerungsart: None,
385 sachverhalt_l_l: None,
386 funktionsergänzung_l_l: None,
387 bu_49_hauptfunktiontyp: None,
388 bu_49_hauptfunktionsnummer: None,
389 bu_49_funktionsergänzung: None,
390 zusatzinformation_art1: None,
391 zusatzinformation_inhalt1: None,
392 zusatzinformation_art2: None,
393 zusatzinformation_inhalt2: None,
394 zusatzinformation_art3: None,
395 zusatzinformation_inhalt3: None,
396 zusatzinformation_art4: None,
397 zusatzinformation_inhalt4: None,
398 zusatzinformation_art5: None,
399 zusatzinformation_inhalt5: None,
400 zusatzinformation_art6: None,
401 zusatzinformation_inhalt6: None,
402 zusatzinformation_art7: None,
403 zusatzinformation_inhalt7: None,
404 zusatzinformation_art8: None,
405 zusatzinformation_inhalt8: None,
406 zusatzinformation_art9: None,
407 zusatzinformation_inhalt9: None,
408 zusatzinformation_art10: None,
409 zusatzinformation_inhalt10: None,
410 zusatzinformation_art11: None,
411 zusatzinformation_inhalt11: None,
412 zusatzinformation_art12: None,
413 zusatzinformation_inhalt12: None,
414 zusatzinformation_art13: None,
415 zusatzinformation_inhalt13: None,
416 zusatzinformation_art14: None,
417 zusatzinformation_inhalt14: None,
418 zusatzinformation_art15: None,
419 zusatzinformation_inhalt15: None,
420 zusatzinformation_art16: None,
421 zusatzinformation_inhalt16: None,
422 zusatzinformation_art17: None,
423 zusatzinformation_inhalt17: None,
424 zusatzinformation_art18: None,
425 zusatzinformation_inhalt18: None,
426 zusatzinformation_art19: None,
427 zusatzinformation_inhalt19: None,
428 zusatzinformation_art20: None,
429 zusatzinformation_inhalt20: None,
430 stück: None,
431 gewicht: None,
432 zahlweise: None,
433 forderungsart: None,
434 forderungsjahr: None,
435 veranlagungsjahr: None,
436 zugeordnete_fälligkeit: None,
437 skontotyp: None,
438 auftragsnummer: None,
439 buchungstyp: None,
440 ust_schlüssel_anzahlung: None,
441 eu_mitgliedstaat_anzahlung: None,
442 sachverhalt_l_l_anzahlung: None,
443 eu_steuersatz_anzahlung: None,
444 erlöskonto_anzahlung: None,
445 herkunft_kz: None,
446 leerfeld: None,
447 kost_datum: None,
448 sepa_mandatsreferenz: None,
449 skontosperre: None,
450 gesellschaftername: None,
451 beteiligtennummer: None,
452 identifikationsnummer: None,
453 zeichennummer: None,
454 postensperre_bis: None,
455 bezeichnung_so_bil_sachverhalt: None,
456 kennzeichen_so_bil_buchung: None,
457 festschreibung: None,
458 leistungsdatum: None,
459 datum_zuord_steuerperiode: None,
460 fälligkeit: None,
461 generalumkehr: None,
462 steuersatz: None,
463 land: None,
464 abrechnungsreferenz: None,
465 bvv_position: None,
466 eu_ustid_ursprung: None,
467 eu_steuersatz_ursprung: None,
468 }
469 }
470}
471
472impl Display for Buchung{
473 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
474 write!(f, r#"{umsatz};{soll_haben_kennzeichen};{wkz_umsatz};{kurs};{basis_umsatz};{wkz_basis_umsatz};{konto};{gegenkonto};{bu_schlüssel};{beleg_datum};{belegfeld1};{belegfeld2};{skonto};{buchungstext};{posten_sperre};{diverse_adressnummer};{geschäftspartner_bank};{sachverhalt};{zinssperre};{beleg_link};{beleg_info_art1};{beleg_info_inhalt1};{beleg_info_art2};{beleg_info_inhalt2};{beleg_info_art3};{beleg_info_inhalt3};{beleg_info_art4};{beleg_info_inhalt4};{beleg_info_art5};{beleg_info_inhalt5};{beleg_info_art6};{beleg_info_inhalt6};{beleg_info_art7};{beleg_info_inhalt7};{beleg_info_art8};{beleg_info_inhalt8};{kost1_kostenstelle};{kost2_kostenstelle};{kost_menge};{eu_ustid};{eu_steuersatz};{abweichende_versteuerungsart};{sachverhalt_l_l};{funktionsergänzung_l_l};{bu_49_hauptfunktiontyp};{bu_49_hauptfunktionsnummer};{bu_49_funktionsergänzung};{zusatzinformation_art1};{zusatzinformation_inhalt1};{zusatzinformation_art2};{zusatzinformation_inhalt2};{zusatzinformation_art3};{zusatzinformation_inhalt3};{zusatzinformation_art4};{zusatzinformation_inhalt4};{zusatzinformation_art5};{zusatzinformation_inhalt5};{zusatzinformation_art6};{zusatzinformation_inhalt6};{zusatzinformation_art7};{zusatzinformation_inhalt7};{zusatzinformation_art8};{zusatzinformation_inhalt8};{zusatzinformation_art9};{zusatzinformation_inhalt9};{zusatzinformation_art10};{zusatzinformation_inhalt10};{zusatzinformation_art11};{zusatzinformation_inhalt11};{zusatzinformation_art12};{zusatzinformation_inhalt12};{zusatzinformation_art13};{zusatzinformation_inhalt13};{zusatzinformation_art14};{zusatzinformation_inhalt14};{zusatzinformation_art15};{zusatzinformation_inhalt15};{zusatzinformation_art16};{zusatzinformation_inhalt16};{zusatzinformation_art17};{zusatzinformation_inhalt17};{zusatzinformation_art18};{zusatzinformation_inhalt18};{zusatzinformation_art19};{zusatzinformation_inhalt19};{zusatzinformation_art20};{zusatzinformation_inhalt20};{stück};{gewicht};{zahlweise};{forderungsart};{forderungsjahr};{veranlagungsjahr};{zugeordnete_fälligkeit};{skontotyp};{auftragsnummer};{buchungstyp};{ust_schlüssel_anzahlung};{eu_mitgliedstaat_anzahlung};{sachverhalt_l_l_anzahlung};{eu_steuersatz_anzahlung};{erlöskonto_anzahlung};{herkunft_kz};{leerfeld};{kost_datum};{sepa_mandatsreferenz};{skontosperre};{gesellschaftername};{beteiligtennummer};{identifikationsnummer};{zeichennummer};{postensperre_bis};{bezeichnung_so_bil_sachverhalt};{kennzeichen_so_bil_buchung};{festschreibung};{leistungsdatum};{datum_zuord_steuerperiode};{fälligkeit};{generalumkehr};{steuersatz};{land};{abrechnungsreferenz};{bvv_position};{eu_ustid_ursprung};{eu_steuersatz_ursprung}{newline}"#,
475 umsatz = self.umsatz,
476 soll_haben_kennzeichen = self.soll_haben_kennzeichen,
477 wkz_umsatz = self.wkz_umsatz,
478 kurs = match self.kurs {
479 Some(val) => val.to_string(),
480 None => "".to_string(),
481 },
482 basis_umsatz = match self.basis_umsatz {
483 Some(val) => val.to_string(),
484 None => "".to_string(),
485 },
486 wkz_basis_umsatz = match &self.wkz_basis_umsatz{
487 Some(val) => val.to_string(),
488 None => "".to_string(),
489 },
490 konto = self.konto,
491 gegenkonto = self.gegenkonto,
492 bu_schlüssel = match self.bu_schlüssel {
493 Some(val) => val.to_string(),
494 None => "".to_string(),
495 },
496 beleg_datum = self.beleg_datum.format("%d%m").to_string(),
497 belegfeld1 = match &self.belegfeld1 {
498 Some(val) => val.to_string(),
499 None => "".to_string(),
500 },
501 belegfeld2 = match &self.belegfeld2 {
502 Some(val) => val.to_string(),
503 None => "".to_string(),
504 },
505 skonto = match self.skonto {
506 Some(val) => val.to_string(),
507 None => "".to_string(),
508 },
509 buchungstext = match &self.buchungstext {
510 Some(val) => val.to_string(),
511 None => "".to_string(),
512 },
513 posten_sperre = match self.postensperre {
514 Some(val) => val.to_string(),
515 None => "".to_string(),
516 },
517 diverse_adressnummer = match &self.diverse_adressnummer{
518 Some(val) => val.to_string(),
519 None => "".to_string(),
520 },
521 geschäftspartner_bank = match &self.geschäftspartner_bank{
522 Some(val) => val.to_string(),
523 None => "".to_string(),
524 },
525 sachverhalt = match &self.sachverhalt{
526 Some(val) => val.to_string(),
527 None => "".to_string(),
528 },
529 zinssperre = match &self.zinssperre{
530 Some(val) => val.to_string(),
531 None => "".to_string(),
532 },
533 beleg_link = match &self.beleg_link{
534 Some(val) => val.to_string(),
535 None => "".to_string(),
536 },
537 beleg_info_art1 = match &self.beleg_info_art1{
538 Some(val) => val.to_string(),
539 None => "".to_string(),
540 },
541 beleg_info_inhalt1 = match &self.beleg_info_inhalt1{
542 Some(val) => val.to_string(),
543 None => "".to_string(),
544 },
545 beleg_info_art2 = match &self.beleg_info_art2{
546 Some(val) => val.to_string(),
547 None => "".to_string(),
548 },
549 beleg_info_inhalt2 = match &self.beleg_info_inhalt2{
550 Some(val) => val.to_string(),
551 None => "".to_string(),
552 },
553 beleg_info_art3 = match &self.beleg_info_art3{
554 Some(val) => val.to_string(),
555 None => "".to_string(),
556 },
557 beleg_info_inhalt3 = match &self.beleg_info_inhalt3{
558 Some(val) => val.to_string(),
559 None => "".to_string(),
560 },
561 beleg_info_art4 = match &self.beleg_info_art4{
562 Some(val) => val.to_string(),
563 None => "".to_string(),
564 },
565 beleg_info_inhalt4 = match &self.beleg_info_inhalt4{
566 Some(val) => val.to_string(),
567 None => "".to_string(),
568 },
569 beleg_info_art5 = match &self.beleg_info_art5{
570 Some(val) => val.to_string(),
571 None => "".to_string(),
572 },
573 beleg_info_inhalt5 = match &self.beleg_info_inhalt5{
574 Some(val) => val.to_string(),
575 None => "".to_string(),
576 },
577 beleg_info_art6 = match &self.beleg_info_art6{
578 Some(val) => val.to_string(),
579 None => "".to_string(),
580 },
581 beleg_info_inhalt6 = match &self.beleg_info_inhalt6{
582 Some(val) => val.to_string(),
583 None => "".to_string(),
584 },
585 beleg_info_art7 = match &self.beleg_info_art7{
586 Some(val) => val.to_string(),
587 None => "".to_string(),
588 },
589 beleg_info_inhalt7 = match &self.beleg_info_inhalt7{
590 Some(val) => val.to_string(),
591 None => "".to_string(),
592 },
593 beleg_info_art8 = match &self.beleg_info_art8{
594 Some(val) => val.to_string(),
595 None => "".to_string(),
596 },
597 beleg_info_inhalt8 = match &self.beleg_info_inhalt8{
598 Some(val) => val.to_string(),
599 None => "".to_string(),
600 },
601 kost1_kostenstelle = match &self.kost1_kostenstelle {
602 Some(val) => val.to_string(),
603 None => "".to_string(),
604 },
605 kost2_kostenstelle = match &self.kost2_kostenstelle {
606 Some(val) => val.to_string(),
607 None => "".to_string(),
608 },
609 kost_menge = match self.kost_menge {
610 Some(val) => val.to_string(),
611 None => "".to_string(),
612 },
613 eu_ustid = match &self.eu_ustid {
614 Some(val) => val.to_string(),
615 None => "".to_string(),
616 },
617 eu_steuersatz = match self.eu_steuersatz {
618 Some(val) => val.to_string(),
619 None => "".to_string(),
620 },
621 abweichende_versteuerungsart = match &self.abweichende_versteuerungsart{
622 Some(val) => val.to_string(),
623 None => "".to_string(),
624 },
625 sachverhalt_l_l = match &self.sachverhalt_l_l{
626 Some(val) => val.to_string(),
627 None => "".to_string(),
628 },
629 funktionsergänzung_l_l = match &self.funktionsergänzung_l_l{
630 Some(val) => val.to_string(),
631 None => "".to_string(),
632 },
633 bu_49_hauptfunktiontyp = match &self.bu_49_hauptfunktiontyp{
634 Some(val) => val.to_string(),
635 None => "".to_string(),
636 },
637 bu_49_hauptfunktionsnummer = match &self.bu_49_hauptfunktionsnummer{
638 Some(val) => val.to_string(),
639 None => "".to_string(),
640 },
641 bu_49_funktionsergänzung = match &self.bu_49_funktionsergänzung{
642 Some(val) => val.to_string(),
643 None => "".to_string(),
644 },
645 zusatzinformation_art1 = match &self.zusatzinformation_art1 {
646 Some(val) => val.to_string(),
647 None => "".to_string(),
648 },
649 zusatzinformation_inhalt1 = match &self.zusatzinformation_inhalt1 {
650 Some(val) => val.to_string(),
651 None => "".to_string(),
652 },
653 zusatzinformation_art2 = match &self.zusatzinformation_art2 {
654 Some(val) => val.to_string(),
655 None => "".to_string(),
656 },
657 zusatzinformation_inhalt2 = match &self.zusatzinformation_inhalt2 {
658 Some(val) => val.to_string(),
659 None => "".to_string(),
660 },
661 zusatzinformation_art3 = match &self.zusatzinformation_art3 {
662 Some(val) => val.to_string(),
663 None => "".to_string(),
664 },
665 zusatzinformation_inhalt3 = match &self.zusatzinformation_inhalt3 {
666 Some(val) => val.to_string(),
667 None => "".to_string(),
668 },
669 zusatzinformation_art4 = match &self.zusatzinformation_art4 {
670 Some(val) => val.to_string(),
671 None => "".to_string(),
672 },
673 zusatzinformation_inhalt4 = match &self.zusatzinformation_inhalt4 {
674 Some(val) => val.to_string(),
675 None => "".to_string(),
676 },
677 zusatzinformation_art5 = match &self.zusatzinformation_art5 {
678 Some(val) => val.to_string(),
679 None => "".to_string(),
680 },
681 zusatzinformation_inhalt5 = match &self.zusatzinformation_inhalt5 {
682 Some(val) => val.to_string(),
683 None => "".to_string(),
684 },
685 zusatzinformation_art6 = match &self.zusatzinformation_art6 {
686 Some(val) => val.to_string(),
687 None => "".to_string(),
688 },
689 zusatzinformation_inhalt6 = match &self.zusatzinformation_inhalt6 {
690 Some(val) => val.to_string(),
691 None => "".to_string(),
692 },
693 zusatzinformation_art7 = match &self.zusatzinformation_art7 {
694 Some(val) => val.to_string(),
695 None => "".to_string(),
696 },
697 zusatzinformation_inhalt7 = match &self.zusatzinformation_inhalt7 {
698 Some(val) => val.to_string(),
699 None => "".to_string(),
700 },
701 zusatzinformation_art8 = match &self.zusatzinformation_art8 {
702 Some(val) => val.to_string(),
703 None => "".to_string(),
704 },
705 zusatzinformation_inhalt8 = match &self.zusatzinformation_inhalt8 {
706 Some(val) => val.to_string(),
707 None => "".to_string(),
708 },
709 zusatzinformation_art9 = match &self.zusatzinformation_art9 {
710 Some(val) => val.to_string(),
711 None => "".to_string(),
712 },
713 zusatzinformation_inhalt9 = match &self.zusatzinformation_inhalt9 {
714 Some(val) => val.to_string(),
715 None => "".to_string(),
716 },
717 zusatzinformation_art10 = match &self.zusatzinformation_art10 {
718 Some(val) => val.to_string(),
719 None => "".to_string(),
720 },
721 zusatzinformation_inhalt10 = match &self.zusatzinformation_inhalt10 {
722 Some(val) => val.to_string(),
723 None => "".to_string(),
724 },
725 zusatzinformation_art11 = match &self.zusatzinformation_art11 {
726 Some(val) => val.to_string(),
727 None => "".to_string(),
728 },
729 zusatzinformation_inhalt11 = match &self.zusatzinformation_inhalt11 {
730 Some(val) => val.to_string(),
731 None => "".to_string(),
732 },
733 zusatzinformation_art12 = match &self.zusatzinformation_art12 {
734 Some(val) => val.to_string(),
735 None => "".to_string(),
736 },
737 zusatzinformation_inhalt12 = match &self.zusatzinformation_inhalt12 {
738 Some(val) => val.to_string(),
739 None => "".to_string(),
740 },
741 zusatzinformation_art13 = match &self.zusatzinformation_art13 {
742 Some(val) => val.to_string(),
743 None => "".to_string(),
744 },
745 zusatzinformation_inhalt13 = match &self.zusatzinformation_inhalt13 {
746 Some(val) => val.to_string(),
747 None => "".to_string(),
748 },
749 zusatzinformation_art14 = match &self.zusatzinformation_art14 {
750 Some(val) => val.to_string(),
751 None => "".to_string(),
752 },
753 zusatzinformation_inhalt14 = match &self.zusatzinformation_inhalt14 {
754 Some(val) => val.to_string(),
755 None => "".to_string(),
756 },
757 zusatzinformation_art15 = match &self.zusatzinformation_art15 {
758 Some(val) => val.to_string(),
759 None => "".to_string(),
760 },
761 zusatzinformation_inhalt15 = match &self.zusatzinformation_inhalt15 {
762 Some(val) => val.to_string(),
763 None => "".to_string(),
764 },
765 zusatzinformation_art16 = match &self.zusatzinformation_art16 {
766 Some(val) => val.to_string(),
767 None => "".to_string(),
768 },
769 zusatzinformation_inhalt16 = match &self.zusatzinformation_inhalt16 {
770 Some(val) => val.to_string(),
771 None => "".to_string(),
772 },
773 zusatzinformation_art17 = match &self.zusatzinformation_art17 {
774 Some(val) => val.to_string(),
775 None => "".to_string(),
776 },
777 zusatzinformation_inhalt17 = match &self.zusatzinformation_inhalt17 {
778 Some(val) => val.to_string(),
779 None => "".to_string(),
780 },
781 zusatzinformation_art18 = match &self.zusatzinformation_art18 {
782 Some(val) => val.to_string(),
783 None => "".to_string(),
784 },
785 zusatzinformation_inhalt18 = match &self.zusatzinformation_inhalt18 {
786 Some(val) => val.to_string(),
787 None => "".to_string(),
788 },
789 zusatzinformation_art19 = match &self.zusatzinformation_art19 {
790 Some(val) => val.to_string(),
791 None => "".to_string(),
792 },
793 zusatzinformation_inhalt19 = match &self.zusatzinformation_inhalt19 {
794 Some(val) => val.to_string(),
795 None => "".to_string(),
796 },
797 zusatzinformation_art20 = match &self.zusatzinformation_art20 {
798 Some(val) => val.to_string(),
799 None => "".to_string(),
800 },
801 zusatzinformation_inhalt20 = match &self.zusatzinformation_inhalt20 {
802 Some(val) => val.to_string(),
803 None => "".to_string(),
804 },
805 stück = match self.stück {
806 Some(val) => val.to_string(),
807 None => "".to_string(),
808 },
809 gewicht = match self.gewicht {
810 Some(val) => val.to_string(),
811 None => "".to_string(),
812 },
813 zahlweise = match &self.zahlweise {
814 Some(val) => val.to_string(),
815 None => "".to_string(),
816 },
817 forderungsart = match &self.forderungsart {
818 Some(val) => val.to_string(),
819 None => "".to_string(),
820 },
821 forderungsjahr = match self.forderungsjahr {
822 Some(val) => val.to_string(),
823 None => "".to_string(),
824 },
825 veranlagungsjahr = match self.veranlagungsjahr {
826 Some(val) => val.to_string(),
827 None => "".to_string(),
828 },
829 zugeordnete_fälligkeit = match &self.zugeordnete_fälligkeit {
830 Some(val) => val.to_string(),
831 None => "".to_string(),
832 },
833 skontotyp = match &self.skontotyp {
834 Some(val) => val.to_string(),
835 None => "".to_string(),
836 },
837 auftragsnummer = match &self.auftragsnummer {
838 Some(val) => val.to_string(),
839 None => "".to_string(),
840 },
841 buchungstyp = match &self.buchungstyp {
842 Some(val) => val.to_string(),
843 None => "".to_string(),
844 },
845 ust_schlüssel_anzahlung = match self.ust_schlüssel_anzahlung {
846 Some(val) => val.to_string(),
847 None => "".to_string(),
848 },
849 eu_mitgliedstaat_anzahlung = match &self.eu_mitgliedstaat_anzahlung {
850 Some(val) => val.to_string(),
851 None => "".to_string(),
852 },
853 sachverhalt_l_l_anzahlung = match &self.sachverhalt_l_l_anzahlung {
854 Some(val) => val.to_string(),
855 None => "".to_string(),
856 },
857 eu_steuersatz_anzahlung = match self.eu_steuersatz_anzahlung {
858 Some(val) => val.to_string(),
859 None => "".to_string(),
860 },
861 erlöskonto_anzahlung = match self.erlöskonto_anzahlung {
862 Some(val) => val.to_string(),
863 None => "".to_string(),
864 },
865 herkunft_kz = match &self.herkunft_kz {
866 Some(val) => val.to_string(),
867 None => "".to_string(),
868 },
869 leerfeld = match &self.leerfeld {
870 Some(val) => val.to_string(),
871 None => "".to_string(),
872 },
873 kost_datum = match &self.kost_datum {
874 Some(val) => val.to_string(),
875 None => "".to_string(),
876 },
877 sepa_mandatsreferenz = match &self.sepa_mandatsreferenz {
878 Some(val) => val.to_string(),
879 None => "".to_string(),
880 },
881 skontosperre = match self.skontosperre {
882 Some(val) => val.to_string(),
883 None => "".to_string(),
884 },
885 gesellschaftername = match &self.gesellschaftername {
886 Some(val) => val.to_string(),
887 None => "".to_string(),
888 },
889 beteiligtennummer = match &self.beteiligtennummer {
890 Some(val) => val.to_string(),
891 None => "".to_string(),
892 },
893 identifikationsnummer = match &self.identifikationsnummer {
894 Some(val) => val.to_string(),
895 None => "".to_string(),
896 },
897 zeichennummer = match &self.zeichennummer {
898 Some(val) => val.to_string(),
899 None => "".to_string(),
900 },
901 postensperre_bis = match &self.postensperre_bis {
902 Some(val) => val.to_string(),
903 None => "".to_string(),
904 },
905 bezeichnung_so_bil_sachverhalt = match &self.bezeichnung_so_bil_sachverhalt {
906 Some(val) => val.to_string(),
907 None => "".to_string(),
908 },
909 kennzeichen_so_bil_buchung = match &self.kennzeichen_so_bil_buchung {
910 Some(val) => val.to_string(),
911 None => "".to_string(),
912 },
913 festschreibung = match &self.festschreibung {
914 Some(val) => val.to_string(),
915 None => "".to_string(),
916 },
917 leistungsdatum = match &self.leistungsdatum {
918 Some(val) => val.to_string(),
919 None => "".to_string(),
920 },
921 datum_zuord_steuerperiode = match &self.datum_zuord_steuerperiode {
922 Some(val) => val.to_string(),
923 None => "".to_string(),
924 },
925 fälligkeit = match &self.fälligkeit {
926 Some(val) => val.to_string(),
927 None => "".to_string(),
928 },
929 generalumkehr = match &self.generalumkehr {
930 Some(val) => val.to_string(),
931 None => "".to_string(),
932 },
933 steuersatz = match self.steuersatz {
934 Some(val) => val.to_string(),
935 None => "".to_string(),
936 },
937 land = match &self.land {
938 Some(val) => val.to_string(),
939 None => "".to_string(),
940 },
941 abrechnungsreferenz = match &self.abrechnungsreferenz {
942 Some(val) => val.to_string(),
943 None => "".to_string(),
944 },
945 bvv_position = match &self.bvv_position {
946 Some(val) => val.to_string(),
947 None => "".to_string(),
948 },
949 eu_ustid_ursprung = match &self.eu_ustid_ursprung {
950 Some(val) => val.to_string(),
951 None => "".to_string(),
952 },
953 eu_steuersatz_ursprung = match self.eu_steuersatz_ursprung {
954 Some(val) => val.to_string(),
955 None => "".to_string(),
956 },
957 newline = "\n",
958 )
959 }
960}
961
962impl TryFrom<&str> for Buchung {
963 type Error = &'static str;
964
965 fn try_from(value: &str) -> Result<Self, Self::Error> {
966 let mut rdr = csv::ReaderBuilder::new().delimiter(b';').flexible(true)
967 .has_headers(false).from_reader(value.as_bytes());
968
969 let mut iter = rdr.records();
970 if let Some(result) = iter.next() {
971 let record = result.unwrap();
972 let mut buchung = Buchung::default();
973 if let Some(val) = record.get(0) {
975 let fixed_decimal = val.replace(',', ".");
976 buchung.umsatz = fixed_decimal.parse().unwrap();
977 }
978 if let Some(val) = record.get(1) {
979 buchung.soll_haben_kennzeichen = match val{
980 "H" => SollHabenKennzeichen::Haben,
981 "S" => SollHabenKennzeichen::Soll,
982 _ => SollHabenKennzeichen::default(),
983 };
984 }
985 if let Some(val) = record.get(2) {
986 buchung.wkz_umsatz = val.to_string();
987 }
988 if let Some(val) = record.get(3) {
989 if !val.is_empty() {
990 let fixed_decimal = val.replace(',', ".");
991 buchung.kurs = Some(fixed_decimal.parse().unwrap());
992 }
993 }
994 if let Some(val) = record.get(4) {
995 if !val.is_empty() {
996 let fixed_decimal = val.replace(',', ".");
997 buchung.basis_umsatz = Some(fixed_decimal.parse().unwrap());
998 }
999 }
1000 if let Some(val) = record.get(5) {
1001 buchung.wkz_basis_umsatz = Some(val.to_string());
1002 }
1003 if let Some(val) = record.get(6) {
1004 buchung.konto = val.parse().unwrap();
1005 }
1006 if let Some(val) = record.get(7) {
1007 buchung.gegenkonto = val.parse().unwrap();
1008 }
1009 if let Some(val) = record.get(8) {
1010 if !val.is_empty() {
1011 buchung.bu_schlüssel = Some(val.parse().unwrap());
1012 }
1013 }
1014 if let Some(val) = record.get(9) {
1015 let x = format!("{}-2021", val);
1017 buchung.beleg_datum = chrono::NaiveDate::parse_from_str(&x, "%d%m-%Y").unwrap();
1018 }
1019 if let Some(val) = record.get(10) {
1020 buchung.belegfeld1 = Some(val.to_string());
1021 }
1022 if let Some(val) = record.get(11) {
1023 buchung.belegfeld2 = Some(val.to_string());
1024 }
1025 if let Some(val) = record.get(12) {
1026 if !val.is_empty() {
1027 let fixed_decimal = val.replace(',', ".");
1028 buchung.skonto = Some(fixed_decimal.parse().unwrap());
1029 }
1030 }
1031 if let Some(val) = record.get(13) {
1032 buchung.buchungstext = Some(val.to_string());
1033 }
1034 if let Some(val) = record.get(14) {
1035 if !val.is_empty() {
1036 buchung.postensperre = Some(val.parse().unwrap());
1037 }
1038 }
1039 if let Some(val) = record.get(15) {
1040 buchung.diverse_adressnummer = Some(val.to_string());
1041 }
1042 if let Some(val) = record.get(16) {
1043 buchung.geschäftspartner_bank = Some(val.to_string());
1044 }
1045 if let Some(val) = record.get(17) {
1046 buchung.sachverhalt = Some(val.to_string());
1047 }
1048 if let Some(val) = record.get(18) {
1049 buchung.zinssperre = Some(val.to_string());
1050 }
1051 if let Some(val) = record.get(19) {
1052 buchung.beleg_link = Some(val.to_string());
1053 }
1054 if let Some(val) = record.get(20) {
1055 buchung.beleg_info_art1 = Some(val.to_string());
1056 }
1057 if let Some(val) = record.get(21) {
1058 buchung.beleg_info_inhalt1 = Some(val.to_string());
1059 }
1060 if let Some(val) = record.get(22) {
1061 buchung.beleg_info_art2 = Some(val.to_string());
1062 }
1063 if let Some(val) = record.get(23) {
1064 buchung.beleg_info_inhalt2 = Some(val.to_string());
1065 }
1066 if let Some(val) = record.get(24) {
1067 buchung.beleg_info_art3 = Some(val.to_string());
1068 }
1069 if let Some(val) = record.get(25) {
1070 buchung.beleg_info_inhalt3 = Some(val.to_string());
1071 }
1072 if let Some(val) = record.get(26) {
1073 buchung.beleg_info_art4 = Some(val.to_string());
1074 }
1075 if let Some(val) = record.get(27) {
1076 buchung.beleg_info_inhalt4 = Some(val.to_string());
1077 }
1078 if let Some(val) = record.get(28) {
1079 buchung.beleg_info_art5 = Some(val.to_string());
1080 }
1081 if let Some(val) = record.get(29) {
1082 buchung.beleg_info_inhalt5 = Some(val.to_string());
1083 }
1084 if let Some(val) = record.get(30) {
1085 buchung.beleg_info_art6 = Some(val.to_string());
1086 }
1087 if let Some(val) = record.get(31) {
1088 buchung.beleg_info_inhalt6 = Some(val.to_string());
1089 }
1090 if let Some(val) = record.get(32) {
1091 buchung.beleg_info_art7 = Some(val.to_string());
1092 }
1093 if let Some(val) = record.get(33) {
1094 buchung.beleg_info_inhalt7 = Some(val.to_string());
1095 }
1096 if let Some(val) = record.get(34) {
1097 buchung.beleg_info_art8 = Some(val.to_string());
1098 }
1099 if let Some(val) = record.get(35) {
1100 buchung.beleg_info_inhalt8 = Some(val.to_string());
1101 }
1102 if let Some(val) = record.get(36) {
1103 buchung.kost1_kostenstelle = Some(val.to_string());
1104 }
1105 if let Some(val) = record.get(37) {
1106 buchung.kost2_kostenstelle = Some(val.to_string());
1107 }
1108 if let Some(val) = record.get(38) {
1109 if !val.is_empty() {
1110 buchung.kost_menge = Some(val.parse().unwrap());
1111 }
1112 }
1113 if let Some(val) = record.get(39) {
1114 buchung.eu_ustid = Some(val.to_string());
1115 }
1116 if let Some(val) = record.get(40) {
1117 if !val.is_empty() {
1118 buchung.eu_steuersatz = Some(val.parse().unwrap());
1119 }
1120 }
1121 if let Some(val) = record.get(41) {
1122 buchung.abweichende_versteuerungsart = Some(val.to_string());
1123 }
1124 if let Some(val) = record.get(42) {
1125 buchung.sachverhalt_l_l = Some(val.to_string());
1126 }
1127 if let Some(val) = record.get(43) {
1128 buchung.funktionsergänzung_l_l = Some(val.to_string());
1129 }
1130 if let Some(val) = record.get(44) {
1131 buchung.bu_49_hauptfunktiontyp = Some(val.to_string());
1132 }
1133 if let Some(val) = record.get(45) {
1134 buchung.bu_49_hauptfunktionsnummer = Some(val.to_string());
1135 }
1136 if let Some(val) = record.get(46) {
1137 buchung.bu_49_funktionsergänzung = Some(val.to_string());
1138 }
1139 if let Some(val) = record.get(47) {
1140 buchung.zusatzinformation_art1 = Some(val.to_string());
1141 }
1142 if let Some(val) = record.get(48) {
1143 buchung.zusatzinformation_inhalt1 = Some(val.to_string());
1144 }
1145 if let Some(val) = record.get(49) {
1146 buchung.zusatzinformation_art2 = Some(val.to_string());
1147 }
1148 if let Some(val) = record.get(50) {
1149 buchung.zusatzinformation_inhalt2 = Some(val.to_string());
1150 }
1151 if let Some(val) = record.get(51) {
1152 buchung.zusatzinformation_art3 = Some(val.to_string());
1153 }
1154 if let Some(val) = record.get(52) {
1155 buchung.zusatzinformation_inhalt3 = Some(val.to_string());
1156 }
1157 if let Some(val) = record.get(53) {
1158 buchung.zusatzinformation_art4 = Some(val.to_string());
1159 }
1160 if let Some(val) = record.get(54) {
1161 buchung.zusatzinformation_inhalt4 = Some(val.to_string());
1162 }
1163 if let Some(val) = record.get(55) {
1164 buchung.zusatzinformation_art5 = Some(val.to_string());
1165 }
1166 if let Some(val) = record.get(56) {
1167 buchung.zusatzinformation_inhalt5 = Some(val.to_string());
1168 }
1169 if let Some(val) = record.get(57) {
1170 buchung.zusatzinformation_art6 = Some(val.to_string());
1171 }
1172 if let Some(val) = record.get(58) {
1173 buchung.zusatzinformation_inhalt6 = Some(val.to_string());
1174 }
1175 if let Some(val) = record.get(59) {
1176 buchung.zusatzinformation_art7 = Some(val.to_string());
1177 }
1178 if let Some(val) = record.get(60) {
1179 buchung.zusatzinformation_inhalt7 = Some(val.to_string());
1180 }
1181 if let Some(val) = record.get(61) {
1182 buchung.zusatzinformation_art8 = Some(val.to_string());
1183 }
1184 if let Some(val) = record.get(62) {
1185 buchung.zusatzinformation_inhalt8 = Some(val.to_string());
1186 }
1187 if let Some(val) = record.get(63) {
1188 buchung.zusatzinformation_art9 = Some(val.to_string());
1189 }
1190 if let Some(val) = record.get(64) {
1191 buchung.zusatzinformation_inhalt9 = Some(val.to_string());
1192 }
1193 if let Some(val) = record.get(65) {
1194 buchung.zusatzinformation_art10 = Some(val.to_string());
1195 }
1196 if let Some(val) = record.get(66) {
1197 buchung.zusatzinformation_inhalt10 = Some(val.to_string());
1198 }
1199 if let Some(val) = record.get(67) {
1200 buchung.zusatzinformation_art11 = Some(val.to_string());
1201 }
1202 if let Some(val) = record.get(68) {
1203 buchung.zusatzinformation_inhalt11 = Some(val.to_string());
1204 }
1205 if let Some(val) = record.get(69) {
1206 buchung.zusatzinformation_art12 = Some(val.to_string());
1207 }
1208 if let Some(val) = record.get(70) {
1209 buchung.zusatzinformation_inhalt12 = Some(val.to_string());
1210 }
1211 if let Some(val) = record.get(71) {
1212 buchung.zusatzinformation_art13 = Some(val.to_string());
1213 }
1214 if let Some(val) = record.get(72) {
1215 buchung.zusatzinformation_inhalt13 = Some(val.to_string());
1216 }
1217 if let Some(val) = record.get(73) {
1218 buchung.zusatzinformation_art14 = Some(val.to_string());
1219 }
1220 if let Some(val) = record.get(74) {
1221 buchung.zusatzinformation_inhalt14 = Some(val.to_string());
1222 }
1223 if let Some(val) = record.get(75) {
1224 buchung.zusatzinformation_art15 = Some(val.to_string());
1225 }
1226 if let Some(val) = record.get(76) {
1227 buchung.zusatzinformation_inhalt15 = Some(val.to_string());
1228 }
1229 if let Some(val) = record.get(77) {
1230 buchung.zusatzinformation_art16 = Some(val.to_string());
1231 }
1232 if let Some(val) = record.get(78) {
1233 buchung.zusatzinformation_inhalt16 = Some(val.to_string());
1234 }
1235 if let Some(val) = record.get(79) {
1236 buchung.zusatzinformation_art17 = Some(val.to_string());
1237 }
1238 if let Some(val) = record.get(80) {
1239 buchung.zusatzinformation_inhalt17 = Some(val.to_string());
1240 }
1241 if let Some(val) = record.get(81) {
1242 buchung.zusatzinformation_art18 = Some(val.to_string());
1243 }
1244 if let Some(val) = record.get(82) {
1245 buchung.zusatzinformation_inhalt18 = Some(val.to_string());
1246 }
1247 if let Some(val) = record.get(83) {
1248 buchung.zusatzinformation_art19 = Some(val.to_string());
1249 }
1250 if let Some(val) = record.get(84) {
1251 buchung.zusatzinformation_inhalt19 = Some(val.to_string());
1252 }
1253 if let Some(val) = record.get(85) {
1254 buchung.zusatzinformation_art20 = Some(val.to_string());
1255 }
1256 if let Some(val) = record.get(86) {
1257 buchung.zusatzinformation_inhalt20 = Some(val.to_string());
1258 }
1259 if let Some(val) = record.get(87) {
1260 if !val.is_empty() {
1261 buchung.stück = Some(val.parse().unwrap());
1262 }
1263 }
1264 if let Some(val) = record.get(88) {
1265 if !val.is_empty() {
1266 buchung.gewicht = Some(val.parse().unwrap());
1267 }
1268 }
1269 if let Some(val) = record.get(89) {
1270 buchung.zahlweise = Some(val.to_string());
1271 }
1272 if let Some(val) = record.get(90) {
1273 buchung.forderungsart = Some(val.to_string());
1274 }
1275 if let Some(val) = record.get(91) {
1276 if !val.is_empty() {
1277 buchung.forderungsjahr = Some(val.parse().unwrap());
1278 }
1279 }
1280 if let Some(val) = record.get(92) {
1281 buchung.zugeordnete_fälligkeit = Some(val.to_string());
1282 }
1283 if let Some(val) = record.get(93) {
1284 buchung.skontotyp = Some(val.to_string());
1285 }
1286 if let Some(val) = record.get(94) {
1287 buchung.auftragsnummer = Some(val.to_string());
1288 }
1289 if let Some(val) = record.get(95) {
1290 buchung.buchungstyp = Some(val.to_string());
1291 }
1292 if let Some(val) = record.get(96) {
1293 if !val.is_empty() {
1294 buchung.ust_schlüssel_anzahlung = Some(val.parse().unwrap());
1295 }
1296 }
1297 if let Some(val) = record.get(97) {
1298 buchung.eu_mitgliedstaat_anzahlung = Some(val.to_string());
1299 }
1300 if let Some(val) = record.get(98) {
1301 buchung.sachverhalt_l_l_anzahlung = Some(val.to_string());
1302 }
1303 if let Some(val) = record.get(99) {
1304 if !val.is_empty() {
1305 buchung.eu_steuersatz_anzahlung = Some(val.parse().unwrap());
1306 }
1307 }
1308 if let Some(val) = record.get(100) {
1309 if !val.is_empty() {
1310 buchung.erlöskonto_anzahlung = Some(val.parse().unwrap());
1311 }
1312 }
1313 if let Some(val) = record.get(101) {
1314 buchung.herkunft_kz = Some(val.to_string());
1315 }
1316 if let Some(val) = record.get(102) {
1317 buchung.leerfeld = Some(val.to_string());
1318 }
1319 if let Some(val) = record.get(103) {
1320 buchung.kost_datum = Some(val.to_string());
1321 }
1322 if let Some(val) = record.get(104) {
1323 buchung.sepa_mandatsreferenz = Some(val.to_string());
1324 }
1325 if let Some(val) = record.get(105) {
1326 if !val.is_empty() {
1327 buchung.skontosperre = Some(val.parse().unwrap());
1328 }
1329 }
1330 if let Some(val) = record.get(106) {
1331 buchung.gesellschaftername = Some(val.to_string());
1332 }
1333 if let Some(val) = record.get(107) {
1334 buchung.beteiligtennummer = Some(val.to_string());
1335 }
1336 if let Some(val) = record.get(108) {
1337 buchung.identifikationsnummer = Some(val.to_string());
1338 }
1339 if let Some(val) = record.get(109) {
1340 buchung.zeichennummer = Some(val.to_string());
1341 }
1342 if let Some(val) = record.get(110) {
1343 buchung.postensperre_bis = Some(val.to_string());
1344 }
1345 if let Some(val) = record.get(111) {
1346 buchung.bezeichnung_so_bil_sachverhalt = Some(val.to_string());
1347 }
1348 if let Some(val) = record.get(112) {
1349 buchung.kennzeichen_so_bil_buchung = Some(val.to_string());
1350 }
1351 if let Some(val) = record.get(113) {
1352 buchung.festschreibung = match val {
1353 "0" => Some(Festschreibung::KeineFestschreibung),
1354 "1" => Some(Festschreibung::Festschreibung),
1355 _ => None,
1356 };
1357 }
1358 if let Some(val) = record.get(114) {
1359 buchung.leistungsdatum = Some(val.to_string());
1360 }
1361 if let Some(val) = record.get(115) {
1362 buchung.datum_zuord_steuerperiode = Some(val.to_string());
1363 }
1364 if let Some(val) = record.get(116) {
1365 buchung.fälligkeit = Some(val.to_string());
1366 }
1367 if let Some(val) = record.get(117) {
1368 buchung.generalumkehr = Some(val.to_string());
1369 }
1370 if let Some(val) = record.get(118) {
1371 if !val.is_empty() {
1372 buchung.steuersatz = Some(val.parse().unwrap());
1373 }
1374 }
1375 if let Some(val) = record.get(119) {
1376 buchung.land = Some(val.to_string());
1377 }
1378 if let Some(val) = record.get(120) {
1379 buchung.abrechnungsreferenz = Some(val.to_string());
1380 }
1381 if let Some(val) = record.get(121) {
1382 buchung.bvv_position = Some(val.to_string());
1383 }
1384 if let Some(val) = record.get(122) {
1385 buchung.eu_ustid_ursprung = Some(val.to_string());
1386 }
1387 if let Some(val) = record.get(123) {
1388 if !val.is_empty() {
1389 buchung.eu_steuersatz_ursprung = Some(val.parse().unwrap());
1390 }
1391 }
1392 Ok(buchung)
1393 }else{
1394 Err("content not recognised")
1395 }
1396 }
1397}
1398
1399#[derive(Clone, PartialEq, Debug, Eq, Serialize, Deserialize)]
1400#[repr(u8)]
1401pub enum SollHabenKennzeichen{
1402 Soll,
1403 Haben,
1404}
1405impl Default for SollHabenKennzeichen {
1406 fn default() -> Self {
1407 SollHabenKennzeichen::Soll
1408 }
1409}
1410impl Display for SollHabenKennzeichen {
1411 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
1412 write!(f, "{}", match self {
1413 SollHabenKennzeichen::Soll => "S",
1414 SollHabenKennzeichen::Haben => "H",
1415 })
1416 }
1417}