crewmeister.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import requests
  2. import pandas as pd
  3. import datetime
  4. from colorama import Fore
  5. from colorama import Style
  6. def pt_to_hours(x):
  7. delta = int(x[2:-1]) / 3600
  8. return round(delta, 2)
  9. # return str(round(delta)) + ":" + str(round((delta - round(delta)) * 60))
  10. def identity(x):
  11. return x
  12. def type_id(x):
  13. if x == 1:
  14. return "Urlaub"
  15. if x == 2:
  16. return "Krank"
  17. if x == 3:
  18. return "Freizeit"
  19. return "anwesend"
  20. class crewmeister:
  21. webservice = "https://api.crewmeister.com/api/v2"
  22. user_name = "bedner@global-cube.de"
  23. user_pass = "7pmicg1w"
  24. crew_id = "26515"
  25. suffix_count = 0
  26. def auth(self):
  27. cookies = {}
  28. r = requests.post(self.webservice + "/user/authentication", {'userIdentifier': self.user_name, 'password': self.user_pass})
  29. payload = r.json()['payload']
  30. cookies['cmAuthenticationUserToken'] = payload['token']
  31. cookies['cmAuthenticationUserId'] = str(payload['id'])
  32. r = requests.post(self.webservice + "/crew/authentication", {'crewId': self.crew_id}, cookies=cookies)
  33. payload = r.json()['payload']
  34. cookies['cmAuthenticationCrewToken'] = payload['token']
  35. cookies['cmAuthenticationCrewId'] = payload['id']
  36. return cookies
  37. def userlist(self):
  38. r = requests.get(self.webservice + f"/crew/{self.crew_id}/member", cookies=self.cookies)
  39. return pd.DataFrame(r.json()['payload']).set_index("userId")
  40. def add_to_userlist(self, df):
  41. self.users = self.users.join(df, rsuffix="_" + str(self.suffix_count))
  42. self.suffix_count += 1
  43. def __init__(self):
  44. self.cookies = self.auth()
  45. self.users = self.userlist()
  46. def cm_request(self, querystring, params, cols):
  47. r = requests.get(self.webservice + querystring, params, cookies=self.cookies)
  48. try:
  49. df = pd.DataFrame(r.json()['payload'])
  50. if 'userId' not in df.columns:
  51. df['userId'] = df['groupBy'].map(lambda x: x['userId'])
  52. for (key, (col, map_fun)) in cols.items():
  53. df[key] = df[col].map(map_fun)
  54. items = list(cols.keys())
  55. items.append("userId")
  56. self.add_to_userlist(df.filter(items=items).set_index("userId"))
  57. return True
  58. except Exception as e:
  59. print(r.json())
  60. print(e)
  61. return self.zerofill(cols)
  62. def zerofill(self, cols):
  63. for key in cols.keys():
  64. self.users[key] = 0
  65. return False
  66. def statistics(self):
  67. timestamp = datetime.datetime.now().isoformat()
  68. today = timestamp[:10]
  69. first_of_year = today[:4] + "-01-01"
  70. end_of_year = today[:4] + "-12-31"
  71. prev_month = (datetime.date.fromisoformat(today[:7] + "-01") + datetime.timedelta(days=-1)).isoformat()[:10]
  72. r = requests.get(self.webservice + f"/crew/{self.crew_id}/time-tracking/stamps", {'startTime': timestamp, 'endTime': timestamp}, cookies=self.cookies)
  73. stamps = pd.DataFrame(r.json()['payload'])
  74. if len(stamps.index) > 0:
  75. self.add_to_userlist(stamps.query("timeAccount==1").groupby('userId').max())
  76. self.cm_request(f"/crew/{self.crew_id}/absence-management/absences", {'from': today, 'to': today}, {'absence_today': ("typeId", identity)})
  77. self.cm_request(f"/crew/{self.crew_id}/absence-management/absence-balances", {'date': first_of_year, 'typeId': 1}, {'absence_vac_prev': ("value", identity)})
  78. self.cm_request(f"/crew/{self.crew_id}/absence-management/absence-balances", {'date': today, 'typeId': 1}, {'absence_vacation': ("value", identity)})
  79. self.cm_request(f"/crew/{self.crew_id}/absence-management/absence-balances", {'date': end_of_year, 'typeId': 1}, {'absence_planned': ("value", identity)})
  80. self.cm_request(f"/crew/{self.crew_id}/duration-balances?groupBy%5B%5D=user_id&date%5B%5D={prev_month}", {}, {'duration_prev_month': ("value", pt_to_hours)})
  81. self.cm_request(f"/crew/{self.crew_id}/duration-balances?groupBy%5B%5D=user_id&date%5B%5D={today}", {}, {'duration_today': ("value", pt_to_hours)})
  82. return self.users
  83. if __name__ == '__main__':
  84. cm = crewmeister()
  85. user = cm.statistics().loc[86043]
  86. print("Gerade anwesend: " + user['clockInTimestamp'])
  87. print("geplante Abwesenheit heute: " + type_id(user['absence_today']))
  88. print("Urlaub Jahresanfang: " + str(user['absence_vac_prev']))
  89. print("Urlaub genommen: " + str(user['absence_vacation']))
  90. print("Urlaub geplant: " + str(user['absence_planned']))
  91. print("Überstunden Vormonat: " + str(user['duration_prev_month']))
  92. print("Überstunden aktuell: " + str(user['duration_today']))
  93. print(f"{Fore.GREEN}Test!{Style.RESET_ALL}")