diff --git a/i18n/fr.po b/i18n/fr.po index 556de65a8c4fe67cd4201379bbcf57dbc149b643..7bb25316efb40b169a940f13c745e1b2d9fbe05e 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-12 14:08+0000\n" -"PO-Revision-Date: 2018-01-12 14:08+0000\n" +"POT-Creation-Date: 2018-01-15 14:54+0000\n" +"PO-Revision-Date: 2018-01-15 14:54+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +15,11 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: lefilament_link_sale_project +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_config_settings_lf_alias_prefix +msgid "Alias prefix" +msgstr "Préfixe Alias" + #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_related_project_id msgid "Analytical account related" @@ -61,6 +66,11 @@ 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" @@ -91,6 +101,11 @@ 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" @@ -147,6 +162,16 @@ msgstr "Affectation de projet de vente" msgid "Sales Order" msgstr "Bon de commande" +#. module: lefilament_link_sale_project +#: model:ir.model,name:lefilament_link_sale_project.model_sale_order_line +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" + #. module: lefilament_link_sale_project #: model:ir.ui.view,arch_db:lefilament_link_sale_project.lefilament_view_sales_config msgid "Task" @@ -184,3 +209,8 @@ msgstr "project.config.settings" msgid "sale.config.settings" msgstr "sale.config.settings" +#. module: lefilament_link_sale_project +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_product_product_track_service +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_product_template_track_service +msgid "Create a project and link tasks" +msgstr "Créer un projet et lier les tâches" diff --git a/i18n/lefilament_link_sale_project.pot b/i18n/lefilament_link_sale_project.pot index 4f4c90bf8a2f1330bc7017ddce672b007ea1109f..003105cf53fd6a8cea0166a9e66e42adeafef104 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-12 15:01+0000\n" -"PO-Revision-Date: 2018-01-12 15:01+0000\n" +"POT-Creation-Date: 2018-01-15 14:53+0000\n" +"PO-Revision-Date: 2018-01-15 14:53+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +15,11 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: lefilament_link_sale_project +#: model:ir.model.fields,field_description:lefilament_link_sale_project.field_project_config_settings_lf_alias_prefix +msgid "Alias prefix" +msgstr "" + #. module: lefilament_link_sale_project #: model:ir.model.fields,field_description:lefilament_link_sale_project.field_lefilament_sale_views_wizard_related_project_id msgid "Analytical account related" @@ -61,6 +66,11 @@ 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" @@ -91,6 +101,11 @@ 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" @@ -147,6 +162,16 @@ msgstr "" msgid "Sales Order" msgstr "" +#. module: lefilament_link_sale_project +#: model:ir.model,name:lefilament_link_sale_project.model_sale_order_line +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" +msgstr "" + #. module: lefilament_link_sale_project #: model:ir.ui.view,arch_db:lefilament_link_sale_project.lefilament_view_sales_config msgid "Task" diff --git a/models/res_config.py b/models/res_config.py index 7182cae7545a32d97dc2d33bb691ff120d11c0b2..2926a3e401f63a220813883ca621549f6cf7ead1 100644 --- a/models/res_config.py +++ b/models/res_config.py @@ -10,8 +10,14 @@ class ProjectLFConfiguration(models.TransientModel): _inherit = 'project.config.settings' lf_tarif_jour = fields.Float('Day Price') + lf_alias_prefix = fields.Char('Alias prefix') @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 + Values.set_default('project.config.settings', 'lf_tarif_jour', self.lf_tarif_jour) + + @api.multi + def set_default_alias_prefix(self): + Values = self.env['ir.values'].sudo() + Values.set_default('project.config.settings', 'lf_alias_prefix', self.lf_alias_prefix) \ No newline at end of file diff --git a/models/sale_config_settings.py b/models/sale_config_settings.py index b1c4d1798ecb27f597738f66295712889eba227f..4328e0f0091b0a48b29e1ecdb07a3076a450f5bd 100644 --- a/models/sale_config_settings.py +++ b/models/sale_config_settings.py @@ -15,8 +15,17 @@ 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) \ No newline at end of file + '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 diff --git a/models/sale_order.py b/models/sale_order.py index a2c7bd7ba5b226ed1007950600d362cb3e84f088..ede53cd9fc99313f087b9a9bb09e7abf2487e7fe 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -72,4 +72,44 @@ class SaleOrder(models.Model): project_date.lf_tarif_jour = lf_tarif_jour project_date.lf_total_budget = project_total_budget order.tasks_ids = self.env['project.task'].search([('sale_line_id', 'in', order.order_line.ids)]) - order.tasks_count = len(order.tasks_ids) \ No newline at end of file + order.tasks_count = len(order.tasks_ids) + +class LeFilamentSaleOrderLine(models.Model): + _inherit = "sale.order.line" + + @api.multi + def _compute_analytic(self, domain=None): + lines = {} + force_so_lines = self.env.context.get("force_so_lines") + if not domain and self.ids: + # To filter on analyic lines linked to an expense + expense_type_id = self.env.ref('account.data_account_type_expenses', raise_if_not_found=False) + expense_type_id = expense_type_id and expense_type_id.id + domain = [('so_line', 'in', self.ids), '|', ('amount', '<=', 0.0), ('project_id', '!=', False)] + + data = self.env['account.analytic.line'].read_group( + domain, + ['so_line', 'unit_amount', 'product_uom_id'], ['product_uom_id', 'so_line'], lazy=False + ) + # If the unlinked analytic line was the last one on the SO line, the qty was not updated. + if force_so_lines: + for line in force_so_lines: + lines.setdefault(line, 0.0) + for d in data: + if not d['product_uom_id']: + continue + line = self.browse(d['so_line'][0]) + lines.setdefault(line, 0.0) + uom = self.env['product.uom'].browse(d['product_uom_id'][0]) + if line.product_uom.category_id == uom.category_id: + qty = uom._compute_quantity(d['unit_amount'], line.product_uom) + else: + qty = d['unit_amount'] + 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: + line.qty_delivered = 0 + return True diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv new file mode 100644 index 0000000000000000000000000000000000000000..60d8f3dcee692c79cb3bbc814942ad2a7068694d --- /dev/null +++ b/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_project_config_settings_manager,project.project_config_settings_manager,model_project_config_settings,project.group_project_manager,1,1,1,1 \ No newline at end of file diff --git a/views/res_config_views.xml b/views/res_config_views.xml index 9ddf30821f4e540471058eca0f1177d3ca726847..d808fb50a49d36b7f064e44a0c66c94228485e7b 100644 --- a/views/res_config_views.xml +++ b/views/res_config_views.xml @@ -6,7 +6,8 @@ <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" /> + <field name="lf_tarif_jour" class="oe_inline oe_text_right" /> + <field name="lf_alias_prefix" class="oe_inline" /> </xpath> </field> </record> diff --git a/views/sale_config_settings_views.xml b/views/sale_config_settings_views.xml index f12e47ab6714ac024196ef1a82c6720d671656f8..64194c01fbf31b209ad77852a86b3f747fe1dcd4 100644 --- a/views/sale_config_settings_views.xml +++ b/views/sale_config_settings_views.xml @@ -8,6 +8,7 @@ <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 9711682c0a6e2961b5725802d91dfd5ccfcf7a47..cde1147bf11106321e529a3333eb837c9cebef56 100644 --- a/wizard/sale_views_wizard.py +++ b/wizard/sale_views_wizard.py @@ -54,6 +54,8 @@ class LeFilamentSaleWizard(models.TransientModel): 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') lf_heures_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_heures_jour') + lf_alias_prefix = self.env['ir.values'].get_default('project.config.settings', 'lf_alias_prefix') + ir_values = self.env['ir.values'].get_default('project.config.settings', 'generate_project_alias') for line in sale_id.order_line: if line.product_id.track_service == 'project': if line.product_id.project_id: @@ -74,6 +76,10 @@ class LeFilamentSaleWizard(models.TransientModel): 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 + if not line.product_id.project_id: + if ir_values and lf_alias_prefix: + lf_alias_name = lf_alias_prefix + project_date.name + project_date.alias_name = lf_alias_name planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour description_line = "<p>" i = 1