summaryrefslogtreecommitdiff
path: root/addons/sale_project/models/product.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/sale_project/models/product.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/sale_project/models/product.py')
-rw-r--r--addons/sale_project/models/product.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/addons/sale_project/models/product.py b/addons/sale_project/models/product.py
new file mode 100644
index 00000000..b86b0d71
--- /dev/null
+++ b/addons/sale_project/models/product.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+from odoo.exceptions import ValidationError
+
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ service_tracking = fields.Selection([
+ ('no', 'Don\'t create task'),
+ ('task_global_project', 'Create a task in an existing project'),
+ ('task_in_project', 'Create a task in sales order\'s project'),
+ ('project_only', 'Create a new project but no task')],
+ string="Service Tracking", default="no",
+ help="On Sales order confirmation, this product can generate a project and/or task. \
+ From those, you can track the service you are selling.\n \
+ 'In sale order\'s project': Will use the sale order\'s configured project if defined or fallback to \
+ creating a new project based on the selected template.")
+ project_id = fields.Many2one(
+ 'project.project', 'Project', company_dependent=True,
+ domain="[('company_id', '=', current_company_id)]",
+ help='Select a billable project on which tasks can be created. This setting must be set for each company.')
+ project_template_id = fields.Many2one(
+ 'project.project', 'Project Template', company_dependent=True, copy=True,
+ domain="[('company_id', '=', current_company_id)]",
+ help='Select a billable project to be the skeleton of the new created project when selling the current product. Its stages and tasks will be duplicated.')
+
+ @api.constrains('project_id', 'project_template_id')
+ def _check_project_and_template(self):
+ """ NOTE 'service_tracking' should be in decorator parameters but since ORM check constraints twice (one after setting
+ stored fields, one after setting non stored field), the error is raised when company-dependent fields are not set.
+ So, this constraints does cover all cases and inconsistent can still be recorded until the ORM change its behavior.
+ """
+ for product in self:
+ if product.service_tracking == 'no' and (product.project_id or product.project_template_id):
+ raise ValidationError(_('The product %s should not have a project nor a project template since it will not generate project.') % (product.name,))
+ elif product.service_tracking == 'task_global_project' and product.project_template_id:
+ raise ValidationError(_('The product %s should not have a project template since it will generate a task in a global project.') % (product.name,))
+ elif product.service_tracking in ['task_in_project', 'project_only'] and product.project_id:
+ raise ValidationError(_('The product %s should not have a global project since it will generate a project.') % (product.name,))
+
+ @api.onchange('service_tracking')
+ def _onchange_service_tracking(self):
+ if self.service_tracking == 'no':
+ self.project_id = False
+ self.project_template_id = False
+ elif self.service_tracking == 'task_global_project':
+ self.project_template_id = False
+ elif self.service_tracking in ['task_in_project', 'project_only']:
+ self.project_id = False
+
+
+class ProductProduct(models.Model):
+ _inherit = 'product.product'
+
+ @api.onchange('service_tracking')
+ def _onchange_service_tracking(self):
+ if self.service_tracking == 'no':
+ self.project_id = False
+ self.project_template_id = False
+ elif self.service_tracking == 'task_global_project':
+ self.project_template_id = False
+ elif self.service_tracking in ['task_in_project', 'project_only']:
+ self.project_id = False