[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

@@ -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,
});
}
},
});
},
});