[REM] sale_timesheet: dynamic domains

closes odoo/odoo#40947

Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
This commit is contained in:
Xavier Morel
2019-12-02 08:46:03 +00:00
parent 73e3ad9159
commit ba7afeb5bc
4 changed files with 16 additions and 15 deletions
+3 -8
View File
@@ -121,11 +121,12 @@ class Project(models.Model):
class ProjectTask(models.Model):
_inherit = "project.task"
sale_line_id = fields.Many2one('sale.order.line', 'Sales Order Item', domain="[('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done'])]",
sale_line_id = fields.Many2one('sale.order.line', 'Sales Order Item', domain="[('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done']), ('order_id', '=?', project_sale_order_id)]",
compute='_compute_sale_line', store=True, readonly=False,
help="Sales order item to which the task is linked. If an employee timesheets on a this task, "
"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.", copy=False)
project_sale_order_id = fields.Many2one('sale.order', string="project's sale order", related='project_id.sale_order_id')
sale_order_id = fields.Many2one('sale.order', 'Sales Order', compute='_compute_sale_order_id', store=True, readonly=False, help="Sales order to which the task is linked.")
billable_type = fields.Selection([
('task_rate', 'At Task Rate'),
@@ -161,7 +162,7 @@ class ProjectTask(models.Model):
@api.onchange('project_id')
def _onchange_project(self):
result = super(ProjectTask, self)._onchange_project()
super(ProjectTask, self)._onchange_project()
if self.project_id:
if self.project_id.billable_type == 'employee_rate':
if not self.partner_id:
@@ -172,12 +173,6 @@ class ProjectTask(models.Model):
if not self.partner_id:
self.partner_id = self.sale_line_id.order_partner_id
# set domain on SO: on non billable project, all SOL of customer, otherwise the one from the SO
result = result or {}
domain = [('is_service', '=', True), ('is_expense', '=', False), ('order_partner_id', 'child_of', self.partner_id.commercial_partner_id.id), ('state', 'in', ['sale', 'done'])]
if self.project_id.sale_order_id:
domain += [('order_id', '=', self.project_id.sale_order_id.id)]
result.setdefault('domain', {})['sale_line_id'] = domain
return result
@api.depends('project_id.sale_line_id.order_partner_id')
def _compute_partner_id(self):
@@ -73,6 +73,7 @@
<field name="billable_type" invisible="1"/>
<field name="sale_order_id" attrs="{'invisible': [('project_id', '!=', False)]}" groups="sales_team.group_sale_salesman"/>
<field name="commercial_partner_id" invisible="1" />
<field name="project_sale_order_id" invisible="1"/>
</xpath>
</field>
</record>
@@ -23,16 +23,20 @@ class ProjectCreateInvoice(models.TransientModel):
return result
project_id = fields.Many2one('project.project', "Project", help="Project to make billable", required=True)
sale_order_id = fields.Many2one('sale.order', string="Choose the Sales Order to invoice", required=True)
_candidate_orders = fields.Many2many('sale.order', compute='_compute_candidate_orders')
sale_order_id = fields.Many2one(
'sale.order', string="Choose the Sales Order to invoice", required=True,
domain="[('id', 'in', _candidate_orders)]"
)
amount_to_invoice = fields.Monetary("Amount to invoice", compute='_compute_amount_to_invoice', currency_field='currency_id', help="Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)")
currency_id = fields.Many2one(related='sale_order_id.currency_id', readonly=True)
@api.onchange('project_id')
def _onchange_project_id(self):
sale_orders = self.project_id.tasks.mapped('sale_line_id.order_id').filtered(lambda so: so.invoice_status == 'to invoice')
return {
'domain': {'sale_order_id': [('id', 'in', sale_orders.ids)]},
}
@api.depends('project_id.tasks.sale_line_id.order_id.invoice_status')
def _compute_candidate_orders(self):
for p in self:
p._candidate_orders = p.project_id\
.mapped('tasks.sale_line_id.order_id')\
.filtered(lambda so: so.invoice_status == 'to invoice')
@api.depends('sale_order_id')
def _compute_amount_to_invoice(self):
@@ -8,6 +8,7 @@
<form string="Create Sales Order from Project">
<group>
<field name="project_id" readonly="1"/>
<field name="_candidate_orders" invisible="1"/>
<field name="sale_order_id" options="{'no_create_edit': True}" context="{'sale_show_partner_name': True}"/>
<field name="amount_to_invoice"/>
</group>