planner_load.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import json
  2. from pathlib import Path
  3. class PlannerLoad:
  4. base_dir: Path
  5. account_values: list
  6. account_info: list
  7. structure: list
  8. config = {
  9. 'department': [1, 2, 3, 10, 30, 40, 50, 55, 81, 82],
  10. 'translation': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  11. 20, 21, 22, 23, 3, 4, 5, 6, 7, 4, 0, 4,
  12. 1, 4, 2, 4, 4, 4, 8, 9]
  13. }
  14. def __init__(self, base_dir: str):
  15. self.base_dir = Path(base_dir)
  16. def new_file(self, year: str):
  17. with open(self.base_dir.joinpath(f'accounts_{year}.json'), 'r') as frh:
  18. self.account_values = json.load(frh)['values']
  19. with open(self.base_dir.joinpath(f'planning_{year}.json'), 'r') as frh:
  20. self.plan_values = json.load(frh)['values']
  21. with open(self.base_dir.joinpath('gcstruct.json'), 'r') as frh:
  22. gcstruct = json.load(frh)
  23. self.account_info = dict([(a['Konto_Nr'], a) for a in gcstruct['accounts']])
  24. structure_source = gcstruct['flat']['Struktur_FB']
  25. self.structure = []
  26. for s in structure_source:
  27. accts = s['accounts']
  28. s['accounts'] = []
  29. s['planlevel'] = (len(accts) > 0)
  30. self.structure.append(s)
  31. for a in accts:
  32. acct_text: str = a + ' - ' + self.account_info[a]['Konto_Bezeichnung']
  33. acct_id = s['id'].replace(';;', ';' + acct_text + ';', 1)
  34. s['children'].append(acct_id)
  35. new_account = {
  36. "id": acct_id,
  37. "text": acct_text,
  38. "children": [],
  39. "children2": [],
  40. "parents": [s['id']] + s['parents'],
  41. "accounts": [a],
  42. "costcenter": self.account_info[a]['Kostenstelle'],
  43. "level": s['level'] + 1,
  44. "drilldown": False,
  45. "form": s['form'],
  46. "accountlevel": False,
  47. "absolute": True,
  48. "seasonal": True,
  49. "status": "0",
  50. "values": [],
  51. "values2": {}
  52. }
  53. self.structure.append(new_account)
  54. for s in self.structure:
  55. s['values2'] = self.get_values2(s)
  56. s['options'] = self.get_options(s)
  57. del s['accountlevel']
  58. del s['absolute']
  59. del s['seasonal']
  60. del s['status']
  61. s['sumvalues'] = [0] * 30
  62. return self.structure
  63. def get_values2(self, s):
  64. a_values = {}
  65. if s['accounts']:
  66. a_values = self.account_values.get(s['accounts'][0], dict())
  67. p_values = self.plan_values.get(s['id'], dict())
  68. values = dict([(str(d), [0] * 30) for d in self.config['department']])
  69. for d in values.keys():
  70. if d in s['values2']:
  71. if len(s['values2'][d]) == 30:
  72. values[d] = s['values2'][d]
  73. else:
  74. values[d] = [s['values2'][d].get(i, 0) for i in self.config['translation']]
  75. if d in p_values:
  76. for i, v in enumerate(p_values[d], 28):
  77. values[d][i] = v
  78. if d in a_values:
  79. for i, v in enumerate(a_values[d], 20):
  80. values[d][i] = v
  81. return values
  82. def get_options(self, s):
  83. status = "0"
  84. seasonal = True
  85. absolute = True
  86. planlevel = False
  87. if isinstance(s['absolute'], bool):
  88. absolute = s['absolute']
  89. s['absolute'] = {}
  90. if isinstance(s['seasonal'], bool):
  91. seasonal = s['seasonal']
  92. s['seasonal'] = {}
  93. if isinstance(s['status'], str):
  94. status = s['status']
  95. s['status'] = {}
  96. if 'planlevel' in s:
  97. planlevel = s['planlevel']
  98. opts = dict([(str(d), {
  99. 'absolute': absolute,
  100. 'seasonal': seasonal,
  101. 'status': status,
  102. 'planlevel': planlevel
  103. }) for d in self.config['department']])
  104. for d in opts.keys():
  105. if d in s['absolute']:
  106. opts[d]['absolute'] = s['absolute'][d]
  107. if d in s['seasonal']:
  108. opts[d]['seasonal'] = s['seasonal'][d]
  109. if d in s['status']:
  110. opts[d]['status'] = s['status'][d]
  111. return opts
  112. if __name__ == '__main__':
  113. planner_dir = Path(__file__).parent.parent.joinpath('export')
  114. p_load = PlannerLoad(planner_dir)
  115. print(p_load.new_file('2022')[12])