skr51.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import pandas as pd
  2. # import numpy as np
  3. from pathlib import Path
  4. class skr51_validation():
  5. current_dir = Path('C:/Projekte/Python/SKR51')
  6. def __init__(self):
  7. filter_csv = pd.read_csv(self.current_dir.joinpath('SKR51_Kostenrechnungsmerkmale.csv'), sep=';', quotechar='"') # , encoding='ansi')
  8. filter_csv['Filter'] = filter_csv['Filter'].apply(self.create_list)
  9. self.filter = filter_csv.set_index('Block').to_dict(orient='dict')['Filter']
  10. # print(self.filter)
  11. explode_cols = ['Kostenstelle', 'Absatzkanal', 'Kostenträger']
  12. matrix_csv = pd.read_csv(self.current_dir.joinpath('Plausibilitaetsmatrix.csv'), sep=';', converters={i: str for i in range(0, 200)}) # , encoding='ansi' .set_index('Konto_Nr')
  13. matrix_csv['valid'] = True
  14. for col in explode_cols:
  15. matrix_csv[col] = matrix_csv[col].apply(self.create_list)
  16. self.matrix = matrix_csv
  17. # self.matrix['Kostenstelle'] = matrix_csv[['Konto_Nr', 'Kostenstelle', 'valid']].explode('Kostenstelle')
  18. # print(self.matrix[self.matrix['Konto_Nr'] == '3300'])
  19. def create_list(self, whitelist):
  20. if whitelist == '':
  21. return [str(i).zfill(2) for i in range(0, 100)]
  22. result = []
  23. for x in whitelist.split(','):
  24. if '-' in x:
  25. result += [str(i).zfill(2) for i in range(int(x.split('-')[0]), int(x.split('-')[1]) + 1)]
  26. else:
  27. result.append(x)
  28. return result
  29. def check_bookings(self, bookings_file):
  30. export_csv = pd.read_csv(self.current_dir.joinpath(bookings_file), sep=';', converters={i: str for i in range(0, 200)}, decimal=',', encoding='ansi')
  31. export_csv = export_csv.merge(self.matrix[['Konto_Nr', 'valid']], how='left', on='Konto_Nr', suffixes=(None, '_matrix'))
  32. export_csv['Konto_Nr_valid'] = export_csv['valid'] == True
  33. temp = export_csv['Konto_Nr_Händler']
  34. export_csv.drop(['Konto_Nr_Händler'], axis=1, inplace=True)
  35. export_csv.insert(0, 'Konto_Nr_Händler', temp)
  36. for col in ['Marke', 'Standort']:
  37. export_csv[col + '_valid'] = export_csv[col].isin(self.filter[col])
  38. export_csv['valid'] = export_csv['valid'] & export_csv[col + '_valid']
  39. for col in ['Kostenstelle', 'Absatzkanal', 'Kostenträger']:
  40. export_csv = export_csv.merge(self.matrix[['Konto_Nr', col, 'valid']].explode(col), how='left', on=['Konto_Nr', col], suffixes=(None, '_' + col))
  41. export_csv[col + '_valid'] = export_csv[col].isin(self.filter[col]) & export_csv['valid_' + col] == True
  42. export_csv.drop(['valid_' + col], axis=1, inplace=True)
  43. export_csv['valid'] = export_csv['valid'] & export_csv[col + '_valid']
  44. return export_csv
  45. @staticmethod
  46. def format_konto(konto):
  47. return f"{konto['Kontonummer']}-{konto['Marke']}-{konto['Standort']}-{konto['Kostenstelle']}-{konto['Absatzkanal']}-{konto['Kostentraeger']}"
  48. @staticmethod
  49. def format_konto_neu(konto):
  50. return f"{konto['Kontonummer_neu']}-{konto['Marke_neu']}-{konto['Standort_neu']}-{konto['Kostenstelle_neu']}-{konto['Absatzkanal_neu']}-{konto['Kostentraeger_neu']}"
  51. if __name__ == '__main__':
  52. skr = skr51_validation()
  53. df = skr.check_bookings('Kontenrahmen_kombiniert.csv')
  54. df[['Konto_Nr_Händler', 'Marke', 'Marke_valid', 'Standort', 'Standort_valid', 'Konto_Nr', 'Konto_Nr_valid',
  55. 'Kostenstelle', 'Kostenstelle_valid', 'Absatzkanal', 'Absatzkanal_valid', 'Kostenträger', 'Kostenträger_valid',
  56. 'Kostenträger_Ebene', 'valid']].to_csv(skr.current_dir.joinpath('SKR51_Validierung.csv'), sep=';', encoding='ansi', index=False)