From 2d080e7c5a404b3788d6d5d92ddd8eda18694b35 Mon Sep 17 00:00:00 2001 From: Juliana <juliana@le-filament.com> Date: Mon, 8 Jan 2018 10:51:55 +0100 Subject: [PATCH] update 8-01 --- __init__.py | 3 +- __manifest__.py | 3 ++ models/__init__.py | 3 +- models/procurement.py | 6 +-- models/product.py | 3 +- models/res_config.py | 17 +++++++++ views/product_views.xml | 1 + views/res_config_views.xml | 13 +++++++ views/sale_views.xml | 10 +++++ wizard/__init__.py | 4 ++ wizard/sale_views_wizard.py | 74 ++++++++++++++++++++++++++++++++++++ wizard/sale_views_wizard.xml | 42 ++++++++++++++++++++ 12 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 models/res_config.py create mode 100644 views/res_config_views.xml create mode 100644 wizard/__init__.py create mode 100644 wizard/sale_views_wizard.py create mode 100644 wizard/sale_views_wizard.xml diff --git a/__init__.py b/__init__.py index a5e7e1d..eb6cc70 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 7eacbd9..8a9b0ac 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 4c86822..57bb6eb 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 11a8b94..bdee566 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 2034a44..709feeb 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 0000000..902e06c --- /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 0a0df78..606453d 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 0000000..9ddf308 --- /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 75d6e9b..040d609 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 0000000..5a71743 --- /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 0000000..0e6fe2e --- /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 0000000..41544c6 --- /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 -- GitLab