213 lines
5.4 KiB
JavaScript
213 lines
5.4 KiB
JavaScript
/** @odoo-module */
|
|
|
|
import { rpc } from "@web/core/network/rpc";
|
|
import { user } from "@web/core/user";
|
|
import { useBus, useService } from "@web/core/utils/hooks";
|
|
import { Many2XAutocomplete } from "@web/views/fields/relational_utils";
|
|
import { DateTimeInput } from '@web/core/datetime/datetime_input';
|
|
import { Component, useState, onWillStart, markup, xml } from "@odoo/owl";
|
|
|
|
export class LunchCurrency extends Component {
|
|
static template = "lunch.LunchCurrency";
|
|
static props = ["currency", "amount"];
|
|
|
|
get amount() {
|
|
return parseFloat(this.props.amount).toFixed(2);
|
|
}
|
|
}
|
|
|
|
export class LunchOrderLine extends Component {
|
|
static template = "lunch.LunchOrderLine";
|
|
static props = ["line", "currency", "onUpdateQuantity", "openOrderLine", "infos"];
|
|
static components = {
|
|
LunchCurrency,
|
|
};
|
|
|
|
setup() {
|
|
super.setup();
|
|
this.orm = useService('orm');
|
|
this.state = useState({ mobileOpen: false });
|
|
}
|
|
|
|
get line() {
|
|
return this.props.line;
|
|
}
|
|
|
|
get canAdd(){
|
|
let price = this.line.product[3]
|
|
this.line.toppings.forEach((line) => price += line[3])
|
|
const unpaid = parseFloat(this.props.infos.unpaid_subtotal)
|
|
return this.canEdit && (this.props.infos.wallet - unpaid) > price;
|
|
}
|
|
|
|
get canEdit() {
|
|
return !['sent', 'confirmed'].includes(this.line.raw_state);
|
|
}
|
|
|
|
get badgeClass() {
|
|
const mapping = {'new': 'warning', 'confirmed': 'success', 'sent': 'info', 'ordered': 'danger'};
|
|
return mapping[this.line.raw_state];
|
|
}
|
|
|
|
get hasToppings() {
|
|
return this.line.toppings.length !== 0;
|
|
}
|
|
|
|
async updateQuantity(increment) {
|
|
await this.orm.call('lunch.order', 'update_quantity', [
|
|
this.props.line.id,
|
|
increment
|
|
]);
|
|
|
|
await this.props.onUpdateQuantity();
|
|
}
|
|
}
|
|
|
|
export class LunchAlert extends Component {
|
|
static props = ["message"];
|
|
static template = xml`<t t-out="message"/>`;
|
|
get message() {
|
|
return markup(this.props.message);
|
|
}
|
|
}
|
|
|
|
export class LunchAlerts extends Component {
|
|
static components = {
|
|
LunchAlert,
|
|
};
|
|
static props = ["alerts"];
|
|
static template = "lunch.LunchAlerts";
|
|
}
|
|
|
|
export class LunchUser extends Component {
|
|
static components = {
|
|
Many2XAutocomplete,
|
|
};
|
|
static props = ["username", "isManager", "onUpdateUser"];
|
|
static template = "lunch.LunchUser";
|
|
getDomain() {
|
|
return [['share', '=', false]];
|
|
}
|
|
}
|
|
|
|
export class LunchLocation extends Component {
|
|
static components = {
|
|
Many2XAutocomplete,
|
|
};
|
|
static props = ["location", "onUpdateLunchLocation"];
|
|
static template = "lunch.LunchLocation";
|
|
getDomain() {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export class LunchDashboard extends Component {
|
|
static components = {
|
|
LunchAlerts,
|
|
LunchCurrency,
|
|
LunchLocation,
|
|
LunchOrderLine,
|
|
LunchUser,
|
|
Many2XAutocomplete,
|
|
};
|
|
static props = ["openOrderLine"];
|
|
static template = "lunch.LunchDashboard";
|
|
setup() {
|
|
super.setup();
|
|
this.state = useState({
|
|
infos: {},
|
|
date: new Date(),
|
|
});
|
|
|
|
useBus(this.env.bus, 'lunch_update_dashboard', () => this._fetchLunchInfos());
|
|
onWillStart(async () => {
|
|
await this._fetchLunchInfos()
|
|
this.env.searchModel.updateLocationId(this.state.infos.user_location[0]);
|
|
});
|
|
}
|
|
|
|
async lunchRpc(route, args = {}) {
|
|
return await rpc(route, {
|
|
...args,
|
|
context: user.context,
|
|
user_id: this.env.searchModel.lunchState.userId,
|
|
})
|
|
}
|
|
|
|
async _fetchLunchInfos() {
|
|
this.state.infos = await this.lunchRpc('/lunch/infos');
|
|
}
|
|
|
|
async emptyCart() {
|
|
await this.lunchRpc('/lunch/trash');
|
|
await this._fetchLunchInfos();
|
|
}
|
|
|
|
get hasLines() {
|
|
return this.state.infos.lines && this.state.infos.lines.length !== 0;
|
|
}
|
|
|
|
get canOrder() {
|
|
return this.state.infos.raw_state === 'new';
|
|
}
|
|
|
|
get location() {
|
|
return this.state.infos.user_location && this.state.infos.user_location[1];
|
|
}
|
|
|
|
async orderNow() {
|
|
if (!this.canOrder) {
|
|
return;
|
|
}
|
|
|
|
await this.lunchRpc('/lunch/pay');
|
|
await this._fetchLunchInfos();
|
|
}
|
|
|
|
async onUpdateQuantity() {
|
|
await this._fetchLunchInfos();
|
|
}
|
|
|
|
async onUpdateUser(value) {
|
|
if (!value) {
|
|
return;
|
|
}
|
|
this.env.searchModel.updateUserId(value[0].id);
|
|
await this._fetchLunchInfos();
|
|
}
|
|
|
|
async onUpdateLunchLocation(value) {
|
|
if (!value) {
|
|
return;
|
|
}
|
|
|
|
await this.lunchRpc('/lunch/user_location_set', {
|
|
location_id: value[0].id,
|
|
});
|
|
await this._fetchLunchInfos();
|
|
this.env.searchModel.updateLocationId(value[0].id);
|
|
}
|
|
|
|
async onUpdateLunchTime(value) {
|
|
if (value) {
|
|
// Set time at 12:00
|
|
this.state.date.setTime(value + 12 * 60 * 60 * 1000);
|
|
} else {
|
|
this.state.date.setTime(new Date());
|
|
}
|
|
this.env.searchModel.updateDate(this.state.date);
|
|
}
|
|
}
|
|
|
|
LunchDashboard.components = {
|
|
LunchAlerts,
|
|
LunchCurrency,
|
|
LunchLocation,
|
|
LunchOrderLine,
|
|
LunchUser,
|
|
Many2XAutocomplete,
|
|
DateTimeInput,
|
|
};
|
|
LunchDashboard.props = ["openOrderLine"];
|
|
LunchDashboard.template = 'lunch.LunchDashboard';
|