gchr.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import pandas as pd
  2. import numpy as np
  3. import xml.etree.ElementTree as ET
  4. from xml.dom import minidom
  5. base_dir = 'C:/Projekte/Python/gcstruct/'
  6. account_translation = base_dir + 'Kontenrahmen_kombiniert.csv'
  7. account_bookings = base_dir + 'GuV_Salden.csv'
  8. first_month_of_financial_year = '07'
  9. current_year = '2021'
  10. current_month = '04'
  11. last_year = str(int(current_year) - 1)
  12. next_year = str(int(current_year) + 1)
  13. header = {
  14. 'Country': 'DE',
  15. 'MainBmCode': '8024',
  16. 'Month': '07',
  17. 'Year': '2015',
  18. 'Currency': 'EUR',
  19. 'NumberOfMakes': 2,
  20. 'NumberOfSites': 2,
  21. 'ExtractionDate': '26.08.2015',
  22. 'ExtractionTime': '13:51:47',
  23. 'BeginFiscalYear': '01'
  24. }
  25. def bookkeep_filter():
  26. period = [current_year + str(i).zfill(2) for i in range(1, 13)]
  27. if first_month_of_financial_year != '01':
  28. if first_month_of_financial_year > current_month:
  29. period = [last_year + str(i).zfill(2) for i in range(1, 13)] + period
  30. else:
  31. period = period + [next_year + str(i).zfill(2) for i in range(1, 13)]
  32. fm = int(first_month_of_financial_year)
  33. period = period[fm - 1:fm + 12]
  34. rename_to = ['Period' + str(i).zfill(2) for i in range(1, 13)]
  35. return dict(zip(period, rename_to))
  36. def main():
  37. # Übersetzungstabelle laden
  38. df_translate = pd.read_csv(account_translation, decimal=',', sep=';', encoding='ansi', converters={i: str for i in range(0, 200)})
  39. # Kontensalden laden
  40. df_bookings = pd.read_csv(account_bookings, decimal=',', sep=';', encoding='ansi', converters={0: str, 1: str})
  41. # Kontensalden auf gegebenen Monat filtern
  42. filter_from = current_year + first_month_of_financial_year
  43. if first_month_of_financial_year > current_month:
  44. filter_from = last_year + first_month_of_financial_year
  45. filter_to = current_year + current_month
  46. df_bookings = df_bookings[(df_bookings['Bookkeep Period'] >= filter_from) & (df_bookings['Bookkeep Period'] <= filter_to)]
  47. bk_filter = bookkeep_filter()
  48. # Spalten konvertieren
  49. df_bookings['period'] = df_bookings['Bookkeep Period'].apply(lambda x: bk_filter[x])
  50. df_bookings['amount'] = df_bookings['Debit Amount'] + df_bookings['Credit Amount']
  51. df_bookings['quantity'] = df_bookings['Debit Quantity'] + df_bookings['Credit Quantity']
  52. # Join auf Übersetzung
  53. df_combined = df_bookings.merge(df_translate, how='inner', on='Konto_Nr_Händler')
  54. # Gruppieren
  55. # df_grouped = df_combined.groupby(['Konto_Nr_SKR51', 'period']).sum()
  56. df_pivot = df_combined.pivot_table(index=['Konto_Nr_SKR51'], columns=['period'], values='amount', aggfunc=np.sum, margins=True, margins_name='CumulatedYear')
  57. # Infos ergänzen
  58. df_pivot['Decimals'] = 2
  59. df_pivot['OpeningBalance'] = 0.0
  60. df_recombined = df_translate.drop(columns=['Konto_Nr_Händler', 'Kostenträger_Ebene']).drop_duplicates()
  61. df_recombined = df_recombined.merge(df_pivot, how='inner', on='Konto_Nr_SKR51')
  62. from_label = ['Marke', 'Standort', 'Konto_Nr', 'Kostenstelle', 'Absatzkanal', 'Kostenträger']
  63. to_label = ['Make', 'Site', 'Account', 'Origin', 'SalesChannel', 'CostCarrier']
  64. df_recombined = df_recombined.rename(columns=dict(zip(from_label, to_label)))
  65. df_recombined['CostAccountingString'] = df_recombined['Make'] + df_recombined['Site'] + df_recombined['Origin'] + \
  66. df_recombined['SalesChannel'] + df_recombined['CostCarrier']
  67. makes = df_recombined[['Make', 'Marke_HBV']].drop_duplicates().to_dict(orient='records')
  68. sites = df_recombined[['Make', 'Site', 'Marke_HBV']].drop_duplicates().to_dict(orient='records')
  69. # als xml exportieren
  70. res = df_recombined.head().to_dict(orient='records')
  71. record_elements = ['Account', 'Make', 'Site', 'Origin', 'SalesChannel', 'CostCarrier', 'CostAccountingString',
  72. 'Decimals', 'OpeningBalance'] + list(bk_filter.values()) + ['CumulatedYear']
  73. root = ET.Element('HbvData')
  74. h = ET.SubElement(root, 'Header')
  75. for k, v in header.items():
  76. ET.SubElement(h, k).text = str(v)
  77. make_list = ET.SubElement(root, 'MakeList')
  78. for m in makes:
  79. e = ET.SubElement(make_list, 'MakeListEntry')
  80. ET.SubElement(e, 'Make').text = m['Make']
  81. ET.SubElement(e, 'MakeCode').text = m['Marke_HBV']
  82. bm_code_list = ET.SubElement(root, 'BmCodeList')
  83. for s in sites:
  84. e = ET.SubElement(bm_code_list, 'BmCodeListEntry')
  85. ET.SubElement(e, 'Make').text = m['Make']
  86. ET.SubElement(e, 'Site').text = m['Site']
  87. ET.SubElement(e, 'BmCode').text = m['Marke_HBV']
  88. record_list = ET.SubElement(root, 'RecordList')
  89. for row in res:
  90. record = ET.SubElement(record_list, 'Record')
  91. for e in record_elements:
  92. child = ET.SubElement(record, e)
  93. child.text = str(row.get(e, 0.0))
  94. with open(base_dir + 'export_2021-04.xml', 'w', encoding='utf-8') as f:
  95. f.write(minidom.parseString(ET.tostring(root)).toprettyxml(indent=' '))
  96. if __name__ == '__main__':
  97. print(bookkeep_filter())
  98. main()