[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:
Pierre Masereel
2019-03-15 09:10:44 +00:00
parent d0b8811d34
commit 11ece72e24
4 changed files with 39 additions and 4 deletions
+22 -1
View File
@@ -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):
+7 -1
View File
@@ -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>
+3
View File
@@ -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>