mazda_export.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import json
  2. from datetime import datetime
  3. import numpy as np
  4. import pandas as pd
  5. from dateutil.relativedelta import relativedelta
  6. base_dir = "C:/projekte/mazda/"
  7. def date_format(d: datetime):
  8. if d == 0:
  9. return "" # '0000-00-00T00:00:00.000Z'
  10. date_str = d.isoformat(sep="T")
  11. if len(date_str) == 19:
  12. return date_str + ".000Z"
  13. return date_str[:-3] + "Z"
  14. def convert_csv(import_csv, export_json, year, month):
  15. date_min = datetime(year, month, 5, 0, 0, 0)
  16. date_max = datetime(year, month, 5, 0, 0, 0) + relativedelta(days=5)
  17. date_cols = ["invoiceDate", "orderDate", "orderCompletionDate", "vehicleIntakeDate", "nextMotDueDate"]
  18. df = pd.read_csv(import_csv, encoding="latin-1", decimal=",", sep=";", parse_dates=date_cols)
  19. df = df.fillna(0) # [(df["invoiceDate"] >= date_min) & (df["invoiceDate"] <= date_max)]
  20. df = df.sort_values(by=["invoiceDate", "invoiceNumber", "orderNumber", "lineNumber"])
  21. df["vin"] = np.where(df["vin"] == 0, "0" * 17, df["vin"])
  22. # print(df[['currency','documentType','invoiceCategory','invoiceDate','invoiceNumber']].drop_duplicates().info())
  23. invoices_filter = ["currency", "documentType", "invoiceCategory", "invoiceDate", "invoiceNumber"]
  24. invoices = df[invoices_filter].drop_duplicates().to_dict("records")
  25. invoice_items_filter = [
  26. "invoiceNumber",
  27. "orderLineNumber",
  28. "orderNumber",
  29. "amount",
  30. "discount",
  31. "portion",
  32. "unitPrice",
  33. ]
  34. invoice_items = df[invoice_items_filter].groupby("invoiceNumber")
  35. for invoice in invoices:
  36. invoice["invoiceDate"] = date_format(invoice["invoiceDate"])
  37. items = invoice_items.get_group(invoice["invoiceNumber"])
  38. items.pop("invoiceNumber")
  39. invoice["invoiceItems"] = items.to_dict("records")
  40. orders = (
  41. df[["orderNumber", "orderDate", "orderCompletionDate", "vehicleIntakeDate"]]
  42. .drop_duplicates()
  43. .to_dict("records")
  44. )
  45. orders_vehicle_filter = ["orderNumber", "licensePlate", "nextMotDueDate", "odometer", "odometerUnit", "vin"]
  46. orders_vehicle = df[orders_vehicle_filter].drop_duplicates().groupby("orderNumber")
  47. orders_items = (
  48. df[
  49. [
  50. "orderNumber",
  51. "lineNumber",
  52. "orderItemType",
  53. "category",
  54. "descriptionOperation",
  55. "hours",
  56. "operationCode",
  57. "standardHours",
  58. "descriptionOther",
  59. "type",
  60. "descriptionPart",
  61. "isDamageCausal",
  62. "manufacturer",
  63. "partNumber",
  64. "quantity",
  65. "serialNumber",
  66. "unit",
  67. "company",
  68. "descriptionPurchase",
  69. "invoiceCode",
  70. "invoiceDate",
  71. "invoiceNumber",
  72. ]
  73. ]
  74. .drop_duplicates()
  75. .groupby("orderNumber")
  76. )
  77. for order in orders:
  78. order["vehicle"] = orders_vehicle.get_group(order["orderNumber"]).to_dict("records")[0]
  79. order["vehicle"]["nextMotDueDate"] = date_format(order["vehicle"]["nextMotDueDate"])
  80. # odo_str = str(order["vehicle"]["odometer"])
  81. order["vehicle"]["odometer"] = int(order["vehicle"]["odometer"])
  82. order["orderDate"] = date_format(order["orderDate"])
  83. order["orderCompletionDate"] = date_format(order["orderCompletionDate"])
  84. order["vehicleIntakeDate"] = date_format(order["vehicleIntakeDate"])
  85. items = orders_items.get_group(order["orderNumber"]).to_dict("records")
  86. order["items"] = []
  87. for item in items:
  88. if item["orderItemType"] == "operation":
  89. order["items"].append(
  90. {
  91. "lineNumber": item["lineNumber"],
  92. "operation": {
  93. "category": item["category"],
  94. "description": item["descriptionOperation"],
  95. "hours": item["hours"],
  96. "operationCode": item["operationCode"],
  97. "standardHours": item["standardHours"],
  98. },
  99. }
  100. )
  101. elif item["orderItemType"] == "part":
  102. order["items"].append(
  103. {
  104. "lineNumber": item["lineNumber"],
  105. "part": {
  106. "description": item["descriptionPart"],
  107. "isDamageCausal": item["isDamageCausal"],
  108. "manufacturer": item["manufacturer"],
  109. "partNumber": item["partNumber"],
  110. "quantity": item["quantity"],
  111. "serialNumber": str(item["serialNumber"]),
  112. "unit": "pcs",
  113. },
  114. }
  115. )
  116. elif item["orderItemType"] == "other":
  117. order["items"].append(
  118. {
  119. "lineNumber": item["lineNumber"],
  120. "other": {"description": item["descriptionOther"], "type": item["type"]},
  121. }
  122. )
  123. else:
  124. order["items"].append(
  125. {
  126. "lineNumber": item["lineNumber"],
  127. "purchaseInvoice": {
  128. "company": item["company"],
  129. "description": item["descriptionPurchase"],
  130. "invoiceCode": item["invoiceCode"],
  131. "invoiceDate": date_format(item["invoiceDate"]),
  132. "invoiceNumber": item["invoiceNumber"],
  133. },
  134. }
  135. )
  136. res = {
  137. "creationDate": date_format(datetime.now()),
  138. "invoices": invoices,
  139. "orders": orders,
  140. "timeRangeBegin": date_format(date_min),
  141. "timeRangeEnd": date_format(date_max),
  142. }
  143. # json.dump(res, open(export_json, "w"), indent=2)
  144. return res
  145. def export_orders(data, export_dir):
  146. dt = datetime.now()
  147. timestamp = dt.strftime("%Y%m%d_%H%M%S")
  148. invoices = data["invoices"]
  149. orders = data["orders"]
  150. data["invoices"] = []
  151. data["orders"] = []
  152. for order in orders:
  153. order_date = order["orderDate"]
  154. data["creationDate"] = order_date
  155. data["timeRangeBegin"] = order_date
  156. data["timeRangeEnd"] = order_date
  157. period = order_date[:4] + order_date[5:7]
  158. data["orders"] = [order]
  159. order_no = order["orderNumber"]
  160. data["invoices"] = [i for i in invoices if i["invoiceItems"][0]["orderNumber"] == order_no]
  161. json.dump(data, open(f"{export_dir}/order-report_{order_no}_{period}_{timestamp}.json", "w"), indent=2)
  162. def main():
  163. data = convert_csv(
  164. base_dir + "data/Workshop_Order_Report.csv", base_dir + "export/Mazda/temp/mazda_export.json", 2024, 1
  165. )
  166. export_orders(data, base_dir + "export/Mazda/temp")
  167. if __name__ == "__main__":
  168. main()