planner_load.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import json
  2. from pathlib import Path
  3. class PlannerLoad:
  4. base_dir: Path
  5. account_values: list = None
  6. account_info: list = None
  7. plan_values: list = None
  8. marketing_values: list = None
  9. structure: list
  10. config = {
  11. 'department': [1, 2, 3, 10, 30, 40, 50, 55, 81, 82],
  12. 'translation': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  13. 20, 21, 22, 23, 3, 4, 5, 6, 7, 4, 0, 4,
  14. 4, 4, 1, 4, 2, 4, 8, 9]
  15. }
  16. def __init__(self, base_dir: str):
  17. self.base_dir = Path(base_dir)
  18. def new_file(self, year: str):
  19. with open(self.base_dir.joinpath(f'accounts_{year}.json'), 'r') as frh:
  20. self.account_values = json.load(frh)['values']
  21. with open(self.base_dir.joinpath(f'planning_{year}.json'), 'r') as frh:
  22. self.plan_values = json.load(frh)['values']
  23. with open(self.base_dir.joinpath(f'marketing_{year}.json'), 'r') as frh:
  24. self.marketing_values = json.load(frh)
  25. with open(self.base_dir.joinpath('gcstruct.json'), 'r') as frh:
  26. gcstruct = json.load(frh)
  27. self.account_info = dict([(a['Konto_Nr'], a) for a in gcstruct['accounts']])
  28. return self.convert_file(gcstruct['flat']['Struktur_FB'])
  29. def convert_file(self, structure_source):
  30. self.structure = []
  31. for s in structure_source:
  32. accts = s['accounts']
  33. s['accounts'] = []
  34. s['planlevel'] = (len(accts) > 0)
  35. self.structure.append(s)
  36. for a in accts:
  37. if type(a) == str:
  38. acct = {
  39. 'text': a + ' - ' + self.account_info[a]['Konto_Bezeichnung'],
  40. 'id': a,
  41. 'costcenter': self.account_info[a]['Konto_KST'],
  42. 'values': [],
  43. 'values2': None
  44. }
  45. else:
  46. acct = a
  47. a = acct['id']
  48. acct['id'] = s['id'].replace(';;', ';' + acct['text'] + ';', 1)
  49. s['children'].append(acct['id'])
  50. new_account = {
  51. "id": acct['id'],
  52. "text": acct['text'],
  53. "children": [],
  54. "children2": [],
  55. "parents": [s['id']] + s['parents'],
  56. "accounts": [a],
  57. "costcenter": acct['costcenter'],
  58. "level": s['level'] + 1,
  59. "drilldown": False,
  60. "form": s['form'],
  61. "accountlevel": False,
  62. "absolute": True,
  63. "seasonal": True,
  64. "status": "0",
  65. "values": acct['values'],
  66. "values2": acct['values2']
  67. }
  68. self.structure.append(new_account)
  69. for s in self.structure:
  70. s['values2'] = self.get_values2(s)
  71. s['options'] = self.get_options(s)
  72. del s['accountlevel']
  73. del s['absolute']
  74. del s['seasonal']
  75. del s['status']
  76. s['sumvalues'] = [0] * 30
  77. return self.structure
  78. def get_values2(self, s):
  79. a_values = {}
  80. m_values = {}
  81. if s['accounts'] and s['values2'] is None:
  82. a_values = self.account_values.get(s['accounts'][0], dict())
  83. m_values = self.marketing_values.get(s['accounts'][0], dict())
  84. p_values = {}
  85. if self.plan_values is not None:
  86. p_values = self.plan_values.get(s['id'], dict())
  87. values = dict([(str(d), [0] * 30) for d in self.config['department']])
  88. for d in values.keys():
  89. if s['values2'] is not None and d in s['values2']:
  90. if len(s['values2'][d]) == 30:
  91. values[d] = s['values2'][d]
  92. else:
  93. values[d] = [s['values2'][d][i] if 0 <= i < len(s['values2'][d]) else 0
  94. for i in self.config['translation']]
  95. if d in p_values:
  96. for i, v in enumerate(p_values[d], 28):
  97. values[d][i] = v
  98. if d in a_values:
  99. for i, v in enumerate(a_values[d], 20):
  100. values[d][i] = v
  101. if d in m_values:
  102. for i, v in enumerate(m_values[d], 1):
  103. values[d][i] = v
  104. values[d][0] = sum(m_values[d])
  105. values[d][14] = sum(m_values[d])
  106. return values
  107. def convert_values2(self, s):
  108. a_values = {}
  109. if s['accounts']:
  110. a_values = self.account_values.get(s['accounts'][0], dict())
  111. p_values = self.plan_values.get(s['id'], dict())
  112. values = dict([(str(d), [0] * 30) for d in self.config['department']])
  113. for d in values.keys():
  114. if d in s['values2']:
  115. if len(s['values2'][d]) == 30:
  116. values[d] = s['values2'][d]
  117. else:
  118. values[d] = [s['values2'][d].get(i, 0) for i in self.config['translation']]
  119. if d in p_values:
  120. for i, v in enumerate(p_values[d], 28):
  121. values[d][i] = v
  122. if d in a_values:
  123. for i, v in enumerate(a_values[d], 20):
  124. values[d][i] = v
  125. return values
  126. def get_options(self, s):
  127. status = "0"
  128. seasonal = True
  129. absolute = True
  130. planlevel = False
  131. if isinstance(s['absolute'], bool):
  132. absolute = s['absolute']
  133. s['absolute'] = {}
  134. if isinstance(s['seasonal'], bool):
  135. seasonal = s['seasonal']
  136. s['seasonal'] = {}
  137. if isinstance(s['status'], str):
  138. status = s['status']
  139. s['status'] = {}
  140. if 'planlevel' in s:
  141. planlevel = s['planlevel']
  142. opts = dict([(str(d), {
  143. 'absolute': absolute,
  144. 'seasonal': seasonal,
  145. 'status': status,
  146. 'planlevel': planlevel
  147. }) for d in self.config['department']])
  148. for d in opts.keys():
  149. if d in s['absolute']:
  150. opts[d]['absolute'] = s['absolute'][d]
  151. if d in s['seasonal']:
  152. opts[d]['seasonal'] = s['seasonal'][d]
  153. if d in s['status']:
  154. opts[d]['status'] = s['status'][d]
  155. return opts
  156. if __name__ == '__main__':
  157. planner_dir = Path(__file__).parent.parent.joinpath('export')
  158. p_load = PlannerLoad(planner_dir)
  159. print(p_load.convert_file(
  160. json.load(open(planner_dir.joinpath('2022_V1.json'), 'r'))
  161. )[12])