[IMP] delivery: manage return label for all carrier
Until now, only fedex was providing return label printing, and as we want to integrate it with other carriers, we have mande a generc mecanism to easily implement it with new ones. We've also added an option that allow to print return label from portal if one has been generated on delivery.
This commit is contained in:
@@ -60,10 +60,21 @@ class DeliveryCarrier(models.Model):
|
||||
free_over = fields.Boolean('Free if order amount is above', help="If the order total amount (shipping excluded) is above or equal to this value, the customer benefits from a free shipping", default=False, oldname='free_if_more_than')
|
||||
amount = fields.Float(string='Amount', help="Amount of the order to benefit from a free shipping, expressed in the company currency")
|
||||
|
||||
can_generate_return = fields.Boolean(compute="_compute_can_generate_return")
|
||||
return_label_on_delivery = fields.Boolean(string="Generate Return Label", required=True, default=False,
|
||||
help="The return label is automatically generated at the delivery.")
|
||||
get_return_label_from_portal = fields.Boolean(string="Return Label Accessible from Customer Portal", required=True, default=False,
|
||||
help="The return label can be downloaded by the customer from the customer portal.")
|
||||
|
||||
_sql_constraints = [
|
||||
('margin_not_under_100_percent', 'CHECK (margin >= -100)', 'Margin cannot be lower than -100%'),
|
||||
]
|
||||
|
||||
@api.depends('delivery_type')
|
||||
def _compute_can_generate_return(self):
|
||||
for carrier in self:
|
||||
carrier.can_generate_return = hasattr(self, '%s_get_return_label' % carrier.delivery_type)
|
||||
|
||||
def toggle_prod_environment(self):
|
||||
for c in self:
|
||||
c.prod_environment = not c.prod_environment
|
||||
@@ -100,6 +111,16 @@ class DeliveryCarrier(models.Model):
|
||||
return False
|
||||
return True
|
||||
|
||||
@api.onchange('can_generate_return')
|
||||
def _onchange_can_generate_return(self):
|
||||
if not self.can_generate_return:
|
||||
self.return_label_on_delivery = False
|
||||
|
||||
@api.onchange('return_label_on_delivery')
|
||||
def _onchange_return_label_on_delivery(self):
|
||||
if not self.return_label_on_delivery:
|
||||
self.get_return_label_from_portal = False
|
||||
|
||||
@api.onchange('state_ids')
|
||||
def onchange_states(self):
|
||||
self.country_ids = [(6, 0, self.country_ids.ids + self.state_ids.mapped('country_id.id'))]
|
||||
@@ -150,7 +171,7 @@ class DeliveryCarrier(models.Model):
|
||||
|
||||
def get_return_label(self,pickings):
|
||||
self.ensure_one()
|
||||
if hasattr(self, '%s_get_return_label' % self.delivery_type):
|
||||
if self.can_generate_return:
|
||||
return getattr(self, '%s_get_return_label' % self.delivery_type)(pickings)
|
||||
|
||||
def get_tracking_link(self, picking):
|
||||
|
||||
@@ -84,6 +84,7 @@ class StockPicking(models.Model):
|
||||
weight_bulk = fields.Float('Bulk Weight', compute='_compute_bulk_weight')
|
||||
shipping_weight = fields.Float("Weight for Shipping", compute='_compute_shipping_weight', help="Total weight of the packages and products which are not in a package. That's the weight used to compute the cost of the shipping.")
|
||||
is_return_picking = fields.Boolean(compute='_compute_return_picking')
|
||||
return_label_ids = fields.One2many('ir.attachment', compute='_compute_return_label')
|
||||
|
||||
@api.depends('carrier_id', 'carrier_tracking_ref')
|
||||
def _compute_carrier_tracking_url(self):
|
||||
@@ -93,10 +94,15 @@ class StockPicking(models.Model):
|
||||
@api.depends('carrier_id', 'move_ids_without_package')
|
||||
def _compute_return_picking(self):
|
||||
for picking in self:
|
||||
if picking.carrier_id and hasattr(picking.carrier_id, '%s_get_return_label' % picking.carrier_id.delivery_type):
|
||||
if picking.carrier_id and picking.carrier_id.can_generate_return:
|
||||
picking.is_return_picking = any(m.origin_returned_move_id for m in picking.move_ids_without_package)
|
||||
else:
|
||||
picking.is_return_picking = False
|
||||
|
||||
def _compute_return_label(self):
|
||||
for picking in self:
|
||||
picking.return_label_ids = self.env['ir.attachment'].search([('res_model', '=', 'stock.picking'), ('res_id', '=', picking.id), ('name', 'ilike', 'ReturnLabel')])
|
||||
|
||||
@api.depends('move_lines')
|
||||
def _cal_weight(self):
|
||||
for picking in self:
|
||||
|
||||
@@ -2,14 +2,19 @@
|
||||
<template id="sale_order_portal_content_inherit_sale_stock_inherit_website_sale_delivery" name="Shipping tracking on orders followup" inherit_id="sale_stock.sale_order_portal_content_inherit_sale_stock">
|
||||
<xpath expr="//div[hasclass('o_sale_stock_picking')]/div" position="after">
|
||||
<div t-if="i.carrier_tracking_ref" class="small d-lg-inline-block">
|
||||
Tracking: <span t-field="i.carrier_id.name"/>
|
||||
Tracking:
|
||||
<t t-if="i.carrier_tracking_url">
|
||||
<a t-att-href="i.carrier_tracking_url" target="_blank"><span t-field="i.carrier_tracking_ref"/></a>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<span t-field="i.carrier_tracking_ref"/>
|
||||
<span t-field="i.carrier_id.name"/> <span t-field="i.carrier_tracking_ref"/>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="i.carrier_id.get_return_label_from_portal and i.return_label_ids">
|
||||
<div>
|
||||
<a class="ml-3" t-attf-href="/web/content/#{i.return_label_ids[:1].id}" target="_blank">Print Return Label</a>
|
||||
</div>
|
||||
</t>
|
||||
</xpath>
|
||||
</template>
|
||||
</odoo>
|
||||
|
||||
@@ -96,6 +96,9 @@
|
||||
<field nolabel="1" name="amount" attrs="{'required':[('free_over','!=', False)], 'invisible':[('free_over','=', False)]}"/>
|
||||
<field name="product_id" context="{'default_type': 'service', 'sale_ok': False, 'purchase_ok': False}" />
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="can_generate_return" invisible="1"/>
|
||||
<field name="return_label_on_delivery" attrs="{'invisible': [('can_generate_return', '=', False)]}"/>
|
||||
<field name="get_return_label_from_portal" attrs="{'invisible': [('return_label_on_delivery', '=', False)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
|
||||
Reference in New Issue
Block a user