From 6d2ae036d3591ffcc24bb15fb283b35114d4b060 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 8 Feb 2022 10:43:30 -0800 Subject: [PATCH] [FIX] delivery_fedex_hibou,delivery_hibou,delivery_ups_hibou: FedEx per-warehouse account/meter, choose packaging 14 --- delivery_fedex_hibou/models/delivery_fedex.py | 2 + delivery_hibou/models/delivery.py | 68 ++++++++++++------- delivery_hibou/models/stock.py | 7 +- delivery_ups_hibou/models/delivery_ups.py | 19 +++--- .../models/ups_request_patch.py | 7 +- 5 files changed, 63 insertions(+), 40 deletions(-) diff --git a/delivery_fedex_hibou/models/delivery_fedex.py b/delivery_fedex_hibou/models/delivery_fedex.py index e4043106..0c6502fc 100644 --- a/delivery_fedex_hibou/models/delivery_fedex.py +++ b/delivery_fedex_hibou/models/delivery_fedex.py @@ -38,6 +38,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): diff --git a/delivery_hibou/models/delivery.py b/delivery_hibou/models/delivery.py index b138f17f..a0678350 100644 --- a/delivery_hibou/models/delivery.py +++ b/delivery_hibou/models/delivery.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from odoo.tools.float_utils import float_compare from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES from odoo.exceptions import UserError @@ -272,27 +273,29 @@ class DeliveryCarrier(models.Model): class ChooseDeliveryPackage(models.TransientModel): _inherit = 'choose.delivery.package' - package_declared_value = fields.Float(string='Declared Value', - default=lambda self: self._default_package_declared_value()) + package_declared_value = fields.Float(string='Declared Value') package_require_insurance = fields.Boolean(string='Require Insurance') package_require_signature = fields.Boolean(string='Require Signature') - def _default_package_declared_value(self): - # guard for install - if not self.env.context.get('active_id'): - 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 - 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] - total_value = sum([po.qty_done * po.product_id.standard_price for po in move_line_ids]) - return total_value + @api.model + def default_get(self, fields_list): + defaults = super().default_get(fields_list) + if 'package_declared_value' in fields_list: + picking = self.env['stock.picking'].browse(defaults.get('picking_id')) + move_line_ids = picking.move_line_ids.filtered(lambda m: + float_compare(m.qty_done, 0.0, precision_rounding=m.product_uom_id.rounding) > 0 + and not m.result_package_id + ) + total_value = 0.0 + for ml in move_line_ids: + qty = ml.product_uom_id._compute_quantity(ml.qty_done, ml.product_id.uom_id) + total_value += qty * ml.product_id.standard_price + defaults['package_declared_value'] = total_value + return defaults @api.onchange('package_declared_value') def _onchange_package_declared_value(self): - picking = self.env['stock.picking'].browse(self.env.context['active_id']) + picking = self.picking_id 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 @@ -303,11 +306,30 @@ class ChooseDeliveryPackage(models.TransientModel): else: self.package_require_signature = picking.require_signature == 'yes' - def put_in_pack(self): - super().put_in_pack() - if self.stock_quant_package_id: - self.stock_quant_package_id.write({ - 'declared_value': self.package_declared_value, - 'require_insurance': self.package_require_insurance, - 'require_signature': self.package_require_signature, - }) + def action_put_in_pack(self): + # Copied because `delivery_package` is not retained by reference or returned... + picking_move_lines = self.picking_id.move_line_ids + if not self.picking_id.picking_type_id.show_reserved and not self.env.context.get('barcode_view'): + picking_move_lines = self.picking_id.move_line_nosuggest_ids + + move_line_ids = picking_move_lines.filtered(lambda ml: + float_compare(ml.qty_done, 0.0, precision_rounding=ml.product_uom_id.rounding) > 0 + and not ml.result_package_id + ) + if not move_line_ids: + move_line_ids = picking_move_lines.filtered(lambda ml: float_compare(ml.product_uom_qty, 0.0, + precision_rounding=ml.product_uom_id.rounding) > 0 and float_compare(ml.qty_done, 0.0, + precision_rounding=ml.product_uom_id.rounding) == 0) + + delivery_package = self.picking_id._put_in_pack(move_line_ids) + # write shipping weight and product_packaging on 'stock_quant_package' if needed + if self.delivery_packaging_id: + delivery_package.packaging_id = self.delivery_packaging_id + if self.shipping_weight: + delivery_package.shipping_weight = self.shipping_weight + # Hibou : Fill additional fields. + delivery_package.write({ + 'declared_value': self.package_declared_value, + 'require_insurance': self.package_require_insurance, + 'require_signature': self.package_require_signature, + }) diff --git a/delivery_hibou/models/stock.py b/delivery_hibou/models/stock.py index c272ab46..27220a59 100644 --- a/delivery_hibou/models/stock.py +++ b/delivery_hibou/models/stock.py @@ -164,9 +164,10 @@ class StockPicking(models.Model): for carrier in carriers: carrier_packages = packages_with_carrier.filtered(lambda p: p.carrier_id == carrier) carrier.cancel_shipment(self, packages=carrier_packages) - package_refs = ','.join(carrier_packages.mapped('carrier_tracking_ref')) - msg = "Shipment %s cancelled" % package_refs - picking.message_post(body=msg) + # Above cancel should also say which are cancelled in chatter. + # package_refs = ','.join(carrier_packages.mapped('carrier_tracking_ref')) + # msg = "Shipment %s cancelled" % package_refs + # picking.message_post(body=msg) carrier_packages.write({'carrier_tracking_ref': False}) pickings_without_package_tracking = self - pickings_with_package_tracking diff --git a/delivery_ups_hibou/models/delivery_ups.py b/delivery_ups_hibou/models/delivery_ups.py index 67f371f6..c10cac7f 100644 --- a/delivery_ups_hibou/models/delivery_ups.py +++ b/delivery_ups_hibou/models/delivery_ups.py @@ -26,7 +26,7 @@ class ProviderUPS(models.Model): if not third_party_account.delivery_type == 'ups': raise ValidationError('Non-UPS Shipping Account indicated during UPS shipment.') return True - if order and self.ups_bill_my_account and order.ups_carrier_account: + if order and order.ups_bill_my_account and order.partner_ups_carrier_account: return True return False @@ -51,12 +51,12 @@ class ProviderUPS(models.Model): if not third_party_account.delivery_type == 'ups': raise ValidationError('Non-UPS Shipping Account indicated during UPS shipment.') return third_party_account.name - if order and order.ups_carrier_account: - return order.ups_carrier_account + if order and order.partner_ups_carrier_account: + return order.partner_ups_carrier_account + if picking and picking.sale_id.partner_ups_carrier_account: + return picking.sale_id.partner_ups_carrier_account if picking and picking.picking_type_id.warehouse_id.ups_shipper_number: return picking.picking_type_id.warehouse_id.ups_shipper_number - if picking and picking.sale_id.ups_carrier_account: - return picking.sale_id.ups_carrier_account return self.ups_shipper_number def _get_ups_carrier_account(self, picking): @@ -127,7 +127,7 @@ class ProviderUPS(models.Model): 'error_message': check_value, 'warning_message': False} - ups_service_type = order.ups_service_type or self.ups_default_service_type + ups_service_type = self.ups_default_service_type result = srm.get_shipping_price( shipment_info=shipment_info, packages=packages, shipper=shipper_company, ship_from=shipper_warehouse, ship_to=recipient, packaging_type=self.ups_default_packaging_id.shipper_package_code, service_type=ups_service_type, @@ -204,10 +204,7 @@ class ProviderUPS(models.Model): 'itl_currency_code': self.env.user.company_id.currency_id.name, 'phone': recipient.mobile or recipient.phone, } - if picking.sale_id and picking.sale_id.carrier_id != picking.carrier_id: - ups_service_type = picking.carrier_id.ups_default_service_type or picking.ups_service_type or superself.ups_default_service_type - else: - ups_service_type = picking.ups_service_type or superself.ups_default_service_type + ups_service_type = picking.carrier_id.ups_default_service_type # Hibou Delivery ups_carrier_account = superself._get_ups_carrier_account(picking) @@ -353,7 +350,7 @@ class ProviderUPS(models.Model): 'warning_message': False, }] # We now use Shop if we send multi=True - ups_service_type = (order.ups_service_type or self.ups_default_service_type) if order else self.ups_default_service_type + ups_service_type = self.ups_default_service_type result = srm.get_shipping_price( shipment_info=shipment_info, packages=packages, shipper=shipper_company, ship_from=shipper_warehouse, ship_to=recipient, packaging_type=self.ups_default_packaging_id.shipper_package_code, service_type=ups_service_type, diff --git a/delivery_ups_hibou/models/ups_request_patch.py b/delivery_ups_hibou/models/ups_request_patch.py index 69df0cf7..69ef26af 100644 --- a/delivery_ups_hibou/models/ups_request_patch.py +++ b/delivery_ups_hibou/models/ups_request_patch.py @@ -388,9 +388,10 @@ def patched_set_package_detail(self, client, packages, packaging_type, ship_from if not package.PackageServiceOptions: package.PackageServiceOptions = self.factory_ns2.PackageServiceOptionsType() if not package.PackageServiceOptions.DeclaredValue: - package.PackageServiceOptions.DeclaredValue = self.factory_ns2.InsuredValueType() - # Shipping service - # package.PackageServiceOptions.DeclaredValue = self.factory_ns2.PackageDeclaredValueType() + if request_type == 'shipping': + package.PackageServiceOptions.DeclaredValue = self.factory_ns2.PackageDeclaredValueType() + else: + package.PackageServiceOptions.DeclaredValue = self.factory_ns2.ShipperDeclaredValueType() package.PackageServiceOptions.DeclaredValue.MonetaryValue = p.insurance_value package.PackageServiceOptions.DeclaredValue.CurrencyCode = p.insurance_currency_code if p.signature_required: