diff --git a/README.rst b/README.rst index 23c74ab2b21b68a5927eb699b14f8c5da1d40cc9..78a3784a3dd3329a5fa73bbd38561d4d0c37b656 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,8 @@ LE FILAMENT - LIEN COMMANDES PROJET ==================================== Modifie le module Sale: - - Fais le lien entre les commandes et les projets + - Ajoute le taux horaire sur la société et sur les bons de commande + - Convertit les prix vendu en heures (en divisant par le taux horaire) lors de la création des tâches Credits ======= diff --git a/models/res_company.py b/models/res_company.py index 1e7a8fa70168fd5dffdbcbbcabc893f00438e66d..d6b6a2a9762381bdd8781f33f8e5c3a015616730 100644 --- a/models/res_company.py +++ b/models/res_company.py @@ -7,4 +7,6 @@ from odoo import fields, models class Company(models.Model): _inherit = "res.company" - taux_horaire = fields.Integer(required=True, default=100) + taux_horaire = fields.Integer( + string="Taux horaire (€/h)", required=True, default=100 + ) diff --git a/models/res_config_settings.py b/models/res_config_settings.py index d9c77af75f201fe23bd42906e43d5d4d989ddf82..d4b6c5522e063268d7cbb3d8412da6ac1ecca070 100644 --- a/models/res_config_settings.py +++ b/models/res_config_settings.py @@ -8,5 +8,5 @@ class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" taux_horaire = fields.Integer( - "Taux horaire", related="company_id.taux_horaire", readonly=False + "Taux horaire (€/h)", related="company_id.taux_horaire", readonly=False ) diff --git a/models/sale_order.py b/models/sale_order.py index fc660669a7d4f789a06c8cf2b1c912e790c4e053..5aab687aef464cbafc9eb7de4dfca40beee7f362 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -8,5 +8,5 @@ class SaleOrder(models.Model): _inherit = "sale.order" taux_horaire = fields.Integer( - "Taux horaire", default=lambda self: self.env.company.taux_horaire + "Taux horaire (€/h)", default=lambda self: self.env.company.taux_horaire ) diff --git a/models/sale_order_line.py b/models/sale_order_line.py index 7a3f5b8f6898c2c6c952912cf236785a1526ed9d..c96b41118e2aca42187173eec64b478ef44dde70 100644 --- a/models/sale_order_line.py +++ b/models/sale_order_line.py @@ -22,3 +22,41 @@ class SaleOrderLine(models.Model): else: planned_hours = (self.product_uom_qty * self.price_unit) / taux_horaire return planned_hours + + def _timesheet_create_project(self): + """ + Reprise de la fonction native pour changer le mode de calcul des heures + planifiées dans timesheet + """ + project = super()._timesheet_create_project() + + project_uom = self.company_id.project_time_mode_id + uom_hour = self.env.ref("uom.product_uom_hour") + unit_factor = project_uom.factor * uom_hour.factor_inv + + uom_unit = self.env.ref("uom.product_uom_unit") + + allocated_hours = project.allocated_hours + # for sale_order_line in sale_order for the same project + # we deduce default allocation of units (Odoo considers that 1 unit = 1 hour) + # and we recalculate hours depending on taux_horaire + for line in self.order_id.order_line: + if ( + line.is_service + and line.product_id.service_tracking + in ["task_in_project", "project_only"] + and line.product_id.project_template_id + == self.product_id.project_template_id + and line.product_uom == uom_unit + ): + allocated_hours -= line.product_uom_qty * unit_factor + allocated_hours += ( + line.product_uom_qty * line.price_unit + ) / self.order_id.taux_horaire + + project.write( + { + "allocated_hours": allocated_hours, + } + ) + return project diff --git a/views/res_config_settings_view.xml b/views/res_config_settings_view.xml index 023a757182f972e4c0433cc63e5a6f8f7cb0d428..1232c94ad1a2622e3caa446b58acbeb3f148e942 100644 --- a/views/res_config_settings_view.xml +++ b/views/res_config_settings_view.xml @@ -8,23 +8,15 @@ name="name" >res.config.settings.view.form.inherit.link.sale.project</field> <field name="model">res.config.settings</field> - <field name="inherit_id" ref="project.res_config_settings_view_form" /> + <field name="inherit_id" ref="sale.res_config_settings_view_form" /> <field name="arch" type="xml"> - <div class="app_settings_block" data-string="Sales" position="inside"> - <h2>Configuration devis-projet</h2> - <div class="row mt16 o_settings_container"> - <div class="col-12 col-lg-6 o_setting_box"> - <div class="o_setting_right_pane"> - <label - for="taux_horaire" - string="Taux horaire" - class="col-3 col-lg-3 o_light_label" - /> - <field name="taux_horaire" class="oe_inline" required="1" /> - </div> - </div> - </div> - </div> + <app name="sale_management" position="inside"> + <block title="Configuration devis-projet" id="sale_project_hourly_cost"> + <setting id="hourly_cost"> + <field name="taux_horaire" string="Taux horaire (€/h)" /> + </setting> + </block> + </app> </field> </record> diff --git a/views/sale_view.xml b/views/sale_view.xml index d2731108a2d0ae1ad1ceca87aee4031f84701c0f..3db451692198b880a87dd603655c30fe59041e9b 100644 --- a/views/sale_view.xml +++ b/views/sale_view.xml @@ -10,10 +10,7 @@ <field name="priority">100</field> <field name="arch" type="xml"> <field name="payment_term_id" position="after"> - <field - name="taux_horaire" - attrs="{'readonly':[('state','!=','draft')]}" - /> + <field name="taux_horaire" readonly="state != 'draft'" /> </field> </field>