[IMP] sale: improve activity management on sale order model

This commit improves sale management through a better integration of
activities and addition of automated activities. Several things are done
in this commit :

 * automatic activities generation is added for sale order upselling.
   They are also automatically removed or updated when the sale order state
   changes from or to upselling to avoid bloating users with unnecessary
   activities;
 * a menu to configure activity types is added. Indeed HR managers should be
   able to see and configure activity types related to their job;

Technically we choose to override _write in order to catch the invoice_status
computed field update and try to have a lightweight implementation. Indeed
sale.order is a complex model and we tried to have a low-level override
that do not mess with business overrides.
This commit is contained in:
Thibault Delavallée
2018-03-27 16:31:00 +02:00
parent 133fd0a21e
commit 17c9b7afee
5 changed files with 50 additions and 0 deletions
+1
View File
@@ -26,6 +26,7 @@ This module contains all the common features of Sales Management and eCommerce.
'views/account_invoice_views.xml',
'views/sales_team_views.xml',
'views/res_partner_views.xml',
'views/mail_activity_views.xml',
'views/assets.xml',
'views/sale_portal_templates.xml',
'views/sale_layout_category_view.xml',
+7
View File
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Activities -->
<record id="mail_act_sale_upsell" model="mail.activity.type">
<field name="name">Order Upsell</field>
<field name="icon">fa-line-chart</field>
<field name="res_model_id" ref="sale.model_sale_order"/>
</record>
<!-- Sale-related subtypes for messaging / Chatter -->
<record id="mt_order_sent" model="mail.message.subtype">
<field name="name">Quotation sent</field>
+25
View File
@@ -289,6 +289,31 @@ class SaleOrder(models.Model):
result = super(SaleOrder, self).create(vals)
return result
@api.multi
def _write(self, values):
""" Override of private write method in order to generate activities
based in the invoice status. As the invoice status is a computed field
triggered notably when its lines and linked invoice status changes the
flow does not necessarily goes through write if the action was not done
on the SO itself. We hence override the _write to catch the computation
of invoice_status field. """
if self.env.context.get('mail_activity_automation_skip'):
return super(SaleOrder, self)._write(values)
res = super(SaleOrder, self)._write(values)
if 'invoice_status' in values:
self.activity_unlink(['sale.mail_act_sale_upsell'])
if values['invoice_status'] == 'upselling':
for order in self:
order.activity_schedule(
'sale.mail_act_sale_upsell', fields.Date.today(),
user_id=order.user_id.id,
note=_("Upsell <a href='#' data-oe-model='%s' data-oe-id='%d'>%s</a> for customer <a href='#' data-oe-model='%s' data-oe-id='%s'>%s</a>") % (
order._name, order.id, order.name,
order.partner_id._name, order.partner_id.id, order.partner_id.display_name))
return res
@api.multi
def copy_data(self, default=None):
if default is None:
+1
View File
@@ -55,3 +55,4 @@ access_account_tax_group_sale_manager,account.tax.group sale manager,account.mod
access_account_account_sale_manager,account.account sale manager,account.model_account_account,sales_team.group_sale_manager,1,0,0,0
access_report_all_channels_sales_salesman,report.all.channels.sales,model_report_all_channels_sales,sales_team.group_sale_salesman,1,1,1,0
access_report_all_channels_sales_manager,report.all.channels.sales,model_report_all_channels_sales,sales_team.group_sale_manager,1,1,1,1
access_mail_activity_type_sale_manager,mail.activity.type.sale.manager,mail.model_mail_activity_type,sales_team.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
55 access_account_account_sale_manager account.account sale manager account.model_account_account sales_team.group_sale_manager 1 0 0 0
56 access_report_all_channels_sales_salesman report.all.channels.sales model_report_all_channels_sales sales_team.group_sale_salesman 1 1 1 0
57 access_report_all_channels_sales_manager report.all.channels.sales model_report_all_channels_sales sales_team.group_sale_manager 1 1 1 1
58 access_mail_activity_type_sale_manager mail.activity.type.sale.manager mail.model_mail_activity_type sales_team.group_sale_manager 1 1 1 1
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<odoo>
<!-- Activity types config -->
<record id="mail_activity_type_action_config_sale" model="ir.actions.act_window">
<field name="name">Activity Types</field>
<field name="res_model">mail.activity.type</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">['|', ('res_model_id', '=', False), ('res_model_id.model', '=', 'sale.order')]</field>
<field name="context">{'default_res_model': 'sale.order'}</field>
</record>
<menuitem id="sale_menu_config_activity_type"
action="mail_activity_type_action_config_sale"
parent="menu_sale_config"
groups="base.group_no_one"/>
</odoo>