From f006353aa4c581ad62ffeed577d7ce06f2d7e2e0 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Fri, 24 Jan 2025 15:26:43 +0100
Subject: [PATCH] [IMP] product_contract: Set description under product name
instead of description
Using the feature extraLines of Many2one field Component we can add the info under the product and avoid noice on the product description.
You can show this info on the description by using the system parameters:
- product_contract.show_recurrency
- product_contract.show_invoicing_type
- product_contract.show_date
---
product_contract/README.rst | 10 ++
product_contract/i18n/es.po | 80 ++++-----
product_contract/i18n/product_contract.pot | 49 +++---
product_contract/models/sale_order_line.py | 157 +++++++++++-------
product_contract/readme/CONFIGURE.md | 5 +
.../static/description/index.html | 39 +++--
.../static/src/js/sale_product_field.esm.js | 15 ++
product_contract/views/sale_order.xml | 1 +
8 files changed, 212 insertions(+), 144 deletions(-)
create mode 100644 product_contract/readme/CONFIGURE.md
diff --git a/product_contract/README.rst b/product_contract/README.rst
index e9f75bda9..57cae6822 100644
--- a/product_contract/README.rst
+++ b/product_contract/README.rst
@@ -42,6 +42,16 @@ invoice directly.
.. contents::
:local:
+Configuration
+=============
+
+You can include the contract details on the sales order description by
+using the following system parameters:
+
+1. **Recurrency** -> product_contract.show_recurrency
+2. **Invoicing Type** -> product_contract.show_invoicing_type
+3. **Date** -> product_contract.show_date
+
Usage
=====
diff --git a/product_contract/i18n/es.po b/product_contract/i18n/es.po
index a3ce0bd48..4704f42aa 100644
--- a/product_contract/i18n/es.po
+++ b/product_contract/i18n/es.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-08-30 12:54+0000\n"
-"PO-Revision-Date: 2024-08-30 15:06+0200\n"
+"POT-Creation-Date: 2025-01-24 14:18+0000\n"
+"PO-Revision-Date: 2025-01-24 15:19+0100\n"
"Last-Translator: Pedro M. Baeza \n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"Language: es\n"
@@ -20,6 +20,27 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Date: {}"
+msgstr "- Fecha: {}"
+
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Invoicing Type: {}"
+msgstr "- Tipo de facturación: {}"
+
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Recurrency: {}"
+msgstr "- Recurrencia: {}"
+
#. module: product_contract
#: model_terms:ir.ui.view,arch_db:product_contract.contract_contract_customer_form_view
msgid "Sale Orders"
@@ -361,6 +382,11 @@ msgstr "Producto"
msgid "Product Contract Configurator Wizard"
msgstr ""
+#. module: product_contract
+#: model:ir.model.fields,field_description:product_contract.field_sale_order_line__product_contract_description
+msgid "Product Contract Description"
+msgstr ""
+
#. module: product_contract
#: model:ir.model.fields,field_description:product_contract.field_product_contract_configurator__product_uom_qty
msgid "Quantity"
@@ -616,53 +642,3 @@ msgstr "Años"
#, python-format
msgid "You can't upsell or downsell a terminated contract"
msgstr "No puede vender o vender un contrato terminado"
-
-#. module: product_contract
-#. odoo-python
-#: code:addons/product_contract/models/sale_order.py:0
-#, python-format
-msgid ""
-"You must specify a contract template for '%(product_name)s' product in "
-"'%(company_name)s' company."
-msgstr ""
-"Debes especificar una plantilla de contrato para el producto "
-"'%(product_name)s' en la empresa '%(company_name)s'."
-
-#. module: product_contract
-#. odoo-python
-#: code:addons/product_contract/models/sale_order_line.py:0
-#, python-format
-msgid ""
-"{product}:\n"
-" - Recurrency: {recurring_rule}\n"
-" - Invoicing Type: {invoicing_type}\n"
-" - Date: {date_text}\n"
-" "
-msgstr ""
-
-#, python-format
-#~ msgid ""
-#~ "{product}\n"
-#~ " - Recurrency: {recurring_rule}\n"
-#~ " - Invoicing Type: {invoicing_type}\n"
-#~ " - Date: {date_text}\n"
-#~ " "
-#~ msgstr ""
-#~ "{product}\n"
-#~ " - Periodicidad: {recurring_rule}\n"
-#~ " - Tipo de facturación: {invoicing_type}\n"
-#~ " - Fecha: {date_text}\n"
-#~ " "
-
-#~ msgid "Product Template"
-#~ msgstr "Plantilla de producto"
-
-#~ msgid "Sale Order"
-#~ msgstr "Pedido de Venta"
-
-#, python-format
-#~ msgid ""
-#~ "You must specify a contract template for '{}' product in '{}' company."
-#~ msgstr ""
-#~ "Debe especificar una plantilla de contrato para el producto '{}' en la "
-#~ "compañía '{}'."
diff --git a/product_contract/i18n/product_contract.pot b/product_contract/i18n/product_contract.pot
index 1d930281c..9959a7344 100644
--- a/product_contract/i18n/product_contract.pot
+++ b/product_contract/i18n/product_contract.pot
@@ -6,6 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-01-24 14:18+0000\n"
+"PO-Revision-Date: 2025-01-24 14:18+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -13,6 +15,27 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Date: {}"
+msgstr ""
+
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Invoicing Type: {}"
+msgstr ""
+
+#. module: product_contract
+#. odoo-python
+#: code:addons/product_contract/models/sale_order_line.py:0
+#, python-format
+msgid "- Recurrency: {}"
+msgstr ""
+
#. module: product_contract
#: model_terms:ir.ui.view,arch_db:product_contract.contract_contract_customer_form_view
msgid "Sale Orders"
@@ -354,6 +377,11 @@ msgstr ""
msgid "Product Contract Configurator Wizard"
msgstr ""
+#. module: product_contract
+#: model:ir.model.fields,field_description:product_contract.field_sale_order_line__product_contract_description
+msgid "Product Contract Description"
+msgstr ""
+
#. module: product_contract
#: model:ir.model.fields,field_description:product_contract.field_product_contract_configurator__product_uom_qty
msgid "Quantity"
@@ -559,24 +587,3 @@ msgstr ""
#, python-format
msgid "You can't upsell or downsell a terminated contract"
msgstr ""
-
-#. module: product_contract
-#. odoo-python
-#: code:addons/product_contract/models/sale_order.py:0
-#, python-format
-msgid ""
-"You must specify a contract template for '%(product_name)s' product in "
-"'%(company_name)s' company."
-msgstr ""
-
-#. module: product_contract
-#. odoo-python
-#: code:addons/product_contract/models/sale_order_line.py:0
-#, python-format
-msgid ""
-"{product}:\n"
-" - Recurrency: {recurring_rule}\n"
-" - Invoicing Type: {invoicing_type}\n"
-" - Date: {date_text}\n"
-" "
-msgstr ""
diff --git a/product_contract/models/sale_order_line.py b/product_contract/models/sale_order_line.py
index fa86047c8..1bf5cf84c 100644
--- a/product_contract/models/sale_order_line.py
+++ b/product_contract/models/sale_order_line.py
@@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
+from odoo.tools import str2bool
MONTH_NB_MAPPING = {
"monthly": 1,
@@ -74,6 +75,9 @@ class SaleOrderLine(models.Model):
contract_start_date_method = fields.Selection(
related="product_id.contract_start_date_method"
)
+ product_contract_description = fields.Text(
+ compute="_compute_product_contract_description"
+ )
@api.constrains("contract_id")
def _check_contact_is_not_terminated(self):
@@ -307,64 +311,103 @@ class SaleOrderLine(models.Model):
start_date = start_date + relativedelta(day=31)
line.date_start = start_date
- @api.depends("product_id")
- def _compute_name(self):
- res = super()._compute_name()
+ def _get_product_contract_date_text(self):
+ self.ensure_one()
+ date_text = ""
+ if self.contract_start_date_method == "manual":
+ date_text = "%s" % self.date_start
+ if self.date_end:
+ date_text += " -> %s" % self.date_end
+ else:
+ field_info = dict(
+ self._fields["contract_start_date_method"].get_description(self.env)
+ )
+ field_selection = dict(field_info.get("selection"))
+ start_method_label = field_selection.get(self.contract_start_date_method)
+ date_text = start_method_label and "%s" % start_method_label
+ if (
+ self.recurring_rule_type != "monthly"
+ and self.product_id["force_month_%s" % self.recurring_rule_type]
+ ):
+ field_info = dict(
+ self.env["product.template"]
+ ._fields["force_month_%s" % self.recurring_rule_type]
+ .get_description(self.env)
+ )
+ field_selection = dict(field_info.get("selection"))
+ force_month_label = field_selection.get(
+ self.product_id["force_month_%s" % self.recurring_rule_type]
+ )
+ date_text += " (%s)" % force_month_label
+ return date_text and _("- Date: {}").format(date_text)
+
+ def _get_product_contract_recurring_rule_label(self):
+ self.ensure_one()
+ field_info = dict(self._fields["recurring_rule_type"].get_description(self.env))
+ field_selection = dict(field_info.get("selection"))
+ recurring_rule_label = field_selection.get(self.recurring_rule_type)
+ return recurring_rule_label and _("- Recurrency: {}").format(
+ recurring_rule_label
+ )
+
+ def _get_product_contract_invoicing_type_label(self):
+ field_info = dict(
+ self._fields["recurring_invoicing_type"].get_description(self.env)
+ )
+ field_selection = dict(field_info.get("selection"))
+ invoicing_type_label = field_selection.get(self.recurring_invoicing_type)
+ return invoicing_type_label and _("- Invoicing Type: {}").format(
+ invoicing_type_label
+ )
+
+ @api.depends(
+ "product_id",
+ "date_start",
+ "date_end",
+ "recurring_rule_type",
+ "recurring_invoicing_type",
+ )
+ def _compute_product_contract_description(self):
+ self.product_contract_description = False
for line in self:
if line.is_contract:
- date_text = ""
- if line.contract_start_date_method == "manual":
- date_text = "%s" % line.date_start
- if line.date_end:
- date_text += " -> %s" % line.date_end
- else:
- field_info = dict(
- line._fields["contract_start_date_method"].get_description(
- self.env
- )
- )
- field_selection = dict(field_info.get("selection"))
- start_method_label = field_selection.get(
- line.contract_start_date_method
- )
- date_text = "%s" % start_method_label
- if (
- line.recurring_rule_type != "monthly"
- and line.product_id["force_month_%s" % line.recurring_rule_type]
- ):
- field_info = dict(
- self.env["product.template"]
- ._fields["force_month_%s" % line.recurring_rule_type]
- .get_description(self.env)
- )
- field_selection = dict(field_info.get("selection"))
- force_month_label = field_selection.get(
- line.product_id["force_month_%s" % line.recurring_rule_type]
- )
- date_text += " (%s)" % force_month_label
- field_info = dict(
- self._fields["recurring_rule_type"].get_description(self.env)
- )
- field_selection = dict(field_info.get("selection"))
- recurring_rule_label = field_selection.get(line.recurring_rule_type)
- field_info = dict(
- self._fields["recurring_invoicing_type"].get_description(self.env)
- )
- field_selection = dict(field_info.get("selection"))
- invoicing_type_label = field_selection.get(
- line.recurring_invoicing_type
- )
- line.name = _(
- """{product}:
- - Recurrency: {recurring_rule}
- - Invoicing Type: {invoicing_type}
- - Date: {date_text}
- """
- ).format(
- product=line.product_id.display_name,
- recurring_rule=recurring_rule_label,
- invoicing_type=invoicing_type_label,
- date_text=date_text,
- )
+ description = ""
+ if (
+ recurring_rule_label
+ := line._get_product_contract_recurring_rule_label()
+ ):
+ description += recurring_rule_label + "||"
+ if (
+ invoicing_type_label
+ := line._get_product_contract_invoicing_type_label()
+ ):
+ description += invoicing_type_label + "||"
+ if date_text := line._get_product_contract_date_text():
+ description += date_text + "||"
+ line.product_contract_description = description
+ @api.depends(
+ "date_start", "date_end", "recurring_rule_type", "recurring_invoicing_type"
+ )
+ def _compute_name(self):
+ res = super()._compute_name()
+ ICP = self.env["ir.config_parameter"].sudo()
+ for line in self:
+ if line.is_contract:
+ description = ""
+ if str2bool(ICP.get_param("product_contract.show_recurrency")) and (
+ recurring_rule_label
+ := line._get_product_contract_recurring_rule_label()
+ ):
+ description += "\n\t" + recurring_rule_label
+ if str2bool(ICP.get_param("product_contract.show_invoicing_type")) and (
+ invoicing_type_label
+ := line._get_product_contract_invoicing_type_label()
+ ):
+ description += "\n\t" + invoicing_type_label
+ if str2bool(ICP.get_param("product_contract.show_date")) and (
+ date_text := line._get_product_contract_date_text()
+ ):
+ description += "\n\t" + date_text
+ line.name = f"{line.product_id.display_name}{description}"
return res
diff --git a/product_contract/readme/CONFIGURE.md b/product_contract/readme/CONFIGURE.md
new file mode 100644
index 000000000..f988ceb63
--- /dev/null
+++ b/product_contract/readme/CONFIGURE.md
@@ -0,0 +1,5 @@
+You can include the contract details on the sales order description by using the following system parameters:
+
+1. **Recurrency** -\> product_contract.show_recurrency
+2. **Invoicing Type** -\> product_contract.show_invoicing_type
+3. **Date** -\> product_contract.show_date
diff --git a/product_contract/static/description/index.html b/product_contract/static/description/index.html
index 9dfa5c9ec..7688ad1f8 100644
--- a/product_contract/static/description/index.html
+++ b/product_contract/static/description/index.html
@@ -379,19 +379,30 @@ invoice directly.
Table of contents
+
+
+
You can include the contract details on the sales order description by
+using the following system parameters:
+
+- Recurrency -> product_contract.show_recurrency
+- Invoicing Type -> product_contract.show_invoicing_type
+- Date -> product_contract.show_date
+
+
-
+
To use this module, you need to:
- Go to Sales -> Products and select or create a product.
@@ -401,14 +412,14 @@ product
-
+
- There’s no support right now for computing the start date for the
following recurrent types: daily, weekly and monthlylastday.
-
+
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -416,16 +427,16 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
Do not contact contributors directly about support or help with technical issues.