module Datev
  class Booking < Base
    # http://www.datev.de/dnlexom/client/app/index.html#/document/1036228/D103622800010

    # 1
    field 'Umsatz (ohne Soll/Haben-Kz)', :decimal, precision: 12, scale: 2, required: true
    # Beispiel: 1234567890,12
    # Muss immer ein positiver Wert sein

    # 2
    field 'Soll/Haben-Kennzeichen', :string, limit: 1, required: true
    # Die Soll-/Haben-Kennzeichnung des Umsatzes bezieht sich auf das Konto, das im Feld Konto angegeben wird:
    # S = Soll
    # H = Haben

    # 3
    field 'WKZ Umsatz', :string, limit: 3
    # Dreistelliger ISO-Code der Währung (Dok.-Nr. 1080170); gibt an, welche Währung dem Betrag zugrunde liegt.
    # Wenn kein Wert angegeben ist, wird das WKZ aus dem Header übernommen.

    # 4
    field 'Kurs', :decimal, precision: 10, scale: 6
    # Der Fremdwährungskurs bestimmt, wie der angegebene Umsatz, der in Fremdwährung übergeben wird, in die Basiswährung umzurechnen ist, wenn es sich um ein Nicht-EWU-Land handelt.
    # Beispiel: 1123,123456
    # Achtung: Der Wert 0 ist unzulässig.

    # 5
    field 'Basisumsatz', :decimal, precision: 12, scale: 2
    # Wenn das Feld Basisumsatz verwendet wird, muss auch das Feld WKZ Basisumsatz gefüllt werden.
    # Beispiel: 1123123123,12

    # 6
    field 'WKZ Basisumsatz', :string, limit: 3
    # Währungskennzeichen der hinterlegten Basiswährung. Wenn das Feld WKZ Basisumsatz verwendet wird, muss auch das Feld Basisumsatz verwendet werden.
    # ISO-Code beachten (siehe Dok.-Nr.1080170)

    # 7
    field 'Konto', :integer, limit: 9, required: true do
    # Sach- oder Personen-Kontonummer
    # Darf max. 8- bzw. max. 9-stellig sein (abhängig von der Information im Header)
    # Die Personenkontenlänge darf nur 1 Stelle länger sein als die definierte Sachkontennummernlänge.

      def output(value, context)
        length = context['Sachkontenlänge']
        value.to_s.rjust(length, '0')
      end
    end

    # 8
    field 'Gegenkonto (ohne BU-Schlüssel)', :integer, limit: 9, required: true do
    # Sach- oder Personen-Kontonummer
    # Darf max. 8- bzw. max. 9-stellig sein (abhängig von der Information im Header)
    # Die Personenkontenlänge darf nur 1 Stelle länger sein als die definierte Sachkontennummernlänge.

      def output(value, context)
        length = context['Sachkontenlänge']
        value.to_s.rjust(length, '0')
      end
    end

    # 9
    field 'BU-Schlüssel', :string, limit: 4
    # Steuerschlüssel und/oder Berichtigungsschlüssel

    # 10
    field 'Belegdatum', :date, format: '%d%m', required: true
    # Achtung: Auch bei individueller Feldformatierung mit vierstelliger Jahreszahl wird immer in das aktuelle Wirtschaftsjahr importiert, wenn Tag und Monat des Datums im bebuchbaren Zeitraum liegen, da die Jahreszahl nicht berücksichtigt wird.

    # 11
    field 'Belegfeld 1', :string, limit: 36, regex: %r{\A[a-zA-Z0-9\$\&\%\*\+\-\/]*\z}
    # Rechnungs-/Belegnummer
    # Das Belegfeld 1 ist der "Schlüssel" für die Verwaltung von Offenen Posten.
    # Bei einer Zahlung oder Gutschrift erfolgt nur dann ein OP-Ausgleich, wenn die Belegnummer mit dem Belegfeld 1 identisch ist.

    # 12
    field 'Belegfeld 2', :string, limit: 12, regex: %r{\A[a-zA-Z0-9\$\&\%\*\+\-\/]*\z}
    # Belegnummer oder OPOS-Verarbeitungsinformationen

    # 13
    field 'Skonto', :decimal, precision: 10, scale: 2
    # Skonto-Betrag/-Abzug
    # Nur bei Zahlungen zulässig.
    # Beispiel 12123123,12
    # Achtung: Der Wert 0 ist unzulässig.

    # 14
    field 'Buchungstext', :string, limit: 60

    # 15
    field 'Postensperre', :boolean
    # Mahn-/Zahl-Sperre
    # Die Rechnung kann aus dem Mahnwesen / Zahlungsvorschlag ausgeschlossen werden.
    # true = Postensperre
    # false/keine Angabe = keine Sperre
    # Nur in Verbindung mit einer Rechnungsbuchung und Personenkonto (OPOS) relevant.

    # 16
    field 'Diverse Adressnummer', :string, limit: 9
    # Adressnummer einer diversen Adresse
    # Nur in Verbindung mit OPOS relevant.

    # 17
    field 'Geschäftspartnerbank', :integer, limit: 3
    # Wenn für eine Lastschrift oder Überweisung eine bestimmte Bank des Geschäftspartners genutzt werden soll.
    # Nur in Verbindung mit OPOS relevant.

    # 18
    field 'Sachverhalt', :integer, limit: 2
    # Der Sachverhalt wird in Rechnungswesen pro verwendet, um Buchungen/Posten als Mahnzins/Mahngebühr zu identifizieren.
    # Für diese Posten werden z. B. beim Erstellen von Mahnungen keine Mahnzinsen berechnet.
    # 31 = Mahnzins
    # 40 = Mahngebühr
    # Nur in Verbindung mit OPOS relevant.

    # 19
    field 'Zinssperre', :boolean
    # Hier kann eine Zinssperre übergeben werden; dadurch werden für diesen Posten bei Erstellung einer Mahnung keine Mahnzinsen ermittelt.
    # Nur in Verbindung mit OPOS relevant.
    # keine Angabe und 0 = keine Sperre
    # 1 = Zinssperre

    # 20
    field 'Beleglink', :string, limit: 210
    # Link auf den Buchungsbeleg, der digital in einem Dokumenten-Management-System (z. B. DATEV Dokumentenablage, DATEV DMS classic) abgelegt wurde.
    # Der Beleglink hat folgenden Aufbau:
    #   4-stelliges Kürzel für Dokumentenmanagementsystem (siehe unten)
    #   Leerzeichen
    #   Anführungszeichen
    #   Beleglink (GUID, Dateiname des Belegs), max. 36 Zeichen
    #   Schlusszeichen
    # Beispiel für einen Beleglink aus Belege online:
    # BEDI “CB6A8F8F-099A-B3A9-2BAA-0CB64E299BA”
    # Das Kürzel bezeichnet das Quellsystem (Dokumentenmanagement), indem die digitalen Belege abgelegt sind.
    # DATEV verwendet für seine Dokumentenmanagement-Systeme folgende Kürzel:
    #   Belegverwaltung online → BEDI
    #   DATEV DMS → DDMS
    #   Dokumentenablage → DDMS (vormals DORG)

    # 21 bis 36
    (1..8).each do |number|
      field "Beleginfo – Art #{number}", :string, limit: 20
      field "Beleginfo – Inhalt #{number}", :string, limit: 210
    end
    # Bei einem ASCII-Format, das aus einem DATEV pro-Rechnungswesen-Programm erstellt wurde, können diese Felder Informationen aus einem Beleg (z. B. einem elektronischen Kontoumsatz) enthalten.
    # Wenn die Feldlänge eines Beleginfo-Inhalts-Felds überschritten wird, wird die Information im nächsten Beleginfo-Feld weitergeführt.
    # Wichtiger Hinweis
    # Eine Beleginfo besteht immer aus den Bestandteilen Beleginfo-Art und Beleginfo-Inhalt. Wenn Sie die Beleginfo nutzen möchten, befüllen Sie immer beide Felder.
    # Beispiel:
    # Beleginfo-Art:
    # Kontoumsätze der jeweiligen Bank
    # Beleginfo-Inhalt:
    # Buchungsspezifische Inhalte zu den oben genannten Informationsarten

    # 37
    field 'KOST1 – Kostenstelle', :string, limit: 8
    # Über KOST1 erfolgt die Zuordnung des Geschäftsvorfalls für die anschließende Kostenrechnung.

    # 38
    field 'KOST2 – Kostenstelle', :string, limit: 8
    # Über KOST2 erfolgt die Zuordnung des Geschäftsvorfalls für die anschließende Kostenrechnung.

    # 39
    field 'Kost Menge', :decimal, precision: 11, scale: 2
    # Im KOST-Mengenfeld wird die Wertgabe zu einer bestimmten Bezugsgröße für eine Kostenstelle erfasst. Diese Bezugsgröße kann z. B. kg, g, cm, m, % sein. Die Bezugsgröße ist definiert in den Kostenrechnungs-Stammdaten.
    # Beispiel: 123123123,12

    # 40
    field 'EU-Land u. USt-IdNr.', :string, limit: 15
    # Die USt-IdNr. besteht aus:
    # 2-stelligen Länderkürzel (siehe Dok.-Nr. 1080169; Ausnahme Griechenland: Das Länderkürzel lautet EL)
    # 13-stelliger USt-IdNr.

    # 41
    field 'EU-Steuersatz', :decimal, precision: 4, scale: 2
    # Nur für entsprechende EU-Buchungen:
    # Der im EU-Bestimmungsland gültige Steuersatz.
    # Beispiel: 12,12

    # 42
    field 'Abw. Versteuerungsart', :string, limit: 1
    # Für Buchungen, die in einer von der Mandantenstammdaten-Schlüsselung abweichenden Umsatzsteuerart verarbeitet werden sollen, kann die abweichende Versteuerungsart im Buchungssatz übergeben werden:
    # I = Ist-Versteuerung
    # K = keine Umsatzsteuerrechnung
    # P = Pauschalierung (z. B. für Land- und Forstwirtschaft)
    # S = Soll-Versteuerung

    # 43
    field 'Sachverhalt L+L', :integer, limit: 3
    # Sachverhalte gem. § 13b Abs. 1 Satz 1 Nrn. 1.ff UStG
    # Achtung: Der Wert 0 ist unzulässig.
    # (siehe Dok.-Nr. 1034915)

    # 44
    field 'Funktionsergänzung L+L', :integer, limit: 3
    # Steuersatz/Funktion zum L+L-Sachverhalt
    # Achtung: Der Wert 0 ist unzulässig.
    # (siehe Dok.-Nr. 1034915)

    # 45
    field 'BU 49 Hauptfunktionstyp', :integer, limit: 1
    # Bei Verwendung des BU-Schlüssels 49 für "andere Steuersätze" muss der steuerliche Sachverhalt mitgegeben werden.

    # 46
    field 'BU 49 Hauptfunktionsnummer', :integer, limit: 2

    # 47
    field 'BU 49 Funktionsergänzung', :integer, limit: 3

    # 48 bis 87
    (1..20).each do |number|
      field "Zusatzinformation – Art #{number}", :string, limit: 20
      field "Zusatzinformation – Inhalt #{number}", :string, limit: 210
    end
    # Zusatzinformationen, die zu Buchungssätzen erfasst werden können.
    # Diese Zusatzinformationen besitzen den Charakter eines Notizzettels und können frei erfasst werden.
    # Wichtiger Hinweis
    # Eine Zusatzinformation besteht immer aus den Bestandteilen Informationsart und Informationsinhalt. Wenn Sie die Zusatzinformation nutzen möchten, füllen Sie immer beide Felder.
    # Beispiel:
    # Informationsart, z. B. Filiale oder Mengengrößen (qm)
    # Informationsinhalt: Buchungsspezifische Inhalte zu den oben genannten Informationsarten.

    # 88
    field 'Stück', :integer, limit: 8
    # Wirkt sich nur bei Sachverhalt mit SKR14 Land- und Forstwirtschaft aus, für andere SKR werden die Felder beim Import/Export überlesen bzw. leer exportiert.

    # 89
    field 'Gewicht', :decimal, limit: 10, scale: 2

    # 90
    field 'Zahlweise', :integer, limit: 2
    # OPOS-Informationen kommunal
    # 1 = Lastschrift
    # 2 = Mahnung
    # 3 = Zahlung

    # 91
    field 'Forderungsart', :string, limit: 10
    # OPOS-Informationen kommunal

    # 92
    field 'Veranlagungsjahr', :date, format: '%Y'
    # OPOS-Informationen kommunal

    # 93
    field 'Zugeordnete Fälligkeit', :date, format: '%d%m%Y'
    # OPOS-Informationen kommunal

    # 94
    field 'Skontotyp', :integer, limit: 1
    # 1 = Einkauf von Waren
    # 2 = Erwerb von Roh-Hilfs- und Betriebsstoffen

    # 95
    field 'Auftragsnummer', :string, limit: 30
    # Allgemeine Bezeichnung, des Auftrags/Projekts

    # 96
    field 'Buchungstyp', :string, limit: 2
    # AA = Angeforderte Anzahlung/Abschlagsrechnung
    # AG = Erhaltene Anzahlung (Geldeingang)
    # AV = Erhaltene Anzahlung (Verbindlichkeit)
    # SR = Schlussrechnung
    # SU = Schlussrechnung (Umbuchung)
    # SG = Schlussrechnung (Geldeingang)
    # SO = Sonstige

    # 97
    field 'USt-Schlüssel (Anzahlungen)', :integer, limit: 2
    # USt-Schlüssel der späteren Schlussrechnung

    # 98
    field 'EU-Mitgliedstaat (Anzahlungen)', :string, limit: 2
    # EU-Mitgliedstaat der späteren Schlussrechnung
    # (siehe Dok.-Nr. 1080169)

    # 99
    field 'Sachverhalt L+L (Anzahlungen)', :integer, limit: 3
    # L+L-Sachverhalt der späteren Schlussrechnung
    # Sachverhalte gem. § 13b Abs. 1 Satz 1 Nrn. 1.-5. UStG
    # Achtung: Der Wert 0 ist unzulässig.

    # 100
    field 'EU-Steuersatz (Anzahlungen)', :decimal, precision: 4, scale: 2
    # EU-Steuersatz der späteren Schlussrechnung
    # Nur für entsprechende EU-Buchungen: Der im EU-Bestimmungsland gültige Steuersatz.
    # Beispiel: 12,12

    # 101
    field 'Erlöskonto (Anzahlungen)', :integer, limit: 9
    # Erlöskonto der späteren Schlussrechnung

    # 102
    field 'Herkunft-Kz', :string, limit: 2
    # Wird beim Import durch SV (Stapelverarbeitung) ersetzt.

    # 103
    field 'Leerfeld', :string, limit: 36
    # Wird von DATEV verwendet.

    # 104
    field 'KOST-Datum', :date, format: '%d%m%Y'
    # Format TTMMJJJJ

    # 105
    field 'SEPA-Mandatsreferenz', :string, limit: 35
    # Vom Zahlungsempfänger individuell vergebenes Kennzeichen eines Mandats (z. B. Rechnungs- oder Kundennummer).

    # 106
    field 'Skontosperre', :boolean
    # 0 = keine Skontosperre
    # 1 = Skontosperre

    # 107
    field 'Gesellschaftername', :string, limit: 76

    # 108
    field 'Beteiligtennummer', :integer, limit: 4

    # 109
    field 'Identifikationsnummer', :string, limit: 11

    # 110
    field 'Zeichnernummer', :string, limit: 20

    # 111
    field 'Postensperre bis', :date, format: '%d%m%Y'

    # 112
    field 'Bezeichnung', :string, limit: 30
    # SoBil-Sachverhalt

    # 113
    field 'Kennzeichen', :integer, limit: 2
    # SoBil-Buchung

    # 114
    field 'Festschreibung', :boolean
    # leer = nicht definiert; wird ab Jahreswechselversion 2016/2017 automatisch festgeschrieben
    # 0 = keine Festschreibung
    # 1 = Festschreibung
    # Hat ein Buchungssatz in diesem Feld den Inhalt 1, so wird der gesamte Stapel nach dem Import festgeschrieben.
    # Ab Jahreswechselversion 2016/2017 gilt das auch bei Inhalt = leer.

    # 115
    field 'Leistungsdatum', :date, format: '%d%m%Y'

    # 116
    field 'Datum Zuord.', :date, format: '%d%m%Y'
    # Steuerperiode

    # Neue Felder ab Programmversion 7.1

    # 117
    field 'Fälligkeit', :date, format: '%d%m%Y'
    # OPOS Informationen

    # 118
    field 'Generalumkehr', :string, limit: 1
    # 1 = Generalumkehr
    # 0 = keine Generalumkehr

    # 119
    field 'Steuersatz', :decimal, precision: 4, scale: 2

    # 120
    field 'Land', :string, limit: 2
    # Beispiel: DE für Deutschland
  end
end
