mazda-upload.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import pandas as pd
  2. import json
  3. import requests
  4. from oauthlib.oauth2 import BackendApplicationClient, OAuth2Session
  5. from datetime import datetime
  6. domain = 'https://mappsacc.mazdaeur.com'
  7. # Production Server 'https://mapps.mazdaeur.com'
  8. webservice = domain + '/dogma-restapi-dms/api'
  9. module = '/vehicles/workshop/order-report'
  10. auth_url = domain + '/oauth/authorize'
  11. token_url = domain + '/oauth/token'
  12. client_id = ''
  13. api_key = ''
  14. user = 'mmd88888.cdk'
  15. password = ''
  16. dealer_number = '11197/MMD' # Example '10030/MMD'
  17. # token = 'MDDq3CUd9ix0iSqR'
  18. def date_format(d):
  19. return d.isoformat() + "Z"
  20. def convert_csv(csv_file, json_file):
  21. date_cols = ['invoiceDate', 'orderDate', 'orderCompletionDate', 'vehicleIntakeDate', 'nextMotDueDate']
  22. df = pd.read_csv(csv_file, encoding='ansi', decimal=',', sep=';', parse_dates=date_cols)
  23. # print(df[['currency','documentType','invoiceCategory','invoiceDate','invoiceNumber']].drop_duplicates().info())
  24. invoices = df[['currency', 'documentType', 'invoiceCategory', 'invoiceDate', 'invoiceNumber']].drop_duplicates().to_dict('records')
  25. invoice_items = df[['invoiceNumber', 'orderLineNumber', 'orderNumber', 'amount', 'discount', 'portion', 'unitPrice']].groupby('invoiceNumber')
  26. for invoice in invoices:
  27. invoice['invoiceDate'] = date_format(invoice['invoiceDate'])
  28. items = invoice_items.get_group(invoice['invoiceNumber'])
  29. items.pop('invoiceNumber')
  30. invoice['invoiceItems'] = items.to_dict('records')
  31. orders = df[['orderNumber', 'orderDate', 'orderCompletionDate', 'vehicleIntakeDate']].drop_duplicates().to_dict('records')
  32. orders_vehicle = df[['orderNumber', 'licensePlate', 'nextMotDueDate', 'odometer', 'odometerUnit', 'vin']].drop_duplicates().groupby('orderNumber')
  33. orders_items = df[[
  34. 'orderNumber', 'lineNumber',
  35. 'category', 'description', 'hours', 'operationCode', 'standardHours',
  36. 'description.1', 'type',
  37. 'description.2', 'isDamageCausal', 'manufacturer', 'partNumber', 'quantity', 'serialNumber', 'unit',
  38. 'company', 'description.3', 'invoiceCode', 'invoiceDate', 'invoiceNumber'
  39. ]].drop_duplicates().groupby('orderNumber')
  40. for order in orders:
  41. order['vehicle'] = orders_vehicle.get_group(order['orderNumber']).to_dict('records')[0]
  42. order['vehicle']['nextMotDueDate'] = date_format(order['vehicle']['nextMotDueDate'])
  43. order['orderDate'] = date_format(order['orderDate'])
  44. order['orderCompletionDate'] = date_format(order['orderCompletionDate'])
  45. order['vehicleIntakeDate'] = date_format(order['vehicleIntakeDate'])
  46. items = orders_items.get_group(order['orderNumber']).to_dict('records')
  47. order['items'] = []
  48. for item in items:
  49. order['items'].append({
  50. 'lineNumber': item['lineNumber'],
  51. 'operation': {
  52. 'category': item['category'],
  53. 'description': item['description'],
  54. 'hours': item['hours'],
  55. 'operationCode': item['operationCode'],
  56. 'standardHours': item['standardHours']
  57. },
  58. 'other': {
  59. 'description': item['description.1'],
  60. 'type': item['type']
  61. },
  62. 'part': {
  63. 'description': item['description.2'],
  64. 'isDamageCausal': item['isDamageCausal'],
  65. 'manufacturer': item['manufacturer'],
  66. 'partNumber': item['partNumber'],
  67. 'quantity': item['quantity'],
  68. 'serialNumber': item['serialNumber'],
  69. 'unit': item['unit']
  70. },
  71. 'purchaseInvoice': {
  72. 'company': item['company'],
  73. 'description': item['description.3'],
  74. 'invoiceCode': item['invoiceCode'],
  75. 'invoiceDate': date_format(item['invoiceDate']),
  76. 'invoiceNumber': item['invoiceNumber']
  77. }
  78. })
  79. date_min = str(df['invoiceDate'].min()) + 'T00:00:00.000Z'
  80. date_max = str(df['invoiceDate'].max()) + 'T00:00:00.000Z'
  81. res = {
  82. 'creationDate': str(datetime.now()),
  83. 'invoices': invoices,
  84. 'orders': orders,
  85. 'timeRangeBegin': date_min,
  86. 'timeRangeEnd': date_max
  87. }
  88. json.dump(res, open(json_file, 'w'), indent=2)
  89. return res
  90. def upload(data):
  91. headers = {
  92. 'accept': 'application/vnd.mazdaeur.dms.v3+json',
  93. 'x-mme-organisation': dealer_number,
  94. 'X-mazda-org': dealer_number,
  95. 'Content-Type': 'application/json',
  96. # 'Authorization': 'Bearer ' + token
  97. }
  98. client = BackendApplicationClient(client_id=client_id)
  99. oauth = OAuth2Session(client=client)
  100. authorization_url, state = oauth.authorization_url(auth_url)
  101. print('Please go here and authorize: ' + authorization_url)
  102. redirect_response = input('Paste the full redirect URL here:')
  103. token = oauth.fetch_token(token_url=auth_url, client_id=client_id, client_secret=api_key, authorization_response=redirect_response)
  104. s = requests.Session()
  105. s.auth = (user, password)
  106. s.headers.update(headers)
  107. # r = s.post(webservice + module, data=data)
  108. r = s.get(auth_url + '?response_type=code&client_id=globalcube&state=xyz&scope=write', token)
  109. print(r.text)
  110. r = s.post(token_url, data={'grant_type': 'authorization_code', 'code': ''})
  111. print(r.text)
  112. def main():
  113. # data = convert_csv('nasa/Workshop_Order_Report.csv', 'nasa/mazda_export.json')
  114. data = json.load(open('nasa/mazda_export.json', 'r'))
  115. upload(data)
  116. if __name__ == '__main__':
  117. main()