skr51.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import pandas as pd
  2. # import numpy as np
  3. from pathlib import Path
  4. from itertools import product
  5. class skr51_validation():
  6. current_dir = Path('/home/robert/projekte/python/gcstruct/SKR51')
  7. def __init__(self):
  8. filter_csv = pd.read_csv(self.current_dir.joinpath('SKR51_Kostenrechnungsmerkmale.csv'),
  9. sep=';', quotechar='"') # , encoding='latin-1')
  10. filter_csv['Filter'] = filter_csv['Filter'].apply(self.create_list)
  11. self.filter = filter_csv.set_index('Block').to_dict(orient='dict')['Filter']
  12. # print(self.filter)
  13. explode_cols = ['Kostenstelle', 'Absatzkanal', 'Kostenträger']
  14. matrix_csv = pd.read_csv(self.current_dir.joinpath('Plausibilitaetsmatrix.csv'), sep=';',
  15. converters={i: str for i in range(0, 200)}) # , encoding='latin-1' .set_index('Konto_Nr')
  16. matrix_csv['valid'] = True
  17. for col in explode_cols:
  18. matrix_csv[col] = matrix_csv[col].apply(self.create_list)
  19. self.matrix = matrix_csv
  20. # self.matrix['Kostenstelle'] = matrix_csv[['Konto_Nr', 'Kostenstelle', 'valid']].explode('Kostenstelle')
  21. # print(self.matrix[self.matrix['Konto_Nr'] == '3300'])
  22. def create_list(self, whitelist):
  23. if whitelist == '':
  24. # return [str(i).zfill(2) for i in range(0, 100)]
  25. return ['00']
  26. result = []
  27. for x in whitelist.split(','):
  28. if '-' in x:
  29. start, end = map(int, x.split('-'))
  30. result += [str(i).zfill(2) for i in range(start, end + 1)]
  31. else:
  32. result.append(x)
  33. return result
  34. def check_bookings(self, bookings_file):
  35. export_csv = pd.read_csv(self.current_dir.joinpath(bookings_file), sep=';', decimal=',',
  36. converters={i: str for i in range(0, 200)}, encoding='latin-1')
  37. export_csv = export_csv.merge(self.matrix[['Konto_Nr', 'valid']], how='left', on='Konto_Nr', suffixes=(None, '_matrix'))
  38. export_csv['Konto_Nr_valid'] = export_csv['valid'] == True
  39. temp = export_csv['Konto_Nr_Händler']
  40. export_csv.drop(['Konto_Nr_Händler'], axis=1, inplace=True)
  41. export_csv.insert(0, 'Konto_Nr_Händler', temp)
  42. for col in ['Marke', 'Standort']:
  43. export_csv[col + '_valid'] = export_csv[col].isin(self.filter[col])
  44. export_csv['valid'] = export_csv['valid'] & export_csv[col + '_valid']
  45. for col in ['Kostenstelle', 'Absatzkanal', 'Kostenträger']:
  46. export_csv = export_csv.merge(self.matrix[['Konto_Nr', col, 'valid']].explode(col),
  47. how='left', on=['Konto_Nr', col], suffixes=(None, '_' + col))
  48. export_csv[col + '_valid'] = export_csv[col].isin(self.filter[col]) & export_csv['valid_' + col] == True
  49. export_csv.drop(['valid_' + col], axis=1, inplace=True)
  50. export_csv['valid'] = export_csv['valid'] & export_csv[col + '_valid']
  51. return export_csv
  52. def maximum_accounts(self):
  53. accounts = self.matrix.to_dict(orient='records')
  54. header = ['Account', 'Make', 'Site', 'Origin', 'SalesChannel', 'CostCarrier', 'CostAccountingString',
  55. 'Decimals', 'OpeningBalance', 'Period01', 'CumulatedYear', 'Marke_HBV']
  56. with open(self.current_dir.joinpath('maximum.csv'), 'w', encoding='latin-1') as fwh:
  57. fwh.write(';'.join(header) + '\n')
  58. for a in accounts:
  59. for entry in product(a['Kostenstelle'], a['Absatzkanal'], a['Kostenträger']):
  60. row = [a['Konto_Nr'], '01', '01', *entry, '0101' + ''.join(entry), '2', '0', '100', '100', '0000']
  61. fwh.write(';'.join(row) + '\n')
  62. return None
  63. @staticmethod
  64. def format_konto(k):
  65. return "{0}-{1}-{2}-{3}-{4}-{5}".format(
  66. k['Kontonummer'],
  67. k['Marke'],
  68. k['Standort'],
  69. k['Kostenstelle'],
  70. k['Absatzkanal'],
  71. k['Kostentraeger']
  72. )
  73. @staticmethod
  74. def format_konto_neu(k):
  75. return "{0}-{1}-{2}-{3}-{4}-{5}".format(
  76. k['Kontonummer_neu'],
  77. k['Marke_neu'],
  78. k['Standort_neu'],
  79. k['Kostenstelle_neu'],
  80. k['Absatzkanal_neu'],
  81. k['Kostentraeger_neu']
  82. )
  83. if __name__ == '__main__':
  84. skr = skr51_validation()
  85. skr.maximum_accounts()
  86. # df = skr.check_bookings('Kontenrahmen_kombiniert.csv')
  87. # df[['Konto_Nr_Händler', 'Marke', 'Marke_valid', 'Standort', 'Standort_valid', 'Konto_Nr', 'Konto_Nr_valid',
  88. # 'Kostenstelle', 'Kostenstelle_valid', 'Absatzkanal', 'Absatzkanal_valid', 'Kostenträger', 'Kostenträger_valid',
  89. # 'Kostenträger_Ebene', 'valid']].to_csv(skr.current_dir.joinpath('SKR51_Validierung.csv'),
  90. # sep=';', encoding='latin-1', index=False)