;; -*-scheme-*-
;; 
;; This file was copied from the file txf.scm by  Richard -Gilligan- Uschold
;;
;; Originally, these were meant to hold the codes for the US tax TXF
;; format. Christian Stimming modified this heavily so that it might become useful for
;; the German Umsatzsteuer-Voranmeldung. 
;; Further modifications by:
;;   Jannick Asmus
;;   J. Alex Aycinena
;;   Frank H. Ellenberger
;;   Andreas Köhler
;;   Rolf Leggewie
;; 
;; Der gesamte Inhalt zu den vier Abschnitten der "Umsatzsteuer-Kategorien" wurden im
;; Dezember 2010 für GnuCash Vers. 2.4.0 vollständig überarbeitet und alle Einträge gemäß
;; der "Umsatzsteuer-Voranmeldung 2011" umfassend berichtigt und komplettiert von FJSW - Franz Stoll
;; 
;; This file holds all the Kennzahlen for the
;; Umsatzsteuer-Voranmeldung and their explanations, which can be
;; assigned to particular accounts via the "Edit -> Tax options"
;; dialog. The report in taxtxf-de_DE.scm then will extract the
;; numbers for these Kennzahlen from the actual accounts for a given
;; time period, and will write it to some XML file as required by
;; e.g. the Winston software
;; https://www.felfri.de/winston/schnittstellen.htm
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2 of
;; the License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, contact:
;;
;; Free Software Foundation           Voice:  +1-617-542-5942
;; 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
;; Boston, MA  02110-1301,  USA       gnu@gnu.org
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define-module (gnucash locale de_DE tax txf))

(use-modules (gnucash app-utils))
(use-modules (srfi srfi-2))
(use-modules (gnucash locale de_DE tax txf-help))

(export gnc:tax-type-txf-get-code-info)
(export gnc:txf-get-category-key)
(export gnc:txf-get-code-info)
(export gnc:txf-get-codes)
(export gnc:txf-get-description)
(export gnc:txf-get-form)
(export gnc:txf-get-format)
(export gnc:txf-get-help)
(export gnc:txf-get-last-year)
(export gnc:txf-get-line-data)
(export gnc:txf-get-multiple)
(export gnc:txf-get-payer-name-source)
(export gnc:txf-get-tax-entity-type)
(export gnc:txf-get-tax-entity-type-codes)
(export gnc:txf-get-tax-entity-type-description)
(export txf-asset-categories)
(export txf-expense-categories)
(export txf-help-categories)
(export txf-income-categories)
(export txf-liab-eq-categories)
(export txf-tax-entity-types)

(define txf-tax-entity-types
  (list
   (cons 'Ind #("Individual, Joint, etc." "Umsatzsteuer-Kennzahlen"))
   (cons 'Other #("None" "Keine Steuerberichtsoptionen vorhanden"))))

(define (gnc:tax-type-txf-get-code-info tax-entity-types type-code index)
  (and-let* ((tax-entity-type (assv-ref tax-entity-types type-code)))
    (vector-ref tax-entity-type index)))

(define (gnc:txf-get-tax-entity-type type-code)
  (gnc:tax-type-txf-get-code-info txf-tax-entity-types type-code 0))

(define (gnc:txf-get-tax-entity-type-description type-code)
  (gnc:tax-type-txf-get-code-info txf-tax-entity-types type-code 1))

(define (gnc:txf-get-tax-entity-type-codes)
  (map car txf-tax-entity-types))

(define (gnc:txf-get-payer-name-source categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 0 tax-entity-type))
(define (gnc:txf-get-form categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 1 tax-entity-type))
(define (gnc:txf-get-description categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 2 tax-entity-type))
(define (gnc:txf-get-format categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 3 tax-entity-type))
(define (gnc:txf-get-multiple categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 4 tax-entity-type))
(define (gnc:txf-get-category-key categories code tax-entity-type)
  (gnc:txf-get-code-info categories code 5 tax-entity-type))
(define (gnc:txf-get-line-data categories code tax-entity-type)
  (and-let* ((sym (string->symbol tax-entity-type))
             (tax-entity-codes (assv-ref categories sym))
             (category (assv-ref tax-entity-codes code))
             ((>= (vector-length category) 7)))
    (gnc:txf-get-code-info categories code 6 tax-entity-type)))
(define (gnc:txf-get-last-year categories code tax-entity-type)
  (and-let* ((sym (string->symbol tax-entity-type))
             (tax-entity-codes (assv-ref categories sym))
             (category (assv-ref tax-entity-codes code))
             ((>= (vector-length category) 8)))
    (gnc:txf-get-code-info categories code 7 tax-entity-type)))

(define (gnc:txf-get-help categories code)
  (or (assv-ref txf-help-strings code)
      "Keine Hilfe verfügbar, da nur Gruppenüberschrift.
Diese Kategorie ohne Nummer ==>> N I C H T   V E R W E N D E N !
USt-Kategorien 2011 für GnuCash Vers. 2.4.0 entwickelt und erstellt von: FJSW
Fehlermeldungen + Dankschreiben an: stoll@bomhardt.de"))

(define (gnc:txf-get-codes categories tax-entity-type)
  (and-let* ((sym (if (string-null? tax-entity-type)
                      'Ind
                      (string->symbol tax-entity-type)))
             (tax-entity-codes (assv-ref categories sym)))
    (map car tax-entity-codes)))

;;;; Private

(define (gnc:txf-get-code-info categories code index tax-entity-type)
  (and-let* ((sym (if (string-null? tax-entity-type)
                      'Ind
                      (string->symbol tax-entity-type)))
             (tax-entity-codes (assv-ref categories sym))
             (category (assv-ref tax-entity-codes code)))
    (vector-ref category index)))

(define txf-help-categories
  (list
   (cons 'H000 #(current "help" "Name des aktuellen Kontos wird exportiert." 0 #f ""))
   (cons 'H002 #(parent "help" "Name des übergeordneten Kontos wird exportiert." 0 #f ""))
   (cons 'H003 #(not-impl "help" "Noch nicht implementiert, NICHT benutzen!" 0 #f ""))))

;; We use several formats; nr. 1 means Euro+Cent, nr. 2 means only full Euro

;; Also, we abuse the "category-key" for now to store the Kennzahl as
;; well. We are not yet sure what to use the "form" field for.

;; Format: (name-source  form  description  format  multiple  category-key)
(define txf-income-categories
 (list
  (cons 'Ind
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   (cons 'UST #(none "" "Diese und nachfolgende Kategorien ohne Nummer --> NICHT VERWENDEN !" 0 #f ""))

   (cons 'U00 #(none "" "Lieferungen und sonstige Leistungen (einschließlich unentgeltlicher Wertabgaben)" 0 #f ""))
   (cons 'U10 #(none "" "Steuerfreie Umsätze mit Vorsteuerabzug" 0 #f ""))
   (cons 'U11 #(none "" "Innergemeinschaftliche Lieferungen (§ 4 Nr. 1 Buchst. b UStG)" 0 #f ""))
   (cons 'K41 #(none "41" "an Abnehmer MIT USt-IdNr." 2 #f "41"))
   (cons 'K44 #(none "44" "neuer Fahrzeuge an Abnehmer OHNE USt-IdNr." 2 #f "44"))
   (cons 'K49 #(none "49" "neuer Fahrzeuge außerhalb eines Unternehmens (§ 2a UStG)" 2 #f "49"))
   (cons 'K43 #(none "43" "Weitere steuerfreie Umsätze mit Vorsteuerabzug" 2 #f "43"))
   (cons 'U12 #(none "" "Steuerfreie Umsätze ohne Vorsteuerabzug" 0 #f ""))
   (cons 'K48 #(none "48" "Umsätze nach § 4 Nr. 8 bis 28 UStG" 2 #f "48"))

   (cons 'U20 #(none "" "Steuerpflichtige Umsätze (Lieferungen u. sonst. Leistungen einschl. unentgeltlicher Wertabgaben)" 0 #f ""))
   (cons 'K51 #(none "51" "zum Steuersatz von 16 %  (bis incl. 2006)" 2 #f "51"))
   (cons 'K81 #(none "81" "zum Steuersatz von 19 %" 2 #f "81"))
   (cons 'K86 #(none "86" "zum Steuersatz von  7 %" 2 #f "86"))
   (cons 'K35 #(none "35" "zu anderen Steuersätzen (Erlöse)" 2 #f "35"))
   (cons 'K36 #(none "36" "zu anderen Steuersätzen (MWSt)" 1 #f "36"))
   (cons 'U21 #(none "" "Lieferungen land- und forstwirtschaftlicher Betriebe nach § 24 UStG" 0 #f ""))
   (cons 'K77 #(none "77" "an Abnehmer MIT USt-IdNr." 2 #f "77"))
   (cons 'K76 #(none "76" "Umsätze, für die eine Steuer nach § 24 UStG zu entrichten ist (Erlöse)" 2 #f "76"))
   (cons 'K80 #(none "80" "Umsätze, für die eine Steuer nach § 24 UStG zu entrichten ist (MWSt)" 1 #f "80"))

   (cons 'U30 #(none "" "Innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'U32 #(none "" "Steuerpflichtige innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K98 #(none "98" "zu anderen Steuersätzen (Gebuchte MWSt)" 1 #f "98"))
   (cons 'K96 #(none "96" "neuer Fahrzeuge von Lieferern OHNE USt-IdNr. zum allgemeinen Steuersatz (Gebuchte MWSt)" 1 #f "96"))

   (cons 'U40 #(none "" "Ergänzende Angaben zu Umsätzen" 0 #f ""))
   (cons 'K42 #(none "42" "Lieferungen des ersten Abnehmers bei innergemeinschaftl. Dreiecksgeschäften (§ 25b Abs. 2 UStG)" 2 #f "42"))
   (cons 'K60 #(none "60" "Steuerpflichtige Umsätze, für die der Leistungsempfänger die Steuer nach § 13b Abs. 5 UStG schuldet" 2 #f "60"))
   (cons 'K21 #(none "21" "Nicht steuerbare sonstige Leistungen gem. § 18b Satz 1 Nr. 2 UStG (Leistungen EU-Land)" 2 #f "21"))
   (cons 'K45 #(none "45" "Übrige nicht steuerbare Umsätze (Leistungsort nicht im Inland)" 2 #f "45"))

   (cons 'U50 #(none "" "Leistungsempfänger als Steuerschuldner (§ 13b UStG)" 0 #f ""))
   (cons 'K47 #(none "47" "Im Inland steuerpflichtige sonstige Leistungen aus EU-Ländern (§13b Abs. 1 UStG) (Gebuchte MWSt)" 1 #f "47"))
   (cons 'K53 #(none "53" "Andere Leistungen eines im Ausland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 1 und 5 UStG) (Gebuchte MWSt)" 1 #f "53"))
   (cons 'K74 #(none "74" "Lieferungen sicherheitsübereigneter Gegenstände und Umsätze, die unter das GrEStG fallen (Gebuchte MWSt)" 1 #f "74"))
   (cons 'K85 #(none "85" "Andere Umsätze eines im Inland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 4 und Nr. 6 bis 9 UStG) (Gebuchte MWSt)" 1 #f "85"))

   (cons 'U70 #(none "" "Andere Steuerbeträge" 0 #f ""))
   (cons 'K65 #(none "65" "Steuer infolge Wechsels der Besteuerungsform sowie Nachsteuer auf versteuerte Anzahlungen u. ä." 1 #f "65"))
   (cons 'K69 #(none "69" "In Rechnungen unrichtig oder unberechtigt ausgewiesene Steuerbeträge (§ 14c UStG)" 1 #f "69"))

   )
  )
  (cons 'Other
   (list
    (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   )
  )
))


;; We use several formats; nr. 1 means Euro+Cent, nr. 2 means only full Euro

;; Also, we abuse the "category-key" for now to store the Kennzahl as
;; well. We are not yet sure what to use the "form" field for.

;; Format: (name-source  form  description  format  multiple  category-key)
(define txf-expense-categories
 (list
  (cons 'Ind
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   (cons 'UST #(none "" "Diese und nachfolgende Kategorien ohne Nummer --> NICHT VERWENDEN !" 0 #f ""))

   (cons 'U30 #(none "" "Innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'U31 #(none "" "Steuerfreie innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K91 #(none "91" "Erwerbe nach § 4b UStG" 2 #f "91"))
   (cons 'U32 #(none "" "Steuerpflichtige innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K89 #(none "89" "zum Steuersatz von 19 %" 2 #f "89"))
   (cons 'K93 #(none "93" "zum Steuersatz von  7 %" 2 #f "93"))
   (cons 'K95 #(none "95" "zu anderen Steuersätzen (Aufwand)" 2 #f "95"))
   (cons 'K94 #(none "94" "neuer Fahrzeuge von Lieferern OHNE USt-IdNr. zum allgemeinen Steuersatz (Aufwand)" 2 #f "94"))

   (cons 'U50 #(none "" "Leistungsempfänger als Steuerschuldner (§ 13b UStG)" 0 #f ""))
   (cons 'K46 #(none "46" "Im Inland steuerpflichtige sonstige Leistungen aus EU-Ländern (§13b Abs. 1 UStG) (Aufwand)" 2 #f "46"))
   (cons 'K52 #(none "52" "Andere Leistungen eines im Ausland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 1 und 5 UStG) (Aufwand)" 2 #f "52"))
   (cons 'K73 #(none "73" "Lieferungen sicherheitsübereigneter Gegenstände und Umsätze die unter das GrEStG fallen (Aufwand)" 2 #f "73"))
   (cons 'K84 #(none "84" "Andere Umsätze eines im Inland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 4 und Nr. 6 bis 9 UStG) (Aufwand)" 2 #f "84"))

   (cons 'U60 #(none "" "Abziehbare Vorsteuerbeträge" 0 #f ""))
   (cons 'K66 #(none "66" "Vorsteuerbeträge aus Rechnungen von anderen Unternehmern (§ 15 Abs. 1 Satz 1 Nr. 1 UStG)" 1 #f "66"))
   (cons 'K61 #(none "61" "Vorsteuerbeträge aus dem innergemeinschaftlichen Erwerb von Gegenständen (Gebuchte VSt)" 1 #f "61"))
   (cons 'K62 #(none "62" "Entrichtete Einfuhrumsatzsteuer (§ 15 Abs. 1 Satz 1 Nr. 2 UStG)" 1 #f "62"))
   (cons 'K67 #(none "67" "Vorsteuerbeträge aus Leistungen im Sinne des § 13b UStG (§ 15 Abs. 1 Satz 1 Nr. 4 UStG) (Gebuchte VSt)" 1 #f "67"))
   (cons 'K63 #(none "63" "Vorsteuerbeträge, die nach allgemeinen Durchschnittssätzen berechnet sind (§§ 23 und 23a UStG)" 1 #f "63"))
   (cons 'K64 #(none "64" "Berichtigung des Vorsteuerabzugs (§ 15a UStG)" 1 #f "64"))
   (cons 'K59 #(none "59" "Vorsteuerabzug für innergemeinschaftl. Lieferungen neuer Fahrzeuge außerhalb eines Unternehmens" 1 #f "59"))

   (cons 'U70 #(none "" "Andere Steuerbeträge" 0 #f ""))
   (cons 'K39 #(none "39" "Anrechnung (Abzug) der festgesetzten Sondervorauszahlung (1/11) für Dauerfristverlängerung" 1 #f "39"))

   )
  )
  (cons 'Other
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   )
  )

   ))

(define txf-asset-categories
 (list
  (cons 'Ind
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   (cons 'UST #(none "" "Diese und nachfolgende Kategorien ohne Nummer --> NICHT VERWENDEN !" 0 #f ""))

   (cons 'U30 #(none "" "Innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'U31 #(none "" "Steuerfreie innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K91 #(none "91" "Erwerbe nach § 4b UStG" 2 #f "91"))
   (cons 'U32 #(none "" "Steuerpflichtige innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K89 #(none "89" "zum Steuersatz von 19 %" 2 #f "89"))
   (cons 'K93 #(none "93" "zum Steuersatz von  7 %" 2 #f "93"))
   (cons 'K95 #(none "95" "zu anderen Steuersätzen" 2 #f "95"))
   (cons 'K94 #(none "94" "neuer Fahrzeuge von Lieferern OHNE USt-IdNr. zum allgemeinen Steuersatz (Aufwand)" 2 #f "94"))

   (cons 'U50 #(none "" "Leistungsempfänger als Steuerschuldner (§ 13b UStG)" 0 #f ""))
   (cons 'K46 #(none "46" "Im Inland steuerpflichtige sonstige Leistungen aus EU-Ländern (§13b Abs. 1 UStG) (Aufwand)" 2 #f "46"))
   (cons 'K52 #(none "52" "Andere Leistungen eines im Ausland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 1 und 5 UStG) (Aufwand)" 2 #f "52"))
   (cons 'K73 #(none "73" "Lieferungen sicherheitsübereigneter Gegenstände und Umsätze die unter das GrEStG fallen (Aufwand)" 2 #f "73"))
   (cons 'K84 #(none "84" "Andere Umsätze eines im Inland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 4 und Nr. 6 bis 9 UStG) (Aufwand)" 2 #f "84"))

   (cons 'U60 #(none "" "Abziehbare Vorsteuerbeträge" 0 #f ""))
   (cons 'K66 #(none "66" "Vorsteuerbeträge aus Rechnungen von anderen Unternehmern (§ 15 Abs. 1 Satz 1 Nr. 1 UStG)" 1 #f "66"))
   (cons 'K61 #(none "61" "Vorsteuerbeträge aus dem innergemeinschaftlichen Erwerb von Gegenständen (Gebuchte VSt)" 1 #f "61"))
   (cons 'K62 #(none "62" "Entrichtete Einfuhrumsatzsteuer (§ 15 Abs. 1 Satz 1 Nr. 2 UStG)" 1 #f "62"))
   (cons 'K67 #(none "67" "Vorsteuerbeträge aus Leistungen im Sinne des § 13b UStG (§ 15 Abs. 1 Satz 1 Nr. 4 UStG) (Gebuchte VSt)" 1 #f "67"))
   (cons 'K63 #(none "63" "Vorsteuerbeträge, die nach allgemeinen Durchschnittssätzen berechnet sind (§§ 23 und 23a UStG)" 1 #f "63"))
   (cons 'K64 #(none "64" "Berichtigung des Vorsteuerabzugs (§ 15a UStG)" 1 #f "64"))
   (cons 'K59 #(none "59" "Vorsteuerabzug für innergemeinschaftl. Lieferungen neuer Fahrzeuge außerhalb eines Unternehmens" 1 #f "59"))

   )
  )
  (cons 'Other
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   )
  )
))

(define txf-liab-eq-categories
 (list
  (cons 'Ind
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   (cons 'UST #(none "" "Diese und nachfolgende Kategorien ohne Nummer --> NICHT VERWENDEN !" 0 #f ""))

   (cons 'U20 #(none "" "Steuerpflichtige Umsätze (Lieferungen u. sonst. Leistungen einschl. unentgeltlicher Wertabgaben)" 0 #f ""))
   (cons 'K36 #(none "36" "zu anderen Steuersätzen (MWSt)" 1 #f "36"))
   (cons 'U21 #(none "" "Lieferungen land- und forstwirtschaftlicher Betriebe nach § 24 UStG" 0 #f ""))
   (cons 'K80 #(none "80" "Umsätze, für die eine Steuer nach § 24 UStG zu entrichten ist (MWSt)" 1 #f "80"))

   (cons 'U30 #(none "" "Innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'U32 #(none "" "Steuerpflichtige innergemeinschaftliche Erwerbe" 0 #f ""))
   (cons 'K98 #(none "98" "zu anderen Steuersätzen (Gebuchte MWSt)" 1 #f "98"))
   (cons 'K96 #(none "96" "neuer Fahrzeuge von Lieferern OHNE USt-IdNr. zum allgemeinen Steuersatz (Gebuchte MWSt)" 1 #f "96"))

   (cons 'U50 #(none "" "Leistungsempfänger als Steuerschuldner (§ 13b UStG)" 0 #f ""))
   (cons 'K47 #(none "47" "Im Inland steuerpflichtige sonstige Leistungen aus EU-Ländern (§13b Abs. 1 UStG) (Gebuchte MWSt)" 1 #f "47"))
   (cons 'K53 #(none "53" "Andere Leistungen eines im Ausland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 1 und 5 UStG) (Gebuchte MWSt)" 1 #f "53"))
   (cons 'K74 #(none "74" "Lieferungen sicherheitsübereigneter Gegenstände und Umsätze, die unter das GrEStG fallen (Gebuchte MWSt)" 1 #f "74"))
   (cons 'K85 #(none "85" "Andere Umsätze eines im Inland ansässigen Unternehmers (§ 13b Abs. 2 Nr. 4 und Nr. 6 bis 9 UStG) (Gebuchte MWSt)" 1 #f "85"))

   (cons 'U70 #(none "" "Andere Steuerbeträge" 0 #f ""))
   (cons 'K65 #(none "65" "Steuer infolge Wechsels der Besteuerungsform sowie Nachsteuer auf versteuerte Anzahlungen u. ä." 1 #f "65"))
   (cons 'K69 #(none "69" "In Rechnungen unrichtig oder unberechtigt ausgewiesene Steuerbeträge (§ 14c UStG)" 1 #f "69"))
   (cons 'K39 #(none "39" "Anrechnung (Abzug) der festgesetzten Sondervorauszahlung (1/11) für Dauerfristverlängerung" 1 #f "39"))

   )
  )
  (cons 'Other
   (list
   (cons 'N000 #(none "" "Informativ im Steuerbericht anzeigen -- Kein Export -- " 0 #f ""))
   )
  )
))
