From 085b0af099e0f1bbed3ba0718041b75f2a58331f Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Mon, 2 Oct 2023 16:27:56 -0400 Subject: [PATCH 1/5] bemade_fsm: added a test for task template descriptions. Added description to subtask tree on task form view for easier editing by technicians. --- bemade_fsm/i18n/fr.po | 76 ++++++++----------- bemade_fsm/tests/test_sale_order.py | 17 +++++ bemade_fsm/views/product_views.xml | 3 +- bemade_fsm/views/task_views.xml | 10 +++ .../__manifest__.py | 33 ++++++++ 5 files changed, 92 insertions(+), 47 deletions(-) create mode 100644 bemade_margin_vendor_pricelist/__manifest__.py diff --git a/bemade_fsm/i18n/fr.po b/bemade_fsm/i18n/fr.po index 00d6651..facf7ab 100644 --- a/bemade_fsm/i18n/fr.po +++ b/bemade_fsm/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 15.0+e\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-29 15:04+0000\n" -"PO-Revision-Date: 2023-08-29 15:04+0000\n" +"POT-Creation-Date: 2023-10-02 20:26+0000\n" +"PO-Revision-Date: 2023-10-02 20:26+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -28,7 +28,6 @@ msgstr "" " \n" " Prix" - #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_signature_block msgid "" @@ -57,7 +56,7 @@ msgstr "" #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table msgid "Taxes" -msgstr "Taxes" +msgstr "" #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table @@ -120,7 +119,7 @@ msgstr "Bloqué" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__allow_billable msgid "Can be billed" -msgstr "Facturable" +msgstr "" #. module: bemade_fsm #: model:ir.model.fields,help:bemade_fsm.field_res_partner__is_site_contact @@ -128,7 +127,6 @@ msgstr "Facturable" msgid "" "Check if the contact is a site contact, otherwise it is a not in that list" msgstr "" -"Vérifier si le contact est un contact du site, sinon ne pas l'inclure dans la liste" #. module: bemade_fsm #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_equipment__tag_ids @@ -136,8 +134,8 @@ msgid "" "Classify and analyze your equipment categories like: Boiler, Laboratory, " "Waste water, Pure water" msgstr "" -"Classifier et analyser vos catégories d'équipements comme : Chaudière, Laboratoire, " -"Eaux usées, Eau pure" +"Classifier et analyser vos catégories d'équipements comme : Chaudière, " +"Laboratoire, Eaux usées, Eau pure" #. module: bemade_fsm #: model:ir.ui.menu,name:bemade_fsm.menu_service_client_equipment @@ -261,6 +259,11 @@ msgstr "Livré" msgid "Description" msgstr "" +#. module: bemade_fsm +#: model_terms:ir.ui.view,arch_db:bemade_fsm.view_task_form2_inherit +msgid "Description/Comments" +msgstr "Description/Commentaires" + #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.fsm_equipment_view_tree msgid "Details" @@ -283,7 +286,7 @@ msgstr "Employés assignés aux tâches créées à partir de ce gabarit." #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_end msgid "End Date" -msgstr "Date de fin" +msgstr "" #. module: bemade_fsm #: model:ir.actions.act_window,name:bemade_fsm.action_window_equipment @@ -300,7 +303,7 @@ msgstr "Équipement désservi" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_count msgid "Equipment Count" -msgstr "Nombre d'équipements" +msgstr "" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__complete_name @@ -450,11 +453,9 @@ msgstr "En cours" #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__is_invoiced #: model:ir.model.fields,help:bemade_fsm.field_sale_order_line__is_fully_delivered_and_invoiced msgid "" -"Indicates whether a line or all the lines in a section have be enentirely" -" delivered and invoiced." +"Indicates whether a line or all the lines in a section have been entirely " +"delivered and invoiced." msgstr "" -"Indique si une ligne ou toutes les lignes dans une section ont été entièrement livrées" -"et facturées." #. module: bemade_fsm #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__is_completed @@ -463,7 +464,8 @@ msgid "" "Indicates whether a line or all the lines in a section have been entirely " "delivered." msgstr "" -"Indique si une ligne ou toutes les lignes dans une section ont été entièrement livrées." +"Indique si une ligne ou toutes les lignes dans une section ont été " +"entièrement livrées." #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__planned_hours @@ -499,7 +501,7 @@ msgstr "Est un abonné" #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__is_site_contact #: model:ir.model.fields,field_description:bemade_fsm.field_res_users__is_site_contact msgid "Is a site contact" -msgstr "Est un contact du site" +msgstr "" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__label @@ -558,17 +560,6 @@ msgstr "Erreur de livraison de message" msgid "Messages" msgstr "" -#. module: bemade_fsm -#: code:addons/bemade_fsm/models/task.py:0 -#, python-format -msgid "" -"Modifying the planned start or end time on a task is not permitted when that" -" task already has planning records associated to it. Please modify or delete" -" the planning records instead." -msgstr "" -"Modifier la date planifiée pour le début ou la fin d'une tâche nest pas permis quand" -" cette tâche est déjà associée à des enregistrements de planification. Veuillez" -" plutôt modifier ou supprimer les planifications associées." #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__my_activity_date_deadline msgid "My Activity Deadline" @@ -682,8 +673,8 @@ msgid "" "Products planned as field service will have travel time considered in " "planning." msgstr "" -"Les produits planifiés comme service terrain auront leur temps de voyagement considéré" -" lors de la planification." +"Les produits planifiés comme service terrain auront leur temps de voyagement" +" considéré lors de la planification." #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view @@ -726,7 +717,7 @@ msgstr "Section de commande de vente" #: model:ir.model,name:bemade_fsm.model_sale_order #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__sale_order_id msgid "Sales Order" -msgstr "Commande de vente" +msgstr "Commande de ventes" #. module: bemade_fsm #: model:ir.model,name:bemade_fsm.model_sale_order_line @@ -769,12 +760,12 @@ msgstr "Contacts sur site :" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_ids msgid "Site Equipment" -msgstr "Équipements du site" +msgstr "" #. module: bemade_fsm #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_begin msgid "Start Date" -msgstr "Date de début" +msgstr "" #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_tasks_table @@ -860,8 +851,9 @@ msgstr "Gabarits pour nouvelles tâches" #. module: bemade_fsm #: model:ir.model.fields,help:bemade_fsm.field_sale_order__default_equipment_ids msgid "The default equipment to service for new sale order lines." -msgstr "L'équipement à désservir par défaut pour les nouveaux articles de commande de" -" ventes." +msgstr "" +"L'équipement à désservir par défaut pour les nouveaux articles de commande " +"de ventes." #. module: bemade_fsm #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__so_section_id @@ -869,22 +861,14 @@ msgid "" "The section on the sale order that represents the labour and parts for this " "visit" msgstr "" -"La section sur la commande de vente représentant la main d'oeuvre et les pièces pour" -" cette visite" +"La section sur la commande de vente représentant la main d'oeuvre et les " +"pièces pour cette visite" + #. module: bemade_fsm #: model_terms:ir.actions.act_window,help:bemade_fsm.task_template_act_window msgid "There are no task templates, click above to create one." -msgstr "Il n'existe aucun gabarit de tâche, cliquez ci-dessus pour en créer une." - -#. module: bemade_fsm -#: code:addons/bemade_fsm/models/sale_order.py:0 -#, python-format -msgid "" -"This task has been created from: %s (%s)" msgstr "" -"Cette tâche a été créée à partir de : %s (%s)" +"Il n'existe aucun gabarit de tâche, cliquez ci-dessus pour en créer une." #. module: bemade_fsm #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table diff --git a/bemade_fsm/tests/test_sale_order.py b/bemade_fsm/tests/test_sale_order.py index 9b22f35..2801ff3 100644 --- a/bemade_fsm/tests/test_sale_order.py +++ b/bemade_fsm/tests/test_sale_order.py @@ -270,3 +270,20 @@ class TestSalesOrder(BemadeFSMBaseTest): self.assertTrue("It even spans multiple lines." in task.description) self.assertTrue("One could find this annoying in a task name." in task.description) + + def test_subtask_templates_no_description_if_blank_on_template(self): + so = self._generate_sale_order() + template = self._generate_task_template(structure=[5], names=['Parent', 'Child']) + template.description = "" + template.subtasks[0].description = "Some fixed description" + for t in template.subtasks[1:]: + t.description = "" + product = self._generate_product(task_template=template) + sol = self._generate_sale_order_line(sale_order=so, product=product) + + so.action_confirm() + + task = sol.task_id + self.assertEqual(task.child_ids[0].description, template.subtasks[0].description) + for t in task.child_ids[1:]: + self.assertFalse(t.description) diff --git a/bemade_fsm/views/product_views.xml b/bemade_fsm/views/product_views.xml index 340de8c..a580f43 100644 --- a/bemade_fsm/views/product_views.xml +++ b/bemade_fsm/views/product_views.xml @@ -9,7 +9,8 @@ + attrs="{'invisible': [('service_tracking', 'not in', ('task_global_project', 'task_in_project'))]}" + domain="[('parent', '=', False)]"/> diff --git a/bemade_fsm/views/task_views.xml b/bemade_fsm/views/task_views.xml index f0ec993..9f1de08 100644 --- a/bemade_fsm/views/task_views.xml +++ b/bemade_fsm/views/task_views.xml @@ -38,6 +38,16 @@ + + + project.task + bemade_fsm.project_task.form2 + + + + + + [('is_fsm', '=', True), diff --git a/bemade_margin_vendor_pricelist/__manifest__.py b/bemade_margin_vendor_pricelist/__manifest__.py new file mode 100644 index 0000000..d190342 --- /dev/null +++ b/bemade_margin_vendor_pricelist/__manifest__.py @@ -0,0 +1,33 @@ +# +# Bemade Inc. +# +# Copyright (C) September 2023 Bemade Inc. (). +# Author: Marc Durepos (Contact : marc@bemade.org) +# +# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) +# It is forbidden to publish, distribute, sublicense, or sell copies of the Software +# or modified copies of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +{ + 'name': 'Sales Margin on Vendor Price', + 'version': '15.0.0.0.1', + 'summary': 'Enables calculation of sales margins based on vendor pricelists.', + 'description': """Adds a new method for calculating """, + 'category': '', + 'author': 'Bemade Inc.', + 'website': 'https://www.bemade.org', + 'license': 'OPL-1', + 'depends': [''], + 'data': [''], + 'demo': [''], + 'installable': True, + 'auto_install': False, +} From a988b6d035e7470862837b42585062d4c64de16c Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Wed, 18 Oct 2023 20:53:35 -0400 Subject: [PATCH 2/5] New module bemade_margin_vendor_pricelist. Calculates margins based vendor pricing, average inventory cost, or a blend of both, depending on the situation. --- bemade_margin_vendor_pricelist/__init__.py | 1 + .../__manifest__.py | 6 +- .../models/__init__.py | 1 + .../models/sale_order.py | 153 ++++++++++++++++++ .../models/views/sale_order.xml | 50 ++++++ 5 files changed, 207 insertions(+), 4 deletions(-) create mode 100644 bemade_margin_vendor_pricelist/__init__.py create mode 100644 bemade_margin_vendor_pricelist/models/__init__.py create mode 100644 bemade_margin_vendor_pricelist/models/sale_order.py create mode 100644 bemade_margin_vendor_pricelist/models/views/sale_order.xml diff --git a/bemade_margin_vendor_pricelist/__init__.py b/bemade_margin_vendor_pricelist/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/bemade_margin_vendor_pricelist/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/bemade_margin_vendor_pricelist/__manifest__.py b/bemade_margin_vendor_pricelist/__manifest__.py index d190342..ea19487 100644 --- a/bemade_margin_vendor_pricelist/__manifest__.py +++ b/bemade_margin_vendor_pricelist/__manifest__.py @@ -21,13 +21,11 @@ 'version': '15.0.0.0.1', 'summary': 'Enables calculation of sales margins based on vendor pricelists.', 'description': """Adds a new method for calculating """, - 'category': '', 'author': 'Bemade Inc.', 'website': 'https://www.bemade.org', 'license': 'OPL-1', - 'depends': [''], - 'data': [''], - 'demo': [''], + 'depends': ['sale_stock_margin'], + 'data': ['models/views/sale_order.xml'], 'installable': True, 'auto_install': False, } diff --git a/bemade_margin_vendor_pricelist/models/__init__.py b/bemade_margin_vendor_pricelist/models/__init__.py new file mode 100644 index 0000000..6aacb75 --- /dev/null +++ b/bemade_margin_vendor_pricelist/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order diff --git a/bemade_margin_vendor_pricelist/models/sale_order.py b/bemade_margin_vendor_pricelist/models/sale_order.py new file mode 100644 index 0000000..aacabb8 --- /dev/null +++ b/bemade_margin_vendor_pricelist/models/sale_order.py @@ -0,0 +1,153 @@ +from odoo import models, fields, api, _ +from odoo.tools.float_utils import float_is_zero, float_compare + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + margin_actual = fields.Monetary("Margin", compute='_compute_margin_actual', + store=False) + margin_percent_actual = fields.Float('Margin (%)', compute='_compute_margin_actual', + store=False, + group_operator='avg') + + @api.depends('order_line.margin_actual', 'amount_untaxed') + def _compute_margin_actual(self): + for order in self: + order.margin_actual = sum(order.order_line.mapped('margin_actual')) + order.margin_percent_actual = order.amount_untaxed \ + and order.margin_actual / order.amount_untaxed + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + purchase_price_vendor = fields.Float(compute='_compute_purchase_price_vendor', + string="Vendor Price", groups="base.group_user", + digits='Product Price') + margin_percent_vendor = fields.Float(string='Margin (%) on Vendor Price', + groups='base.group_user', group_operator='avg', + compute='_compute_margin_vendor') + margin_vendor = fields.Float(string='Margin on Vendor Price', + groups='base.group_user', digits='Product Price', + compute='_compute_margin_vendor') + + purchase_price_actual = fields.Float(compute="_compute_actual_margins", + digits='Product Price', + groups="base.group_user", + string="Purchase Price") + margin_actual = fields.Float(compute="_compute_actual_margins", + digits='Product Price', + groups="base.group_user", + string="Margin") + margin_percent_actual = fields.Float(compute="_compute_actual_margins", + groups="base.group_user", + string="Margin (%)") + + @api.depends('purchase_price', 'purchase_price_vendor', 'move_ids.product_id', + 'move_ids.product_id.qty_available', 'move_ids.state', + 'qty_to_deliver') + def _compute_actual_margins(self): + """ We want to use the margin based on average inventory valuation when the + sale order line will be completely fulfilled (or has been fulfilled) from stock. + For product not yet in stock we want to use the vendor price. We can also have + blended calculations (partly on vendor price, partly on stock valuation). This + occurs when an order has been or would be partially fulfilled from available + stock. + :return: + """ + non_product_lines = self.filtered(lambda r: not r.product_id) + non_product_lines.purchase_price_actual = 0.0 + non_product_lines.margin_actual = 0.0 + non_product_lines.margin_percent_actual = 0.0 + for line in self - non_product_lines: + stock_missing = line._determine_missing_stock() + if float_is_zero(stock_missing, + precision_rounding=line.product_uom.rounding): + # everything is coming from stock, use inventory valuation + line.purchase_price_actual = line.purchase_price + elif float_compare(line.product_uom_qty, stock_missing, + precision_rounding=line.product_uom.rounding) == 0: + # everything is coming from the vendor, use vendor pricing + line.purchase_price_actual = line.purchase_price_vendor + else: + # we have a mix, use blended pricing + qty_from_stock = line.product_uom_qty - stock_missing + line.purchase_price_actual = \ + (stock_missing * line.purchase_price_vendor + + qty_from_stock * line.purchase_price) \ + / line.product_uom_qty + line.margin_actual = line.price_subtotal - ( + line.purchase_price_actual * line.product_uom_qty) + line.margin_percent_actual = line.price_subtotal \ + and line.margin_actual / line.price_subtotal + + def _determine_missing_stock(self) -> float: + """ Compute how much stock is missing to meet an order line's demand. In the + case of a quotation line, available stock is checked as if the order were to be + placed immediately. + + :return: The quantity missing from available stock to fulfill the line, in + the unit of measure matching self.product_uom. + """ + self.ensure_one() + is_order = self.order_id.state in ('sale', 'done') + if is_order and self.qty_to_deliver == 0: + return 0 + elif is_order and self.qty_to_deliver > 0: + reserved = sum([m.reserved_availability for m in self.move_ids]) + missing = self.qty_to_deliver - reserved + if float_compare(missing, 0.0, + precision_rounding=self.product_uom.rounding) == 1: + # Not enough reserved, check stock + missing = missing - self.product_id.qty_available + if float_compare(missing, 0.0, + precision_rounding=self.product_uom.rounding) == 1: + # Missing some stock to meet demand, return the quantity + return missing + else: + # Enough stock available to meet this line's demand + return 0 + else: + # Already have stock reserved + return 0 + else: + # This is a quotation, don't bother with stock reservations + missing = self.product_uom_qty - self.product_id.qty_available + if float_compare(missing, 0.0, + precision_rounding=self.product_uom.rounding) == 1: + return missing + else: + return 0 + + @api.depends('product_id', 'product_id.seller_ids', + 'product_id.seller_ids.price') + def _compute_purchase_price_vendor(self): + for line in self: + product = line.product_id + suppinfos = product.seller_ids.sorted('sequence') + if not suppinfos: + line.purchase_price_vendor = 0.0 + continue + suppinfo = suppinfos[0] + purch_currency = suppinfo.currency_id + to_cur = line.currency_id or line.order_id.currency_id + line.purchase_price_vendor = purch_currency._convert( + from_amount=suppinfo.price, + to_currency=to_cur, + company=line.company_id or self.env.company, + date=line.order_id.date_order or fields.Date.today(), + round=False, + ) if to_cur and suppinfo.price else suppinfo.price + + @api.depends('purchase_price_vendor') + def _compute_margin_vendor(self): + for line in self: + if not line.price_unit or float_is_zero(line.price_unit): + line.margin_vendor = 0 + line.margin_percent_vendor = 0 + continue + unit_margin = line.price_unit - line.purchase_price_vendor + line.margin_percent_vendor = unit_margin / line.price_unit + + line.margin_vendor = unit_margin * line.product_uom_qty diff --git a/bemade_margin_vendor_pricelist/models/views/sale_order.xml b/bemade_margin_vendor_pricelist/models/views/sale_order.xml new file mode 100644 index 0000000..47d7579 --- /dev/null +++ b/bemade_margin_vendor_pricelist/models/views/sale_order.xml @@ -0,0 +1,50 @@ + + + + + sale.order.margin.view.form.inherit + sale.order + + + + + + + + sale.order.line.margin.view.form.inherit + sale.order + + + + + + + + + sale.order.view.form + + sale.order + + + + + + + + + + + + + + + \ No newline at end of file From 1edb031836779335c6497e5ba4754f570c022b4c Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 19 Oct 2023 09:45:22 -0400 Subject: [PATCH 3/5] bemade_margin_vendor_pricelist: added percentage widget and groups on views. --- bemade_margin_vendor_pricelist/models/views/sale_order.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bemade_margin_vendor_pricelist/models/views/sale_order.xml b/bemade_margin_vendor_pricelist/models/views/sale_order.xml index 47d7579..8c7eb40 100644 --- a/bemade_margin_vendor_pricelist/models/views/sale_order.xml +++ b/bemade_margin_vendor_pricelist/models/views/sale_order.xml @@ -14,7 +14,7 @@ + widget="percentage" groups="base.group_user"/> @@ -40,7 +40,8 @@ - + From 9441a6296510b3fef9f11111d54a41a362ca7e73 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 19 Oct 2023 11:13:35 -0400 Subject: [PATCH 4/5] bemade_margin_vendor_pricelist: added translations. --- .../i18n/bemade_margin_vendor_pricelist.pot | 58 +++++++++++++++++++ bemade_margin_vendor_pricelist/i18n/fr.po | 58 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 bemade_margin_vendor_pricelist/i18n/bemade_margin_vendor_pricelist.pot create mode 100644 bemade_margin_vendor_pricelist/i18n/fr.po diff --git a/bemade_margin_vendor_pricelist/i18n/bemade_margin_vendor_pricelist.pot b/bemade_margin_vendor_pricelist/i18n/bemade_margin_vendor_pricelist.pot new file mode 100644 index 0000000..145fc85 --- /dev/null +++ b/bemade_margin_vendor_pricelist/i18n/bemade_margin_vendor_pricelist.pot @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * bemade_margin_vendor_pricelist +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-19 15:08+0000\n" +"PO-Revision-Date: 2023-10-19 15:08+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order__margin_actual +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_actual +msgid "Margin" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order__margin_percent_actual +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_percent_actual +msgid "Margin (%)" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_percent_vendor +msgid "Margin (%) on Vendor Price" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_vendor +msgid "Margin on Vendor Price" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__purchase_price_actual +msgid "Purchase Price" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model,name:bemade_margin_vendor_pricelist.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model,name:bemade_margin_vendor_pricelist.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__purchase_price_vendor +msgid "Vendor Price" +msgstr "" diff --git a/bemade_margin_vendor_pricelist/i18n/fr.po b/bemade_margin_vendor_pricelist/i18n/fr.po new file mode 100644 index 0000000..f0dcd19 --- /dev/null +++ b/bemade_margin_vendor_pricelist/i18n/fr.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * bemade_margin_vendor_pricelist +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-19 15:08+0000\n" +"PO-Revision-Date: 2023-10-19 15:08+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order__margin_actual +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_actual +msgid "Margin" +msgstr "Marge" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order__margin_percent_actual +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_percent_actual +msgid "Margin (%)" +msgstr "Marge (%)" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_percent_vendor +msgid "Margin (%) on Vendor Price" +msgstr "Marge (%) sur le prix du fournisseur" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__margin_vendor +msgid "Margin on Vendor Price" +msgstr "Marge sur le prix du fournisseur" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__purchase_price_actual +msgid "Purchase Price" +msgstr "Prix d'achat" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model,name:bemade_margin_vendor_pricelist.model_sale_order +msgid "Sales Order" +msgstr "Commande de vente" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model,name:bemade_margin_vendor_pricelist.model_sale_order_line +msgid "Sales Order Line" +msgstr "Article de commande de vente" + +#. module: bemade_margin_vendor_pricelist +#: model:ir.model.fields,field_description:bemade_margin_vendor_pricelist.field_sale_order_line__purchase_price_vendor +msgid "Vendor Price" +msgstr "Prix du fournisseur" From 8137247f79155491469e97f1bf6c31b4b7a94d15 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 19 Oct 2023 11:22:53 -0400 Subject: [PATCH 5/5] bemade_margin_vendor_pricelist: fixed folder hierarchy --- bemade_margin_vendor_pricelist/__manifest__.py | 2 +- .../{models => }/views/sale_order.xml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename bemade_margin_vendor_pricelist/{models => }/views/sale_order.xml (100%) diff --git a/bemade_margin_vendor_pricelist/__manifest__.py b/bemade_margin_vendor_pricelist/__manifest__.py index ea19487..c4cdbc9 100644 --- a/bemade_margin_vendor_pricelist/__manifest__.py +++ b/bemade_margin_vendor_pricelist/__manifest__.py @@ -25,7 +25,7 @@ 'website': 'https://www.bemade.org', 'license': 'OPL-1', 'depends': ['sale_stock_margin'], - 'data': ['models/views/sale_order.xml'], + 'data': ['views/sale_order.xml'], 'installable': True, 'auto_install': False, } diff --git a/bemade_margin_vendor_pricelist/models/views/sale_order.xml b/bemade_margin_vendor_pricelist/views/sale_order.xml similarity index 100% rename from bemade_margin_vendor_pricelist/models/views/sale_order.xml rename to bemade_margin_vendor_pricelist/views/sale_order.xml