You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

72 lines
2.5 KiB

/** @odoo-module **/
import { _t } from "@web/core/l10n/translation";
import { ProductScreen } from "@point_of_sale/app/screens/product_screen/product_screen";
import { useService } from "@web/core/utils/hooks";
import { NumberPopup } from "@point_of_sale/app/utils/input_popups/number_popup";
import { ErrorPopup } from "@point_of_sale/app/errors/popups/error_popup";
import { Component } from "@odoo/owl";
import { usePos } from "@point_of_sale/app/store/pos_hook";
import { parseFloat } from "@web/views/fields/parsers";
export class ServiceChargeButton extends Component {
static template = "service_charges_pos.ServiceChargeButton";
setup() {
this.pos = usePos();
this.popup = useService("popup");
}
async click() {
var self = this;
const { confirmed, payload } = await this.popup.add(NumberPopup, {
title: _t("Service Charge"),
startingValue: this.pos.config.service_charge,
isInputSelected: true,
});
if (confirmed) {
const val = Math.max(0, Math.min(100, parseFloat(payload)));
if (val > 0) {
await self.apply_service_charge(val);
}
}
}
async apply_service_charge(val) {
const order = this.pos.get_order();
const lines = order.get_orderlines();
const product = this.pos.db.get_product_by_id(this.pos.config.service_product_id[0]);
if (product === undefined) {
await this.popup.add(ErrorPopup, {
title: _t("No service product found"),
body: _t(
"The service product seems misconfigured. Make sure it is flagged as 'Can be Sold' and 'Available in Point of Sale'."
),
});
return;
}
// Remove existing service charges
lines
.filter((line) => line.get_product() === product)
.forEach((line) => order._unlinkOrderline(line));
// Add service charge
if (this.pos.config.service_charge_type == 'amount') {
var sc_price = val
} else {
var sc_price = order.get_total_with_tax() * val / 100
}
order.add_product(product, {
price: sc_price,
tax_ids: []
});
}
}
ProductScreen.addControlButton({
component: ServiceChargeButton,
condition: function () {
const { is_service_charges, service_product_id } = this.pos.config;
return is_service_charges && service_product_id;
},
});