diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..75bb2042901930f807a588241612a29dd75e34d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.* +*.pyc +!.gitignore diff --git a/__manifest__.py b/__manifest__.py index 9cfc54461a70039c8abd82dfb03779b3194d6fd2..cec98137566121f1620c32daa4cca3ebfd49ab1d 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -4,10 +4,11 @@ 'license': 'AGPL-3', 'description': """ MODULE LINK SALE ORDER / PROJECT LE FILAMENT - - Etend l'application Projet : - - Créer un projet à partir d'un bon de commande - - Créer une tâche par ordre + + This module depends upon *sale_service* and *lefilament_projets* modules. + + - This module provides a new functionality to transform your sale order in projects and tasks (and to update those in case sale order is updated) + - Product template has been enhanced, invoicing policy section in order to set how each product should behave when transformed from sale order to project/task. """, 'author': 'LE FILAMENT', 'category': 'LE FILAMENT', @@ -23,6 +24,7 @@ 'views/sale_views.xml', 'views/res_config_views.xml', 'views/project_views.xml', + 'views/project_task_views.xml', ], 'qweb': [ ], diff --git a/i18n/fr.po b/i18n/fr.po index daea595cd7a1cdac10eddfa20e7a240727663e94..386e5798162b25dcd97f3669c71dfcc0376272d4 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-16 10:38+0000\n" -"PO-Revision-Date: 2018-01-16 10:38+0000\n" +"POT-Creation-Date: 2018-01-16 18:19+0000\n" +"PO-Revision-Date: 2018-01-16 18:19+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -46,6 +46,11 @@ msgstr "Créé par" msgid "Created on" msgstr "Créé le" +#. module: lefilament_link_sale_project +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_task_currency_id +msgid "Currency" +msgstr "Devise" + #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_config_settings_lf_tarif_jour msgid "Day Price" @@ -66,11 +71,6 @@ msgstr "Annuler" msgid "Display Name" msgstr "Nom affiché" -#. module: lefilament_link_sale_project -#: selection:sale.config.settings,lf_follow_task:0 -msgid "Do not track delivered quantity" -msgstr "Ne pas mettre à jour les quantités livrées" - #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_project_id msgid "Existing project" @@ -101,11 +101,6 @@ msgstr "Dernière mise à jour par" msgid "Last Updated on" msgstr "Dernière mise à jour le" -#. module: lefilament_link_sale_project -#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_sale_config_settings_lf_follow_task -msgid "Manage quantity delivered" -msgstr "Gestion de la quantité livrée" - #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_related_project_name msgid "New Analytical Account" @@ -140,7 +135,7 @@ msgstr "Etapes de projet" #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_product_product_project_task_type_id #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_product_template_project_task_type_id msgid "Project task stage" -msgstr "Étape projet" +msgstr "Etape projet" #. module: lefilament_link_sale_project #: model:ir.ui.view,arch_db:lefilament_link_sale_project.lefilament_project_view_form_create @@ -168,11 +163,12 @@ msgid "Sales Order Line" msgstr "Ligne de bons de commande" #. module: lefilament_link_sale_project -#: selection:sale.config.settings,lf_follow_task:0 -msgid "Standard operation for tracking delivered quantitiy based on time spent on project tasks" -msgstr "Fonctionnement standard pour le suivi de la quantité livrée en fonction du temps passé sur les tâches du projet" +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_task_price_subtotal +msgid "Subtotal initial" +msgstr "Sous-Total initial" #. module: lefilament_link_sale_project +#: model:ir.model,name:lefilament_link_sale_project.model_project_task #: model:ir.ui.view,arch_db:lefilament_link_sale_project.lefilament_view_sales_config msgid "Task" msgstr "Tâche" diff --git a/i18n/lefilament_link_sale_project.pot b/i18n/lefilament_link_sale_project.pot index 6d7a9e8cd6b374e1ced6436357484c77ce24af6b..1911134fc6ff27c2b9f5fa263db9a62bb8e05fd2 100644 --- a/i18n/lefilament_link_sale_project.pot +++ b/i18n/lefilament_link_sale_project.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-16 10:51+0000\n" -"PO-Revision-Date: 2018-01-16 10:51+0000\n" +"POT-Creation-Date: 2018-01-16 18:19+0000\n" +"PO-Revision-Date: 2018-01-16 18:19+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -46,6 +46,11 @@ msgstr "" msgid "Created on" msgstr "" +#. module: lefilament_link_sale_project +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_task_currency_id +msgid "Currency" +msgstr "" + #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_config_settings_lf_tarif_jour msgid "Day Price" @@ -66,11 +71,6 @@ msgstr "" msgid "Display Name" msgstr "" -#. module: lefilament_link_sale_project -#: selection:sale.config.settings,lf_follow_task:0 -msgid "Do not track delivered quantity" -msgstr "" - #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_project_id msgid "Existing project" @@ -101,11 +101,6 @@ msgstr "" msgid "Last Updated on" msgstr "" -#. module: lefilament_link_sale_project -#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_sale_config_settings_lf_follow_task -msgid "Manage quantity delivered" -msgstr "" - #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_related_project_name msgid "New Analytical Account" @@ -168,11 +163,12 @@ msgid "Sales Order Line" msgstr "" #. module: lefilament_link_sale_project -#: selection:sale.config.settings,lf_follow_task:0 -msgid "Standard operation for tracking delivered quantitiy based on time spent on project tasks" +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_task_price_subtotal +msgid "Subtotal initial" msgstr "" #. module: lefilament_link_sale_project +#: model:ir.model,name:lefilament_link_sale_project.model_project_task #: model:ir.ui.view,arch_db:lefilament_link_sale_project.lefilament_view_sales_config msgid "Task" msgstr "" diff --git a/models/__init__.py b/models/__init__.py index 98cee0573784ef6a92d64405c470f98291a881fe..38ce05d0c8b42297c5b12146334e821de00126fb 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -6,4 +6,5 @@ import sale_config_settings import res_config import project_task_type import project +import project_task import sale_order \ No newline at end of file diff --git a/models/project_task.py b/models/project_task.py new file mode 100644 index 0000000000000000000000000000000000000000..565ae6c116a95b27823f43ad4e379bc798a69ae6 --- /dev/null +++ b/models/project_task.py @@ -0,0 +1,13 @@ +# -*- 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 models, fields +from odoo.tools import float_is_zero, float_compare, DEFAULT_SERVER_DATETIME_FORMAT +import odoo.addons.decimal_precision as dp + +class LeFilamentProjectTask(models.Model): + _inherit = 'project.task' + + price_subtotal = fields.Monetary(string='Subtotal initial', readonly=True, store='True') + currency_id = fields.Many2one(related='sale_line_id.currency_id', store=True, string='Currency', readonly=True) \ No newline at end of file diff --git a/models/sale_config_settings.py b/models/sale_config_settings.py index 4328e0f0091b0a48b29e1ecdb07a3076a450f5bd..b1c4d1798ecb27f597738f66295712889eba227f 100644 --- a/models/sale_config_settings.py +++ b/models/sale_config_settings.py @@ -15,17 +15,8 @@ class LeFilamentSaleConfiguration(models.TransientModel): project_task_type_id = fields.Many2one( 'project.task.type', 'Initial step') - lf_follow_task = fields.Selection([ - (0, "Standard operation for tracking delivered quantitiy based on time spent on project tasks"), - (1, "Do not track delivered quantity") - ], "Manage quantity delivered") @api.multi def set_project_task_type(self): return self.env['ir.values'].sudo().set_default( - 'sale.config.settings', 'project_task_type_id', self.project_task_type_id.id) - - @api.multi - def set_lf_follow_task(self): - return self.env['ir.values'].sudo().set_default( - 'sale.config.settings', 'lf_follow_task', self.lf_follow_task) \ No newline at end of file + 'sale.config.settings', 'project_task_type_id', self.project_task_type_id.id) \ No newline at end of file diff --git a/models/sale_order.py b/models/sale_order.py index ede53cd9fc99313f087b9a9bb09e7abf2487e7fe..4c509fe81cc08354ec05d576708ecab5d4c0e2b6 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -29,6 +29,15 @@ class SaleOrder(models.Model): project_total_budget = project_total_budget + line.price_subtotal planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour task_id_refer.planned_hours = planned_hours + else: + if line.price_subtotal != task_id_refer.price_subtotal: + project = line.product_id.project_id + project_id_maint = project.id + project_update = self.env['project.project'].browse(project_id_maint) + project_update.lf_total_budget = ( project_update.lf_total_budget - task_id_refer.price_subtotal ) + line.price_subtotal + planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour + task_id_refer.planned_hours = planned_hours + task_id_refer.price_subtotal = line.price_subtotal else: if line.product_id.track_service == 'project': if line.product_id.project_id: @@ -108,8 +117,8 @@ class LeFilamentSaleOrderLine(models.Model): lines[line] += qty for line, qty in lines.items(): - if not self.env['ir.values'].get_default('sale.config.settings', 'lf_follow_task'): - line.qty_delivered = qty - else: + if line.product_id.track_service == 'project': line.qty_delivered = 0 + else: + line.qty_delivered = qty return True diff --git a/views/project_task_views.xml b/views/project_task_views.xml new file mode 100644 index 0000000000000000000000000000000000000000..73c5518387167fbf296dce201e25e9f0bd51dc7f --- /dev/null +++ b/views/project_task_views.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record id="lefilament_view_sale_service_inherit_form2" model="ir.ui.view"> + <field name="name">lefilament.sale.service.form.view.inherit</field> + <field name="model">project.task</field> + <field name="groups_id" eval="[(4, ref('base.group_user'))]"/> + <field name="inherit_id" ref="sale_timesheet.view_sale_service_inherit_form2"/> + <field name="arch" type="xml"> + <field name="sale_line_id" position="after"> + <field name="price_subtotal"/> + </field> + </field> + </record> +</odoo> diff --git a/views/sale_config_settings_views.xml b/views/sale_config_settings_views.xml index 64194c01fbf31b209ad77852a86b3f747fe1dcd4..f12e47ab6714ac024196ef1a82c6720d671656f8 100644 --- a/views/sale_config_settings_views.xml +++ b/views/sale_config_settings_views.xml @@ -8,7 +8,6 @@ <div id="main" position="inside"> <group string="Task"> <field name="project_task_type_id" class="oe_inline"/> - <field name="lf_follow_task" widget="radio"/> </group> </div> </field> diff --git a/wizard/sale_views_wizard.py b/wizard/sale_views_wizard.py index cde1147bf11106321e529a3333eb837c9cebef56..b52f9e02178fde63829e5a191ce392314dc743de 100644 --- a/wizard/sale_views_wizard.py +++ b/wizard/sale_views_wizard.py @@ -99,8 +99,10 @@ class LeFilamentSaleWizard(models.TransientModel): 'description': description_line + '</p><br/>', 'project_id': project_id, 'company_id': sale_id.company_id.id, - 'stage_id': stage.id, - 'sale_line_id': line.id + 'stage_id': stage.id or '', + 'sale_line_id': line.id, + 'price_subtotal': line.price_subtotal, + 'currency_id': line.currency_id.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)