mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[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
This commit is contained in:
@@ -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
|
||||
=====
|
||||
|
||||
|
||||
@@ -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 <pedro.baeza@gmail.com>\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 "<span class=\"o_stat_text\">Sale Orders</span>"
|
||||
@@ -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 '{}'."
|
||||
|
||||
@@ -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 "<span class=\"o_stat_text\">Sale Orders</span>"
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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
|
||||
|
||||
5
product_contract/readme/CONFIGURE.md
Normal file
5
product_contract/readme/CONFIGURE.md
Normal file
@@ -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
|
||||
@@ -379,19 +379,30 @@ invoice directly.</p>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
|
||||
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-2">Known issues / Roadmap</a></li>
|
||||
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
|
||||
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
|
||||
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
|
||||
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-3">Known issues / Roadmap</a></li>
|
||||
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="configuration">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
|
||||
<p>You can include the contract details on the sales order description by
|
||||
using the following system parameters:</p>
|
||||
<ol class="arabic simple">
|
||||
<li><strong>Recurrency</strong> -> product_contract.show_recurrency</li>
|
||||
<li><strong>Invoicing Type</strong> -> product_contract.show_invoicing_type</li>
|
||||
<li><strong>Date</strong> -> product_contract.show_date</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="section" id="usage">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
|
||||
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
|
||||
<p>To use this module, you need to:</p>
|
||||
<ol class="arabic simple">
|
||||
<li>Go to Sales -> Products and select or create a product.</li>
|
||||
@@ -401,14 +412,14 @@ product</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="section" id="known-issues-roadmap">
|
||||
<h1><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h1>
|
||||
<h1><a class="toc-backref" href="#toc-entry-3">Known issues / Roadmap</a></h1>
|
||||
<ul class="simple">
|
||||
<li>There’s no support right now for computing the start date for the
|
||||
following recurrent types: daily, weekly and monthlylastday.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
|
||||
<h1><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/contract/issues">GitHub Issues</a>.
|
||||
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
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
|
||||
<h1><a class="toc-backref" href="#toc-entry-5">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>LasLabs</li>
|
||||
<li>ACSONE SA/NV</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
|
||||
<h2><a class="toc-backref" href="#toc-entry-7">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Ted Salmon <<a class="reference external" href="mailto:tsalmon@laslabs.com">tsalmon@laslabs.com</a>></li>
|
||||
<li>Souheil Bejaoui <<a class="reference external" href="mailto:souheil.bejaoui@acsone.eu">souheil.bejaoui@acsone.eu</a>></li>
|
||||
@@ -439,7 +450,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
|
||||
<h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2>
|
||||
<p>This module is maintained by the OCA.</p>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org">
|
||||
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
|
||||
|
||||
@@ -4,6 +4,21 @@ import {SaleOrderLineProductField} from "@sale/js/sale_product_field";
|
||||
import {patch} from "@web/core/utils/patch";
|
||||
|
||||
patch(SaleOrderLineProductField.prototype, {
|
||||
get extraLines() {
|
||||
var res = super.extraLines;
|
||||
if (
|
||||
this.props.record.data.is_contract &&
|
||||
this.props.record.data.product_contract_description
|
||||
) {
|
||||
for (var val of this.props.record.data.product_contract_description.split(
|
||||
"||"
|
||||
)) {
|
||||
res.push(val);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
},
|
||||
|
||||
async _onProductUpdate() {
|
||||
super._onProductUpdate(...arguments);
|
||||
if (this.props.record.data.is_contract) {
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
>
|
||||
<field name="contract_template_id" column_invisible="1" />
|
||||
<field name="is_contract" column_invisible="1" />
|
||||
<field name="product_contract_description" column_invisible="1" />
|
||||
<field
|
||||
name="contract_id"
|
||||
options='{"no_create": True}'
|
||||
|
||||
Reference in New Issue
Block a user