diff --git a/delivery_fedex_hibou/models/delivery_fedex.py b/delivery_fedex_hibou/models/delivery_fedex.py index f67012d5..b5f4b357 100644 --- a/delivery_fedex_hibou/models/delivery_fedex.py +++ b/delivery_fedex_hibou/models/delivery_fedex.py @@ -42,6 +42,8 @@ class DeliveryFedex(models.Model): if not third_party_account.delivery_type == 'fedex': raise ValidationError('Non-FedEx Shipping Account indicated during FedEx shipment.') return third_party_account.name + if picking and picking.picking_type_id.warehouse_id.fedex_account_number: + return picking.picking_type_id.warehouse_id.fedex_account_number return self.fedex_account_number def _get_fedex_account_number(self, order=None, picking=None): @@ -668,3 +670,27 @@ class DeliveryFedex(models.Model): ('fedex_service_type', '=', service_code) ], limit=1) return carrier + + def fedex_cancel_shipment(self, picking): + request = FedexRequest(self.log_xml, request_type="shipping", prod_environment=self.prod_environment) + superself = self.sudo() + request.web_authentication_detail(superself.fedex_developer_key, superself.fedex_developer_password) + acc_number = superself._get_fedex_account_number(picking=picking) + meter_number = superself._get_fedex_meter_number(picking=picking) + request.client_detail(acc_number, meter_number) + request.transaction_detail(picking.id) + + master_tracking_id = picking.carrier_tracking_ref.split(',')[0] + request.set_deletion_details(master_tracking_id) + result = request.delete_shipment() + + warnings = result.get('warnings_message') + if warnings: + _logger.info(warnings) + + if result.get('delete_success') and not result.get('errors_message'): + picking.message_post(body=_(u'Shipment N° %s has been cancelled' % master_tracking_id)) + picking.write({'carrier_tracking_ref': '', + 'carrier_price': 0.0}) + else: + raise UserError(result['errors_message']) diff --git a/delivery_hibou/models/delivery.py b/delivery_hibou/models/delivery.py index c3749c90..755593ce 100644 --- a/delivery_hibou/models/delivery.py +++ b/delivery_hibou/models/delivery.py @@ -284,7 +284,7 @@ class ChooseDeliveryPackage(models.TransientModel): return 0.0 if self.env.context.get('default_stock_quant_package_id'): stock_quant_package = self.env['stock.quant.package'].browse(self.env.context['default_stock_quant_package_id']) - return stock_quant_package.package_declared_value + return stock_quant_package.declared_value else: picking_id = self.env['stock.picking'].browse(self.env.context['active_id']) move_line_ids = [po for po in picking_id.move_line_ids if po.qty_done > 0 and not po.result_package_id] @@ -293,7 +293,7 @@ class ChooseDeliveryPackage(models.TransientModel): @api.onchange('package_declared_value') def _onchange_package_declared_value(self): - picking = self.env['stock.picking'].browse(self.env.context['active_id']) + picking = self.env['stock.picking'].browse(self.env.context.get('active_id', 0)) value = self.package_declared_value if picking.require_insurance == 'auto': self.package_require_insurance = value and picking.carrier_id.automatic_insurance_value and value >= picking.carrier_id.automatic_insurance_value diff --git a/sale_planner/wizard/order_planner.py b/sale_planner/wizard/order_planner.py index 6f99aa93..95273ec9 100644 --- a/sale_planner/wizard/order_planner.py +++ b/sale_planner/wizard/order_planner.py @@ -29,10 +29,17 @@ class FakeCollection(): yield v def filtered(self, f): - return filter(f, self.vals) + return self.__class__([v for v in self.vals if f(v)]) + + def mapped(self, s): + # note this only maps to one level and doesn't really support recordset + return [v[s] for v in self.vals] + + def sudo(self, *args, **kwargs): + return self -class FakePartner(): +class FakePartner(FakeCollection): def __init__(self, **kwargs): """ 'delivery.carrier'.verify_carrier(contact) -> @@ -95,7 +102,7 @@ class FakePartner(): return getattr(self, item) -class FakeOrderLine(): +class FakeOrderLine(FakeCollection): def __init__(self, **kwargs): """ 'delivery.carrier'.get_price_available(order) -> @@ -133,7 +140,7 @@ class FakeOrderLine(): return getattr(self, item) -class FakeSaleOrder(): +class FakeSaleOrder(FakeCollection): """ partner_id :: used in shipping partner_shipping_id :: is used in several places @@ -694,7 +701,7 @@ class SaleOrderMakePlan(models.TransientModel): if has_error: continue order_fake.warehouse_id = warehouses.filtered(lambda wh: wh.id == wh_id) - order_fake.order_line = FakeCollection(filter(lambda line: line.product_id.id in wh_vals['product_ids'], original_order_fake_order_line)) + order_fake.order_line = FakeCollection(list(filter(lambda line: line.product_id.id in wh_vals['product_ids'], original_order_fake_order_line))) wh_carrier_options = self._generate_shipping_carrier_option(wh_vals, order_fake, carrier) if not wh_carrier_options: has_error = True