Initial commit: Sale packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 14e3d26998
6469 changed files with 2479670 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -0,0 +1,46 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { formView } from "@web/views/form/form_view";
import { Record, RelationalModel } from "@web/views/relational_model";
/**
* This model is overridden to allow configuring sale_order_lines through a popup
* window when a product with 'detailed_type' == 'event' is selected.
*
* This allows keeping an editable list view for sales order and remove the noise of
* those 2 fields ('event_id' + 'event_ticket_id')
*/
export class EventConfiguratorRelationalModel extends RelationalModel {}
export class EventConfiguratorRecord extends Record {
/**
* We let the regular process take place to allow the validation of the required fields
* to happen.
*
* Then we can manually close the window, providing event information to the caller.
*
* @override
*/
async save() {
const isSaved = await super.save(...arguments);
if (!isSaved) {
return false;
}
this.model.action.doAction({type: 'ir.actions.act_window_close', infos: {
eventConfiguration: {
event_id: this.data.event_id,
event_ticket_id: this.data.event_ticket_id,
}
}});
return true;
}
}
EventConfiguratorRelationalModel.Record = EventConfiguratorRecord;
registry.category("views").add("event_configurator_form", {
...formView,
Model: EventConfiguratorRelationalModel,
});

View file

@ -0,0 +1,58 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch";
import { SaleOrderLineProductField } from '@sale/js/sale_product_field';
patch(SaleOrderLineProductField.prototype, 'event_sale', {
async _onProductUpdate() {
this._super(...arguments);
if (this.props.record.data.product_type === 'event') {
this._openEventConfigurator();
}
},
_editLineConfiguration() {
this._super(...arguments);
if (this.props.record.data.product_type === 'event') {
this._openEventConfigurator();
}
},
get isConfigurableLine() {
return this._super(...arguments) || Boolean(this.props.record.data.event_ticket_id);
},
async _openEventConfigurator() {
let actionContext = {
'default_product_id': this.props.record.data.product_id[0],
};
if (this.props.record.data.event_id) {
actionContext.default_event_id = this.props.record.data.event_id[0];
}
if (this.props.record.data.event_ticket_id) {
actionContext.default_event_ticket_id = this.props.record.data.event_ticket_id[0];
}
this.action.doAction(
'event_sale.event_configurator_action',
{
additionalContext: actionContext,
onClose: async (closeInfo) => {
if (!closeInfo || closeInfo.special) {
// wizard popup closed or 'Cancel' button triggered
if (!this.props.record.data.event_ticket_id) {
// remove product if event configuration was cancelled.
this.props.record.update({
[this.props.name]: undefined,
});
}
} else {
const eventConfiguration = closeInfo.eventConfiguration;
this.props.record.update(eventConfiguration);
}
}
}
);
},
});

View file

@ -0,0 +1,77 @@
odoo.define('event.event_configurator_tour', function (require) {
"use strict";
var tour = require('web_tour.tour');
tour.register('event_configurator_tour', {
url: "/web",
test: true,
}, [tour.stepUtils.showAppsMenuItem(), {
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
edition: 'community'
}, {
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
edition: 'enterprise'
}, {
trigger: ".o_list_button_add",
extra_trigger: ".o_sale_order"
}, {
trigger: "a:contains('Add a product')"
}, {
trigger: 'div[name="product_id"] input, div[name="product_template_id"] input',
run: function (actions) {
actions.text('Event Registration');
}
}, {
trigger: 'ul.ui-autocomplete a:contains("Event Registration")',
run: 'click'
}, {
trigger: 'div[name="event_id"] input',
run: 'click'
}, {
trigger: 'ul.ui-autocomplete a:contains("Design")',
run: 'click',
in_modal: false
}, {
trigger: 'div[name="event_ticket_id"] input',
run: 'click'
}, {
trigger: 'ul.ui-autocomplete a:contains("VIP")',
run: 'click',
in_modal: false
}, {
trigger: '.o_event_sale_js_event_configurator_ok'
}, {
trigger: "td[name='name'][data-tooltip*='VIP']",
run: function () {} // check
}, {
trigger: 'ul.nav a:contains("Order Lines")',
run: 'click'
}, {
content: "search the partner",
trigger: 'div[name="partner_id"] input',
run: 'text Azure'
}, {
content: "select the partner",
trigger: 'ul.ui-autocomplete > li > a:contains(Azure)',
}, {
trigger: 'td:contains("Event")',
run: 'click'
}, {
trigger: 'button.fa-pencil'
}, {
trigger: 'div[name="event_ticket_id"] input',
run: 'click'
}, {
trigger: 'ul.ui-autocomplete a:contains("Standard")',
run: 'click',
in_modal: false
}, {
trigger: '.o_event_sale_js_event_configurator_ok'
}, {
trigger: "td[name='name'][data-tooltip*='Standard']",
run: function () {} // check
}, ...tour.stepUtils.saveForm()
]);
});