mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
@@ -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