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

+
+

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. +
  3. Invoicing Type -> product_contract.show_invoicing_type
  4. +
  5. Date -> product_contract.show_date
  6. +
+
-

Usage

+

Usage

To use this module, you need to:

  1. Go to Sales -> Products and select or create a product.
  2. @@ -401,14 +412,14 @@ product
-

Known issues / Roadmap

+

Known issues / Roadmap

-

Bug Tracker

+

Bug Tracker

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.

-

Credits

+

Credits

-

Authors

+

Authors

  • LasLabs
  • ACSONE SA/NV
-

Contributors

+

Contributors