From f8b0395b8758315ccfb6c0eb238d4cd3b2e4e3b7 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Wed, 27 Oct 2021 14:23:49 -0700 Subject: [PATCH 1/2] [IMP] delivery_hibou: per-package declared value, insurance, sig.req. --- delivery_hibou/__manifest__.py | 2 +- delivery_hibou/models/delivery.py | 69 +++++++++++++++++++++---- delivery_hibou/models/stock.py | 14 ++++- delivery_hibou/views/delivery_views.xml | 5 ++ delivery_hibou/views/stock_views.xml | 7 ++- 5 files changed, 81 insertions(+), 16 deletions(-) diff --git a/delivery_hibou/__manifest__.py b/delivery_hibou/__manifest__.py index a17ed470..a776fb28 100644 --- a/delivery_hibou/__manifest__.py +++ b/delivery_hibou/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Delivery Hibou', 'summary': 'Adds underlying pinnings for things like "RMA Return Labels"', - 'version': '11.0.1.2.0', + 'version': '11.0.1.2.1', 'author': "Hibou Corp.", 'category': 'Stock', 'license': 'AGPL-3', diff --git a/delivery_hibou/models/delivery.py b/delivery_hibou/models/delivery.py index b3318147..f4aeeff3 100644 --- a/delivery_hibou/models/delivery.py +++ b/delivery_hibou/models/delivery.py @@ -19,7 +19,7 @@ class DeliveryCarrier(models.Model): # Utility - def get_insurance_value(self, order=None, picking=None): + def get_insurance_value(self, order=None, picking=None, package=None): value = 0.0 if order: if order.order_line: @@ -27,14 +27,17 @@ class DeliveryCarrier(models.Model): else: return value if picking: - value = picking.declared_value() - if picking.require_insurance == 'no': - value = 0.0 - elif picking.require_insurance == 'auto' and self.automatic_insurance_value and self.automatic_insurance_value > value: + value = picking.declared_value(package=package) + if package and not package.require_insurance: value = 0.0 + else: + if picking.require_insurance == 'no': + value = 0.0 + elif picking.require_insurance == 'auto' and self.automatic_insurance_value and self.automatic_insurance_value > value: + value = 0.0 return value - def get_signature_required(self, order=None, picking=None): + def get_signature_required(self, order=None, picking=None, package=None): value = 0.0 if order: if order.order_line: @@ -42,11 +45,14 @@ class DeliveryCarrier(models.Model): else: return False if picking: - value = picking.declared_value() - if picking.require_signature == 'no': - return False - elif picking.require_signature == 'yes': - return True + value = picking.declared_value(package=package) + if package: + return package.require_signature + else: + if picking.require_signature == 'no': + return False + elif picking.require_signature == 'yes': + return True return self.automatic_sig_req_value and value >= self.automatic_sig_req_value def get_third_party_account(self, order=None, picking=None): @@ -262,3 +268,44 @@ class DeliveryCarrier(models.Model): }) return getattr(self, '%s_cancel_shipment' % self.delivery_type)(pickings) + + +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_require_insurance = fields.Boolean(string='Require Insurance') + package_require_signature = fields.Boolean(string='Require Signature') + + def _default_package_declared_value(self): + 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.onchange('package_declared_value') + def _onchange_package_declared_value(self): + picking = self.env['stock.picking'].browse(self.env.context['active_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 + else: + self.package_require_insurance = picking.require_insurance == 'yes' + if picking.require_signature == 'auto': + self.package_require_signature = value and picking.carrier_id.automatic_sig_req_value and value >= picking.carrier_id.automatic_sig_req_value + 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, + }) diff --git a/delivery_hibou/models/stock.py b/delivery_hibou/models/stock.py index 946f35cc..7aa55838 100644 --- a/delivery_hibou/models/stock.py +++ b/delivery_hibou/models/stock.py @@ -7,12 +7,18 @@ class StockQuantPackage(models.Model): carrier_id = fields.Many2one('delivery.carrier', string='Carrier') carrier_tracking_ref = fields.Char(string='Tracking Reference') + require_insurance = fields.Boolean(string='Require Insurance') + require_signature = fields.Boolean(string='Require Signature') + declared_value = fields.Float(string='Declared Value') def _get_active_picking(self): picking_id = self._context.get('active_id') picking_model = self._context.get('active_model') if not picking_id or picking_model != 'stock.picking': - raise UserError('Cannot cancel package other than through shipment/picking.') + picking_id = self._context.get('picking_active_id') + picking_model = self._context.get('picking_active_model') + if not picking_id or picking_model != 'stock.picking': + raise UserError('Cannot cancel package other than through shipment/picking.') return self.env['stock.picking'].browse(picking_id) def send_to_shipper(self): @@ -81,8 +87,10 @@ class StockPicking(models.Model): res = super(StockPicking, self).create(values) return res - def declared_value(self): + def declared_value(self, package=None): self.ensure_one() + if package: + return package.declared_value cost = sum([(l.product_id.standard_price * l.qty_done) for l in self.move_line_ids] or [0.0]) if not cost: # Assume Full Value @@ -126,6 +134,8 @@ class StockPicking(models.Model): tracking_numbers.append(tracking_number) # Try to add tracking to the individual packages. potential_tracking_numbers = tracking_number.split(',') + if len(potential_tracking_numbers) == 1: + potential_tracking_numbers = tracking_number.split('+') # UPS for example... if len(potential_tracking_numbers) >= len(carrier_packages): for t, p in zip(potential_tracking_numbers, carrier_packages): p.carrier_tracking_ref = t diff --git a/delivery_hibou/views/delivery_views.xml b/delivery_hibou/views/delivery_views.xml index 47d5a848..a1e4015f 100644 --- a/delivery_hibou/views/delivery_views.xml +++ b/delivery_hibou/views/delivery_views.xml @@ -21,6 +21,11 @@ [('product_id', '=', False)] + + + + + diff --git a/delivery_hibou/views/stock_views.xml b/delivery_hibou/views/stock_views.xml index 2eb0526c..8cbf343c 100644 --- a/delivery_hibou/views/stock_views.xml +++ b/delivery_hibou/views/stock_views.xml @@ -17,6 +17,9 @@