[IMP] product_contract: Add contract configurator instead of making tree not editable

Before this changes, when trying to edit a line of sale order, it was
opening the form of the line. But following the way to work of odoo
with sale event, we have make a new contract configurator that will
be opened when selecting a product of type contract.
This commit is contained in:
Carlos Roca
2024-08-26 11:29:09 +02:00
parent 7f7d947172
commit 88d2cb9a2f
10 changed files with 367 additions and 22 deletions

View File

@@ -8,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -274,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -300,7 +301,7 @@ span.option {
span.pre {
white-space: pre }
span.problematic {
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -431,7 +432,9 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">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" /></a>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>

View File

@@ -0,0 +1,50 @@
/** @odoo-module **/
import {formView} from "@web/views/form/form_view";
import {registry} from "@web/core/registry";
import {useService} from "@web/core/utils/hooks";
export class ProductContractConfiguratorController extends formView.Controller {
setup() {
super.setup();
this.action = useService("action");
}
async onRecordSaved(record) {
await super.onRecordSaved(...arguments);
const {
product_uom_qty,
contract_id,
recurring_rule_type,
recurring_invoicing_type,
date_start,
date_end,
contract_line_id,
is_auto_renew,
auto_renew_interval,
auto_renew_rule_type,
} = record.data;
return this.action.doAction({
type: "ir.actions.act_window_close",
infos: {
productContractConfiguration: {
product_uom_qty,
contract_id,
recurring_rule_type,
recurring_invoicing_type,
date_start,
date_end,
contract_line_id,
is_auto_renew,
auto_renew_interval,
auto_renew_rule_type,
},
},
});
}
}
registry.category("views").add("product_contract_configurator_form", {
...formView,
Controller: ProductContractConfiguratorController,
});

View File

@@ -0,0 +1,54 @@
/** @odoo-module **/
import {SaleOrderLineProductField} from "@sale/js/sale_product_field";
import {patch} from "@web/core/utils/patch";
patch(SaleOrderLineProductField.prototype, {
async _onProductUpdate() {
super._onProductUpdate(...arguments);
if (this.props.record.data.is_contract) {
this._openContractConfigurator(true);
}
},
_editLineConfiguration() {
super._editLineConfiguration(...arguments);
if (this.props.record.data.is_contract) {
this._openContractConfigurator();
}
},
get isConfigurableLine() {
return super.isConfigurableLine || this.props.record.data.is_contract;
},
async _openContractConfigurator(isNew = false) {
const actionContext = {
default_product_id: this.props.record.data.product_id[0],
default_partner_id: this.props.record.model.root.data.partner_id[0],
default_company_id: this.props.record.model.root.data.company_id[0],
default_product_uom_qty: this.props.record.data.product_uom_qty,
default_contract_id: this.props.record.data.contract_id[0],
default_recurring_rule_type: this.props.record.data.recurring_rule_type,
default_recurring_invoicing_type:
this.props.record.data.recurring_invoicing_type,
default_date_start: this.props.record.data.date_start,
default_date_end: this.props.record.data.date_end,
default_is_auto_renew: this.props.record.data.is_auto_renew,
default_auto_renew_interval: this.props.record.data.auto_renew_interval,
default_auto_renew_rule_type: this.props.record.data.auto_renew_rule_type,
};
this.action.doAction("product_contract.product_contract_configurator_action", {
additionalContext: actionContext,
onClose: async (closeInfo) => {
if (closeInfo && !closeInfo.special) {
this.props.record.update(closeInfo.productContractConfiguration);
} else if (isNew) {
this.props.record.update({
[this.props.name]: undefined,
});
}
},
});
},
});