add header row

This commit is contained in:
Raffael Meyer 2019-07-08 14:48:54 +02:00
parent 6a7969117f
commit 59cee369ce

View File

@ -8,6 +8,7 @@ Provide a report and downloadable CSV according to the German DATEV format.
all required columns. Used to import the data into the DATEV Software.
"""
from __future__ import unicode_literals
import datetime
import json
from six import string_types
import frappe
@ -158,13 +159,84 @@ def get_gl_entries(filters, as_dict):
return gl_entries
def get_datev_csv(data):
def get_datev_csv(data, filters):
"""
Fill in missing columns and return a CSV in DATEV Format.
For automatic processing, DATEV requires the first line of the CSV file to
hold meta data such as the length of account numbers oder the category of
the data.
Arguments:
data -- array of dictionaries
filters -- dict
"""
header = [
# A = DATEV format
# DTVF = created by DATEV software,
# EXTF = created by other software
"EXTF",
# B = version of the DATEV format
# 141 = 1.41,
# 510 = 5.10,
# 720 = 7.20
"510",
# C = Data category
# 21 = Transaction batch (Buchungsstapel),
# 67 = Buchungstextkonstanten,
# 16 = Debitors/Creditors,
# 20 = Account names (Kontenbeschriftungen)
"21",
# D = Format name
# Buchungsstapel,
# Buchungstextkonstanten,
# Debitoren/Kreditoren,
# Kontenbeschriftungen
"Buchungsstapel",
# E = Format version (regarding format name)
"",
# F = Generated on
datetime.datetime.now().strftime("%Y%m%d"),
# G = Imported on -- stays empty
"",
# H = Origin (SV = other (?), RE = KARE)
"SV",
# I = Exported by
frappe.session.user,
# J = Imported by -- stays empty
"",
# K = Tax consultant number (Beraternummer)
# TODO: frappe.get_value("Company", filters.get("company"), "tax_consultant_number"),
"",
# L = Tax client number (Mandantennummer)
# TODO: frappe.get_value("Company", filters.get("company"), "tax_client_number"),
"",
# M = Start of the fiscal year (Wirtschaftsjahresbeginn)
"",
# N = Length of account numbers (Sachkontenlänge)
"4",
# O = Transaction batch start date (YYYYMMDD)
frappe.utils.formatdate(filters.get('from_date'), "yyyyMMdd"),
# P = Transaction batch end date (YYYYMMDD)
frappe.utils.formatdate(filters.get('to_date'), "yyyyMMdd"),
# Q = Description (for example, "January - February 2019 Transactions")
"{} - {} Buchungsstapel".format(
frappe.utils.formatdate(filters.get('from_date'), "MMMM yyyy"),
frappe.utils.formatdate(filters.get('to_date'), "MMMM yyyy")
),
# R = Diktatkürzel
"",
# S = Buchungstyp
# 1 = Transaction batch (Buchungsstapel),
# 2 = Annual financial statement (Jahresabschluss)
"1",
# T = Rechnungslegungszweck
"",
# U = Festschreibung
"",
# V = Kontoführungs-Währungskennzeichen des Geldkontos
frappe.get_value("Company", filters.get("company"), "default_currency")
]
columns = [
# All possible columns must tbe listed here, because DATEV requires them to
# be present in the CSV.
@ -324,9 +396,10 @@ def get_datev_csv(data):
data_df = pd.DataFrame.from_records(data)
result = empty_df.append(data_df)
result["Belegdatum"] = pd.to_datetime(result["Belegdatum"])
result['Belegdatum'] = pd.to_datetime(result['Belegdatum'])
return result.to_csv(
header = ';'.join(header).encode('latin_1')
data = result.to_csv(
sep=b';',
# European decimal seperator
decimal=',',
@ -342,6 +415,7 @@ def get_datev_csv(data):
columns=columns
)
return header + b'\r\n' + data
@frappe.whitelist()
def download_datev_csv(filters=None):
@ -362,12 +436,6 @@ def download_datev_csv(filters=None):
validate_filters(filters)
data = get_gl_entries(filters, as_dict=1)
filename = 'DATEV_Buchungsstapel_{}-{}_bis_{}'.format(
filters.get('company'),
filters.get('from_date'),
filters.get('to_date')
)
frappe.response['result'] = get_datev_csv(data)
frappe.response['doctype'] = filename
frappe.response['result'] = get_datev_csv(data, filters)
frappe.response['doctype'] = 'EXTF_Buchungsstapel'
frappe.response['type'] = 'csv'