Skip to content

Commit 905dbbf

Browse files
committed
[ADD] module product_pricelist_supplier_info
1 parent 2d08548 commit 905dbbf

File tree

13 files changed

+511
-0
lines changed

13 files changed

+511
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Copyright 2025 Akretion (https://www.akretion.com).
2+
# @author Sébastien BEAU <sebastien.beau@akretion.com>
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
5+
6+
{
7+
"name": "Product Pricelist Supplier Info",
8+
"summary": "Show supplier info on pricelist item",
9+
"version": "14.0.1.0.0",
10+
"development_status": "Alpha",
11+
"category": "Uncategorized",
12+
"website": "www.akretion.com",
13+
"author": " Akretion",
14+
"license": "AGPL-3",
15+
"external_dependencies": {
16+
"python": [],
17+
"bin": [],
18+
},
19+
"depends": [
20+
"purchase",
21+
"sale",
22+
"product_supplierinfo_per_attribute_value",
23+
"product_pricelist_per_attribute_value",
24+
],
25+
"data": ["views/product_pricelist_item_view.xml"],
26+
"demo": [],
27+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * product_pricelist_supplier_info
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 14.0\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"Last-Translator: \n"
10+
"Language-Team: \n"
11+
"MIME-Version: 1.0\n"
12+
"Content-Type: text/plain; charset=UTF-8\n"
13+
"Content-Transfer-Encoding: \n"
14+
"Plural-Forms: \n"
15+
16+
#. module: product_pricelist_supplier_info
17+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__display_name
18+
msgid "Display Name"
19+
msgstr ""
20+
21+
#. module: product_pricelist_supplier_info
22+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__id
23+
msgid "ID"
24+
msgstr ""
25+
26+
#. module: product_pricelist_supplier_info
27+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item____last_update
28+
msgid "Last Modified on"
29+
msgstr ""
30+
31+
#. module: product_pricelist_supplier_info
32+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_info
33+
msgid "Main Supplier Info"
34+
msgstr "Autre Prix"
35+
36+
#. module: product_pricelist_supplier_info
37+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_margin
38+
msgid "Main Supplier Margin"
39+
msgstr "Marge"
40+
41+
#. module: product_pricelist_supplier_info
42+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_price
43+
msgid "Main Supplier Price"
44+
msgstr "Prix Fournisseur"
45+
46+
#. module: product_pricelist_supplier_info
47+
#: model:ir.model,name:product_pricelist_supplier_info.model_product_pricelist_item
48+
msgid "Pricelist Rule"
49+
msgstr ""
50+
51+
#. module: product_pricelist_supplier_info
52+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_partner_id
53+
msgid "Supplier"
54+
msgstr "Fournisseur"
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * product_pricelist_supplier_info
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 14.0\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"Last-Translator: \n"
10+
"Language-Team: \n"
11+
"MIME-Version: 1.0\n"
12+
"Content-Type: text/plain; charset=UTF-8\n"
13+
"Content-Transfer-Encoding: \n"
14+
"Plural-Forms: \n"
15+
16+
#. module: product_pricelist_supplier_info
17+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__display_name
18+
msgid "Display Name"
19+
msgstr ""
20+
21+
#. module: product_pricelist_supplier_info
22+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__id
23+
msgid "ID"
24+
msgstr ""
25+
26+
#. module: product_pricelist_supplier_info
27+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item____last_update
28+
msgid "Last Modified on"
29+
msgstr ""
30+
31+
#. module: product_pricelist_supplier_info
32+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_info
33+
msgid "Main Supplier Info"
34+
msgstr ""
35+
36+
#. module: product_pricelist_supplier_info
37+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_margin
38+
msgid "Main Supplier Margin"
39+
msgstr ""
40+
41+
#. module: product_pricelist_supplier_info
42+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_price
43+
msgid "Main Supplier Price"
44+
msgstr ""
45+
46+
#. module: product_pricelist_supplier_info
47+
#: model:ir.model,name:product_pricelist_supplier_info.model_product_pricelist_item
48+
msgid "Pricelist Rule"
49+
msgstr ""
50+
51+
#. module: product_pricelist_supplier_info
52+
#: model:ir.model.fields,field_description:product_pricelist_supplier_info.field_product_pricelist_item__main_supplier_partner_id
53+
msgid "Supplier"
54+
msgstr ""
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import product_pricelist_item
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Copyright 2025 Akretion (https://www.akretion.com).
2+
# @author Sébastien BEAU <sebastien.beau@akretion.com>
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
5+
from odoo import api, fields, models
6+
7+
8+
class ProductPricelistItem(models.Model):
9+
_inherit = "product.pricelist.item"
10+
11+
main_supplier_partner_id = fields.Many2one(
12+
"res.partner", "Supplier", compute="_compute_supplier_info"
13+
)
14+
main_supplier_margin = fields.Float(compute="_compute_supplier_info")
15+
main_supplier_price = fields.Float(compute="_compute_supplier_info")
16+
main_supplier_info = fields.Text(compute="_compute_supplier_info")
17+
18+
def _prepare_info_name(self, seller):
19+
tmpl_values = seller.product_id.product_template_attribute_value_ids
20+
values = (
21+
tmpl_values.product_attribute_value_id or seller.product_attribute_value_ids
22+
)
23+
if values:
24+
return ", ".join(values.mapped("name"))
25+
else:
26+
return "_"
27+
28+
@api.depends(
29+
"product_tmpl_id.seller_ids.price",
30+
"product_tmpl_id.seller_ids.name",
31+
"product_tmpl_id.seller_ids.min_qty",
32+
"product_tmpl_id.seller_ids.date_start",
33+
"product_tmpl_id.seller_ids.date_end",
34+
"product_tmpl_id.seller_ids.sequence",
35+
"product_tmpl_id.seller_ids.product_id",
36+
"product_tmpl_id.seller_ids.product_attribute_value_ids", # in a glue module ?
37+
)
38+
def _compute_supplier_info(self):
39+
# Following code is not optimal when having a lot of variante
40+
# But it's simple code ;)
41+
for record in self:
42+
sellers = self.env["product.supplierinfo"]
43+
if record.product_id:
44+
sellers = record.product_id._select_seller(quantity=record.min_quantity)
45+
elif record.product_tmpl_id:
46+
for variant in record.product_tmpl_id.product_variant_ids:
47+
if record._is_applicable_for(variant, record.min_quantity):
48+
sellers |= variant._select_seller(quantity=record.min_quantity)
49+
if not sellers:
50+
record.update(
51+
{
52+
"main_supplier_partner_id": None,
53+
"main_supplier_margin": 0,
54+
"main_supplier_price": 0,
55+
"main_supplier_info": "",
56+
}
57+
)
58+
else:
59+
sellers = sellers.sorted("price", reverse=True)
60+
seller = sellers[0]
61+
if len(sellers) > 1 and seller.price > sellers[-1].price:
62+
info = "- " + "\n- ".join(
63+
[
64+
(
65+
format(seller.price, "g")
66+
+ f" : {self._prepare_info_name(seller)}"
67+
)
68+
for seller in sellers
69+
]
70+
)
71+
else:
72+
info = ""
73+
if seller.price:
74+
margin = (record.fixed_price - seller.price) / record.fixed_price
75+
else:
76+
margin = 0
77+
record.update(
78+
{
79+
"main_supplier_partner_id": seller.name.id,
80+
"main_supplier_margin": margin,
81+
"main_supplier_price": seller.price,
82+
"main_supplier_info": info,
83+
}
84+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Copyright 2025 Akretion (https://www.akretion.com).
2+
# @author Sébastien BEAU <sebastien.beau@akretion.com>
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
5+
6+
from odoo import _, api, fields, models
7+
8+
9+
class ProductSupplierinfo(models.Model):
10+
_inherit = 'product.supplierinfo'
11+
12+
13+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_price

0 commit comments

Comments
 (0)