1
1
# Copyright 2020 Hunki Enterprises BV
2
2
# Copyright 2021-2022 Tecnativa - Víctor Martínez
3
+ # Copyright 2023 ForgeFlow, S.L. - Jordi Ballester
4
+ # Copyright 2024 Sygel - Manuel Regidor
3
5
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
6
+
4
7
from odoo import fields , models
5
8
6
9
from .ups_request import UpsRequest
9
12
class DeliveryCarrier (models .Model ):
10
13
_inherit = "delivery.carrier"
11
14
12
- delivery_type = fields .Selection (selection_add = [("ups" , "UPS" )])
15
+ delivery_type = fields .Selection (
16
+ selection_add = [("ups" , "UPS" )],
17
+ ondelete = {
18
+ "ups" : lambda recs : recs .write ({"delivery_type" : "fixed" , "fixed_price" : 0 })
19
+ },
20
+ )
13
21
ups_file_format = fields .Selection (
14
- selection = [("GIF" , "PDF " ), ("ZPL" , "ZPL" ), ("EPL" , "EPL" ), ("SPL" , "SPL" )],
22
+ selection = [("GIF" , "GIF " ), ("ZPL" , "ZPL" ), ("EPL" , "EPL" ), ("SPL" , "SPL" )],
15
23
default = "GIF" ,
16
24
string = "File format" ,
17
25
)
18
- ups_ws_username = fields .Char (string = "Username WS" )
19
- ups_ws_password = fields .Char (string = "Password WS" )
20
- ups_access_license = fields .Char (string = "Access license number" )
21
26
ups_shipper_number = fields .Char (string = "Shipper number" )
22
27
ups_service_code = fields .Selection (
23
28
selection = [
@@ -79,11 +84,61 @@ class DeliveryCarrier(models.Model):
79
84
"webservice (you will necessary to activate tracking API)" ,
80
85
)
81
86
ups_use_packages_from_picking = fields .Boolean (string = "Use packages from picking" )
87
+ ups_client_id = fields .Char ()
88
+ ups_client_secret = fields .Char ()
89
+ ups_token = fields .Char ()
90
+ ups_token_expiration_date = fields .Datetime (readonly = True )
91
+ ups_cash_on_delivery = fields .Boolean (string = "UPS Cash On Delivery" )
92
+ ups_cod_funds_code = fields .Selection (
93
+ selection = [("1" , "Cash" ), ("9" , "Check/Cashier Check/Money Order" )],
94
+ string = "UPS Cod Funds Code" ,
95
+ )
82
96
83
- def ups_test_call (self , order ):
97
+ def _ups_get_response_price (self , total_charges , currency , company ):
98
+ """We need to convert the price if the currency is different."""
99
+ price = float (total_charges ["MonetaryValue" ])
100
+ if total_charges ["CurrencyCode" ] != currency .name :
101
+ price = currency ._convert (
102
+ price ,
103
+ self .env ["res.currency" ].search (
104
+ [("name" , "=" , total_charges ["CurrencyCode" ])]
105
+ ),
106
+ company ,
107
+ fields .Date .today (),
108
+ )
109
+ return price
110
+
111
+ def ups_rate_shipment (self , order ):
112
+ ups_request = UpsRequest (self )
113
+ response = ups_request .rate_shipment (order )
114
+ price = self ._ups_get_response_price (
115
+ response , order .currency_id , order .company_id
116
+ )
117
+ return {
118
+ "success" : True ,
119
+ "price" : price ,
120
+ "error_message" : False ,
121
+ "warning_message" : False ,
122
+ }
123
+
124
+ def ups_create_shipping (self , picking ):
125
+ """Send packages of the picking to UPS
126
+ return a list of dicts {'exact_price': 'tracking_number':}
127
+ suitable for delivery.carrier#send_shipping"""
84
128
self .ensure_one ()
85
129
ups_request = UpsRequest (self )
86
- return ups_request .test_call (order )
130
+ response = ups_request ._send_shipping (picking )
131
+ extra_price = self ._ups_get_response_price (
132
+ response ["price" ], picking .company_id .currency_id , picking .company_id
133
+ )
134
+ picking .carrier_tracking_ref = response ["ShipmentIdentificationNumber" ]
135
+ # Create label from response
136
+ self ._create_ups_label (picking , response ["labels" ])
137
+ # Return
138
+ return {
139
+ "exact_price" : extra_price ,
140
+ "tracking_number" : picking .carrier_tracking_ref ,
141
+ }
87
142
88
143
def ups_send_shipping (self , pickings ):
89
144
return [self .ups_create_shipping (p ) for p in pickings ]
@@ -97,21 +152,21 @@ def _prepare_ups_label_attachment(self, picking, values):
97
152
"res_id" : picking .id ,
98
153
}
99
154
100
- def _create_ups_label (self , picking , data ):
155
+ def _create_ups_label (self , picking , labels ):
101
156
val_list = []
102
- for PackageResult in data [ "PackageResults" ] :
103
- format_code = PackageResult [ "ShippingLabel" ][ "ImageFormat" ][ "Code " ].upper ()
157
+ for label in labels :
158
+ format_code = label [ "format_code " ].upper ()
104
159
attachment_name = "%s-%s.%s" % (
105
- picking .carrier_tracking_ref ,
160
+ label ["tracking_ref" ],
161
+ format_code ,
106
162
format_code ,
107
- ("txt" if format_code != "PDF" else "pdf" ),
108
163
)
109
164
val_list .append (
110
165
self ._prepare_ups_label_attachment (
111
166
picking ,
112
167
{
113
168
"name" : attachment_name ,
114
- "datas" : PackageResult [ "ShippingLabel" ][ "GraphicImage " ],
169
+ "datas" : label [ "datas " ],
115
170
},
116
171
)
117
172
)
@@ -133,33 +188,17 @@ def ups_get_label(self, carrier_tracking_ref):
133
188
)
134
189
return self ._create_ups_label (picking , response )
135
190
136
- def ups_create_shipping (self , picking ):
137
- """Send packages of the picking to UPS
138
- return a list of dicts {'exact_price': 'tracking_number':}
139
- suitable for delivery.carrier#send_shipping"""
140
- self .ensure_one ()
141
- ups_request = UpsRequest (self )
142
- response = ups_request ._send_shipping (picking )
143
- extra_price = self ._ups_get_response_price (
144
- response ["price" ], picking .company_id .currency_id , picking .company_id
145
- )
146
- picking .carrier_tracking_ref = response ["ShipmentIdentificationNumber" ]
147
- # Create label from response
148
- self ._create_ups_label (picking , response )
149
- # Return
150
- return {
151
- "exact_price" : extra_price ,
152
- "tracking_number" : picking .carrier_tracking_ref ,
153
- }
154
-
155
191
def ups_get_tracking_link (self , picking ):
156
192
return "https://ups.com/WebTracking/track?trackingNumber=%s" % (
157
193
picking .carrier_tracking_ref
158
194
)
159
195
160
196
def ups_cancel_shipment (self , pickings ):
161
197
ups_request = UpsRequest (self )
162
- return ups_request .cancel_shipment (pickings )
198
+ for picking in pickings .filtered (lambda a : a .carrier_tracking_ref ):
199
+ if ups_request .cancel_shipment (pickings ):
200
+ picking .write ({"tracking_state_history" : False })
201
+ return True
163
202
164
203
def ups_tracking_state_update (self , picking ):
165
204
self .ensure_one ()
@@ -172,29 +211,7 @@ def ups_tracking_state_update(self, picking):
172
211
picking .delivery_state = response ["delivery_state" ]
173
212
picking .tracking_state_history = response ["tracking_state_history" ]
174
213
175
- def ups_rate_shipment (self , order ):
214
+ def ups_update_token (self ):
215
+ self .ensure_one ()
176
216
ups_request = UpsRequest (self )
177
- response = ups_request .rate_shipment (order )
178
- price = self ._ups_get_response_price (
179
- response , order .currency_id , order .company_id
180
- )
181
- return {
182
- "success" : True ,
183
- "price" : price ,
184
- "error_message" : False ,
185
- "warning_message" : False ,
186
- }
187
-
188
- def _ups_get_response_price (self , total_charges , currency , company ):
189
- """We need to convert the price if the currency is different."""
190
- price = float (total_charges ["MonetaryValue" ])
191
- if total_charges ["CurrencyCode" ] != currency .name :
192
- price = currency ._convert (
193
- price ,
194
- self .env ["res.currency" ].search (
195
- [("name" , "=" , total_charges ["CurrencyCode" ])]
196
- ),
197
- company ,
198
- fields .Date .today (),
199
- )
200
- return price
217
+ ups_request ._get_new_token ()
0 commit comments