[REM] sale_timesheet: dynamic domains
closes odoo/odoo#40947 Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user