@@ -33,25 +33,29 @@ def _generate_order_number(order):
3333def _generate_order_json (order , address_data ):
3434 order_json = {
3535 "test" : settings .GBF_TEST_FLAG ,
36- "orderNumber" : order .order_number ,
37- "shippingInfo" : {
38- "address" : {
39- "company" : f"{ address_data ['first_name' ] if 'first_name' in address_data else '' } { address_data ['last_name' ] if 'last_name' in address_data else '' } " ,
40- "addressLine1" : address_data ['street_1' ] if 'street_1' in address_data else '' ,
41- "addressLine2" : address_data ['street_2' ] if 'street_2' in address_data else '' , # in case we add this to redcap, we need to add
42- "city" : address_data ['city' ] if 'city' in address_data else '' ,
43- "state" : address_data ['state' ] if 'state' in address_data else '' ,
44- "zipCode" : address_data ['zip' ] if 'zip' in address_data else '' ,
45- "country" : settings .GBF_SHIPPING_COUNTRY ,
46- "phone" : address_data ['phone' ] if 'phone' in address_data else '' ,
47- "residential" : True # see GitHub discussion #19 (shipping address)
48- },
49- "shipMethod" : settings .GBF_SHIPPING_METHOD ,
50- },
51- "lineItems" : [
36+ "orders" : [
5237 {
53- "itemNumber" : settings .GBF_ITEM_NR ,
54- "itemQuantity" : settings .GBF_ITEM_QUANTITY ,
38+ "orderNumber" : order .order_number ,
39+ "shippingInfo" : {
40+ "address" : {
41+ "company" : f"{ address_data ['first_name' ] if 'first_name' in address_data else '' } { address_data ['last_name' ] if 'last_name' in address_data else '' } " ,
42+ "addressLine1" : address_data ['street_1' ] if 'street_1' in address_data else '' ,
43+ "addressLine2" : address_data ['street_2' ] if 'street_2' in address_data else '' , # in case we add this to redcap, we need to add
44+ "city" : address_data ['city' ] if 'city' in address_data else '' ,
45+ "state" : address_data ['state' ] if 'state' in address_data else '' ,
46+ "zipCode" : address_data ['zip' ] if 'zip' in address_data else '' ,
47+ "country" : settings .GBF_SHIPPING_COUNTRY ,
48+ "phone" : address_data ['phone' ] if 'phone' in address_data else '' ,
49+ "residential" : True # see GitHub discussion #19 (shipping address)
50+ },
51+ "shipMethod" : settings .GBF_SHIPPING_METHOD ,
52+ },
53+ "lineItems" : [
54+ {
55+ "itemNumber" : settings .GBF_ITEM_NR ,
56+ "itemQuantity" : settings .GBF_ITEM_QUANTITY ,
57+ }
58+ ]
5559 }
5660 ]
5761 }
@@ -79,9 +83,16 @@ def _place_order_with_GBF(order_json):
7983 logger .error ("Response from GBF:" )
8084 logger .error (response )
8185
86+ response_body = response .json ()
8287 if response .status_code != HTTPStatus .OK :
8388 logger .error ("Could not submit order to GBF." )
8489 logger .error (response )
90+ logger .error (response_body )
91+ return False
92+
93+ if "success" not in response_body or response_body ["success" ] != True :
94+ logger .error ("Could not submit order to GBF." )
95+ logger .error (response_body )
8596 return False
8697
8798 return True
@@ -93,13 +104,25 @@ def get_order_confirmations(order_numbers):
93104 - tracking numbers
94105 - return tracking numbers
95106
107+ GBF sends json like this:
108+ {
109+ "success": true,
110+ "dataArray": [
111+ {
112+ "format": "json",
113+ "data": "{\r \n \" ShippingConfirmations\" : [\r \n {\r \n \" OrderNumber\" : \" EDROP-00014\" ,\r \n \" Shipper\" : \" \" ,\r \n \" ShipVia\" : \" FedEx Ground\" ,\r \n \" ShipDate\" : \" 2025-01-23\" ,\r \n \" ClientID\" : \" \" ,\r \n \" Tracking\" : [\r \n \" 270000004830\" \r \n ],\r \n \" Items\" : [\r \n {\r \n \" ItemNumber\" : \" K-BAN-001\" ,\r \n \" SerialNumber\" : \" EV-05FCSG\" ,\r \n \" ShippedQty\" : 1,\r \n \" ReturnTracking\" : [\r \n \" XXXXXXXXXXXX\" \r \n ],\r \n \" TubeSerial\" : [\r \n \" SIHIRJT5786\" \r \n ]\r \n }\r \n ]\r \n }\r \n ]\r \n }"
114+ }
115+ ]
116+ }
117+
96118 Returns:
97119 - a dictionary of the form:
98120 {
99121 'EDROP-001': {
100122 'date_kit_shipped': '2023-01-12',
101123 'kit_tracking_n': ['outbound tracking 1', 'outbound tracking 2'],
102- 'return_tracking_n': ['inbound tracking', 'inbound tracking2']
124+ 'return_tracking_n': ['inbound tracking', 'inbound tracking2'],
125+ 'tube_serial_n': [tube serial1', 'tube serial2']
103126 }
104127 }
105128 """
@@ -108,20 +131,43 @@ def get_order_confirmations(order_numbers):
108131 try :
109132 response = requests .post (f"{ settings .GBF_URL } oap/api/confirm2" , data = content , headers = headers )
110133 response .raise_for_status () # Raises an exception for bad status codes
134+ logger .debug (response .json ())
111135 except requests .exceptions .HTTPError as err :
112136 logger .error (f"Could not get order confirmation from GBF." )
113137 logger .error (err )
114138 return None
115139
116- confirmations = response .json ()
140+ response_body = response .json ()
141+ # if for some reason GBF does not return a success response
142+ if response_body ['success' ] != True :
143+ logger .error ("GBF returned success is false." )
144+ logger .error (response_body )
145+
146+ if "dataArray" not in response_body or not response_body ["dataArray" ]:
147+ logger .info ("No GBF confirmations available." )
148+ return None
149+
150+ # GBF sends one object in a list in 'dataArray', so we'll use the first one
151+ data_object = response_body ["dataArray" ][0 ]
152+ if 'format' not in data_object or data_object ["format" ] != "json" :
153+ logger .error ("GBF did not send json back." )
154+ return None
155+
156+ if 'data' not in data_object or not data_object ["data" ]:
157+ logger .info ("No GBF confirmations available." )
158+ return None
159+
160+ confirmations = json .loads (data_object ["data" ])
117161 tracking_info = {}
118162 if "ShippingConfirmations" in confirmations :
119163 for shipping_confirmation in confirmations ['ShippingConfirmations' ]:
120164 tracking_info [shipping_confirmation ['OrderNumber' ]] = {
121165 'date_kit_shipped' : shipping_confirmation ['ShipDate' ],
122166 'kit_tracking_n' : shipping_confirmation ['Tracking' ],
123167 #filter for items with return tracking numbers and returns tracking numbers
124- 'return_tracking_n' : [return_track for item in shipping_confirmation ['Items' ] if 'ReturnTracking' in item for return_track in item ['ReturnTracking' ]]
168+ 'return_tracking_n' : [return_track for item in shipping_confirmation ['Items' ] if 'ReturnTracking' in item for return_track in item ['ReturnTracking' ]],
169+ #filter for items with return tracking numbers and returns tracking numbers
170+ 'tube_serial_n' : [tube_serial for item in shipping_confirmation ['Items' ] if 'TubeSerial' in item for tube_serial in item ['TubeSerial' ]]
125171 }
126172 return tracking_info
127173
0 commit comments