datev_types/
buchung.rs

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    /// Umsatz/Betrag für den Datensatz
12    /// z.B.: 1234567890,12
13    /// Betrag muss immer positiv sein.
14    pub umsatz: f64,
15    /// Soll-/Haben-Kennzeichnung
16    /// bezieht sich auf das Feld #7
17    /// Konto
18    /// S = SOLL (default)
19    /// H = HABEN
20    pub soll_haben_kennzeichen: SollHabenKennzeichen,
21    /// ISO-Code der Währung
22    /// #22 aus Header = default
23    pub wkz_umsatz: String,
24    /// Wenn Umsatz in Fremdwährung bei #1 angegeben wird
25    /// #004, 005 und 006 sind zu übergeben
26    /// z.B.: 1234,123456
27    #[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    /// nur Tag und Monat werden ausgewertet.
38    /// Das Jahr wird immer aus
39    /// dem Feld 13 des Headers ermittelt
40    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    // #[validate(range(min = 1, max = 2))]
254    #[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    /// Format TTMMJJJJ
275    #[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    /// Gültige Werte: 0, 1.
280    /// 1 = Skontosperre
281    /// 0 = Keine Skontosperre
282    #[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    /// leer=nichtdefiniert;wird  automatisch festgeschrieben
299    /// 0 = keine Festschreibung
300    /// 1 = Festschreibung
301    /// Hat ein Buchungssatz in diesem Feld den Inhalt 1, so wird der
302    /// gesamte Stapel nach dem Import festgeschrieben.
303    #[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    /// Format TTMMJJJJ
308    #[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    /// G oder 1 = Generalumkehr
313    /// 0 = keine Generalumkehr
314    #[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    /// Beispiel: DE für Deutschland
319    #[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    /// Die USt-IdNr. besteht aus
326    /// - 2-stelligen Länderkürzel (siehe Dok.-Nr. 1080169)
327    /// Ausnahme Griechenland: Das Länderkürzel lautet EL)
328    /// - 13-stelliger USt-IdNr.
329    /// - Beispiel: DE133546770. Die USt-IdNr kann auch Buchstaben haben, z.B.: bei Österreich
330    /// Detaillierte Informationen zur Erfassung von EU-Informationen im Buchungssatz: Dok.-Nr: 9211462. 
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub eu_ustid_ursprung: Option<String>,
333    /// Nur für entsprechende EU-Buchungen:
334    /// Der im EU-Ursprungsland gültige Steuersatz.
335    /// Beispiel: 12,12
336    #[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            //add values
974            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                //TODO find correct year
1016                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}