mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
Merge branch 'imp/11.0/delivery_hibou__sig_req' into '11.0-test'
imp/11.0/delivery_hibou__sig_req into 11.0-test See merge request hibou-io/hibou-odoo/suite!1169
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,6 +21,11 @@
|
||||
<xpath expr="//field[@name='delivery_packaging_id']" position="attributes">
|
||||
<attribute name="domain">[('product_id', '=', False)]</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='delivery_packaging_id']" position="after">
|
||||
<field name="package_declared_value" />
|
||||
<field name="package_require_insurance" />
|
||||
<field name="package_require_signature" />
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
<field name="carrier_tracking_ref" class="oe_inline" />
|
||||
<button type="object" class="fa fa-arrow-right oe_link" name="cancel_shipment" string="Cancel" attrs="{'invisible':['|',('carrier_tracking_ref','=',False),('carrier_id','=', False)]}"/>
|
||||
</div>
|
||||
<field name="declared_value" />
|
||||
<field name="require_insurance" />
|
||||
<field name="require_signature" />
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -36,12 +39,12 @@
|
||||
<field name="package_carrier_tracking_ref" attrs="{'invisible': [('package_carrier_tracking_ref', '=', False)]}" />
|
||||
<button name="clear_carrier_tracking_ref" type="object" string="Clear Tracking" attrs="{'invisible': [('carrier_tracking_ref', '!=', False)]}" />
|
||||
<button name="reset_carrier_tracking_ref" type="object" string="Reset Tracking" attrs="{'invisible': [('package_carrier_tracking_ref', '!=', False)]}" />
|
||||
<field name="package_ids" attrs="{'invisible': [('package_carrier_tracking_ref', '=', False)]}" context="{'active_id': id, 'active_model': 'stock.picking'}" nolabel="1" colspan="2">
|
||||
<field name="package_ids" attrs="{'invisible': [('package_carrier_tracking_ref', '=', False)]}" nolabel="1" colspan="2">
|
||||
<tree>
|
||||
<field name="name" />
|
||||
<field name="carrier_id" />
|
||||
<field name="carrier_tracking_ref" />
|
||||
<button type="object" name="cancel_shipment" string="Cancel" />
|
||||
<button type="object" name="cancel_shipment" string="Cancel" context="{'picking_active_id': parent.id, 'picking_active_model': 'stock.picking'}" />
|
||||
</tree>
|
||||
</field>
|
||||
</xpath>
|
||||
|
||||
@@ -12,13 +12,13 @@ _logger = logging.getLogger(__name__)
|
||||
class ProviderUPS(models.Model):
|
||||
_inherit = 'delivery.carrier'
|
||||
|
||||
def _get_ups_signature_required_type(self):
|
||||
def _get_ups_signature_required_type(self, order=None, picking=None, package=None):
|
||||
# '3' for Adult Sig.
|
||||
return '2'
|
||||
|
||||
def _get_ups_signature_required(self, order=None, picking=None):
|
||||
if self.get_signature_required(order=order, picking=picking):
|
||||
return self._get_ups_signature_required_type()
|
||||
def _get_ups_signature_required(self, order=None, picking=None, package=None):
|
||||
if self.get_signature_required(order=order, picking=picking, package=package):
|
||||
return self._get_ups_signature_required_type(order=order, picking=picking, package=package)
|
||||
return False
|
||||
|
||||
def _get_ups_is_third_party(self, order=None, picking=None):
|
||||
@@ -168,8 +168,6 @@ class ProviderUPS(models.Model):
|
||||
shipper_company = superself.get_shipper_company(picking=picking)
|
||||
shipper_warehouse = superself.get_shipper_warehouse(picking=picking)
|
||||
recipient = superself.get_recipient(picking=picking)
|
||||
signature_required = superself._get_ups_signature_required(picking=picking)
|
||||
insurance_value = superself.get_insurance_value(picking=picking)
|
||||
currency = picking.sale_id.currency_id if picking.sale_id else picking.company_id.currency_id
|
||||
insurance_currency_code = currency.name
|
||||
|
||||
@@ -188,7 +186,7 @@ class ProviderUPS(models.Model):
|
||||
# Create all packages
|
||||
for package in picking_packages:
|
||||
packages.append(Package(self, package.shipping_weight, quant_pack=package.packaging_id, name=package.name,
|
||||
insurance_value=insurance_value, insurance_currency_code=insurance_currency_code, signature_required=signature_required))
|
||||
insurance_value=superself.get_insurance_value(picking=picking, package=package), insurance_currency_code=insurance_currency_code, signature_required=superself._get_ups_signature_required(picking=picking, package=package)))
|
||||
package_names.append(package.name)
|
||||
|
||||
# what is the point of weight_bulk?
|
||||
@@ -282,11 +280,10 @@ class ProviderUPS(models.Model):
|
||||
srm = UPSRequest(self.log_xml, superself.ups_username, superself.ups_passwd, superself._get_main_ups_account_number(order=order, picking=picking), superself.ups_access_number, self.prod_environment)
|
||||
ResCurrency = self.env['res.currency']
|
||||
max_weight = self.ups_default_packaging_id.max_weight
|
||||
insurance_value = superself.get_insurance_value(order=order, picking=picking)
|
||||
insurance_currency_code = 'USD' # will be overridden below, here for consistency
|
||||
signature_required = superself._get_ups_signature_required(order=order, picking=picking)
|
||||
packages = []
|
||||
if order:
|
||||
insurance_value = superself.get_insurance_value(order=order)
|
||||
signature_required = superself._get_ups_signature_required(order=order)
|
||||
currency = order.currency_id
|
||||
insurance_currency_code = currency.name
|
||||
company = order.company_id
|
||||
@@ -315,14 +312,14 @@ class ProviderUPS(models.Model):
|
||||
# Is total quantity the number of packages or the number of items being shipped?
|
||||
if package:
|
||||
total_qty = 1
|
||||
packages = [Package(self, package.shipping_weight, insurance_value=insurance_value, insurance_currency_code=insurance_currency_code, signature_required=signature_required)]
|
||||
packages = [Package(self, package.shipping_weight, insurance_value=superself.get_insurance_value(picking=picking, package=package), insurance_currency_code=insurance_currency_code, signature_required=superself._get_ups_signature_required(picking=picking, package=package))]
|
||||
elif picking.package_ids:
|
||||
# all packages....
|
||||
total_qty = len(picking.package_ids)
|
||||
packages = [Package(self, package.shipping_weight, insurance_value=insurance_value, insurance_currency_code=insurance_currency_code, signature_required=signature_required) for package in picking.package_ids.filtered(lambda p: not p.carrier_id)]
|
||||
packages = [Package(self, package.shipping_weight, insurance_value=superself.get_insurance_value(picking=picking, package=package), insurance_currency_code=insurance_currency_code, signature_required=superself._get_ups_signature_required(picking=picking, package=package)) for package in picking.package_ids.filtered(lambda p: not p.carrier_id)]
|
||||
else:
|
||||
total_qty = 1
|
||||
packages.append(Package(self, picking.shipping_weight or picking.weight, insurance_value=insurance_value, insurance_currency_code=insurance_currency_code, signature_required=signature_required))
|
||||
packages.append(Package(self, picking.shipping_weight or picking.weight, insurance_value=superself.get_insurance_value(picking=picking), insurance_currency_code=insurance_currency_code, signature_required=superself._get_ups_signature_required(picking=picking)))
|
||||
|
||||
shipment_info = {
|
||||
'total_qty': total_qty # required when service type = 'UPS Worldwide Express Freight'
|
||||
|
||||
Reference in New Issue
Block a user