diff --git a/__init__.py b/__init__.py index a5e7e1d4f02807b492d1626a2f84c5ba769474b3..eb6cc70758afc3954ae75ff55a99aa10415dffa2 100644 --- a/__init__.py +++ b/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- -import models \ No newline at end of file +import models +import wizard \ No newline at end of file diff --git a/__manifest__.py b/__manifest__.py index 7eacbd9be4eaf9e99776ea0b7d39c34619040e77..8a9b0ace55650801c536115acf27d61e946f4228 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -18,6 +18,9 @@ 'data': [ 'views/product_views.xml', 'views/sale_config_settings_views.xml', + 'wizard/sale_views_wizard.xml', + 'views/sale_views.xml', + 'views/res_config_views.xml', ], 'qweb': [ ], diff --git a/models/__init__.py b/models/__init__.py index 4c86822a77d29d117a3eec175cdac2918305fd50..57bb6eb4c7ac26c8e27fc08278ba2bbb58a79e7a 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -4,4 +4,5 @@ import lf_link_sale_project import product import procurement import sale_order -import sale_config_settings \ No newline at end of file +import sale_config_settings +import res_config \ No newline at end of file diff --git a/models/procurement.py b/models/procurement.py index 11a8b94bb6119b8e2d61aa0acde6ecd3561f7e1c..bdee566d015fc722dce1292c35a5651a4a0874a3 100644 --- a/models/procurement.py +++ b/models/procurement.py @@ -7,6 +7,9 @@ from odoo import api, fields, models, _ class LeFilamentProcurementOrder(models.Model): _inherit = 'procurement.order' + def _is_procurement_task(self): + return self.product_id.type == 'service' and self.product_id.track_service == 'task' and self.product_id.product_link == False + def _get_stage_id(self): Stage = self.env['project.task.type'] stage = self.product_id.with_context(force_company=self.company_id.id).project_task_type_id @@ -34,9 +37,7 @@ class LeFilamentProcurementOrder(models.Model): project.lf_total_budget = project.lf_total_budget + self.sale_line_id.price_subtotal def _create_service_task(self): - stage = self._get_stage_id() project = self._get_project() - self._update_project_data(project) planned_hours = self._convert_qty_company_hours() task = self.env['project.task'].create({ 'name': '%s:%s' % (self.origin or '', self.product_id.name), @@ -49,7 +50,6 @@ class LeFilamentProcurementOrder(models.Model): 'description': self.name + '<br/>', 'project_id': project.id, 'company_id': self.company_id.id, - 'stage_id': stage.id, }) self.write({'task_id': task.id}) diff --git a/models/product.py b/models/product.py index 2034a4405ee8183743ad9876da5cc32ac2224a3d..709feeb3729631dab26a0c59e7e23790d89f132a 100644 --- a/models/product.py +++ b/models/product.py @@ -7,4 +7,5 @@ class LeFilamentProductTemplate(models.Model): _inherit = 'product.template' project_task_type_id = fields.Many2one( - 'project.task.type', 'Project Task Type') \ No newline at end of file + 'project.task.type', 'Project Task Type') + product_link = fields.Boolean('Produit à lier au projet') \ No newline at end of file diff --git a/models/res_config.py b/models/res_config.py new file mode 100644 index 0000000000000000000000000000000000000000..902e06c520185e0ca9c459715142008b654377b1 --- /dev/null +++ b/models/res_config.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +# © 2017 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + +class ProjectLFConfiguration(models.TransientModel): + _name = 'project.config.settings' + _inherit = 'project.config.settings' + + lf_tarif_jour = fields.Float('Tarif Jour') + + @api.multi + def set_default_lf_tarif_jour(self): + Values = self.env['ir.values'].sudo() + Values.set_default('project.config.settings', 'lf_tarif_jour', self.lf_tarif_jour) \ No newline at end of file diff --git a/views/product_views.xml b/views/product_views.xml index 0a0df78152b2f057bfe60303b4bb389c4f6d4ecf..606453ded3b166b2ff56eb0e7446d75c63798d24 100644 --- a/views/product_views.xml +++ b/views/product_views.xml @@ -7,6 +7,7 @@ <field name="arch" type="xml"> <field name="project_id" position="after"> <field name="project_task_type_id" attrs="{'invisible':['|', ('type','!=','service'), ('track_service', '<>', 'task')]}"/> + <field name="product_link" attrs="{'invisible':['|', ('type','!=','service'), ('track_service', '<>', 'task')]}"/> </field> </field> </record> diff --git a/views/res_config_views.xml b/views/res_config_views.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ddf30821f4e540471058eca0f1177d3ca726847 --- /dev/null +++ b/views/res_config_views.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record id="view_lefilament_project_config_settings" model="ir.ui.view"> + <field name="name">project.lefilament.settings</field> + <field name="model">project.config.settings</field> + <field name="inherit_id" ref="project.view_config_settings"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='module_rating_project']" position="after"> + <field name="lf_tarif_jour" class="oe_inline oe_text_right" /> + </xpath> + </field> + </record> +</odoo> \ No newline at end of file diff --git a/views/sale_views.xml b/views/sale_views.xml index 75d6e9bcea2717dd7929cff5cfc7efdc1e1609e0..040d60953291e80c78b22f544834a6cc31b5fedc 100644 --- a/views/sale_views.xml +++ b/views/sale_views.xml @@ -3,6 +3,16 @@ <odoo> <data> + <record id="lefilament_view_order_form" model="ir.ui.view"> + <field name="name">lefilament.sale.order.form</field> + <field name="model">sale.order</field> + <field name="inherit_id" ref="sale.view_order_form"/> + <field name="arch" type="xml"> + <header> + <button name="%(lefilament_open_create_project)d" type="action" string="Créer un projet" attrs="{'invisible': ['|', ('project_project_id', '!=', False), ('state', '!=', 'sale')]}"/> + </header> + </field> + </record> </data> </odoo> \ No newline at end of file diff --git a/wizard/__init__.py b/wizard/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5a7174336b765bcf453d3b2503e362b53f67c763 --- /dev/null +++ b/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import sale_views_wizard \ No newline at end of file diff --git a/wizard/sale_views_wizard.py b/wizard/sale_views_wizard.py new file mode 100644 index 0000000000000000000000000000000000000000..0e6fe2e226ad621ac393a9a78962978ee96ab80d --- /dev/null +++ b/wizard/sale_views_wizard.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + +class LeFilamentSaleWizard(models.TransientModel): + _name = 'lefilament.sale.views.wizard' + _description = 'Sale Project Assignment' + + @api.model + def _default_sale_id(self): + return self.env['sale.order'].browse(self.env.context.get('active_id')) + + @api.model + def _default_project_project_id(self): + return self._default_sale_id().project_project_id + + @api.model + def _default_related_project_id(self): + return self._default_sale_id().related_project_id + + @api.model + def _default_project_name(self): + return self._default_sale_id().partner_id.name + + sale_id = fields.Many2one('sale.order', string='Sale', default=_default_sale_id) + project_id = fields.Many2one('project.project', string='Projet existant', default=_default_project_project_id) + project_name = fields.Char('Nouveau Projet', default=_default_project_name) + related_project_id = fields.Many2one('account.analytic.account', string='Compte Analytique', default=_default_related_project_id) + related_project_name = fields.Char('Nouveau Compte Analytique', default=_default_project_name) + + @api.onchange('project_id') + def onchange_project_id(self): + self.related_project_id = self.project_id.analytic_account_id + + @api.multi + def close_dialog(self): + sale_id = self.env['sale.order'].browse(self.env.context.get('active_id')) + if self.project_id: + sale_id.project_id = self.project_id.analytic_account_id + sale_id.project_project_id = self.project_id + project_id_new = self.project_id.id + else: + sale_id._create_analytic_account(prefix=None) + project_id_new = sale_id.project_id.project_create({'name': self.project_name, 'use_tasks': True}) + stage_id_new = self.env['ir.values'].get_default('sale.config.settings', 'project_task_type_id') + stage_new = self.env['project.task.type'].browse(stage_id_new) + lf_tarif_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_tarif_jour') + for line in sale_id.order_line: + if line.product_id.project_id: + project = line.product_id.project_id + project_id = project.id + stage = line.product_id.project_task_type_id + else: + stage = stage_new + project_id = project_id_new + planned_hours = line.procurement_ids._convert_qty_company_hours() + project_date = self.env['project.project'].browse(project_id) + project_date.lf_total_budget = project_date.lf_total_budget + line.price_subtotal + project_date.lf_tarif_jour = lf_tarif_jour + task = self.env['project.task'].create({ + 'name': '%s:%s' % ('', line.product_id.name), + 'date_deadline': line.procurement_ids.date_planned, + 'planned_hours': planned_hours, + 'remaining_hours': planned_hours, + 'partner_id': sale_id.partner_id.id or self.partner_dest_id.id, + 'user_id': self.env.uid, + 'procurement_id': line.procurement_ids.id, + 'description': line.procurement_ids.name + '<br/>', + 'project_id': project_id, + 'company_id': line.procurement_ids.company_id.id, + 'stage_id': stage.id, + }) + sale_id.tasks_ids = self.env['project.task'].search([('sale_line_id', 'in', sale_id.order_line.ids)]) + sale_id.tasks_count = len(sale_id.tasks_ids) + return {'type': 'ir.actions.act_window_close'} \ No newline at end of file diff --git a/wizard/sale_views_wizard.xml b/wizard/sale_views_wizard.xml new file mode 100644 index 0000000000000000000000000000000000000000..41544c671a8c7ac522b9f3e6272ddc5c4a930eb4 --- /dev/null +++ b/wizard/sale_views_wizard.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> + +<odoo> + <data> + + <record id="lefilament_project_view_form_create" model="ir.ui.view"> + <field name="name">lefilament.project.view.form.create</field> + <field name="model">lefilament.sale.views.wizard</field> + <field name="arch" type="xml"> + <form string="Lien Projet"> + <sheet> + <group> + <group> + <field name="project_id" options="{'no_quick_create': True, 'no_create_edit' : True}" /> + <field name="project_name" attrs="{'required': [('project_id', '=', False)]}"/> + </group> + </group> + <group> + <group> + <field name="related_project_id" options="{'no_quick_create': True, 'no_create_edit' : True}" readonly="1"/> + </group> + </group> + <footer> + <button string="Create" name="close_dialog" type="object" class="btn-primary"/> + <button string="Discard" class="btn-default" special="cancel"/> + </footer> + + </sheet> + </form> + </field> + </record> + + <record id="lefilament_open_create_project" model="ir.actions.act_window"> + <field name="name">Créer un Projet</field> + <field name="res_model">lefilament.sale.views.wizard</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="target">new</field> + </record> + + </data> +</odoo> \ No newline at end of file