summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdoutreloux <jud@odoo.com>2020-02-13 10:33:20 +0000
committerjdoutreloux <jud@odoo.com>2020-03-10 10:17:55 +0000
commit69b1e1a05228f05b4cd5f2934167260e51101dce (patch)
tree42db7100dc4c19417c16f200ab4e2e2683b477d9
parent724e0e498d39d1b50c9461a031e9115b0bc4b901 (diff)
[IMP] sale_project : add create invoice server action to project
The possibility to create invoices from project tasks was being introduced in industry_fsm_sale. This moves the server action to sale_project. Task-2191253 closes odoo/odoo#45650 Related: odoo/enterprise#8530 Related: odoo/upgrade#808 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
-rw-r--r--addons/sale_project/models/project.py43
-rw-r--r--addons/sale_project/views/project_task_views.xml16
2 files changed, 59 insertions, 0 deletions
diff --git a/addons/sale_project/models/project.py b/addons/sale_project/models/project.py
index 523fad6b108..94df2d0c965 100644
--- a/addons/sale_project/models/project.py
+++ b/addons/sale_project/models/project.py
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from ast import literal_eval
+
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
@@ -38,6 +40,8 @@ class ProjectTask(models.Model):
"and if this employee is not in the 'Employee/Sales Order Item Mapping' of the project, the "
"timesheet entry will be linked to this sales order item.")
project_sale_order_id = fields.Many2one('sale.order', string="project's sale order", related='project_id.sale_order_id')
+ invoice_count = fields.Integer("Number of invoices", related='sale_order_id.invoice_count')
+ task_to_invoice = fields.Boolean("To invoice", compute='_compute_task_to_invoice', search='_search_task_to_invoice', groups='sales_team.group_sale_salesman_all_leads')
@api.depends('project_id.sale_line_id.order_partner_id')
def _compute_partner_id(self):
@@ -96,3 +100,42 @@ class ProjectTask(models.Model):
if partner:
return partner
return super().rating_get_partner_id()
+
+ @api.depends('sale_order_id.invoice_status', 'sale_order_id.order_line')
+ def _compute_task_to_invoice(self):
+ for task in self:
+ if task.sale_order_id:
+ task.task_to_invoice = bool(task.sale_order_id.invoice_status not in ('no', 'invoiced'))
+ else:
+ task.task_to_invoice = False
+
+ @api.model
+ def _search_task_to_invoice(self, operator, value):
+ query = """
+ SELECT so.id
+ FROM sale_order so
+ WHERE so.invoice_status != 'invoiced'
+ AND so.invoice_status != 'no'
+ """
+ operator_new = 'inselect'
+ if(bool(operator == '=') ^ bool(value)):
+ operator_new = 'not inselect'
+ return [('sale_order_id', operator_new, (query, ()))]
+
+ def action_create_invoice(self):
+ # ensure the SO exists before invoicing, then confirm it
+ so_to_confirm = self.filtered(
+ lambda task: task.sale_order_id and task.sale_order_id.state in ['draft', 'sent']
+ ).mapped('sale_order_id')
+ so_to_confirm.action_confirm()
+
+ # redirect create invoice wizard (of the Sales Order)
+ action = self.env.ref('sale.action_view_sale_advance_payment_inv').read()[0]
+ context = literal_eval(action.get('context', "{}"))
+ context.update({
+ 'active_id': self.sale_order_id.id if len(self) == 1 else False,
+ 'active_ids': self.mapped('sale_order_id').ids,
+ 'default_company_id': self.company_id.id,
+ })
+ action['context'] = context
+ return action
diff --git a/addons/sale_project/views/project_task_views.xml b/addons/sale_project/views/project_task_views.xml
index 4ccd0f8b9c9..d45fdd10d26 100644
--- a/addons/sale_project/views/project_task_views.xml
+++ b/addons/sale_project/views/project_task_views.xml
@@ -56,6 +56,22 @@
<xpath expr="//field[@name='stage_id']" position="before">
<field name="sale_order_id" string="Sale Order" filter_domain="['|', ('sale_order_id', 'ilike', self), ('sale_line_id', 'ilike', self)]"/>
</xpath>
+ <filter name="inactive" position="before">
+ <filter string="To Invoice" name="to_invoice" domain="[('task_to_invoice', '=', True)]" groups="sales_team.group_sale_salesman" />
+ <separator/>
+ </filter>
+ </field>
+ </record>
+
+ <!-- To invoice batch action -->
+ <record id="project_task_server_action_batch_invoice" model="ir.actions.server">
+ <field name="name">Create invoice</field>
+ <field name="model_id" ref="project.model_project_task"/>
+ <field name="binding_model_id" ref="project.model_project_task"/>
+ <field name="state">code</field>
+ <field name="code">
+ if records:
+ action = records.action_create_invoice()
</field>
</record>