From e9fdd2de462991200ca19899f309cce628d46e33 Mon Sep 17 00:00:00 2001 From: Jishnu-Epics Date: Thu, 3 Apr 2025 14:44:17 +0530 Subject: [PATCH] fix:tax issue --- posnext/doc_events/sales_invoice.py | 14 +- posnext/hooks.py | 1 - .../public/dist/js/posnext.bundle.5P43FQKX.js | 5 - .../dist/js/posnext.bundle.5P43FQKX.js.map | 7 - .../public/dist/js/posnext.bundle.TN4KQRHJ.js | 4786 +++++++++++++++++ .../dist/js/posnext.bundle.TN4KQRHJ.js.map | 7 + 6 files changed, 4801 insertions(+), 19 deletions(-) delete mode 100644 posnext/public/dist/js/posnext.bundle.5P43FQKX.js delete mode 100644 posnext/public/dist/js/posnext.bundle.5P43FQKX.js.map create mode 100644 posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js create mode 100644 posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map diff --git a/posnext/doc_events/sales_invoice.py b/posnext/doc_events/sales_invoice.py index 5a6f6ee..d17fc01 100644 --- a/posnext/doc_events/sales_invoice.py +++ b/posnext/doc_events/sales_invoice.py @@ -15,9 +15,11 @@ def validate_si(doc,method): }) -@frappe.whitelist() -def validate_taxes(doc, method): - if doc.taxes and doc.is_pos: - for tax in doc.taxes: - if not tax.included_in_print_rate: - tax.included_in_print_rate = 1 +# @frappe.whitelist() +# def validate_taxes(doc, method): +# if doc.taxes and doc.is_pos: +# for tax in doc.taxes: +# if not tax.included_in_print_rate: +# tax.included_in_print_rate = 1 +# else: +# tax.included_in_print_rate = 0 diff --git a/posnext/hooks.py b/posnext/hooks.py index 3e5a467..3d6c6b6 100644 --- a/posnext/hooks.py +++ b/posnext/hooks.py @@ -141,7 +141,6 @@ "Sales Invoice": { "validate": [ "posnext.doc_events.sales_invoice.validate_si", - "posnext.doc_events.sales_invoice.validate_taxes", ] }, "POS Profile": { diff --git a/posnext/public/dist/js/posnext.bundle.5P43FQKX.js b/posnext/public/dist/js/posnext.bundle.5P43FQKX.js deleted file mode 100644 index a20dad7..0000000 --- a/posnext/public/dist/js/posnext.bundle.5P43FQKX.js +++ /dev/null @@ -1,5 +0,0 @@ -(() => { - // ../posnext/posnext/public/js/posnext.bundle.js - window.posnext = window.posnext || {}; -})(); -//# sourceMappingURL=posnext.bundle.5P43FQKX.js.map diff --git a/posnext/public/dist/js/posnext.bundle.5P43FQKX.js.map b/posnext/public/dist/js/posnext.bundle.5P43FQKX.js.map deleted file mode 100644 index e6d259c..0000000 --- a/posnext/public/dist/js/posnext.bundle.5P43FQKX.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../../../apps/posnext/posnext/public/js/posnext.bundle.js"], - "sourcesContent": ["// import \"./pos_item_selector.js\";\n// import \"./pos_item_cart.js\";\n// import \"./pos_item_details.js\";\n// import \"./pos_number_pad.js\";\n// import \"./pos_payment.js\";\n// import \"./pos_past_order_list.js\";\n// import \"./pos_past_order_summary.js\";\n// import \"./pos_controller\";\n\nwindow.posnext = window.posnext || {};\n"], - "mappings": ";;AASA,SAAO,UAAU,OAAO,WAAW,CAAC;", - "names": [] -} diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js new file mode 100644 index 0000000..623e630 --- /dev/null +++ b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js @@ -0,0 +1,4786 @@ +(() => { + var __defProp = Object.defineProperty; + var __defProps = Object.defineProperties; + var __getOwnPropDescs = Object.getOwnPropertyDescriptors; + var __getOwnPropSymbols = Object.getOwnPropertySymbols; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __propIsEnum = Object.prototype.propertyIsEnumerable; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; + }; + var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); + + // ../posnext/posnext/public/js/pos_controller.js + frappe.provide("posnext.PointOfSale"); + var selected_item = null; + posnext.PointOfSale.Controller = class { + constructor(wrapper) { + console.log("CONTROLLLLLERE"); + this.wrapper = $(wrapper).find(".layout-main-section"); + this.page = wrapper.page; + frappe.run_serially([ + () => this.reload_status = false, + () => this.check_opening_entry(""), + () => this.reload_status = true + ]); + } + fetch_opening_entry(value) { + return frappe.call("posnext.posnext.page.posnext.point_of_sale.check_opening_entry", { "user": frappe.session.user, "value": value }); + } + check_opening_entry(value = "") { + this.fetch_opening_entry(value).then((r) => { + if (r.message.length) { + this.prepare_app_defaults(r.message[0]); + } else { + this.create_opening_voucher(); + } + }); + } + create_opening_voucher() { + const me = this; + const table_fields = [ + { + fieldname: "mode_of_payment", + fieldtype: "Link", + in_list_view: 1, + label: "Mode of Payment", + options: "Mode of Payment", + reqd: 1 + }, + { + fieldname: "opening_amount", + fieldtype: "Currency", + in_list_view: 1, + label: "Opening Amount", + options: "company:company_currency", + change: function() { + dialog.fields_dict.balance_details.df.data.some((d) => { + if (d.idx == this.doc.idx) { + d.opening_amount = this.value; + dialog.fields_dict.balance_details.grid.refresh(); + return true; + } + }); + } + } + ]; + const fetch_pos_payment_methods = () => { + const pos_profile = dialog.fields_dict.pos_profile.get_value(); + if (!pos_profile) + return; + frappe.db.get_doc("POS Profile", pos_profile).then(({ payments }) => { + dialog.fields_dict.balance_details.df.data = []; + payments.forEach((pay) => { + const { mode_of_payment } = pay; + dialog.fields_dict.balance_details.df.data.push({ mode_of_payment, opening_amount: "0" }); + }); + dialog.fields_dict.balance_details.grid.refresh(); + }); + }; + const dialog = new frappe.ui.Dialog({ + title: __("Create POS Opening Entry"), + static: true, + fields: [ + { + fieldtype: "Link", + label: __("Company"), + default: frappe.defaults.get_default("company"), + options: "Company", + fieldname: "company", + reqd: 1 + }, + { + fieldtype: "Link", + label: __("POS Profile"), + options: "POS Profile", + fieldname: "pos_profile", + reqd: 1, + get_query: () => pos_profile_query(), + onchange: () => fetch_pos_payment_methods() + }, + { + fieldname: "balance_details", + fieldtype: "Table", + label: "Opening Balance Details", + cannot_add_rows: false, + in_place_edit: true, + reqd: 1, + data: [], + fields: table_fields + } + ], + primary_action: async function({ company, pos_profile, balance_details }) { + if (!balance_details.length) { + frappe.show_alert({ + message: __("Please add Mode of payments and opening balance details."), + indicator: "red" + }); + return frappe.utils.play_sound("error"); + } + balance_details = balance_details.filter((d) => d.mode_of_payment); + const method = "posnext.posnext.page.posnext.point_of_sale.create_opening_voucher"; + const res = await frappe.call({ method, args: { pos_profile, company, balance_details }, freeze: true }); + !res.exc && me.prepare_app_defaults(res.message); + dialog.hide(); + }, + primary_action_label: __("Submit") + }); + dialog.show(); + const pos_profile_query = () => { + return { + query: "erpnext.accounts.doctype.pos_profile.pos_profile.pos_profile_query", + filters: { company: dialog.fields_dict.company.get_value() } + }; + }; + } + async prepare_app_defaults(data) { + this.pos_opening = data.name; + this.company = data.company; + this.pos_profile = data.pos_profile; + this.pos_opening_time = data.period_start_date; + this.item_stock_map = {}; + this.settings = {}; + window.current_pos_profile = this.pos_profile; + frappe.db.get_value("Stock Settings", void 0, "allow_negative_stock").then(({ message }) => { + this.allow_negative_stock = flt(message.allow_negative_stock) || false; + }); + frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.get_pos_profile_data", + args: { "pos_profile": this.pos_profile }, + callback: (res) => { + const profile = res.message; + Object.assign(this.settings, profile); + this.settings.customer_groups = profile.customer_groups.map((group) => group.name); + this.make_app(); + } + }); + } + set_opening_entry_status() { + this.page.set_title_sub( + ` + + Opened at ${moment(this.pos_opening_time).format("Do MMMM, h:mma")} + + ` + ); + } + make_app() { + this.prepare_dom(); + this.prepare_components(); + this.prepare_menu(); + this.make_new_invoice(); + } + prepare_dom() { + this.wrapper.append( + `
` + ); + this.$components_wrapper = this.wrapper.find(".point-of-sale-app"); + } + prepare_components() { + this.init_item_selector(); + this.init_item_details(); + this.init_item_cart(); + this.init_payments(); + this.init_recent_order_list(); + this.init_order_summary(); + } + prepare_menu() { + this.page.clear_menu(); + if (this.settings.custom_show_open_form_view) { + this.page.add_menu_item(__("Open Form View"), this.open_form_view.bind(this), false, "Ctrl+F"); + } + if (this.settings.custom_show_toggle_recent_orders) { + this.page.add_menu_item(__("Toggle Recent Orders"), this.toggle_recent_order.bind(this), false, "Ctrl+O"); + } + if (this.settings.custom_show_save_as_draft) { + this.page.add_menu_item(__("Save as Draft"), this.save_draft_invoice.bind(this), false, "Ctrl+S"); + } + if (this.settings.custom_show_close_the_pos) { + this.page.add_menu_item(__("Close the POS"), this.close_pos.bind(this), false, "Shift+Ctrl+C"); + } + } + open_form_view() { + frappe.model.sync(this.frm.doc); + frappe.set_route("Form", this.frm.doc.doctype, this.frm.doc.name); + } + toggle_recent_order() { + const show = this.recent_order_list.$component.is(":hidden"); + this.toggle_recent_order_list(show); + } + save_draft_invoice() { + if (!this.$components_wrapper.is(":visible")) + return; + console.log(this.frm.doc.items); + if (this.frm.doc.items.length == 0) { + frappe.show_alert({ + message: __("You must add atleast one item to save it as draft."), + indicator: "red" + }); + frappe.utils.play_sound("error"); + return; + } + this.frm.save(void 0, void 0, void 0, () => { + frappe.show_alert({ + message: __("There was an error saving the document."), + indicator: "red" + }); + frappe.utils.play_sound("error"); + }).then(() => { + frappe.run_serially([ + () => frappe.dom.freeze(), + () => this.make_new_invoice(false), + () => frappe.dom.unfreeze() + ]); + }); + } + close_pos() { + if (!this.$components_wrapper.is(":visible")) + return; + let voucher = frappe.model.get_new_doc("POS Closing Entry"); + voucher.pos_profile = this.frm.doc.pos_profile; + voucher.user = frappe.session.user; + voucher.company = this.frm.doc.company; + voucher.pos_opening_entry = this.pos_opening; + voucher.period_end_date = frappe.datetime.now_datetime(); + voucher.posting_date = frappe.datetime.now_date(); + voucher.posting_time = frappe.datetime.now_time(); + frappe.set_route("Form", "POS Closing Entry", voucher.name); + } + init_item_selector() { + if (this.frm) { + this.frm.doc.set_warehouse = this.settings.warehouse; + } + this.item_selector = new posnext.PointOfSale.ItemSelector({ + wrapper: this.$components_wrapper, + pos_profile: this.pos_profile, + settings: this.settings, + reload_status: this.reload_status, + currency: this.settings.currency, + events: { + check_opening_entry: () => this.check_opening_entry(), + item_selected: (args) => this.on_cart_update(args), + init_item_cart: () => this.init_item_cart(), + init_item_details: () => this.init_item_details(), + change_items: (args) => this.change_items(args), + get_frm: () => this.frm || {} + } + }); + } + change_items(items) { + var me = this; + this.frm = items; + this.cart.load_invoice(); + } + init_item_cart() { + this.cart = new posnext.PointOfSale.ItemCart({ + wrapper: this.$components_wrapper, + settings: this.settings, + events: { + get_frm: () => this.frm, + remove_item_from_cart: (item) => { + this.item_details.current_item = item; + this.item_details.name = item.name; + this.item_details.doctype = item.doctype; + }, + form_updated: (item, field, value) => { + this.item_details.current_item = item; + const item_row = frappe.model.get_doc(item.doctype, item.name); + if (field === "qty" && this.frm.doc.is_return && value >= 0) { + frappe.throw("Qty must be negative for return document"); + } + if (item_row && item_row[field] != value) { + const args = { + field, + value, + item: this.item_details.current_item + }; + return this.on_cart_update(args); + } + return Promise.resolve(); + }, + cart_item_clicked: (item) => { + const item_row = this.get_item_from_frm(item); + if (selected_item && selected_item["name"] == item["name"]) { + selected_item = null; + } else { + selected_item = item_row; + } + this.item_details.toggle_item_details_section(item_row); + }, + numpad_event: (value, action) => this.update_item_field(value, action), + checkout: () => this.save_and_checkout(), + edit_cart: () => this.payment.edit_cart(), + save_draft_invoice: () => this.save_draft_invoice(), + toggle_recent_order: () => this.toggle_recent_order(), + customer_details_updated: (details) => { + this.customer_details = details; + this.payment.render_loyalty_points_payment_mode(); + } + } + }); + } + init_item_details() { + this.item_details = new posnext.PointOfSale.ItemDetails({ + wrapper: this.$components_wrapper, + settings: this.settings, + events: { + get_frm: () => this.frm, + toggle_item_selector: (minimize) => { + this.item_selector.resize_selector(minimize); + this.cart.toggle_numpad(minimize); + }, + form_updated: (item, field, value) => { + const item_row = frappe.model.get_doc(item.doctype, item.name); + if (field === "qty" && this.frm.doc.is_return && value >= 0) { + frappe.throw("Qty must be negative for return document"); + } + if (item_row && item_row[field] != value) { + const args = { + field, + value, + item: this.item_details.current_item + }; + return this.on_cart_update(args); + } + return Promise.resolve(); + }, + highlight_cart_item: (item) => { + const cart_item = this.cart.get_cart_item(item); + this.cart.toggle_item_highlight(cart_item); + }, + item_field_focused: (fieldname) => { + this.cart.toggle_numpad_field_edit(fieldname); + }, + set_value_in_current_cart_item: (selector, value) => { + this.cart.update_selector_value_in_cart_item(selector, value, this.item_details.current_item); + }, + clone_new_batch_item_in_frm: (batch_serial_map, item) => { + Object.keys(batch_serial_map).forEach((batch) => { + const item_to_clone = this.frm.doc.items.find((i) => i.name == item.name); + const new_row = this.frm.add_child("items", __spreadValues({}, item_to_clone)); + new_row.batch_no = batch; + new_row.serial_no = batch_serial_map[batch].join(` +`); + new_row.qty = batch_serial_map[batch].length; + this.frm.doc.items.forEach((row) => { + if (item.item_code === row.item_code) { + this.update_cart_html(row); + } + }); + }); + }, + remove_item_from_cart: () => this.remove_item_from_cart(), + get_item_stock_map: () => this.item_stock_map, + close_item_details: () => { + selected_item = null; + this.item_details.toggle_item_details_section(null); + this.cart.prev_action = null; + this.cart.toggle_item_highlight(); + }, + get_available_stock: (item_code, warehouse) => this.get_available_stock(item_code, warehouse) + } + }); + if (selected_item) { + this.item_details.toggle_item_details_section(selected_item); + } + } + init_payments() { + this.payment = new posnext.PointOfSale.Payment({ + wrapper: this.$components_wrapper, + settings: this.settings, + events: { + get_frm: () => this.frm || {}, + get_customer_details: () => this.customer_details || {}, + toggle_other_sections: (show) => { + if (show) { + this.item_details.$component.is(":visible") ? this.item_details.$component.css("display", "none") : ""; + this.item_selector.toggle_component(false); + } else { + this.item_selector.toggle_component(true); + } + }, + submit_invoice: () => { + this.frm.savesubmit().then((r) => { + this.toggle_components(false); + this.order_summary.toggle_component(true); + this.order_summary.load_summary_of(this.frm.doc, true); + frappe.show_alert({ + indicator: "green", + message: __("POS invoice {0} created succesfully", [r.doc.name]) + }); + }); + } + } + }); + } + init_recent_order_list() { + this.recent_order_list = new posnext.PointOfSale.PastOrderList({ + wrapper: this.$components_wrapper, + events: { + open_invoice_data: (name) => { + frappe.db.get_doc("Sales Invoice", name).then((doc) => { + this.order_summary.load_summary_of(doc); + }); + }, + reset_summary: () => this.order_summary.toggle_summary_placeholder(true), + previous_screen: () => { + this.recent_order_list.toggle_component(false); + this.cart.load_invoice(); + this.item_selector.toggle_component(true); + this.wrapper.find(".past-order-summary").css("display", "none"); + } + }, + settings: this.settings + }); + } + init_order_summary() { + this.order_summary = new posnext.PointOfSale.PastOrderSummary({ + wrapper: this.$components_wrapper, + pos_profile: this.settings, + events: { + get_frm: () => this.frm, + process_return: (name) => { + this.recent_order_list.toggle_component(false); + frappe.db.get_doc("Sales Invoice", name).then((doc) => { + frappe.run_serially([ + () => this.make_return_invoice(doc), + () => this.cart.load_invoice(), + () => this.item_selector.toggle_component(true) + ]); + }); + }, + edit_order: (name) => { + console.log("Edit Order..."); + this.recent_order_list.toggle_component(false); + frappe.run_serially([ + () => this.frm.refresh(name), + () => this.frm.call("reset_mode_of_payments"), + () => this.cart.load_invoice(), + () => this.item_selector.toggle_component(true) + ]); + }, + delete_order: (name) => { + frappe.model.delete_doc(this.frm.doc.doctype, name, () => { + this.recent_order_list.refresh_list(); + }); + }, + new_order: () => { + frappe.run_serially([ + () => frappe.dom.freeze(), + () => this.make_new_invoice(), + () => this.item_selector.toggle_component(true), + () => frappe.dom.unfreeze() + ]); + } + } + }); + } + toggle_recent_order_list(show) { + this.toggle_components(!show); + this.recent_order_list.toggle_component(show); + this.order_summary.toggle_component(show); + } + toggle_components(show) { + this.cart.toggle_component(show); + this.item_selector.toggle_component(show); + !show ? this.item_details.toggle_component(false) || this.payment.toggle_component(false) : ""; + } + make_new_invoice(from_held = false) { + if (from_held) { + return frappe.run_serially([ + () => frappe.dom.freeze(), + () => this.make_sales_invoice_frm(), + () => this.set_pos_profile_data(), + () => this.set_pos_profile_status(), + () => this.cart.load_invoice(), + () => frappe.dom.unfreeze(), + () => this.toggle_recent_order() + ]); + } else { + return frappe.run_serially([ + () => frappe.dom.freeze(), + () => this.make_sales_invoice_frm(), + () => this.set_pos_profile_data(), + () => this.set_pos_profile_status(), + () => this.cart.load_invoice(), + () => frappe.dom.unfreeze() + ]); + } + } + make_sales_invoice_frm() { + const doctype = "Sales Invoice"; + return new Promise((resolve) => { + if (this.frm) { + this.frm = this.get_new_frm(this.frm); + this.frm.doc.items = []; + this.frm.doc.is_pos = 1; + this.frm.doc.set_warehouse = this.settings.warehouse; + resolve(); + } else { + frappe.model.with_doctype(doctype, () => { + this.frm = this.get_new_frm(); + this.frm.doc.items = []; + this.frm.doc.is_pos = 1; + this.frm.doc.set_warehouse = this.settings.warehouse; + resolve(); + }); + } + }); + } + get_new_frm(_frm) { + const doctype = "Sales Invoice"; + const page = $("
"); + const frm = _frm || new frappe.ui.form.Form(doctype, page, false); + const name = frappe.model.make_new_doc_and_get_name(doctype, true); + frm.refresh(name); + return frm; + } + async make_return_invoice(doc) { + frappe.dom.freeze(); + this.frm = this.get_new_frm(this.frm); + this.frm.doc.items = []; + return frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.make_sales_return", + args: { + "source_name": doc.name, + "target_doc": this.frm.doc + }, + callback: (r) => { + frappe.model.sync(r.message); + frappe.get_doc(r.message.doctype, r.message.name).__run_link_triggers = false; + this.set_pos_profile_data().then(() => { + frappe.dom.unfreeze(); + }); + } + }); + } + set_pos_profile_data() { + if (this.company && !this.frm.doc.company) + this.frm.doc.company = this.company; + if ((this.pos_profile && !this.frm.doc.pos_profile) | (this.frm.doc.is_return && this.pos_profile != this.frm.doc.pos_profile)) { + this.frm.doc.pos_profile = this.pos_profile; + } + if (!this.frm.doc.company) + return; + return this.frm.trigger("set_pos_data"); + } + set_pos_profile_status() { + this.page.set_indicator(this.pos_profile, "blue"); + } + async on_cart_update(args) { + console.log("Updating Cart"); + let item_row = void 0; + try { + let { field, value, item } = args; + item_row = this.get_item_from_frm(item); + const item_row_exists = !$.isEmptyObject(item_row); + const from_selector = field === "qty" && value === "+1"; + if (from_selector) + value = flt(item_row.stock_qty) + flt(value); + if (item_row_exists) { + if (field === "qty") + value = flt(value); + if (["qty", "conversion_factor"].includes(field) && value > 0 && !this.allow_negative_stock) { + const qty_needed = field === "qty" ? value * item_row.conversion_factor : item_row.qty * value; + } + if (this.is_current_item_being_edited(item_row) || from_selector) { + await frappe.model.set_value(item_row.doctype, item_row.name, field, value); + } + } else { + if (!this.frm.doc.customer && !this.settings.custom_mobile_number_based_customer) { + return this.raise_customer_selection_alert(); + } + frappe.flags.ignore_company_party_validation = true; + const { item_code, batch_no, serial_no, rate, uom, valuation_rate, custom_item_uoms, custom_logical_rack } = item; + if (!item_code) + return; + if (this.settings.custom_product_bundle) { + const product_bundle = await this.get_product_bundle(item_code); + if (product_bundle && Array.isArray(product_bundle.items)) { + const bundle_items = product_bundle.items.map((bundle_item) => ({ + item_code: bundle_item.item_code, + qty: bundle_item.qty * value, + rate: bundle_item.rate, + uom: bundle_item.uom + })); + for (const bundle_item of bundle_items) { + const bundle_item_row = this.frm.add_child("items", bundle_item); + await this.trigger_new_item_events(bundle_item_row); + } + this.update_cart_html(); + return; + } + } + const new_item = { item_code, batch_no, rate, uom, [field]: value }; + if (value) { + new_item["qty"] = value; + } + if (serial_no) { + await this.check_serial_no_availablilty(item_code, this.frm.doc.set_warehouse, serial_no); + new_item["serial_no"] = serial_no; + } + if (field === "serial_no") + new_item["qty"] = value.split(` +`).length || 0; + item_row = this.frm.add_child("items", new_item); + await this.trigger_new_item_events(item_row); + item_row["rate"] = rate; + item_row["valuation_rate"] = valuation_rate; + item_row["custom_valuation_rate"] = valuation_rate; + item_row["custom_item_uoms"] = custom_item_uoms; + item_row["custom_logical_rack"] = custom_logical_rack; + if (this.item_details.$component.is(":visible")) + this.edit_item_details_of(item_row); + if (this.check_serial_batch_selection_needed(item_row) && !this.item_details.$component.is(":visible")) + this.edit_item_details_of(item_row); + } + } catch (error) { + console.log(error); + } finally { + var total_incoming_rate = 0; + this.frm.doc.items.forEach((item) => { + total_incoming_rate += parseFloat(item.valuation_rate) * item.qty; + }); + this.item_selector.update_total_incoming_rate(total_incoming_rate); + return item_row; + } + } + raise_customer_selection_alert() { + frappe.dom.unfreeze(); + frappe.show_alert({ + message: __("You must select a customer before adding an item."), + indicator: "orange" + }); + frappe.utils.play_sound("error"); + } + async get_product_bundle(item_code) { + const response = await frappe.call({ + method: "posnext.doc_events.item.get_product_bundle_with_items", + args: { + item_code + } + }); + return response.message; + } + get_item_from_frm({ name, item_code, batch_no, uom, rate }) { + let item_row = null; + if (name) { + item_row = this.frm.doc.items.find((i2) => i2.name == name); + } else { + for (var i = 0; i < cur_frm.doc.items.length; i += 1) { + const has_batch_no = batch_no !== "null" && batch_no !== null; + const batch_no_check = this.settings.custom_allow_add_new_items_on_new_line ? has_batch_no && cur_frm.doc.items[i].batch_no === batch_no : true; + if (cur_frm.doc.items[i].item_code === item_code && cur_frm.doc.items[i].uom === uom && parseFloat(cur_frm.doc.items[i].rate) === parseFloat(rate) && batch_no_check) { + item_row = cur_frm.doc.items[i]; + break; + } + } + console.log(item_row); + } + return item_row || {}; + } + edit_item_details_of(item_row) { + this.item_details.toggle_item_details_section(item_row); + } + is_current_item_being_edited(item_row) { + return item_row.name == this.item_details.current_item.name; + } + update_cart_html(item_row, remove_item) { + this.cart.update_item_html(item_row, remove_item); + this.cart.update_totals_section(this.frm); + } + check_serial_batch_selection_needed(item_row) { + const serialized = item_row.has_serial_no; + const batched = item_row.has_batch_no; + const no_serial_selected = !item_row.serial_no; + const no_batch_selected = !item_row.batch_no; + if (serialized && no_serial_selected || batched && no_batch_selected || serialized && batched && (no_batch_selected || no_serial_selected)) { + return true; + } + return false; + } + async trigger_new_item_events(item_row) { + await this.frm.script_manager.trigger("item_code", item_row.doctype, item_row.name); + await this.frm.script_manager.trigger("qty", item_row.doctype, item_row.name); + await this.frm.script_manager.trigger("discount_percentage", item_row.doctype, item_row.name); + } + async check_stock_availability(item_row, qty_needed, warehouse) { + const resp = (await this.get_available_stock(item_row.item_code, warehouse)).message; + const available_qty = resp[0]; + const is_stock_item = resp[1]; + frappe.dom.unfreeze(); + const bold_uom = item_row.uom.bold(); + const bold_item_code = item_row.item_code.bold(); + const bold_warehouse = warehouse.bold(); + const bold_available_qty = available_qty.toString().bold(); + if (!(available_qty > 0)) { + if (is_stock_item) { + frappe.model.clear_doc(item_row.doctype, item_row.name); + frappe.throw({ + title: __("Not Available"), + message: __("Item Code: {0} is not available under warehouse {1}.", [bold_item_code, bold_warehouse]) + }); + } else { + return; + } + } else if (is_stock_item && available_qty < qty_needed) { + frappe.throw({ + message: __("Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}.", [bold_item_code, bold_warehouse, bold_available_qty, bold_uom]), + indicator: "orange" + }); + frappe.utils.play_sound("error"); + } + frappe.dom.freeze(); + } + async check_serial_no_availablilty(item_code, warehouse, serial_no) { + const method = "erpnext.stock.doctype.serial_no.serial_no.get_pos_reserved_serial_nos"; + const args = { filters: { item_code, warehouse } }; + const res = await frappe.call({ method, args }); + if (res.message.includes(serial_no)) { + frappe.throw({ + title: __("Not Available"), + message: __("Serial No: {0} has already been transacted into another Sales Invoice.", [serial_no.bold()]) + }); + } + } + get_available_stock(item_code, warehouse) { + const me = this; + return frappe.call({ + method: "erpnext.accounts.doctype.pos_invoice.pos_invoice.get_stock_availability", + args: { + "item_code": item_code, + "warehouse": warehouse + }, + callback(res) { + if (!me.item_stock_map[item_code]) + me.item_stock_map[item_code] = {}; + me.item_stock_map[item_code][warehouse] = res.message; + } + }); + } + update_item_field(value, field_or_action) { + if (field_or_action === "checkout") { + this.item_details.toggle_item_details_section(null); + } else if (field_or_action === "remove") { + this.remove_item_from_cart(); + } else { + const field_control = this.item_details[`${field_or_action}_control`]; + if (!field_control) + return; + field_control.set_focus(); + value != "" && field_control.set_value(value); + } + } + remove_item_from_cart() { + frappe.dom.freeze(); + const { doctype, name, current_item } = this.item_details; + return frappe.model.set_value(doctype, name, "qty", 0).then(() => { + frappe.model.clear_doc(doctype, name); + this.update_cart_html(current_item, true); + this.item_details.toggle_item_details_section(null); + frappe.dom.unfreeze(); + var total_incoming_rate = 0; + this.frm.doc.items.forEach((item) => { + total_incoming_rate += parseFloat(item.valuation_rate) * item.qty; + }); + this.item_selector.update_total_incoming_rate(total_incoming_rate); + }).catch((e) => console.log(e)); + } + async save_and_checkout() { + if (this.frm.is_dirty()) { + const div = document.getElementById("customer-cart-container2"); + div.style.gridColumn = ""; + let save_error = false; + await this.frm.save(null, null, null, () => save_error = true); + !save_error && this.payment.checkout(); + save_error && setTimeout(() => { + this.cart.toggle_checkout_btn(true); + }, 300); + } else { + this.payment.checkout(); + } + } + async save_and_checkout() { + if (!this.frm.doc.items || this.frm.doc.items.length === 0) { + frappe.show_alert({ + message: __("Please add items to cart before checkout."), + indicator: "red" + }); + frappe.utils.play_sound("error"); + return; + } + if (this.frm.is_dirty()) { + if (this.settings.custom_add_reference_details) { + const dialog = new frappe.ui.Dialog({ + title: __("Enter Reference Details"), + fields: [ + { + fieldtype: "Data", + label: __("Reference Number"), + fieldname: "reference_no" + }, + { + fieldtype: "Data", + label: __("Reference Name"), + fieldname: "reference_name" + } + ], + primary_action_label: __("Proceed to Payment"), + primary_action: async (values) => { + this.frm.doc.custom_reference_no = values.reference_no; + this.frm.doc.custom_reference_name = values.reference_name; + const div = document.getElementById("customer-cart-container2"); + div.style.gridColumn = ""; + let save_error = false; + await this.frm.save(null, null, null, () => save_error = true); + dialog.hide(); + if (!save_error) { + this.payment.checkout(); + } else { + setTimeout(() => { + this.cart.toggle_checkout_btn(true); + }, 300); + } + } + }); + dialog.show(); + } else { + const div = document.getElementById("customer-cart-container2"); + div.style.gridColumn = ""; + let save_error = false; + await this.frm.save(null, null, null, () => save_error = true); + !save_error && this.payment.checkout(); + save_error && setTimeout(() => { + this.cart.toggle_checkout_btn(true); + }, 300); + } + } else { + this.payment.checkout(); + } + } + }; + + // ../posnext/posnext/public/js/pos_item_selector.js + frappe.provide("posnext.PointOfSale"); + var view = "List"; + posnext.PointOfSale.ItemSelector = class { + constructor({ frm, wrapper, events, pos_profile, settings, currency, init_item_cart, reload_status }) { + this.wrapper = wrapper; + this.events = events; + this.currency = currency; + this.pos_profile = pos_profile; + this.hide_images = settings.hide_images; + this.reload_status = reload_status; + this.auto_add_item = settings.auto_add_item_to_cart; + if (settings.custom_default_view) { + view = settings.custom_default_view; + } + if (settings.custom_show_only_list_view) { + view = "List"; + } + if (settings.custom_show_only_card_view) { + view = "Card"; + } + this.custom_show_item_code = settings.custom_show_item_code; + this.custom_show_last_incoming_rate = settings.custom_show_last_incoming_rate; + this.custom_show_oem_part_number = settings.custom_show_oem_part_number; + this.custom_show_posting_date = settings.custom_show_posting_date; + this.custom_show_logical_rack = settings.custom_show_logical_rack; + this.show_only_list_view = settings.custom_show_only_list_view; + this.show_only_card_view = settings.custom_show_only_card_view; + this.custom_edit_rate = settings.custom_edit_rate_and_uom; + this.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom; + this.inti_component(); + } + inti_component() { + this.prepare_dom(); + this.make_search_bar(); + this.load_items_data(); + this.bind_events(); + this.attach_shortcuts(); + } + prepare_dom() { + var cardlist = ``; + if (!this.show_only_list_view && !this.show_only_card_view) { + cardlist = ` + + + `; + } + if (view === "Card" && !this.show_only_list_view) { + var tir = ``; + if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { + tir = `
`; + } + this.wrapper.append( + `
+
` + cardlist + `
+
+ +
+
` + tir + ` + +
+
+
+ ` + ); + this.$component = this.wrapper.find(".items-selector"); + this.$items_container = this.$component.find(".items-container"); + } else if (view === "List" && !this.show_only_card_view) { + var section = `
`; + var tir = ``; + if (this.custom_edit_rate) { + section = `
`; + } + if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { + tir = `
`; + } + this.wrapper.append( + section + `
` + cardlist + `
+
+ +
+
` + tir + ` + +
+
+
` + ); + this.$component = this.wrapper.find(".customer-cart-container"); + this.$items_container = this.$component.find(".cart-container"); + } + if (!this.show_only_list_view && !this.show_only_card_view) { + this.$list_view = this.$component.find(".list-view"); + this.$card_view = this.$component.find(".card-view"); + if (view === "List" && !this.show_only_list_view) { + this.$list_view.find(".list-span").css({ + "display": "inline-block", + "background-color": "#3498db", + "color": "white", + "padding": "3px 3px", + "border-radius": "20px", + "font-size": "12px", + "font-weight": "bold", + "text-transform": "uppercase", + "letter-spacing": "1px", + "cursor": "pointer", + "transition": "background-color 0.3s ease" + }); + this.$card_view.find(".card-span").css({ + "display": "", + "background-color": "", + "color": "", + "padding": "3px 3px", + "border-radius": "", + "font-size": "", + "font-weight": "", + "text-transform": "", + "letter-spacing": "", + "cursor": "", + "transition": "" + }); + } else if (view === "Card" && !this.show_only_card_view) { + this.$card_view.find(".card-span").css({ + "display": "inline-block", + "background-color": "#3498db", + "color": "white", + "padding": "3px 3px", + "border-radius": "20px", + "font-size": "12px", + "font-weight": "bold", + "text-transform": "uppercase", + "letter-spacing": "1px", + "cursor": "pointer", + "transition": "background-color 0.3s ease" + }); + this.$list_view.find(".list-span").css({ + "display": "", + "background-color": "", + "color": "", + "padding": "3px 3px", + "border-radius": "", + "font-size": "", + "font-weight": "", + "text-transform": "", + "letter-spacing": "", + "cursor": "", + "transition": "" + }); + } else { + this.$list_view.find(".list-span").css({ "display": "none" }); + this.$card_view.find(".card-span").css({ "display": "none" }); + } + if (!this.show_only_card_view && !this.show_only_list_view) { + this.click_functions(); + } + } + } + click_functions() { + this.$list_view.on("click", "a", () => { + this.$list_view.find(".list-span").css({ "display": "inline-block", "background-color": "#3498db", "color": "white", "padding": "5px 10px", "border-radius": "20px", "font-size": "14px", "font-weight": "bold", "text-transform": "uppercase", "letter-spacing": "1px", "cursor": "pointer", "transition": "background-color 0.3s ease" }); + this.$card_view.find(".card-span").css({ "display": "", "background-color": "", "color": "", "padding": "", "border-radius": "", "font-size": "", "font-weight": "", "text-transform": "", "letter-spacing": "", "cursor": "", "transition": "" }); + view = "List"; + if (document.getElementById("card-view-section")) + document.getElementById("card-view-section").remove(); + if (document.getElementById("list-view-section")) + document.getElementById("list-view-section").remove(); + if (document.getElementById("customer-cart-container2")) + document.getElementById("customer-cart-container2").remove(); + if (document.getElementById("item-details-container")) + document.getElementById("item-details-container").remove(); + this.inti_component(); + this.events.init_item_details(); + this.events.init_item_cart(); + this.events.change_items(this.events.get_frm()); + }); + this.$card_view.on("click", "a", () => { + this.$card_view.find(".card-span").css({ "display": "inline-block", "background-color": "#3498db", "color": "white", "padding": "5px 10px", "border-radius": "20px", "font-size": "14px", "font-weight": "bold", "text-transform": "uppercase", "letter-spacing": "1px", "cursor": "pointer", "transition": "background-color 0.3s ease" }); + this.$list_view.find(".list-span").css({ "display": "", "background-color": "", "color": "", "padding": "", "border-radius": "", "font-size": "", "font-weight": "", "text-transform": "", "letter-spacing": "", "cursor": "", "transition": "" }); + view = "Card"; + if (document.getElementById("card-view-section")) + document.getElementById("card-view-section").remove(); + if (document.getElementById("list-view-section")) + document.getElementById("list-view-section").remove(); + if (document.getElementById("customer-cart-container2")) + document.getElementById("customer-cart-container2").remove(); + if (document.getElementById("item-details-container")) + document.getElementById("item-details-container").remove(); + this.inti_component(); + this.events.init_item_details(); + this.events.init_item_cart(); + this.events.change_items(this.events.get_frm()); + }); + } + async load_items_data() { + if (!this.item_group) { + const res = await frappe.db.get_value("Item Group", { lft: 1, is_group: 1 }, "name"); + this.parent_item_group = res.message.name; + } + if (!this.price_list) { + const res = await frappe.db.get_value("POS Profile", this.pos_profile, "selling_price_list"); + this.price_list = res.message.selling_price_list; + } + this.get_items({}).then(({ message }) => { + this.render_item_list(message.items); + }); + } + get_items({ start = 0, page_length = 40, search_term = "" }) { + const doc = this.events.get_frm().doc; + const price_list = doc && doc.selling_price_list || this.price_list; + let { item_group, pos_profile } = this; + !item_group && (item_group = this.parent_item_group); + return frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.get_items", + freeze: true, + args: { start, page_length, price_list, item_group, search_term, pos_profile } + }); + } + render_item_list(items) { + this.$items_container.html(""); + var me = this; + if (view === "List") { + let get_item_code_header2 = function() { + var flex_value = 3; + if (!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack) { + flex_value = 2; + } + var html_header = ``; + if (me.custom_show_item_code) { + html_header += `
${__("Item Code")}
`; + } + if (me.custom_show_last_incoming_rate) { + html_header += `
${__("Inc.Rate")}
`; + } + if (me.custom_show_oem_part_number) { + html_header += `
${__("OEM")}
${__("Part No.")}
`; + } + if (me.custom_show_logical_rack) { + html_header += `
${__("Rack")}
`; + } + if (flex_value > 0) { + return `
${__("Item")}
` + html_header; + } else { + return `
${__("Item")}
` + html_header; + } + }; + var get_item_code_header = get_item_code_header2; + this.$items_container.append( + `
+
+ ${get_item_code_header2()} +
${__("Rate")}
+
${__("Avail. Qty")}
+ +
+
+
` + ); + this.make_cart_items_section(); + items.forEach((item) => { + this.render_cart_item(item); + }); + } else { + items.forEach((item) => { + var item_html = this.get_item_html(item); + this.$items_container.append(item_html); + }); + } + } + make_cart_items_section() { + this.$cart_header = this.$component.find(".cart-header"); + this.$cart_items_wrapper = this.$component.find(".cart-items-section"); + } + get_cart_item({ name }) { + const item_selector = `.cart-item-wrapper[data-row-name="${escape(name)}"]`; + return this.$cart_items_wrapper.find(item_selector); + } + get_cart_item1({ item_code }) { + const item_selector = `.cart-item-wrapper[data-row-name="${escape(item_code)}"]`; + return this.$cart_items_wrapper.find(item_selector); + } + render_cart_item(item_data) { + console.log("Rener cart item"); + console.log(item_data); + const me = this; + const currency = me.events.get_frm().currency || me.currency; + this.$cart_items_wrapper.append( + `
+
` + ); + var $item_to_update = this.get_cart_item1(item_data); + $item_to_update.html( + `${get_item_image_html()} + ${get_item_name()} + +
+ ${item_data.item_name} +
+ ${get_description_html()} +
+ ${get_item_code()} + ${get_rate_discount_html()}` + ); + function get_item_name() { + var flex_value = 4; + if (me.custom_show_item_code && me.custom_show_last_incoming_rate && me.custom_show_oem_part_number) { + flex_value = 3; + } + if (!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack) { + flex_value = 2; + } + return `
`; + } + set_dynamic_rate_header_width(); + function set_dynamic_rate_header_width() { + const rate_cols = Array.from(me.$cart_items_wrapper.find(".item-rate-amount")); + me.$cart_header.find(".rate-amount-header").css("width", ""); + me.$cart_items_wrapper.find(".item-rate-amount").css("width", ""); + var max_width = rate_cols.reduce((max_width2, elm) => { + if ($(elm).width() > max_width2) + max_width2 = $(elm).width(); + return max_width2; + }, 0); + max_width += 1; + if (max_width == 1) + max_width = ""; + me.$cart_header.find(".rate-amount-header").css("width", max_width); + me.$cart_items_wrapper.find(".item-rate-amount").css("width", max_width); + } + function get_item_code() { + var html_code = ``; + if (me.custom_show_item_code) { + var item_code_flex_value = 1; + html_code += `
+
+ ${item_data.item_code}
+ ${item_data.uom} +
+
`; + } + if (me.custom_show_last_incoming_rate) { + html_code += `
+
+ ${parseFloat(item_data.valuation_rate).toFixed(2)} +
+
`; + } + if (me.custom_show_oem_part_number) { + html_code += `
+
+ ${item_data.custom_oem_part_number || ""} +
+
`; + } + if (me.custom_show_logical_rack) { + html_code += `
+
+ ${item_data.rack || ""} +
+
`; + } + return html_code; + } + function get_rate_discount_html() { + if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { + return ` +
+
+
${format_currency(item_data.price_list_rate, currency)}
+
+
${item_data.actual_qty || 0}
+
${item_data.batch_no || 0}
+ +
`; + } else { + return ` +
+
+
${format_currency(item_data.price_list_rate, currency)}
+
+
${item_data.actual_qty || 0}
+
${item_data.batch_no || 0}
+ +
`; + } + } + function get_description_html() { + if (item_data.description) { + if (item_data.description.indexOf("
") != -1) { + try { + item_data.description = $(item_data.description).text(); + } catch (error) { + item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); + } + } + item_data.description = frappe.ellipsis(item_data.description, 45); + return `
${item_data.description}
`; + } + return ``; + } + function get_item_image_html() { + const { image, item_name } = item_data; + if (!me.hide_images && image) { + return ` +
+ ${frappe.get_abbr(item_name)} +
`; + } else { + return `
${frappe.get_abbr(item_name)}
`; + } + } + } + get_item_html(item) { + const me = this; + item.currency = item.currency || me.currency; + const { item_image, serial_no, batch_no, barcode, actual_qty, uom, price_list_rate } = item; + const precision2 = flt(price_list_rate, 2) % 1 != 0 ? 2 : 0; + let indicator_color; + let qty_to_display = actual_qty; + if (item.is_stock_item) { + indicator_color = actual_qty > 10 ? "green" : actual_qty <= 0 ? "red" : "orange"; + if (Math.round(qty_to_display) > 999) { + qty_to_display = Math.round(qty_to_display) / 1e3; + qty_to_display = qty_to_display.toFixed(1) + "K"; + } + } else { + indicator_color = ""; + qty_to_display = ""; + } + function get_item_image_html() { + if (!me.hide_images && item_image) { + return `
+ ${qty_to_display} +
+
+ ${frappe.get_abbr(item.item_name)} +
`; + } else { + return `
+ ${qty_to_display} +
+
${frappe.get_abbr(item.item_name)}
`; + } + } + return `
+ + ${get_item_image_html()} + +
+
+ ${frappe.ellipsis(item.item_name, 18)} +
+
${format_currency(price_list_rate, item.currency, precision2) || 0} / ${uom}
+
+
`; + } + handle_broken_image($img) { + const item_abbr = $($img).attr("alt"); + $($img).parent().replaceWith(`
${item_abbr}
`); + } + update_total_incoming_rate(total_rate) { + if (this.total_incoming_rate) { + this.total_incoming_rate.set_value(total_rate); + } + } + make_search_bar() { + const me = this; + const doc = me.events.get_frm().doc; + this.$component.find(".search-field").html(""); + this.$component.find(".pos-profile").html(""); + this.$component.find(".total-incoming-rate").html(""); + this.$component.find(".item-group-field").html(""); + this.$component.find(".invoice-posting-date").html(""); + frappe.db.get_single_value("POS Settings", "custom_profile_lock").then((doc2) => { + this.pos_profile_field = frappe.ui.form.make_control({ + df: { + label: __("POS Profile"), + fieldtype: "Link", + options: "POS Profile", + placeholder: __("POS Profile"), + read_only: doc2, + onchange: function() { + if (me.reload_status && me.pos_profile !== this.value) { + frappe.pages["posnext"].refresh(window.wrapper, window.onScan, this.value); + } + } + }, + parent: this.$component.find(".pos-profile"), + render_input: false + }); + this.pos_profile_field.set_value(me.pos_profile); + this.pos_profile_field.refresh(); + this.pos_profile_field.toggle_label(false); + }); + this.search_field = frappe.ui.form.make_control({ + df: { + label: __("Search"), + fieldtype: "Data", + placeholder: __("Search by serial number or barcode") + }, + parent: this.$component.find(".search-field"), + render_input: true + }); + this.item_group_field = frappe.ui.form.make_control({ + df: { + label: __("Item Group"), + fieldtype: "Link", + options: "Item Group", + placeholder: __("Select item group"), + onchange: function() { + me.item_group = this.value; + !me.item_group && (me.item_group = me.parent_item_group); + me.filter_items(); + }, + get_query: function() { + return { + query: "posnext.posnext.page.posnext.point_of_sale.item_group_query", + filters: { + pos_profile: doc ? doc.pos_profile : "" + } + }; + } + }, + parent: this.$component.find(".item-group-field"), + render_input: true + }); + if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { + this.total_incoming_rate = frappe.ui.form.make_control({ + df: { + label: __(""), + fieldtype: "Currency", + read_only: 1, + placeholder: __("Total Incoming Rate"), + default: 0 + }, + parent: this.$component.find(".total-incoming-rate"), + render_input: true + }); + } + if (me.custom_show_posting_date) { + this.invoice_posting_date = frappe.ui.form.make_control({ + df: { + label: __("Posting Date"), + fieldtype: "Date", + onchange: function() { + me.events.get_frm().doc.posting_date = this.value; + me.events.get_frm().doc.set_posting_time = 1; + } + }, + parent: this.$component.find(".invoice-posting-date"), + render_input: true + }); + } + this.search_field.toggle_label(false); + this.item_group_field.toggle_label(false); + if (this.custom_show_last_incoming_rate) { + this.total_incoming_rate.toggle_label(false); + } + if (me.custom_show_posting_date) { + this.invoice_posting_date.toggle_label(false); + this.invoice_posting_date.set_value(frappe.datetime.get_today()); + } + this.attach_clear_btn(); + } + attach_clear_btn() { + this.search_field.$wrapper.find(".control-input").append( + ` + + ${frappe.utils.icon("close", "sm")} + + ` + ); + this.$clear_search_btn = this.search_field.$wrapper.find(".link-btn"); + this.$clear_search_btn.on("click", "a", () => { + this.set_search_value(""); + this.search_field.set_focus(); + }); + } + set_search_value(value) { + $(this.search_field.$input[0]).val(value).trigger("input"); + } + bind_events() { + const me = this; + if (!window.onScan) { + frappe.require("https://cdn.jsdelivr.net/npm/onscan.js/onscan.min.js", function() { + window.onScan = onScan; + onScan.decodeKeyEvent = function(oEvent) { + var iCode = this._getNormalizedKeyNum(oEvent); + switch (true) { + case (iCode >= 48 && iCode <= 90): + case (iCode >= 106 && iCode <= 111): + case (iCode >= 160 && iCode <= 164 || iCode == 170): + case (iCode >= 186 && iCode <= 194): + case (iCode >= 219 && iCode <= 222): + case iCode == 32: + if (oEvent.key !== void 0 && oEvent.key !== "") { + return oEvent.key; + } + var sDecoded = String.fromCharCode(iCode); + switch (oEvent.shiftKey) { + case false: + sDecoded = sDecoded.toLowerCase(); + break; + case true: + sDecoded = sDecoded.toUpperCase(); + break; + } + return sDecoded; + case (iCode >= 96 && iCode <= 105): + return 0 + (iCode - 96); + } + return ""; + }; + onScan.attachTo(document, { + onScan: (sScancode) => { + if (this.search_field && this.$component.is(":visible")) { + this.search_field.set_focus(); + this.set_search_value(sScancode); + this.barcode_scanned = true; + } + } + }); + }); + } + this.$component.on("click", ".item-wrapper", function() { + console.log("Item Selected"); + const $item = $(this); + const item_code = unescape($item.attr("data-item-code")); + let batch_no = unescape($item.attr("data-batch-no")); + let serial_no = unescape($item.attr("data-serial-no")); + let uom = unescape($item.attr("data-uom")); + let rate = unescape($item.attr("data-rate")); + let valuation_rate = unescape($item.attr("data-valuation-rate")); + let custom_item_uoms = $item.attr("data-item-uoms"); + let custom_logical_rack = $item.attr("data-item-logical-rack"); + batch_no = batch_no === "undefined" ? void 0 : batch_no; + serial_no = serial_no === "undefined" ? void 0 : serial_no; + uom = uom === "undefined" ? void 0 : uom; + rate = rate === "undefined" ? void 0 : rate; + me.events.item_selected({ + field: "qty", + value: "+1", + item: { item_code, batch_no, serial_no, uom, rate, valuation_rate, custom_item_uoms, custom_logical_rack } + }); + }); + this.search_field.$input.on("input", (e) => { + clearTimeout(this.last_search); + this.last_search = setTimeout(() => { + const search_term = e.target.value; + this.filter_items({ search_term }); + }, 300); + }); + } + attach_shortcuts() { + const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; + this.search_field.parent.attr("title", `${ctrl_label}+I`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+i", + action: () => this.search_field.set_focus(), + condition: () => this.$component.is(":visible"), + description: __("Focus on search input"), + ignore_inputs: true, + page: cur_page.page.page + }); + this.item_group_field.parent.attr("title", `${ctrl_label}+G`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+g", + action: () => this.item_group_field.set_focus(), + condition: () => this.$component.is(":visible"), + description: __("Focus on Item Group filter"), + ignore_inputs: true, + page: cur_page.page.page + }); + frappe.ui.keys.on("enter", () => { + const selector_is_visible = this.$component.is(":visible"); + if (!selector_is_visible || this.search_field.get_value() === "") + return; + if (this.items.length == 1) { + this.$items_container.find(".item-wrapper").click(); + frappe.utils.play_sound("submit"); + this.set_search_value(""); + } else if (this.items.length == 0 && this.barcode_scanned) { + frappe.show_alert({ + message: __("No items found. Scan barcode again."), + indicator: "orange" + }); + frappe.utils.play_sound("error"); + this.barcode_scanned = false; + this.set_search_value(""); + } + }); + } + filter_items({ search_term = "" } = {}) { + if (search_term) { + search_term = search_term.toLowerCase(); + this.search_index = this.search_index || {}; + if (this.search_index[search_term]) { + const items = this.search_index[search_term]; + this.items = items; + this.render_item_list(items); + this.auto_add_item && this.items.length == 1; + return; + } + } + this.get_items({ search_term }).then(({ message }) => { + const { items, serial_no, batch_no, barcode } = message; + if (search_term && !barcode) { + this.search_index[search_term] = items; + } + this.items = items; + this.render_item_list(items); + this.auto_add_item && this.items.length == 1; + }); + } + add_filtered_item_to_cart() { + this.$items_container.find(".item-wrapper").click(); + this.set_search_value(""); + } + resize_selector(minimize) { + minimize ? this.$component.find(".filter-section").css("grid-template-columns", "repeat(1, minmax(0, 1fr))") : this.$component.find(".filter-section").css("grid-template-columns", "repeat(12, minmax(0, 1fr))"); + minimize ? this.$component.find(".search-field").css("margin", "var(--margin-sm) 0px") : this.$component.find(".search-field").css("margin", "0px var(--margin-sm)"); + minimize ? this.$component.css("grid-column", "span 2 / span 2") : this.$component.css("grid-column", "span 6 / span 6"); + minimize ? this.$items_container.css("grid-template-columns", "repeat(1, minmax(0, 1fr))") : this.$items_container.css("grid-template-columns", "repeat(4, minmax(0, 1fr))"); + } + toggle_component(show) { + this.set_search_value(""); + this.$component.css("display", show ? "flex" : "none"); + } + }; + + // ../posnext/posnext/public/js/pos_item_cart.js + frappe.provide("posnext.PointOfSale"); + posnext.PointOfSale.ItemCart = class { + constructor({ wrapper, events, settings }) { + this.wrapper = wrapper; + this.events = events; + this.customer_info = void 0; + this.hide_images = settings.hide_images; + this.allowed_customer_groups = settings.customer_groups; + this.allow_rate_change = settings.allow_rate_change; + this.allow_discount_change = settings.allow_discount_change; + this.show_held_button = settings.custom_show_held_button; + this.show_order_list_button = settings.custom_show_order_list_button; + this.mobile_number_based_customer = settings.custom_mobile_number_based_customer; + this.show_checkout_button = settings.custom_show_checkout_button; + this.custom_edit_rate = settings.custom_edit_rate_and_uom; + this.custom_use_discount_percentage = settings.custom_use_discount_percentage; + this.custom_use_discount_amount = settings.custom_use_discount_amount; + this.custom_use_additional_discount_amount = settings.custom_use_additional_discount_amount; + this.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom; + this.custom_show_last_customer_rate = settings.custom_show_last_customer_rate; + this.custom_show_logical_rack_in_cart = settings.custom_show_logical_rack_in_cart && settings.custom_edit_rate_and_uom; + this.custom_show_uom_in_cart = settings.custom_show_uom_in_cart && settings.custom_edit_rate_and_uom; + this.show_branch = settings.show_branch; + this.show_batch_in_cart = settings.show_batch_in_cart; + this.settings = settings; + this.warehouse = settings.warehouse; + this.init_component(); + } + init_component() { + this.prepare_dom(); + this.init_child_components(); + this.bind_events(); + this.attach_shortcuts(); + } + prepare_dom() { + if (this.custom_edit_rate) { + this.wrapper.append( + `
` + ); + } else { + this.wrapper.append( + `
` + ); + } + this.$component = this.wrapper.find(".customer-cart-container1"); + } + init_child_components() { + this.init_customer_selector(); + this.init_cart_components(); + } + init_customer_selector() { + this.$component.append( + `
` + ); + this.$customer_section = this.$component.find(".customer-section"); + this.make_customer_selector(); + } + reset_customer_selector() { + const frm = this.events.get_frm(); + frm.set_value("customer", ""); + this.make_customer_selector(); + this.customer_field.set_focus(); + } + init_cart_components() { + var html = `
+
+
${__("Item Cart")}
+
+
${__("Item")}
+
${__("Qty")}
+ `; + if (this.custom_show_uom_in_cart) { + html += `
${__("UOM")}
`; + } + if (this.show_batch_in_cart) { + html += `
${__("Batch")}
`; + } + if (this.custom_edit_rate) { + html += `
${__("Rate")}
`; + } + if (this.custom_use_discount_percentage) { + html += `
${__("Disc%")}
`; + } + if (this.custom_use_discount_amount) { + html += `
${__("Disc")}
`; + } + if (this.custom_show_incoming_rate) { + html += `
${__("Inc.Rate")}
`; + } + if (this.custom_show_logical_rack_in_cart) { + html += `
${__("Rack")}
`; + } + if (this.custom_show_last_customer_rate) { + html += `
${__("LC Rate")}
`; + } + html += `
${__("Amount")}
+
+
+
+
+
+
+
`; + this.$component.append(html); + this.$cart_container = this.$component.find(".cart-container"); + this.make_branch_section(); + this.make_cart_totals_section(); + this.make_cart_items_section(); + this.make_cart_numpad(); + } + make_cart_items_section() { + this.$cart_header = this.$component.find(".cart-header"); + this.$cart_items_wrapper = this.$component.find(".cart-items-section"); + this.make_no_items_placeholder(); + } + make_no_items_placeholder() { + this.$cart_header.css("display", "none"); + this.$cart_items_wrapper.html( + `
${__("No items in cart")}
` + ); + } + get_discount_icon() { + return ` + + + + + `; + } + get_branch_icon() { + return ` + + + + `; + } + make_branch_section() { + if (this.show_branch) { + this.$branch_section = this.$component.find(".cart-branch-section"); + if (this.$branch_section.length) { + this.$branch_section.append(` +
+
+ ${this.get_branch_icon()} ${__("Add Branch")} +
+ `); + this.$branch_section.find(".add-branch-wrapper").css({ + "display": "flex", + "align-items": "center", + "gap": "8px", + "border": "2px dashed #ccc", + "padding": "10px", + "border-radius": "6px", + "cursor": "pointer", + "font-weight": "bold" + }); + this.$branch_section.find(".add-branch-wrapper").hover( + function() { + $(this).css("background-color", "#f9f9f9"); + }, + function() { + $(this).css("background-color", "transparent"); + } + ); + } + } + } + make_cart_totals_section() { + this.$totals_section = this.$component.find(".cart-totals-section"); + this.$totals_section.append( + `
+ ${this.get_discount_icon()} ${__("Add Discount")} +
+
+
${__("Total Items")}
+
0.00
+
+
+
${__("Net Total")}
+
0.00
+
+
+
+
${__("Grand Total")}
+
0.00
+
+
+
${__("Checkout")}
+
${__("Held")}
+
${__("Order List")}
+
+
${__("Edit Cart")}
` + ); + this.$add_discount_elem = this.$component.find(".add-discount-wrapper"); + this.highlight_checkout_btn(true); + } + make_cart_numpad() { + this.$numpad_section = this.$component.find(".numpad-section"); + this.number_pad = new posnext.PointOfSale.NumberPad({ + wrapper: this.$numpad_section, + events: { + numpad_event: this.on_numpad_event.bind(this) + }, + cols: 5, + keys: [ + [1, 2, 3, "Quantity"], + [4, 5, 6, "Discount"], + [7, 8, 9, "Rate"], + [".", 0, "Delete", "Remove"] + ], + css_classes: [ + ["", "", "", "col-span-2"], + ["", "", "", "col-span-2"], + ["", "", "", "col-span-2"], + ["", "", "", "col-span-2 remove-btn"] + ], + fieldnames_map: { "Quantity": "qty", "Discount": "discount_percentage" } + }); + this.$numpad_section.prepend( + `
+ + + +
` + ); + this.$numpad_section.append( + `
${__("Checkout")}
` + ); + } + bind_events() { + const me = this; + this.$customer_section.on("click", ".reset-customer-btn", function() { + me.reset_customer_selector(); + }); + this.$customer_section.on("click", ".close-details-btn", function() { + me.toggle_customer_info(false); + }); + this.$customer_section.on("click", ".customer-display", function(e) { + if ($(e.target).closest(".reset-customer-btn").length) + return; + const show = me.$cart_container.is(":visible"); + me.toggle_customer_info(show); + }); + if (!me.custom_edit_rate) { + this.$cart_items_wrapper.on("click", ".cart-item-wrapper", function() { + const $cart_item = $(this); + me.toggle_item_highlight(this); + const payment_section_hidden = !me.$totals_section.find(".edit-cart-btn").is(":visible"); + if (!payment_section_hidden) { + me.$totals_section.find(".edit-cart-btn").click(); + } + const item_row_name = unescape($cart_item.attr("data-row-name")); + me.events.cart_item_clicked({ name: item_row_name }); + this.numpad_value = ""; + }); + } + this.$component.on("click", ".checkout-btn", async function() { + if ($(this).attr("style").indexOf("--blue-500") == -1) + return; + if ($(this).attr("class").indexOf("checkout-btn-held") !== -1) + return; + if ($(this).attr("class").indexOf("checkout-btn-order") !== -1) + return; + if (!cur_frm.doc.customer && me.mobile_number_based_customer) { + let d = new frappe.ui.Dialog({ + title: "Enter Mobile Number", + fields: [ + { + label: "Mobile Number", + fieldname: "mobile_number", + fieldtype: "Data", + reqd: 1 + }, + { + label: "", + fieldname: "mobile_number_numpad", + fieldtype: "HTML", + options: '
' + } + ], + size: "small", + primary_action_label: "Continue", + primary_action: function(values) { + if (values["mobile_number"].length !== me.settings.custom_mobile_number_length) { + frappe.throw("Mobile Number Length is " + me.settings.custom_mobile_number_length.toString()); + } + frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.create_customer", + args: { + customer: values["mobile_number"] + }, + freeze: true, + freeze_message: "Creating Customer....", + callback: async function() { + const frm = me.events.get_frm(); + frappe.dom.freeze(); + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", values["mobile_number"]); + frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name).then(() => { + frappe.run_serially([ + () => me.fetch_customer_details(values["mobile_number"]), + () => me.events.customer_details_updated(me.customer_info), + () => me.update_customer_section(), + () => frappe.dom.unfreeze() + ]); + }); + await me.events.checkout(); + me.toggle_checkout_btn(false); + me.allow_discount_change && me.$add_discount_elem.removeClass("d-none"); + d.hide(); + } + }); + } + }); + var mobile_number_numpad_div = d.wrapper.find(".mobile_number_numpad"); + mobile_number_numpad_div.append(` +
+ + + + + + + + + + + + + +
`); + d.show(); + var numpad_num = d.wrapper.find(".custom-numpad"); + var numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero", "plus"]; + for (var xx = 0; xx < numbers.length; xx += 1) { + numpad_num.on("click", "." + numbers[xx], function() { + var current_value = d.get_value("mobile_number"); + d.set_value("mobile_number", current_value + $(this)[0].innerHTML.toString()); + }); + } + numpad_num.on("click", ".clear", function() { + d.set_value("mobile_number", ""); + }); + numpad_num.on("click", ".delete", function() { + var current_value = d.get_value("mobile_number"); + d.set_value("mobile_number", current_value.slice(0, -1)); + }); + } else { + if (!cur_frm.doc.customer && !me.mobile_number_based_customer) { + frappe.throw("Please Select a customer and add items first"); + } + await me.events.checkout(); + me.toggle_checkout_btn(false); + me.allow_discount_change && me.$add_discount_elem.removeClass("d-none"); + } + }); + this.$component.on("click", ".checkout-btn-held", function() { + if ($(this).attr("style").indexOf("--blue-500") == -1) + return; + if (!cur_frm.doc.items || cur_frm.doc.items.length === 0) { + frappe.show_alert({ + message: __("Please add items to cart before holding."), + indicator: "red" + }); + frappe.utils.play_sound("error"); + return; + } + if (!cur_frm.doc.customer && me.mobile_number_based_customer) { + let d = new frappe.ui.Dialog({ + title: "Enter Mobile Number", + fields: [ + { + label: "Mobile Number", + fieldname: "mobile_number", + fieldtype: "Data", + reqd: 1 + }, + { + label: "", + fieldname: "mobile_number_numpad", + fieldtype: "HTML", + options: '
' + } + ], + size: "small", + primary_action_label: "Continue", + primary_action: function(values) { + if (values["mobile_number"].length !== me.settings.custom_mobile_number_length) { + frappe.throw("Mobile Number Length is " + me.settings.custom_mobile_number_length.toString()); + } + if (me.settings.custom_add_reference_details) { + me.show_reference_dialog(values["mobile_number"]); + } else { + me.hold_invoice(values["mobile_number"]); + } + d.hide(); + } + }); + me.setup_mobile_numpad(d); + d.show(); + } else { + if (me.settings.custom_add_reference_details) { + me.show_reference_dialog(); + } else { + me.hold_invoice(); + } + } + }); + this.$component.on("click", ".checkout-btn-order", () => { + this.events.toggle_recent_order(); + }); + this.$totals_section.on("click", ".edit-cart-btn", () => { + this.events.edit_cart(); + this.toggle_checkout_btn(true); + }); + this.$component.on("click", ".add-discount-wrapper", () => { + const can_edit_discount = this.$add_discount_elem.find(".edit-discount-btn").length; + if (!this.discount_field || can_edit_discount) + this.show_discount_control(); + }); + this.$component.on("click", ".add-branch-wrapper", function() { + const $wrapper = $(this); + const branchFieldWrapper = $('
'); + $wrapper.replaceWith(branchFieldWrapper); + let branchField = new frappe.ui.form.ControlLink({ + df: { + fieldtype: "Link", + options: "Branch", + fieldname: "branch", + label: "Branch", + placeholder: "Select Branch" + }, + parent: branchFieldWrapper, + value: "", + change: function(value) { + console.log("Selected Branch:", value); + } + }); + branchField.refresh(); + }); + frappe.ui.form.on("Sales Invoice", "paid_amount", (frm) => { + this.update_totals_section(frm); + }); + } + attach_shortcuts() { + for (let row of this.number_pad.keys) { + for (let btn of row) { + if (typeof btn !== "string") + continue; + let shortcut_key = `ctrl+${frappe.scrub(String(btn))[0]}`; + if (btn === "Delete") + shortcut_key = "ctrl+backspace"; + if (btn === "Remove") + shortcut_key = "shift+ctrl+backspace"; + if (btn === ".") + shortcut_key = "ctrl+>"; + const fieldname = this.number_pad.fieldnames[btn] ? this.number_pad.fieldnames[btn] : typeof btn === "string" ? frappe.scrub(btn) : btn; + let shortcut_label = shortcut_key.split("+").map(frappe.utils.to_title_case).join("+"); + shortcut_label = frappe.utils.is_mac() ? shortcut_label.replace("Ctrl", "\u2318") : shortcut_label; + this.$numpad_section.find(`.numpad-btn[data-button-value="${fieldname}"]`).attr("title", shortcut_label); + frappe.ui.keys.on(`${shortcut_key}`, () => { + const cart_is_visible = this.$component.is(":visible"); + if (cart_is_visible && this.item_is_selected && this.$numpad_section.is(":visible")) { + this.$numpad_section.find(`.numpad-btn[data-button-value="${fieldname}"]`).click(); + } + }); + } + } + const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; + this.$component.find(".checkout-btn").attr("title", `${ctrl_label}+Enter`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+enter", + action: () => this.$component.find(".checkout-btn").click(), + condition: () => this.$component.is(":visible") && !this.$totals_section.find(".edit-cart-btn").is(":visible"), + description: __("Checkout Order / Submit Order / New Order"), + ignore_inputs: true, + page: cur_page.page.page + }); + this.$component.find(".edit-cart-btn").attr("title", `${ctrl_label}+E`); + frappe.ui.keys.on("ctrl+e", () => { + const item_cart_visible = this.$component.is(":visible"); + const checkout_btn_invisible = !this.$totals_section.find(".checkout-btn").is("visible"); + if (item_cart_visible && checkout_btn_invisible) { + this.$component.find(".edit-cart-btn").click(); + } + }); + this.$component.find(".add-discount-wrapper").attr("title", `${ctrl_label}+D`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+d", + action: () => this.$component.find(".add-discount-wrapper").click(), + condition: () => this.$add_discount_elem.is(":visible"), + description: __("Add Order Discount"), + ignore_inputs: true, + page: cur_page.page.page + }); + frappe.ui.keys.on("escape", () => { + const item_cart_visible = this.$component.is(":visible"); + if (item_cart_visible && this.discount_field && this.discount_field.parent.is(":visible")) { + this.discount_field.set_value(0); + } + }); + } + toggle_item_highlight(item) { + const $cart_item = $(item); + const item_is_highlighted = $cart_item.attr("style") == "background-color:var(--gray-50);"; + if (!item || item_is_highlighted) { + this.item_is_selected = false; + this.$cart_container.find(".cart-item-wrapper").css("background-color", ""); + } else { + $cart_item.css("background-color", "var(--control-bg)"); + this.item_is_selected = true; + this.$cart_container.find(".cart-item-wrapper").not(item).css("background-color", ""); + } + } + make_customer_selector() { + this.$customer_section.html(` +
+ `); + const me = this; + const query = { query: "posnext.controllers.queries.customer_query" }; + const allowed_customer_group = this.allowed_customer_groups || []; + if (allowed_customer_group.length) { + query.filters = { + customer_group: ["in", allowed_customer_group] + }; + } + this.customer_field = frappe.ui.form.make_control({ + df: { + label: __("Customer"), + fieldtype: "Link", + options: "Customer", + placeholder: __("Search by customer name, phone, email."), + read_only: this.mobile_number_based_customer, + get_query: () => query, + onchange: function() { + if (this.value) { + const frm = me.events.get_frm(); + frappe.dom.freeze(); + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", this.value); + frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name).then(() => { + frappe.run_serially([ + () => me.fetch_customer_details(this.value), + () => me.events.customer_details_updated(me.customer_info), + () => me.update_customer_section(), + () => me.update_totals_section(), + () => frappe.dom.unfreeze() + ]); + }); + } + } + }, + parent: this.$customer_section.find(".customer-field"), + render_input: true + }); + this.customer_field.toggle_label(false); + } + fetch_customer_details(customer) { + if (customer) { + return new Promise((resolve) => { + frappe.db.get_value("Customer", customer, ["email_id", "mobile_no", "image", "loyalty_program"]).then(({ message }) => { + const { loyalty_program } = message; + if (loyalty_program) { + frappe.call({ + method: "erpnext.accounts.doctype.loyalty_program.loyalty_program.get_loyalty_program_details_with_points", + args: { customer, loyalty_program, "silent": true }, + callback: (r) => { + const { loyalty_points, conversion_factor } = r.message; + if (!r.exc) { + this.customer_info = __spreadProps(__spreadValues({}, message), { customer, loyalty_points, conversion_factor }); + resolve(); + } + } + }); + } else { + this.customer_info = __spreadProps(__spreadValues({}, message), { customer }); + resolve(); + } + }); + }); + } else { + return new Promise((resolve) => { + this.customer_info = {}; + resolve(); + }); + } + } + show_discount_control() { + this.$add_discount_elem.css({ "padding": "0px", "border": "none" }); + this.$add_discount_elem.html( + `
` + ); + const me = this; + const frm = me.events.get_frm(); + let discount = frm.doc.additional_discount_percentage; + this.discount_field = null; + if (me.custom_use_additional_discount_amount) { + this.discount_field = frappe.ui.form.make_control({ + df: { + label: __("Discount"), + fieldtype: "Data", + placeholder: discount ? discount : __("Enter discount amount."), + input_class: "input-xs", + onchange: function() { + setTimeout(() => { + if (flt(this.value) != 0) { + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "discount_amount", flt(this.value)); + me.hide_discount_control(this.value); + } else { + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "discount_amount", 0); + me.$add_discount_elem.css({ + "border": "1px dashed var(--gray-500)", + "padding": "var(--padding-sm) var(--padding-md)" + }); + me.$add_discount_elem.html(`${me.get_discount_icon()} ${__("Add Discount")}`); + me.discount_field = void 0; + } + }, 3e3); + } + }, + parent: this.$add_discount_elem.find(".add-discount-field"), + render_input: true + }); + } else { + this.discount_field = frappe.ui.form.make_control({ + df: { + label: __("Discount"), + fieldtype: "Data", + placeholder: discount ? discount + "%" : __("Enter discount percentage."), + input_class: "input-xs", + onchange: function() { + setTimeout(() => { + if (flt(this.value) != 0) { + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "additional_discount_percentage", flt(this.value)); + me.hide_discount_control(this.value); + } else { + frappe.model.set_value(frm.doc.doctype, frm.doc.name, "additional_discount_percentage", 0); + me.$add_discount_elem.css({ + "border": "1px dashed var(--gray-500)", + "padding": "var(--padding-sm) var(--padding-md)" + }); + me.$add_discount_elem.html(`${me.get_discount_icon()} ${__("Add Discount")}`); + me.discount_field = void 0; + } + }, 3e3); + } + }, + parent: this.$add_discount_elem.find(".add-discount-field"), + render_input: true + }); + } + this.discount_field.toggle_label(false); + this.discount_field.set_focus(); + } + hide_discount_control(discount) { + if (!discount) { + this.$add_discount_elem.css({ "padding": "0px", "border": "none" }); + this.$add_discount_elem.html( + `
` + ); + } else { + this.$add_discount_elem.css({ + "border": "1px dashed var(--dark-green-500)", + "padding": "var(--padding-sm) var(--padding-md)" + }); + if (this.custom_use_additional_discount_amount) { + this.$add_discount_elem.html( + `
+ ${this.get_discount_icon()} ${__("Additional")} ${String(discount).bold()} ${this.events.get_frm().doc.currency} ${__("discount applied")} +
` + ); + } else { + this.$add_discount_elem.html( + `
+ ${this.get_discount_icon()} ${__("Additional")} ${String(discount).bold()}% ${__("discount applied")} +
` + ); + } + } + } + update_customer_section() { + const me = this; + const { customer, email_id = "", mobile_no = "", image } = this.customer_info || {}; + if (customer) { + this.$customer_section.html( + `
+
+ ${this.get_customer_image()} +
+
${customer}
+ ${get_customer_description()} +
+
+ + + +
+
+
` + ); + if (this.mobile_number_based_customer) { + this.$customer_section.find(".reset-customer-btn").css("display", "none"); + } else { + this.$customer_section.find(".reset-customer-btn").css("display", "flex"); + } + } else { + this.reset_customer_selector(); + } + function get_customer_description() { + if (!email_id && !mobile_no) { + return `
${__("Click to add email / phone")}
`; + } else if (email_id && !mobile_no) { + return `
${email_id}
`; + } else if (mobile_no && !email_id) { + return `
${mobile_no}
`; + } else { + return `
${email_id} - ${mobile_no}
`; + } + } + } + get_customer_image() { + const { customer, image } = this.customer_info || {}; + if (image) { + return `
${image}
`; + } else { + return `
${frappe.get_abbr(customer)}
`; + } + } + update_totals_section(frm) { + if (!frm) + frm = this.events.get_frm(); + this.render_net_total(frm.doc.net_total); + this.render_total_item_qty(frm.doc.items); + const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? frm.doc.grand_total : frm.doc.rounded_total; + this.render_grand_total(grand_total); + this.render_taxes(frm.doc.taxes); + } + render_net_total(value) { + const currency = this.events.get_frm().doc.currency; + this.$totals_section.find(".net-total-container").html( + `
${__("Net Total")}
${format_currency(value, currency)}
` + ); + this.$numpad_section.find(".numpad-net-total").html( + `
${__("Net Total")}: ${format_currency(value, currency)}
` + ); + } + render_total_item_qty(items) { + var total_item_qty = 0; + items.map((item) => { + total_item_qty = total_item_qty + item.qty; + }); + this.$totals_section.find(".item-qty-total-container").html( + `
${__("Total Quantity")}
${total_item_qty}
` + ); + this.$numpad_section.find(".numpad-item-qty-total").html( + `
${__("Total Quantity")}: ${total_item_qty}
` + ); + } + render_grand_total(value) { + const currency = this.events.get_frm().doc.currency; + this.$totals_section.find(".grand-total-container").html( + `
${__("Grand Total")}
${format_currency(value, currency)}
` + ); + this.$numpad_section.find(".numpad-grand-total").html( + `
${__("Grand Total")}: ${format_currency(value, currency)}
` + ); + } + render_taxes(taxes) { + if (taxes && taxes.length) { + const currency = this.events.get_frm().doc.currency; + const taxes_html = taxes.map((t) => { + if (t.tax_amount_after_discount_amount == 0) + return; + const description = /[0-9]+/.test(t.description) ? t.description : t.rate != 0 ? `${t.description} @ ${t.rate}%` : t.description; + return `
+
${description}
+
${format_currency(t.tax_amount_after_discount_amount, currency)}
+
`; + }).join(""); + this.$totals_section.find(".taxes-container").css("display", "flex").html(taxes_html); + } else { + this.$totals_section.find(".taxes-container").css("display", "none").html(""); + } + } + get_cart_item({ name }) { + const item_selector = `.cart-item-wrapper[data-row-name="${escape(name)}"]`; + return this.$cart_items_wrapper.find(item_selector); + } + get_item_from_frm(item) { + const doc = this.events.get_frm().doc; + return doc.items.find((i) => i.name == item.name); + } + update_item_html(item, remove_item) { + const $item = this.get_cart_item(item); + if (remove_item) { + $item && $item.next().remove() && $item.remove(); + } else { + const item_row = this.get_item_from_frm(item); + this.render_cart_item(item_row, $item); + } + const no_of_cart_items = this.$cart_items_wrapper.find(".cart-item-wrapper").length; + this.highlight_checkout_btn(true); + this.update_empty_cart_section(no_of_cart_items); + } + render_cart_item(item_data, $item_to_update) { + const currency = this.events.get_frm().doc.currency; + const me = this; + if (!$item_to_update.length) { + this.$cart_items_wrapper.prepend( + `
+
` + ); + $item_to_update = this.get_cart_item(item_data); + } + var item_html = `${get_item_image_html()}`; + if (me.custom_use_discount_percentage && !me.custom_use_discount_amount) { + item_html += `
`; + } + if (me.custom_use_discount_amount && !me.custom_use_discount_percentage) { + item_html += `
`; + } + if (me.custom_use_discount_amount && me.custom_use_discount_percentage) { + item_html += `
`; + } + if (!me.custom_use_discount_amount && !me.custom_use_discount_percentage) { + item_html += `
`; + } + item_html += `
+ ${item_data.item_name} +
+ ${get_description_html()} +
+ ${get_rate_discount_html()}`; + $item_to_update.html(item_html); + if (me.custom_edit_rate) { + this[item_data.item_code + "_qty"] = frappe.ui.form.make_control({ + df: { + fieldname: "qty", + fieldtype: "Float", + onchange: function() { + me.events.form_updated(item_data, "qty", this.value); + } + }, + parent: $item_to_update.find(`.item-qty`), + render_input: true + }); + var uoms = []; + if (item_data.custom_item_uoms) { + uoms = item_data.custom_item_uoms.split(","); + } else if (item_data.uom) { + uoms = [item_data.uom]; + } + if (me.custom_show_uom_in_cart) { + this[item_data.item_code + "_uom"] = frappe.ui.form.make_control({ + df: { + fieldname: "uom", + fieldtype: "Select", + onchange: function() { + me.events.form_updated(item_data, "uom", this.value); + } + }, + parent: $item_to_update.find(`.item-uom`), + render_input: true + }); + } + if (me.show_batch_in_cart) { + this[item_data.item_code + "_batch"] = frappe.ui.form.make_control({ + df: { + fieldname: "batch", + fieldtype: "Link", + options: "Batch", + get_query: function() { + return { + filters: { + item: item_data.item_code + } + }; + }, + onchange: function() { + me.events.form_updated(item_data, "batch_no", this.value); + } + }, + parent: $item_to_update.find(`.item-batch`), + render_input: true + }); + } + this[item_data.item_code + "_rate"] = frappe.ui.form.make_control({ + df: { + fieldname: "rate", + fieldtype: "Float", + read_only: !me.allow_rate_change, + onchange: function() { + me.events.form_updated(item_data, "rate", this.value); + } + }, + parent: $item_to_update.find(`.item-rate`), + render_input: true + }); + if (me.custom_use_discount_percentage) { + this[item_data.item_code + "_discount"] = frappe.ui.form.make_control({ + df: { + fieldname: "discount", + fieldtype: "Float", + onchange: function() { + me.events.form_updated(item_data, "discount_percentage", this.value); + } + }, + parent: $item_to_update.find(`.item-rate-discount`), + render_input: true + }); + } + if (me.custom_use_discount_amount) { + this[item_data.item_code + "_discount_amount"] = frappe.ui.form.make_control({ + df: { + fieldname: "discount_amount", + fieldtype: "Currency", + onchange: function() { + me.events.form_updated(item_data, "discount_amount", this.value); + } + }, + parent: $item_to_update.find(`.item-rate-discount-amount`), + render_input: true + }); + } + if (this.custom_show_incoming_rate) { + this[item_data.item_code + "_incoming_rate"] = frappe.ui.form.make_control({ + df: { + fieldname: "incoming_rate", + fieldtype: "Float", + read_only: 1 + }, + parent: $item_to_update.find(`.item-incoming-rate`), + render_input: true + }); + } + if (this.custom_show_logical_rack_in_cart) { + this[item_data.item_code + "_logical_rack"] = frappe.ui.form.make_control({ + df: { + fieldname: "logical_rack", + fieldtype: "Data", + read_only: 1 + }, + parent: $item_to_update.find(`.item-logical-rack`), + render_input: true + }); + } + if (this.custom_show_last_customer_rate) { + this[item_data.item_code + "_last_customer_rate"] = frappe.ui.form.make_control({ + df: { + fieldname: "last_customer_rate", + fieldtype: "Float", + read_only: 1 + }, + parent: $item_to_update.find(`.item-last-customer-rate`), + render_input: true + }); + } + this[item_data.item_code + "_amount"] = frappe.ui.form.make_control({ + df: { + fieldname: "amount", + fieldtype: "Float", + read_only: 1 + }, + parent: $item_to_update.find(`.item-rate-amount`), + render_input: true + }); + var delete_button = ` `; + var remove_button = frappe.ui.form.make_control({ + df: { + fieldname: "remove", + fieldtype: "Button", + label: delete_button + }, + parent: $item_to_update.find(`.remove-button`), + render_input: true + }); + remove_button.refresh(); + $(remove_button.$input).on("click", function() { + me.events.remove_item_from_cart(item_data); + me.prev_action = void 0; + me.toggle_item_highlight(); + me.events.numpad_event(void 0, "remove"); + }); + this[item_data.item_code + "_qty"].set_value(item_data.qty); + if (me.custom_show_uom_in_cart) { + this[item_data.item_code + "_uom"].df.options = uoms; + this[item_data.item_code + "_uom"].set_value(item_data.uom); + this[item_data.item_code + "_uom"].refresh(); + } + if (me.show_batch_in_cart) { + this[item_data.item_code + "_batch"].set_value(item_data.batch_no); + } + this[item_data.item_code + "_amount"].set_value(item_data.amount); + this[item_data.item_code + "_rate"].set_value(item_data.rate); + if (me.custom_use_discount_percentage) { + this[item_data.item_code + "_discount"].set_value(item_data.discount_percentage); + } + if (me.custom_use_discount_amount) { + this[item_data.item_code + "_discount_amount"].set_value(item_data.discount_amount); + } + if (me.custom_show_incoming_rate) { + this[item_data.item_code + "_incoming_rate"].set_value(item_data.custom_valuation_rate); + } + if (me.custom_show_logical_rack_in_cart) { + this[item_data.item_code + "_logical_rack"].set_value(item_data.custom_logical_rack); + } + if (me.custom_show_last_customer_rate) { + if (me.customer_info.customer) { + frappe.xcall("posnext.posnext.page.posnext.point_of_sale.get_lcr", { + "customer": me.customer_info.customer, + "item_code": item_data.item_code + }).then((d) => { + this[item_data.item_code + "_last_customer_rate"].set_value(d); + }); + } + } + if (me.custom_show_uom_in_cart) { + frappe.xcall("posnext.posnext.page.posnext.point_of_sale.get_uoms", { + "item_code": item_data.item_code + }).then((d) => { + this[item_data.item_code + "_uom"].df.options = d; + this[item_data.item_code + "_uom"].refresh(); + }); + } + } + set_dynamic_rate_header_width(); + function set_dynamic_rate_header_width() { + const rate_cols = Array.from(me.$cart_items_wrapper.find(".item-rate-amount")); + me.$cart_header.find(".rate-amount-header").css("width", ""); + me.$cart_items_wrapper.find(".item-rate-amount").css("width", ""); + let max_width = rate_cols.reduce((max_width2, elm) => { + if ($(elm).width() > max_width2) + max_width2 = $(elm).width(); + return max_width2; + }, 0); + max_width += 1; + if (max_width == 1) + max_width = ""; + me.$cart_header.find(".rate-amount-header").css("width", max_width); + me.$cart_items_wrapper.find(".item-rate-amount").css("width", max_width); + } + function get_rate_discount_html() { + if (me.custom_edit_rate) { + if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { + var html = ` +
+
`; + if (me.custom_show_uom_in_cart) { + html += `
`; + } + if (me.show_batch_in_cart) { + html += `
`; + } + html += `
`; + if (me.custom_use_discount_percentage) { + html += `
`; + } + if (me.custom_use_discount_amount) { + html += `
`; + } + if (me.custom_show_incoming_rate) { + html += `
`; + } + if (me.custom_show_logical_rack_in_cart) { + html += `
`; + } + if (me.custom_show_last_customer_rate) { + html += `
`; + } + html += `
+
+
`; + return html; + } else { + var html = ` +
+
`; + if (me.custom_show_uom_in_cart) { + html += `
`; + } + if (me.show_batch_in_cart) { + html += `
`; + } + html += `
`; + if (me.custom_use_discount_percentage) { + html += `
`; + } + if (me.custom_use_discount_amount) { + html += `
`; + } + if (me.custom_show_incoming_rate) { + html += `
`; + } + if (me.custom_show_logical_rack_in_cart) { + html += `
`; + } + if (me.custom_show_last_customer_rate) { + html += `
`; + } + html += `
+
+
`; + return html; + } + } else { + if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { + return ` +
+
${item_data.qty || 0}
+
${item_data.uom}
+
${item_data.batch}
+
+
${parseFloat(item_data.amount).toFixed(2)}
+
${parseFloat(item_data.rate).toFixed(2)}
+
+
`; + } else { + return ` +
+
${item_data.qty || 0}
+
${item_data.uom}
+
${item_data.batch}
+
+
${parseFloat(item_data.rate).toFixed(2)}
+
+
`; + } + } + } + function get_description_html() { + if (item_data.description) { + if (item_data.description.indexOf("
") != -1) { + try { + item_data.description = $(item_data.description).text(); + } catch (error) { + item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); + } + } + item_data.description = frappe.ellipsis(item_data.description, 45); + return `
${item_data.description}
`; + } + return ``; + } + function get_item_image_html() { + const { image, item_name } = item_data; + if (!me.hide_images && image) { + return ` +
+ ${frappe.get_abbr(item_name)} +
`; + } else { + return `
${frappe.get_abbr(item_name)}
`; + } + } + } + handle_broken_image($img) { + const item_abbr = $($img).attr("alt"); + $($img).parent().replaceWith(`
${item_abbr}
`); + } + update_selector_value_in_cart_item(selector, value, item) { + const $item_to_update = this.get_cart_item(item); + $item_to_update.attr(`data-${selector}`, escape(value)); + } + toggle_checkout_btn(show_checkout) { + if (show_checkout) { + if (this.show_checkout_button) { + this.$totals_section.find(".checkout-btn").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn").css("display", "none"); + } + if (this.show_held_button) { + this.$totals_section.find(".checkout-btn-held").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn-held").css("display", "none"); + } + if (this.show_order_list_button) { + this.$totals_section.find(".checkout-btn-order").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn-order").css("display", "none"); + } + this.$totals_section.find(".edit-cart-btn").css("display", "none"); + } else { + this.$totals_section.find(".checkout-btn").css("display", "none"); + this.$totals_section.find(".checkout-btn-held").css("display", "none"); + this.$totals_section.find(".checkout-btn-held").css("display", "none"); + this.$totals_section.find(".checkout-btn-order").css("display", "none"); + this.$totals_section.find(".edit-cart-btn").css("display", "flex"); + } + } + highlight_checkout_btn(toggle) { + if (toggle) { + this.$add_discount_elem.css("display", "flex"); + this.$cart_container.find(".checkout-btn").css({ + "background-color": "var(--blue-500)" + }); + if (this.show_held_button) { + this.$cart_container.find(".checkout-btn-held").css({ + "background-color": "var(--blue-500)" + }); + } else { + this.$cart_container.find(".checkout-btn-held").css({ + "background-color": "var(--blue-200)" + }); + } + if (this.show_order_list_button) { + this.$cart_container.find(".checkout-btn-order").css({ + "background-color": "var(--blue-500)" + }); + } else { + this.$cart_container.find(".checkout-btn-order").css({ + "background-color": "var(--blue-500)" + }); + } + } else { + this.$add_discount_elem.css("display", "none"); + this.$cart_container.find(".checkout-btn").css({ + "background-color": "var(--blue-200)" + }); + this.$cart_container.find(".checkout-btn-held").css({ + "background-color": "var(--blue-200)" + }); + this.$cart_container.find(".checkout-btn-order").css({ + "background-color": "var(--blue-500)" + }); + } + } + update_empty_cart_section(no_of_cart_items) { + const $no_item_element = this.$cart_items_wrapper.find(".no-item-wrapper"); + no_of_cart_items > 0 && $no_item_element && $no_item_element.remove() && this.$cart_header.css("display", "flex"); + no_of_cart_items === 0 && !$no_item_element.length && this.make_no_items_placeholder(); + } + on_numpad_event($btn) { + const current_action = $btn.attr("data-button-value"); + const action_is_field_edit = ["qty", "discount_percentage", "rate"].includes(current_action); + const action_is_allowed = action_is_field_edit ? current_action == "rate" && this.allow_rate_change || current_action == "discount_percentage" && this.allow_discount_change || current_action == "qty" : true; + const action_is_pressed_twice = this.prev_action === current_action; + const first_click_event = !this.prev_action; + const field_to_edit_changed = this.prev_action && this.prev_action != current_action; + if (action_is_field_edit) { + if (!action_is_allowed) { + const label = current_action == "rate" ? "Rate".bold() : "Discount".bold(); + const message = __("Editing {0} is not allowed as per POS Profile settings", [label]); + frappe.show_alert({ + indicator: "red", + message + }); + frappe.utils.play_sound("error"); + return; + } + if (first_click_event || field_to_edit_changed) { + this.prev_action = current_action; + } else if (action_is_pressed_twice) { + this.prev_action = void 0; + } + this.numpad_value = ""; + } else if (current_action === "checkout") { + this.prev_action = void 0; + this.toggle_item_highlight(); + this.events.numpad_event(void 0, current_action); + return; + } else if (current_action === "remove") { + this.prev_action = void 0; + this.toggle_item_highlight(); + this.events.numpad_event(void 0, current_action); + return; + } else { + this.numpad_value = current_action === "delete" ? this.numpad_value.slice(0, -1) : this.numpad_value + current_action; + this.numpad_value = this.numpad_value || 0; + } + const first_click_event_is_not_field_edit = !action_is_field_edit && first_click_event; + if (first_click_event_is_not_field_edit) { + frappe.show_alert({ + indicator: "red", + message: __("Please select a field to edit from numpad") + }); + frappe.utils.play_sound("error"); + return; + } + if (flt(this.numpad_value) > 100 && this.prev_action === "discount_percentage") { + frappe.show_alert({ + message: __("Discount cannot be greater than 100%"), + indicator: "orange" + }); + frappe.utils.play_sound("error"); + this.numpad_value = current_action; + } + this.highlight_numpad_btn($btn, current_action); + this.events.numpad_event(this.numpad_value, this.prev_action); + } + highlight_numpad_btn($btn, curr_action) { + const curr_action_is_highlighted = $btn.hasClass("highlighted-numpad-btn"); + const curr_action_is_action = ["qty", "discount_percentage", "rate", "done"].includes(curr_action); + if (!curr_action_is_highlighted) { + $btn.addClass("highlighted-numpad-btn"); + } + if (this.prev_action === curr_action && curr_action_is_highlighted) { + $btn.removeClass("highlighted-numpad-btn"); + } + if (this.prev_action && this.prev_action !== curr_action && curr_action_is_action) { + const prev_btn = $(`[data-button-value='${this.prev_action}']`); + prev_btn.removeClass("highlighted-numpad-btn"); + } + if (!curr_action_is_action || curr_action === "done") { + setTimeout(() => { + $btn.removeClass("highlighted-numpad-btn"); + }, 200); + } + } + toggle_numpad(show) { + if (show) { + this.$totals_section.css("display", "none"); + this.$numpad_section.css("display", "flex"); + } else { + this.$totals_section.css("display", "flex"); + this.$numpad_section.css("display", "none"); + } + this.reset_numpad(); + } + reset_numpad() { + this.numpad_value = ""; + this.prev_action = void 0; + this.$numpad_section.find(".highlighted-numpad-btn").removeClass("highlighted-numpad-btn"); + } + toggle_numpad_field_edit(fieldname) { + if (["qty", "discount_percentage", "rate"].includes(fieldname)) { + this.$numpad_section.find(`[data-button-value="${fieldname}"]`).click(); + } + } + toggle_customer_info(show) { + if (show) { + const { customer } = this.customer_info || {}; + this.$cart_container.css("display", "none"); + this.$customer_section.css({ + "height": "100%", + "padding-top": "0px" + }); + this.$customer_section.find(".customer-details").html( + `
+ +
Contact Details
+
+ + + +
+
+
+ ${this.get_customer_image()} +
+
${customer}
+
+
+
+
+ +
+
+
+
+
Recent Transactions
` + ); + this.$customer_section.append(`
`); + if (this.mobile_number_based_customer) { + this.$customer_section.find(".mobile_no-field").css("display", "none"); + this.$customer_section.find(".close-details-btn").css("display", "none"); + } else { + this.$customer_section.find(".mobile_no-field").css("display", "flex"); + this.$customer_section.find(".close-details-btn").css("display", "flex"); + } + this.render_customer_fields(); + this.fetch_customer_transactions(); + } else { + this.$cart_container.css("display", "flex"); + this.$customer_section.css({ + "height": "", + "padding-top": "" + }); + this.update_customer_section(); + } + } + render_customer_fields() { + const $customer_form = this.$customer_section.find(".customer-fields-container"); + const dfs = [{ + fieldname: "email_id", + label: __("Email"), + fieldtype: "Data", + options: "email", + placeholder: __("Enter customer's email") + }, { + fieldname: "mobile_no", + label: __("Phone Number"), + fieldtype: "Data", + placeholder: __("Enter customer's phone number") + }, { + fieldname: "loyalty_program", + label: __("Loyalty Program"), + fieldtype: "Link", + options: "Loyalty Program", + placeholder: __("Select Loyalty Program") + }, { + fieldname: "loyalty_points", + label: __("Loyalty Points"), + fieldtype: "Data", + read_only: 1 + }]; + const me = this; + dfs.forEach((df) => { + this[`customer_${df.fieldname}_field`] = frappe.ui.form.make_control({ + df: __spreadProps(__spreadValues({}, df), { + onchange: handle_customer_field_change + }), + parent: $customer_form.find(`.${df.fieldname}-field`), + render_input: true + }); + this[`customer_${df.fieldname}_field`].set_value(this.customer_info[df.fieldname]); + }); + function handle_customer_field_change() { + const current_value = me.customer_info[this.df.fieldname]; + const current_customer = me.customer_info.customer; + if (this.value && current_value != this.value && this.df.fieldname != "loyalty_points") { + frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.set_customer_info", + args: { + fieldname: this.df.fieldname, + customer: current_customer, + value: this.value + }, + callback: (r) => { + if (!r.exc) { + me.customer_info[this.df.fieldname] = this.value; + frappe.show_alert({ + message: __("Customer contact updated successfully."), + indicator: "green" + }); + frappe.utils.play_sound("submit"); + } + } + }); + } + } + } + fetch_customer_transactions() { + frappe.db.get_list("Sales Invoice", { + filters: { customer: this.customer_info.customer, docstatus: 1 }, + fields: ["name", "grand_total", "status", "posting_date", "posting_time", "currency"], + limit: 20 + }).then((res) => { + const transaction_container = this.$customer_section.find(".customer-transactions"); + if (!res.length) { + transaction_container.html( + `
No recent transactions found
` + ); + return; + } + const elapsed_time = moment(res[0].posting_date + " " + res[0].posting_time).fromNow(); + this.$customer_section.find(".customer-desc").html(`Last transacted ${elapsed_time}`); + res.forEach((invoice) => { + const posting_datetime = moment(invoice.posting_date + " " + invoice.posting_time).format("Do MMMM, h:mma"); + let indicator_color = { + "Paid": "green", + "Draft": "red", + "Return": "gray", + "Consolidated": "blue" + }; + transaction_container.append( + `
+
+
${invoice.name}
+
${posting_datetime}
+
+
+
+ ${format_currency(invoice.grand_total, invoice.currency, 0) || 0} +
+
+ + ${invoice.status} + +
+
+
+
` + ); + }); + }); + } + attach_refresh_field_event(frm) { + $(frm.wrapper).off("refresh-fields"); + $(frm.wrapper).on("refresh-fields", () => { + if (frm.doc.items.length) { + this.$cart_items_wrapper.html(""); + frm.doc.items.forEach((item) => { + this.update_item_html(item); + }); + } + this.update_totals_section(frm); + }); + } + load_invoice() { + console.log("Load invoice"); + const frm = this.events.get_frm(); + this.attach_refresh_field_event(frm); + this.fetch_customer_details(frm.doc.customer).then(() => { + this.events.customer_details_updated(this.customer_info); + this.update_customer_section(); + this.$cart_items_wrapper.html(""); + if (frm.doc.items.length) { + frm.doc.items.forEach((item) => { + this.update_item_html(item); + }); + } else { + this.make_no_items_placeholder(); + this.highlight_checkout_btn(true); + } + this.update_totals_section(frm); + if (frm.doc.docstatus === 1) { + this.$totals_section.find(".checkout-btn").css("display", "none"); + this.$totals_section.find(".checkout-btn-held").css("display", "none"); + if (this.show_order_list_button) { + this.$totals_section.find(".checkout-btn-order").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn-order").css("display", "none"); + } + this.$totals_section.find(".edit-cart-btn").css("display", "none"); + } else { + if (this.show_checkout_button) { + this.$totals_section.find(".checkout-btn").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn").css("display", "none"); + } + if (this.show_held_button) { + this.$totals_section.find(".checkout-btn-held").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn-held").css("display", "none"); + } + if (this.show_order_list_button) { + this.$totals_section.find(".checkout-btn-order").css("display", "flex"); + } else { + this.$totals_section.find(".checkout-btn-order").css("display", "none"); + } + this.$totals_section.find(".edit-cart-btn").css("display", "none"); + } + this.toggle_component(true); + }); + } + toggle_component(show) { + show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); + } + show_reference_dialog(mobile_number = null) { + const me = this; + const dialog = new frappe.ui.Dialog({ + title: __("Enter Reference Details"), + fields: [ + { + fieldtype: "Data", + label: __("Reference Number"), + fieldname: "reference_no", + reqd: 1 + }, + { + fieldtype: "Data", + label: __("Reference Name"), + fieldname: "reference_name", + reqd: 1 + } + ], + primary_action_label: __("Hold Invoice"), + primary_action: async (values) => { + if (mobile_number) { + await frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.create_customer", + args: { customer: mobile_number }, + freeze: true, + freeze_message: "Creating Customer...." + }); + const frm2 = me.events.get_frm(); + await frappe.model.set_value(frm2.doc.doctype, frm2.doc.name, "customer", mobile_number); + await frm2.script_manager.trigger("customer", frm2.doc.doctype, frm2.doc.name); + } + const frm = me.events.get_frm(); + frm.doc.custom_reference_no = values.reference_no; + frm.doc.custom_reference_name = values.reference_name; + dialog.hide(); + await me.events.save_draft_invoice(); + } + }); + dialog.show(); + } + async hold_invoice(mobile_number = null) { + if (mobile_number) { + await frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.create_customer", + args: { customer: mobile_number }, + freeze: true, + freeze_message: "Creating Customer...." + }); + const frm = this.events.get_frm(); + await frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", mobile_number); + await frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name); + } + await this.events.save_draft_invoice(); + } + }; + + // ../posnext/posnext/public/js/pos_item_details.js + frappe.provide("posnext.PointOfSale"); + posnext.PointOfSale.ItemDetails = class { + constructor({ wrapper, events, settings }) { + this.wrapper = wrapper; + this.events = events; + this.hide_images = settings.hide_images; + this.allow_rate_change = settings.allow_rate_change; + this.allow_discount_change = settings.allow_discount_change; + this.custom_edit_rate_and_uom = settings.custom_edit_rate_and_uom; + this.current_item = {}; + this.init_component(); + } + init_component() { + this.prepare_dom(); + this.init_child_components(); + this.bind_events(); + this.attach_shortcuts(); + } + prepare_dom() { + this.wrapper.append( + `
` + ); + this.$component = this.wrapper.find(".item-details-container"); + } + init_child_components() { + this.$component.html( + `
+
${__("Item Detailss")}
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
` + ); + this.$item_name = this.$component.find(".item-name"); + this.$item_description = this.$component.find(".item-desc"); + this.$item_price = this.$component.find(".item-price"); + this.$item_image = this.$component.find(".item-image"); + this.$form_container = this.$component.find(".form-container"); + this.$dicount_section = this.$component.find(".discount-section"); + this.$serial_batch_container = this.$component.find(".serial-batch-container"); + } + compare_with_current_item(item) { + return item && item.name == this.current_item.name; + } + async toggle_item_details_section(item) { + const current_item_changed = !this.compare_with_current_item(item); + const hide_item_details = !Boolean(item) || !current_item_changed; + if (!hide_item_details && current_item_changed || hide_item_details) { + await this.validate_serial_batch_item(); + } + if (!this.custom_edit_rate_and_uom) { + this.events.toggle_item_selector(!hide_item_details); + this.toggle_component(!hide_item_details); + } + if (item && current_item_changed) { + this.doctype = item.doctype; + this.item_meta = frappe.get_meta(this.doctype); + this.name = item.name; + this.item_row = item; + this.currency = this.events.get_frm().doc.currency; + this.current_item = item; + this.render_dom(item); + this.render_discount_dom(item); + this.render_form(item); + this.events.highlight_cart_item(item); + } else { + this.current_item = {}; + } + } + validate_serial_batch_item() { + const doc = this.events.get_frm().doc; + const item_row = doc.items.find((item) => item.name === this.name); + if (!item_row) + return; + const serialized = item_row.has_serial_no; + const batched = item_row.has_batch_no; + const no_bundle_selected = !item_row.serial_and_batch_bundle; + if (serialized && no_bundle_selected || batched && no_bundle_selected) { + frappe.show_alert({ + message: __("Item is removed since no serial / batch no selected."), + indicator: "orange" + }); + frappe.utils.play_sound("cancel"); + return this.events.remove_item_from_cart(); + } + } + render_dom(item) { + let { item_name, description, image, price_list_rate } = item; + function get_description_html() { + if (description) { + description = description.indexOf("...") === -1 && description.length > 140 ? description.substr(0, 139) + "..." : description; + return description; + } + return ``; + } + this.$item_name.html(item_name); + this.$item_description.html(get_description_html()); + this.$item_price.html(format_currency(price_list_rate, this.currency)); + if (!this.hide_images && image) { + this.$item_image.html( + `${frappe.get_abbr(item_name)}` + ); + } else { + this.$item_image.html(`
${frappe.get_abbr(item_name)}
`); + } + } + handle_broken_image($img) { + const item_abbr = $($img).attr("alt"); + $($img).replaceWith(`
${item_abbr}
`); + } + render_discount_dom(item) { + if (item.discount_percentage) { + this.$dicount_section.html( + `
${format_currency(item.price_list_rate, this.currency)}
+
${item.discount_percentage}% off
` + ); + this.$item_price.html(format_currency(item.rate, this.currency)); + } else { + this.$dicount_section.html(``); + } + } + render_form(item) { + const fields_to_display = this.get_form_fields(item); + this.$form_container.html(""); + fields_to_display.forEach((fieldname, idx) => { + this.$form_container.append( + `
` + ); + const field_meta = this.item_meta.fields.find((df) => df.fieldname === fieldname); + fieldname === "discount_percentage" ? field_meta.label = __("Discount (%)") : ""; + const me = this; + var uoms = []; + frappe.db.get_doc("Item", me.current_item.item_code).then((doc) => { + uoms = doc.uoms.map((item2) => item2.uom); + }); + this[`${fieldname}_control`] = frappe.ui.form.make_control({ + df: __spreadProps(__spreadValues({}, field_meta), { + onchange: function() { + me.events.form_updated(me.current_item, fieldname, this.value); + }, + get_query: function() { + if (fieldname === "uom") { + return { + filters: { + name: ["in", uoms] + } + }; + } + return; + } + }), + parent: this.$form_container.find(`.${fieldname}-control`), + render_input: true + }); + this[`${fieldname}_control`].set_value(item[fieldname]); + }); + this.make_auto_serial_selection_btn(item); + this.bind_custom_control_change_event(); + } + get_form_fields(item) { + const fields = ["qty", "uom", "rate", "conversion_factor", "discount_percentage", "warehouse", "actual_qty", "price_list_rate"]; + if (item.has_serial_no) + fields.push("serial_no"); + if (item.has_batch_no) + fields.push("batch_no"); + return fields; + } + make_auto_serial_selection_btn(item) { + if (item.has_serial_no || item.has_batch_no) { + const label = item.has_serial_no ? __("Select Serial No") : __("Select Batch No"); + this.$form_container.append( + `
${label}
` + ); + this.$form_container.find(".serial_no-control").find("textarea").css("height", "6rem"); + } + } + bind_custom_control_change_event() { + const me = this; + if (this.rate_control) { + this.rate_control.df.onchange = function() { + if (this.value || flt(this.value) === 0) { + me.events.form_updated(me.current_item, "rate", this.value).then(() => { + const item_row = frappe.get_doc(me.doctype, me.name); + const doc = me.events.get_frm().doc; + me.$item_price.html(format_currency(item_row.rate, doc.currency)); + me.render_discount_dom(item_row); + }); + } + }; + this.rate_control.df.read_only = !this.allow_rate_change; + this.rate_control.refresh(); + } + if (this.discount_percentage_control && !this.allow_discount_change) { + this.discount_percentage_control.df.read_only = 1; + this.discount_percentage_control.refresh(); + } + if (this.warehouse_control) { + this.warehouse_control.df.reqd = 1; + this.warehouse_control.df.onchange = function() { + if (this.value) { + me.events.form_updated(me.current_item, "warehouse", this.value).then(() => { + me.item_stock_map = me.events.get_item_stock_map(); + const available_qty = me.item_stock_map[me.item_row.item_code][this.value][0]; + const is_stock_item = Boolean(me.item_stock_map[me.item_row.item_code][this.value][1]); + if (available_qty === void 0) { + me.events.get_available_stock(me.item_row.item_code, this.value).then(() => { + me.warehouse_control.set_value(this.value); + }); + } else if (available_qty === 0 && is_stock_item) { + me.warehouse_control.set_value(""); + const bold_item_code = me.item_row.item_code.bold(); + const bold_warehouse = this.value.bold(); + frappe.throw( + __("Item Code: {0} is not available under warehouse {1}.", [bold_item_code, bold_warehouse]) + ); + } + me.actual_qty_control.set_value(available_qty); + }); + } + }; + this.warehouse_control.df.get_query = () => { + return { + filters: { company: this.events.get_frm().doc.company } + }; + }; + this.warehouse_control.refresh(); + } + if (this.serial_no_control) { + this.serial_no_control.df.reqd = 1; + this.serial_no_control.df.onchange = async function() { + !me.current_item.batch_no && await me.auto_update_batch_no(); + me.events.form_updated(me.current_item, "serial_no", this.value); + }; + this.serial_no_control.refresh(); + } + if (this.batch_no_control) { + this.batch_no_control.df.reqd = 1; + this.batch_no_control.df.get_query = () => { + return { + query: "erpnext.controllers.queries.get_batch_no", + filters: { + item_code: me.item_row.item_code, + warehouse: me.item_row.warehouse, + posting_date: me.events.get_frm().doc.posting_date + } + }; + }; + this.batch_no_control.refresh(); + } + if (this.uom_control) { + this.uom_control.df.onchange = function() { + me.events.form_updated(me.current_item, "uom", this.value); + const item_row = frappe.get_doc(me.doctype, me.name); + me.conversion_factor_control.df.read_only = item_row.stock_uom == this.value; + me.conversion_factor_control.refresh(); + }; + } + frappe.model.on("POS Invoice Item", "*", (fieldname, value, item_row) => { + const field_control = this[`${fieldname}_control`]; + const item_row_is_being_edited = this.compare_with_current_item(item_row); + if (item_row_is_being_edited && field_control && field_control.get_value() !== value) { + field_control.set_value(value); + cur_pos.update_cart_html(item_row); + } + }); + } + async auto_update_batch_no() { + if (this.serial_no_control && this.batch_no_control) { + const selected_serial_nos = this.serial_no_control.get_value().split(` +`).filter((s) => s); + if (!selected_serial_nos.length) + return; + const serials_with_batch_no = await frappe.db.get_list("Serial No", { + filters: { "name": ["in", selected_serial_nos] }, + fields: ["batch_no", "name"] + }); + const batch_serial_map = serials_with_batch_no.reduce((acc, r) => { + if (!acc[r.batch_no]) { + acc[r.batch_no] = []; + } + acc[r.batch_no] = [...acc[r.batch_no], r.name]; + return acc; + }, {}); + const batch_no = Object.keys(batch_serial_map)[0]; + const batch_serial_nos = batch_serial_map[batch_no].join(` +`); + const serial_nos_belongs_to_other_batch = selected_serial_nos.length !== batch_serial_map[batch_no].length; + const current_batch_no = this.batch_no_control.get_value(); + current_batch_no != batch_no && await this.batch_no_control.set_value(batch_no); + if (serial_nos_belongs_to_other_batch) { + this.serial_no_control.set_value(batch_serial_nos); + this.qty_control.set_value(batch_serial_map[batch_no].length); + delete batch_serial_map[batch_no]; + this.events.clone_new_batch_item_in_frm(batch_serial_map, this.current_item); + } + } + } + bind_events() { + this.bind_auto_serial_fetch_event(); + this.bind_fields_to_numpad_fields(); + this.$component.on("click", ".close-btn", () => { + this.events.close_item_details(); + }); + } + attach_shortcuts() { + this.wrapper.find(".close-btn").attr("title", "Esc"); + frappe.ui.keys.on("escape", () => { + const item_details_visible = this.$component.is(":visible"); + if (item_details_visible) { + this.events.close_item_details(); + } + }); + } + bind_fields_to_numpad_fields() { + const me = this; + this.$form_container.on("click", ".input-with-feedback", function() { + const fieldname = $(this).attr("data-fieldname"); + if (this.last_field_focused != fieldname) { + me.events.item_field_focused(fieldname); + this.last_field_focused = fieldname; + } + }); + } + bind_auto_serial_fetch_event() { + this.$form_container.on("click", ".auto-fetch-btn", () => { + frappe.require("assets/erpnext/js/utils/serial_no_batch_selector.js", () => { + let frm = this.events.get_frm(); + let item_row = this.item_row; + item_row.type_of_transaction = "Outward"; + new erpnext.SerialBatchPackageSelector(frm, item_row, (r) => { + if (r) { + frappe.model.set_value(item_row.doctype, item_row.name, { + "serial_and_batch_bundle": r.name, + "qty": Math.abs(r.total_qty) + }); + } + }); + }); + }); + } + toggle_component(show) { + show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); + } + }; + + // ../posnext/posnext/public/js/pos_number_pad.js + frappe.provide("posnext.PointOfSale"); + posnext.PointOfSale.NumberPad = class { + constructor({ wrapper, events, cols, keys, css_classes, fieldnames_map }) { + this.wrapper = wrapper; + this.events = events; + this.cols = cols; + this.keys = keys; + this.css_classes = css_classes || []; + this.fieldnames = fieldnames_map || {}; + this.init_component(); + } + init_component() { + this.prepare_dom(); + this.bind_events(); + } + prepare_dom() { + const { cols, keys, css_classes, fieldnames } = this; + function get_keys() { + return keys.reduce((a, row, i) => { + return a + row.reduce((a2, number, j) => { + const class_to_append = css_classes && css_classes[i] ? css_classes[i][j] : ""; + const fieldname = fieldnames && fieldnames[number] ? fieldnames[number] : typeof number === "string" ? frappe.scrub(number) : number; + return a2 + `
${__(number)}
`; + }, ""); + }, ""); + } + this.wrapper.html( + `
+ ${get_keys()} +
` + ); + } + bind_events() { + const me = this; + this.wrapper.on("click", ".numpad-btn", function() { + const $btn = $(this); + me.events.numpad_event($btn); + }); + } + }; + + // ../posnext/posnext/public/js/pos_payment.js + frappe.provide("posnext.PointOfSale"); + posnext.PointOfSale.Payment = class { + constructor({ events, wrapper, settings }) { + this.wrapper = wrapper; + this.events = events; + this.custom_show_sales_man = settings.custom_show_sales_man; + this.custom_show_additional_note = settings.custom_show_additional_note; + this.custom_edit_rate = settings.custom_edit_rate_and_uom; + this.custom_show_credit_sales = settings.custom_show_credit_sales; + this.default_payment = settings.default_payment; + this.current_payments = []; + this.enable_coupon_code = settings.enable_coupon_code; + this.init_component(); + if (this.enable_coupon_code) { + this.render_coupon_code_field(); + } + } + init_component() { + this.prepare_dom(); + this.initialize_numpad(); + this.bind_events(); + this.attach_shortcuts(); + } + prepare_dom() { + this.wrapper.append( + `
+ +
+
+
+ +
+
+
+
+
+
+
+
+
${__("Complete Order")}
+
` + ); + this.$component = this.wrapper.find(".payment-container"); + this.$payment_modes = this.$component.find(".payment-modes"); + this.$totals_section = this.$component.find(".totals-section"); + this.$totals = this.$component.find(".totals"); + this.$numpad = this.$component.find(".number-pad"); + this.$coupon_code = this.$component.find(".coupon-code"); + this.$invoice_fields_section = this.$component.find(".fields-section"); + } + render_coupon_code_field() { + frappe.ui.form.make_control({ + df: { + label: __("Coupon Code"), + fieldtype: "Link", + options: "Coupon Code", + fieldname: "coupon_code", + placeholder: __("Select a coupon") + }, + parent: this.$component.find(".coupon-code"), + render_input: true + }); + } + make_invoice_fields_control() { + var me = this; + const fields = []; + if (this.custom_show_credit_sales) { + fields.push({ + fieldname: "custom_credit_sales", + label: "Credit Sales", + fieldtype: "Check" + }); + } + if (this.custom_show_sales_man) { + fields.push({ + fieldname: "sales_person", + label: "Sales Man", + fieldtype: "Link", + options: "Sales Person" + }); + } + if (this.custom_show_additional_note) { + fields.push({ + fieldname: "remarks", + label: "Additional Note", + fieldtype: "Small Text" + }); + } + if (!fields.length) + return; + this.$invoice_fields = this.$invoice_fields_section.find(".invoice-fields"); + this.$invoice_fields.html(""); + const frm = this.events.get_frm(); + me.current_payments = frm.doc.payments; + fields.forEach((df) => { + this.$invoice_fields.append( + `
` + ); + let df_events = { + onchange: function() { + if (this.df.fieldname === "sales_person") { + frm.clear_table("sales_team"); + cur_frm.add_child("sales_team", { + sales_person: this.get_value(), + allocated_percentage: 100 + }); + } else { + if (this.df.fieldname === "custom_credit_sales") { + if (this.get_value()) { + frm.doc.payments.forEach((p) => { + const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + me[`${mode}_control`].set_value(0); + }); + } else { + console.log(me.current_payments); + me.current_payments.forEach((p) => { + if (p.mode_of_payment === me.default_payment) { + const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + me[`${mode}_control`].set_value(frm.doc.grand_total); + } + }); + } + } + frm.set_value(this.df.fieldname, this.get_value()); + } + } + }; + if (df.fieldtype == "Button") { + df_events = { + click: function() { + if (frm.script_manager.has_handlers(df.fieldname, frm.doc.doctype)) { + frm.script_manager.trigger(df.fieldname, frm.doc.doctype, frm.doc.docname); + } + } + }; + } + this[`${df.fieldname}_field`] = frappe.ui.form.make_control({ + df: __spreadValues(__spreadValues({}, df), df_events), + parent: this.$invoice_fields.find(`.${df.fieldname}-field`), + render_input: true + }); + if (df.fieldname !== "remarks") { + this[`${df.fieldname}_field`].set_value(frm.doc[df.fieldname]); + } + }); + } + initialize_numpad() { + const me = this; + this.number_pad = new posnext.PointOfSale.NumberPad({ + wrapper: this.$numpad, + events: { + numpad_event: function($btn) { + me.on_numpad_clicked($btn); + } + }, + cols: 3, + keys: [ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + [".", 0, "Delete"] + ] + }); + this.numpad_value = ""; + } + on_numpad_clicked($btn) { + const button_value = $btn.attr("data-button-value"); + highlight_numpad_btn($btn); + this.numpad_value = button_value === "delete" ? this.numpad_value.slice(0, -1) : this.numpad_value + button_value; + this.selected_mode.$input.get(0).focus(); + this.selected_mode.set_value(this.numpad_value); + function highlight_numpad_btn($btn2) { + $btn2.addClass("shadow-base-inner bg-selected"); + setTimeout(() => { + $btn2.removeClass("shadow-base-inner bg-selected"); + }, 100); + } + } + bind_events() { + const me = this; + this.$payment_modes.on("click", ".mode-of-payment", function(e) { + const mode_clicked = $(this); + if (!$(e.target).is(mode_clicked)) + return; + const scrollLeft = mode_clicked.offset().left - me.$payment_modes.offset().left + me.$payment_modes.scrollLeft(); + me.$payment_modes.animate({ scrollLeft }); + const mode = mode_clicked.attr("data-mode"); + $(`.mode-of-payment-control`).css("display", "none"); + $(`.cash-shortcuts`).css("display", "none"); + me.$payment_modes.find(`.pay-amount`).css("display", "inline"); + me.$payment_modes.find(`.loyalty-amount-name`).css("display", "none"); + $(".mode-of-payment").removeClass("border-primary"); + if (mode_clicked.hasClass("border-primary")) { + mode_clicked.removeClass("border-primary"); + me.selected_mode = ""; + } else { + mode_clicked.addClass("border-primary"); + mode_clicked.find(".mode-of-payment-control").css("display", "flex"); + mode_clicked.find(".cash-shortcuts").css("display", "grid"); + me.$payment_modes.find(`.${mode}-amount`).css("display", "none"); + me.$payment_modes.find(`.${mode}-name`).css("display", "inline"); + me.selected_mode = me[`${mode}_control`]; + me.selected_mode && me.selected_mode.$input.get(0).focus(); + me.auto_set_remaining_amount(); + } + }); + frappe.ui.form.on("POS Invoice", "contact_mobile", (frm) => { + var _a; + const contact = frm.doc.contact_mobile; + const request_button = $((_a = this.request_for_payment_field) == null ? void 0 : _a.$input[0]); + if (contact) { + request_button.removeClass("btn-default").addClass("btn-primary"); + } else { + request_button.removeClass("btn-primary").addClass("btn-default"); + } + }); + frappe.ui.form.on("POS Invoice", "coupon_code", (frm) => { + if (frm.doc.coupon_code && !frm.applying_pos_coupon_code) { + if (!frm.doc.ignore_pricing_rule) { + frm.applying_pos_coupon_code = true; + frappe.run_serially([ + () => frm.doc.ignore_pricing_rule = 1, + () => frm.trigger("ignore_pricing_rule"), + () => frm.doc.ignore_pricing_rule = 0, + () => frm.trigger("apply_pricing_rule"), + () => frm.save(), + () => this.update_totals_section(frm.doc), + () => frm.applying_pos_coupon_code = false + ]); + } else if (frm.doc.ignore_pricing_rule) { + frappe.show_alert({ + message: __("Ignore Pricing Rule is enabled. Cannot apply coupon code."), + indicator: "orange" + }); + } + } + }); + this.setup_listener_for_payments(); + this.$payment_modes.on("click", ".shortcut", function() { + const value = $(this).attr("data-value"); + me.selected_mode.set_value(value); + }); + this.$component.on("click", ".submit-order-btn", () => { + const doc = this.events.get_frm().doc; + let paid_amount = doc.paid_amount; + if (cur_frm.doc.custom_credit_sales && this.custom_show_credit_sales) { + cur_frm.clear_table("payments"); + paid_amount = 0; + } + const items = doc.items; + if ((paid_amount == 0 || !items.length) && !this.custom_show_credit_sales) { + const message = items.length ? __("You cannot submit the order without payment.") : __("You cannot submit empty order."); + frappe.show_alert({ message, indicator: "orange" }); + frappe.utils.play_sound("error"); + return; + } + this.events.submit_invoice(); + }); + frappe.ui.form.on("POS Invoice", "paid_amount", (frm) => { + this.update_totals_section(frm.doc); + const is_cash_shortcuts_invisible = !this.$payment_modes.find(".cash-shortcuts").is(":visible"); + this.attach_cash_shortcuts(frm.doc); + !is_cash_shortcuts_invisible && this.$payment_modes.find(".cash-shortcuts").css("display", "grid"); + this.render_payment_mode_dom(); + }); + frappe.ui.form.on("POS Invoice", "loyalty_amount", (frm) => { + const formatted_currency = format_currency(frm.doc.loyalty_amount, frm.doc.currency); + this.$payment_modes.find(`.loyalty-amount-amount`).html(formatted_currency); + }); + frappe.ui.form.on("Sales Invoice Payment", "amount", (frm, cdt, cdn) => { + const default_mop = locals[cdt][cdn]; + const mode = default_mop.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + if (this[`${mode}_control`] && this[`${mode}_control`].get_value() != default_mop.amount) { + this[`${mode}_control`].set_value(default_mop.amount); + } + }); + } + setup_listener_for_payments() { + frappe.realtime.on("process_phone_payment", (data) => { + const doc = this.events.get_frm().doc; + const { response, amount, success, failure_message } = data; + let message, title; + if (success) { + title = __("Payment Received"); + const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; + if (amount >= grand_total) { + frappe.dom.unfreeze(); + message = __("Payment of {0} received successfully.", [format_currency(amount, doc.currency, 0)]); + this.events.submit_invoice(); + cur_frm.reload_doc(); + } else { + message = __("Payment of {0} received successfully. Waiting for other requests to complete...", [format_currency(amount, doc.currency, 0)]); + } + } else if (failure_message) { + message = failure_message; + title = __("Payment Failed"); + } + frappe.msgprint({ "message": message, "title": title }); + }); + } + auto_set_remaining_amount() { + const doc = this.events.get_frm().doc; + const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; + const remaining_amount = grand_total - doc.paid_amount; + const current_value = this.selected_mode ? this.selected_mode.get_value() : void 0; + if (!current_value && remaining_amount > 0 && this.selected_mode) { + this.selected_mode.set_value(remaining_amount); + } + } + attach_shortcuts() { + const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; + this.$component.find(".submit-order-btn").attr("title", `${ctrl_label}+Enter`); + frappe.ui.keys.on("ctrl+enter", () => { + const payment_is_visible = this.$component.is(":visible"); + const active_mode = this.$payment_modes.find(".border-primary"); + if (payment_is_visible && active_mode.length) { + this.$component.find(".submit-order-btn").click(); + } + }); + frappe.ui.keys.add_shortcut({ + shortcut: "tab", + action: () => { + const payment_is_visible = this.$component.is(":visible"); + let active_mode = this.$payment_modes.find(".border-primary"); + active_mode = active_mode.length ? active_mode.attr("data-mode") : void 0; + if (!active_mode) + return; + const mode_of_payments = Array.from(this.$payment_modes.find(".mode-of-payment")).map((m) => $(m).attr("data-mode")); + const mode_index = mode_of_payments.indexOf(active_mode); + const next_mode_index = (mode_index + 1) % mode_of_payments.length; + const next_mode_to_be_clicked = this.$payment_modes.find(`.mode-of-payment[data-mode="${mode_of_payments[next_mode_index]}"]`); + if (payment_is_visible && mode_index != next_mode_index) { + next_mode_to_be_clicked.click(); + } + }, + condition: () => this.$component.is(":visible") && this.$payment_modes.find(".border-primary").length, + description: __("Switch Between Payment Modes"), + ignore_inputs: true, + page: cur_page.page.page + }); + } + toggle_numpad() { + } + render_payment_section() { + this.render_payment_mode_dom(); + this.make_invoice_fields_control(); + this.update_totals_section(); + this.focus_on_default_mop(); + } + after_render() { + const frm = this.events.get_frm(); + frm.script_manager.trigger("after_payment_render", frm.doc.doctype, frm.doc.docname); + } + edit_cart() { + if (this.custom_edit_rate) { + const div = document.getElementById("customer-cart-container2"); + div.style.gridColumn = "span 5 / span 5"; + } + this.events.toggle_other_sections(false); + this.toggle_component(false); + } + checkout() { + this.events.toggle_other_sections(true); + this.toggle_component(true); + this.render_payment_section(); + this.after_render(); + } + toggle_remarks_control() { + if (this.$remarks.find(".frappe-control").length) { + this.$remarks.html("+ Add Remark"); + } else { + this.$remarks.html(""); + this[`remark_control`] = frappe.ui.form.make_control({ + df: { + label: __("Remark"), + fieldtype: "Data", + onchange: function() { + } + }, + parent: this.$totals_section.find(`.remarks`), + render_input: true + }); + this[`remark_control`].set_value(""); + } + } + render_payment_mode_dom() { + const doc = this.events.get_frm().doc; + const payments = doc.payments; + const currency = doc.currency; + this.$payment_modes.html(`${payments.map((p, i) => { + const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + const payment_type = p.type; + const margin = i % 2 === 0 ? "pr-2" : "pl-2"; + const amount = p.amount > 0 ? format_currency(p.amount, currency) : ""; + return ` +
+
+ ${p.mode_of_payment} +
${amount}
+
+
+
+ `; + }).join("")}`); + this.current_payments = payments; + payments.forEach((p) => { + const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + const me = this; + this[`${mode}_control`] = frappe.ui.form.make_control({ + df: { + label: p.mode_of_payment, + fieldtype: "Currency", + placeholder: __("Enter {0} amount.", [p.mode_of_payment]), + onchange: function() { + console.log(p.doctype); + console.log(p.name); + const current_value = frappe.model.get_value(p.doctype, p.name, "amount"); + if (current_value != this.value) { + frappe.model.set_value(p.doctype, p.name, "amount", flt(this.value)).then(() => me.update_totals_section()); + const formatted_currency = format_currency(this.value, currency); + me.$payment_modes.find(`.${mode}-amount`).html(formatted_currency); + } + } + }, + parent: this.$payment_modes.find(`.${mode}.mode-of-payment-control`), + render_input: true + }); + this[`${mode}_control`].toggle_label(false); + this[`${mode}_control`].set_value(p.amount); + }); + this.render_loyalty_points_payment_mode(); + this.attach_cash_shortcuts(doc); + } + focus_on_default_mop() { + const doc = this.events.get_frm().doc; + const payments = doc.payments; + payments.forEach((p) => { + const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); + if (p.default) { + setTimeout(() => { + this.$payment_modes.find(`.${mode}.mode-of-payment-control`).parent().click(); + }, 500); + } + }); + } + attach_cash_shortcuts(doc) { + const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; + const currency = doc.currency; + const shortcuts = this.get_cash_shortcuts(flt(grand_total)); + this.$payment_modes.find(".cash-shortcuts").remove(); + let shortcuts_html = shortcuts.map((s) => { + return `
${format_currency(s, currency, 0)}
`; + }).join(""); + this.$payment_modes.find('[data-payment-type="Cash"]').find(".mode-of-payment-control").after(`
${shortcuts_html}
`); + } + get_cash_shortcuts(grand_total) { + let steps = [1, 5, 10]; + const digits = String(Math.round(grand_total)).length; + steps = steps.map((x) => x * 10 ** (digits - 2)); + const get_nearest = (amount, x) => { + let nearest_x = Math.ceil(amount / x) * x; + return nearest_x === amount ? nearest_x + x : nearest_x; + }; + return steps.reduce((finalArr, x) => { + let nearest_x = get_nearest(grand_total, x); + nearest_x = finalArr.indexOf(nearest_x) != -1 ? nearest_x + x : nearest_x; + return [...finalArr, nearest_x]; + }, []); + } + render_loyalty_points_payment_mode() { + const me = this; + const doc = this.events.get_frm().doc; + const { loyalty_program, loyalty_points, conversion_factor } = this.events.get_customer_details(); + this.$payment_modes.find(`.mode-of-payment[data-mode="loyalty-amount"]`).parent().remove(); + if (!loyalty_program) + return; + let description, read_only, max_redeemable_amount; + if (!loyalty_points) { + description = __("You don't have enough points to redeem."); + read_only = true; + } else { + max_redeemable_amount = flt(flt(loyalty_points) * flt(conversion_factor), precision("loyalty_amount", doc)); + description = __("You can redeem upto {0}.", [format_currency(max_redeemable_amount)]); + read_only = false; + } + const margin = this.$payment_modes.children().length % 2 === 0 ? "pr-2" : "pl-2"; + const amount = doc.loyalty_amount > 0 ? format_currency(doc.loyalty_amount, doc.currency) : ""; + this.$payment_modes.append( + `
+
+ Redeem Loyalty Points +
${amount}
+
${loyalty_program}
+
+
+
` + ); + this["loyalty-amount_control"] = frappe.ui.form.make_control({ + df: { + label: __("Redeem Loyalty Points"), + fieldtype: "Currency", + placeholder: __("Enter amount to be redeemed."), + options: "company:currency", + read_only, + onchange: async function() { + if (!loyalty_points) + return; + if (this.value > max_redeemable_amount) { + frappe.show_alert({ + message: __("You cannot redeem more than {0}.", [format_currency(max_redeemable_amount)]), + indicator: "red" + }); + frappe.utils.play_sound("submit"); + me["loyalty-amount_control"].set_value(0); + return; + } + const redeem_loyalty_points = this.value > 0 ? 1 : 0; + await frappe.model.set_value(doc.doctype, doc.name, "redeem_loyalty_points", redeem_loyalty_points); + frappe.model.set_value(doc.doctype, doc.name, "loyalty_points", parseInt(this.value / conversion_factor)); + }, + description + }, + parent: this.$payment_modes.find(`.loyalty-amount.mode-of-payment-control`), + render_input: true + }); + this["loyalty-amount_control"].toggle_label(false); + } + render_add_payment_method_dom() { + const docstatus = this.events.get_frm().doc.docstatus; + if (docstatus === 0) + this.$payment_modes.append( + `
+
+ Add Payment Method
+
` + ); + } + update_totals_section(doc) { + if (!doc) + doc = this.events.get_frm().doc; + let branch_value = $('.input-with-feedback[data-fieldname="branch"]').val(); + frappe.model.set_value(cur_frm.doctype, cur_frm.docname, "branch", branch_value); + cur_frm.save(); + const paid_amount = doc.paid_amount; + if (cur_frm.doc.custom_credit_sales) { + const paid_amount2 = 0; + } + const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; + const remaining = grand_total - doc.paid_amount; + const change = doc.change_amount || remaining <= 0 ? -1 * remaining : void 0; + const currency = doc.currency; + const label = change ? __("Change") : __("To Be Paid"); + this.$totals.html( + `
+
${__("Grand Total")}
+
${format_currency(grand_total, currency)}
+
+
+
+
${__("Paid Amount")}
+
${format_currency(paid_amount, currency)}
+
+
+
+
${label}
+
${format_currency(change || remaining, currency)}
+
` + ); + } + toggle_component(show) { + show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); + } + }; + + // ../posnext/posnext/public/js/pos_past_order_list.js + frappe.provide("posnext.PointOfSale"); + var invoicess = []; + posnext.PointOfSale.PastOrderList = class { + constructor({ wrapper, events, settings }) { + this.wrapper = wrapper; + this.events = events; + this.pos_profile = settings.name; + this.custom_filter_order_list_by_profile = settings.custom_filter_order_list_by_profile; + this.init_component(); + } + init_component() { + this.prepare_dom(); + this.make_filter_section(); + this.bind_events(); + } + prepare_dom() { + this.wrapper.append( + `
+
+ +
+
${__("Recent Orders")}
+
+
+
+
+
` + ); + this.$component = this.wrapper.find(".past-order-list"); + this.$invoices_container = this.$component.find(".invoices-container"); + } + bind_events() { + this.search_field.$input.on("input", (e) => { + clearTimeout(this.last_search); + this.last_search = setTimeout(() => { + const search_term = e.target.value; + this.refresh_list(search_term, this.status_field.get_value()); + }, 300); + }); + const me = this; + this.$invoices_container.on("click", ".invoice-wrapper", function() { + const invoice_name = unescape($(this).attr("data-invoice-name")); + me.events.open_invoice_data(invoice_name); + }); + this.$component.on("click", ".back", function() { + me.events.previous_screen(); + }); + } + make_filter_section() { + const me = this; + this.search_field = frappe.ui.form.make_control({ + df: { + label: __("Search"), + fieldtype: "Data", + placeholder: __("Search by invoice id or customer name") + }, + parent: this.$component.find(".search-field"), + render_input: true + }); + this.status_field = frappe.ui.form.make_control({ + df: { + label: __("Invoice Status"), + fieldtype: "Select", + options: `Draft +Paid +Unpaid +Return`, + placeholder: __("Filter by invoice status"), + onchange: function() { + if (me.$component.is(":visible")) + me.refresh_list(); + } + }, + parent: this.$component.find(".status-field"), + render_input: true + }); + this.search_field.toggle_label(false); + this.status_field.toggle_label(false); + this.status_field.set_value("Draft"); + } + refresh_list() { + frappe.dom.freeze(); + this.events.reset_summary(); + const search_term = this.search_field.get_value(); + const status = this.status_field.get_value(); + const pos_profile = this.pos_profile; + this.$invoices_container.html(""); + let filter = { search_term, status }; + if (this.custom_filter_order_list_by_profile) { + filter = { search_term, status, pos_profile }; + } + return frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.get_past_order_list", + freeze: true, + args: filter, + callback: (response) => { + frappe.dom.unfreeze(); + invoicess = response.message; + response.message.forEach((invoice) => { + const invoice_html = this.get_invoice_html(invoice); + this.$invoices_container.append(invoice_html); + }); + } + }); + } + get_invoice_html(invoice) { + const posting_datetime = moment(invoice.posting_date + " " + invoice.posting_time).format("Do MMMM, h:mma"); + return `
+
+
${invoice.name}
+
+ + + + ${frappe.ellipsis(invoice.customer, 20)} +
+
+
+
${format_currency(invoice.grand_total, invoice.currency, 0) || 0}
+
${posting_datetime}
+
+
+
`; + } + toggle_component(show) { + frappe.run_serially([ + () => show ? this.$component.css("display", "flex") && this.refresh_list() : this.$component.css("display", "none"), + () => this.events.open_invoice_data(invoicess[0].name) + ]); + } + }; + + // ../posnext/posnext/public/js/pos_past_order_summary.js + frappe.provide("posnext.PointOfSale"); + posnext.PointOfSale.PastOrderSummary = class { + constructor({ wrapper, pos_profile, events }) { + this.wrapper = wrapper; + this.pos_profile = pos_profile; + this.events = events; + this.init_component(); + } + init_component() { + this.prepare_dom(); + this.init_email_print_dialog(); + this.bind_events(); + this.attach_shortcuts(); + } + prepare_dom() { + this.wrapper.append( + `
+
+ ${__("Select an invoice to load summary data")} +
+
+
+
+
${__("Items")}
+
+
${__("Totals")}
+
+
${__("Payments")}
+
+
+
+
+
` + ); + this.$component = this.wrapper.find(".past-order-summary"); + this.$summary_wrapper = this.$component.find(".invoice-summary-wrapper"); + this.$summary_container = this.$component.find(".abs-container"); + this.$upper_section = this.$summary_container.find(".upper-section"); + this.$items_container = this.$summary_container.find(".items-container"); + this.$totals_container = this.$summary_container.find(".totals-container"); + this.$payment_container = this.$summary_container.find(".payments-container"); + this.$summary_btns = this.$summary_container.find(".summary-btns"); + } + init_email_print_dialog() { + const email_dialog = new frappe.ui.Dialog({ + title: "Email Receipt", + fields: [ + { fieldname: "email_id", fieldtype: "Data", options: "Email", label: "Email ID", reqd: 1 }, + { fieldname: "content", fieldtype: "Small Text", label: "Message (if any)" } + ], + primary_action: () => { + this.send_email(); + }, + primary_action_label: __("Send") + }); + this.email_dialog = email_dialog; + const print_dialog = new frappe.ui.Dialog({ + title: "Print Receipt", + fields: [ + { fieldname: "print", fieldtype: "Data", label: "Print Preview" } + ], + primary_action: () => { + this.print_receipt(); + }, + primary_action_label: __("Print") + }); + this.print_dialog = print_dialog; + } + get_upper_section_html(doc) { + const { status } = doc; + let indicator_color = ""; + in_list(["Paid", "Consolidated"], status) && (indicator_color = "green"); + status === "Draft" && (indicator_color = "red"); + status === "Return" && (indicator_color = "grey"); + return `
+
${doc.customer}
+
${this.customer_email}
+
${__("Sold by")}: ${doc.owner}
+
+
+ +
${doc.name}
+ ${doc.status} +
`; + } + get_item_html(doc, item_data) { + return `
+
${item_data.item_name}
+
${item_data.qty || 0} ${item_data.uom}
+
${get_rate_discount_html()}
+
`; + function get_rate_discount_html() { + if (item_data.rate && item_data.price_list_rate && item_data.rate !== item_data.price_list_rate) { + return `(${item_data.discount_percentage}% off) +
${format_currency(item_data.rate, doc.currency)}
`; + } else { + return `
${format_currency(item_data.price_list_rate || item_data.rate, doc.currency)}
`; + } + } + } + get_discount_html(doc) { + if (doc.discount_amount) { + return `
+
Discount (${doc.additional_discount_percentage} %)
+
${format_currency(doc.discount_amount, doc.currency)}
+
`; + } else { + return ``; + } + } + get_net_total_html(doc) { + return `
+
${__("Net Total")}
+
${format_currency(doc.net_total, doc.currency)}
+
`; + } + get_taxes_html(doc) { + if (!doc.taxes.length) + return ""; + let taxes_html = doc.taxes.map((t) => { + const description = /[0-9]+/.test(t.description) ? t.description : t.rate != 0 ? `${t.description} @ ${t.rate}%` : t.description; + return ` +
+
${description}
+
${format_currency(t.tax_amount_after_discount_amount, doc.currency)}
+
+ `; + }).join(""); + return `
${taxes_html}
`; + } + get_grand_total_html(doc) { + return `
+
${__("Grand Total")}
+
${format_currency(doc.grand_total, doc.currency)}
+
`; + } + get_payment_html(doc, payment) { + return `
+
${__(payment.mode_of_payment)}
+
${format_currency(payment.amount, doc.currency)}
+
`; + } + bind_events() { + this.$summary_container.on("click", ".return-btn", () => { + this.events.process_return(this.doc.name); + this.toggle_component(false); + this.$component.find(".no-summary-placeholder").css("display", "flex"); + this.$summary_wrapper.css("display", "none"); + }); + this.$summary_container.on("click", ".edit-btn", () => { + this.events.edit_order(this.doc.name); + this.toggle_component(false); + this.$component.find(".no-summary-placeholder").css("display", "flex"); + this.$summary_wrapper.css("display", "none"); + }); + this.$summary_container.on("click", ".delete-btn", () => { + this.events.delete_order(this.doc.name); + this.show_summary_placeholder(); + }); + this.$summary_container.on("click", ".send-btn", () => { + console.log(this.pos_profile); + var field_names = this.pos_profile.custom_whatsapp_field_names.map((x) => this.doc[x.field_names.toString()]); + console.log(field_names); + console.log(field_names.join(",")); + var message = "https://wa.me/" + this.doc.customer + "?text="; + message += formatString(this.pos_profile.custom_whatsapp_message, field_names); + console.log(message); + frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.generate_pdf_and_save", + args: { + docname: this.doc.name, + doctype: this.doc.doctype, + print_format: this.pos_profile.print_format + }, + freeze: true, + freeze_message: "Creating file then send to whatsapp thru link....", + callback: function(r) { + message += "Please Find your invoice here \n " + window.origin + r.message.file_url; + window.open(message); + } + }); + }); + function formatString(str, args) { + return str.replace(/{(\d+)}/g, function(match, number) { + return typeof args[number] !== "undefined" ? args[number] : match; + }); + } + this.$summary_container.on("click", ".new-btn", () => { + this.events.new_order(); + this.toggle_component(false); + this.$component.find(".no-summary-placeholder").css("display", "flex"); + this.$summary_wrapper.css("display", "none"); + }); + this.$summary_container.on("click", ".email-btn", () => { + this.email_dialog.fields_dict.email_id.set_value(this.customer_email); + this.email_dialog.show(); + }); + this.$summary_container.on("click", ".print-btn", () => { + this.print_receipt(); + }); + } + print_receipt() { + const frm = this.events.get_frm(); + frappe.utils.print( + this.doc.doctype, + this.doc.name, + frm.pos_print_format, + this.doc.letter_head, + this.doc.language || frappe.boot.lang + ); + } + attach_shortcuts() { + const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; + this.$summary_container.find(".print-btn").attr("title", `${ctrl_label}+P`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+p", + action: () => this.$summary_container.find(".print-btn").click(), + condition: () => this.$component.is(":visible") && this.$summary_container.find(".print-btn").is(":visible"), + description: __("Print Receipt"), + page: cur_page.page.page + }); + this.$summary_container.find(".new-btn").attr("title", `${ctrl_label}+Enter`); + frappe.ui.keys.on("ctrl+enter", () => { + const summary_is_visible = this.$component.is(":visible"); + if (summary_is_visible && this.$summary_container.find(".new-btn").is(":visible")) { + this.$summary_container.find(".new-btn").click(); + } + }); + this.$summary_container.find(".edit-btn").attr("title", `${ctrl_label}+E`); + frappe.ui.keys.add_shortcut({ + shortcut: "ctrl+e", + action: () => this.$summary_container.find(".edit-btn").click(), + condition: () => this.$component.is(":visible") && this.$summary_container.find(".edit-btn").is(":visible"), + description: __("Edit Receipt"), + page: cur_page.page.page + }); + } + send_email() { + const frm = this.events.get_frm(); + const recipients = this.email_dialog.get_values().email_id; + const content = this.email_dialog.get_values().content; + const doc = this.doc || frm.doc; + const print_format = frm.pos_print_format; + frappe.call({ + method: "frappe.core.doctype.communication.email.make", + args: { + recipients, + subject: __(frm.meta.name) + ": " + doc.name, + content: content ? content : __(frm.meta.name) + ": " + doc.name, + doctype: doc.doctype, + name: doc.name, + send_email: 1, + print_format, + sender_full_name: frappe.user.full_name(), + _lang: doc.language + }, + callback: (r) => { + if (!r.exc) { + frappe.utils.play_sound("email"); + if (r.message["emails_not_sent_to"]) { + frappe.msgprint(__( + "Email not sent to {0} (unsubscribed / disabled)", + [frappe.utils.escape_html(r.message["emails_not_sent_to"])] + )); + } else { + frappe.show_alert({ + message: __("Email sent successfully."), + indicator: "green" + }); + } + this.email_dialog.hide(); + } else { + frappe.msgprint(__("There were errors while sending email. Please try again.")); + } + } + }); + } + add_summary_btns(map) { + this.$summary_btns.html(""); + map.forEach((m) => { + if (m.condition) { + m.visible_btns.forEach((b) => { + const class_name = b.split(" ")[0].toLowerCase(); + const btn = __(b); + this.$summary_btns.append( + `
${btn}
` + ); + }); + } + }); + this.$summary_btns.children().last().removeClass("mr-4"); + } + toggle_summary_placeholder(show) { + if (show) { + this.$summary_wrapper.css("display", "none"); + this.$component.find(".no-summary-placeholder").css("display", "flex"); + } else { + this.$summary_wrapper.css("display", "flex"); + this.$component.find(".no-summary-placeholder").css("display", "none"); + } + } + get_condition_btn_map(after_submission) { + if (after_submission) + return [{ condition: true, visible_btns: ["Print Receipt", "Email Receipt", "Send Whatsapp", "New Order"] }]; + return [ + { condition: this.doc.docstatus === 0, visible_btns: ["Print Receipt", "Edit Order", "Delete Order", "Send Whatsapp"] }, + { condition: !this.doc.is_return && this.doc.docstatus === 1, visible_btns: ["Print Receipt", "Email Receipt", "Return", "Send Whatsapp"] }, + { condition: this.doc.is_return && this.doc.docstatus === 1, visible_btns: ["Print Receipt", "Email Receipt", "Send Whatsapp"] } + ]; + } + load_summary_of(doc, after_submission = false) { + after_submission ? this.$component.css("grid-column", "span 10 / span 10") : this.$component.css("grid-column", "span 6 / span 6"); + this.toggle_summary_placeholder(false); + this.doc = doc; + this.attach_document_info(doc); + this.attach_items_info(doc); + this.attach_totals_info(doc); + this.attach_payments_info(doc); + const condition_btns_map = this.get_condition_btn_map(after_submission); + this.add_summary_btns(condition_btns_map); + this.$summary_wrapper.css("width", after_submission ? "35%" : "60%"); + if (after_submission) { + this.print_receipt_on_order_complete(); + } + } + attach_document_info(doc) { + frappe.db.get_value("Customer", this.doc.customer, "email_id").then(({ message }) => { + this.customer_email = message.email_id || ""; + const upper_section_dom = this.get_upper_section_html(doc); + this.$upper_section.html(upper_section_dom); + }); + } + attach_items_info(doc) { + this.$items_container.html(""); + doc.items.forEach((item) => { + const item_dom = this.get_item_html(doc, item); + this.$items_container.append(item_dom); + this.set_dynamic_rate_header_width(); + }); + } + set_dynamic_rate_header_width() { + const rate_cols = Array.from(this.$items_container.find(".item-rate-disc")); + this.$items_container.find(".item-rate-disc").css("width", ""); + let max_width = rate_cols.reduce((max_width2, elm) => { + if ($(elm).width() > max_width2) + max_width2 = $(elm).width(); + return max_width2; + }, 0); + max_width += 1; + if (max_width == 1) + max_width = ""; + this.$items_container.find(".item-rate-disc").css("width", max_width); + } + attach_payments_info(doc) { + this.$payment_container.html(""); + doc.payments.forEach((p) => { + if (p.amount) { + const payment_dom = this.get_payment_html(doc, p); + this.$payment_container.append(payment_dom); + } + }); + if (doc.redeem_loyalty_points && doc.loyalty_amount) { + const payment_dom = this.get_payment_html(doc, { + mode_of_payment: "Loyalty Points", + amount: doc.loyalty_amount + }); + this.$payment_container.append(payment_dom); + } + } + attach_totals_info(doc) { + this.$totals_container.html(""); + const net_total_dom = this.get_net_total_html(doc); + const taxes_dom = this.get_taxes_html(doc); + const discount_dom = this.get_discount_html(doc); + const grand_total_dom = this.get_grand_total_html(doc); + this.$totals_container.append(net_total_dom); + this.$totals_container.append(taxes_dom); + this.$totals_container.append(discount_dom); + this.$totals_container.append(grand_total_dom); + } + toggle_component(show) { + show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); + } + async print_receipt_on_order_complete() { + var _a; + const profile_name = ((_a = this.pos_profile) == null ? void 0 : _a.name) || this.pos_profile; + const { message } = await frappe.db.get_value( + "POS Profile", + profile_name, + ["print_receipt_on_order_complete", "print_format"] + ); + if (message == null ? void 0 : message.print_receipt_on_order_complete) { + setTimeout(() => this.print_receipt(), 300); + } + } + }; +})(); +//# sourceMappingURL=posnext.bundle.TN4KQRHJ.js.map diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map new file mode 100644 index 0000000..fd8823c --- /dev/null +++ b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../apps/posnext/posnext/public/js/pos_controller.js", "../../../../../apps/posnext/posnext/public/js/pos_item_selector.js", "../../../../../apps/posnext/posnext/public/js/pos_item_cart.js", "../../../../../apps/posnext/posnext/public/js/pos_item_details.js", "../../../../../apps/posnext/posnext/public/js/pos_number_pad.js", "../../../../../apps/posnext/posnext/public/js/pos_payment.js", "../../../../../apps/posnext/posnext/public/js/pos_past_order_list.js", "../../../../../apps/posnext/posnext/public/js/pos_past_order_summary.js"], + "sourcesContent": ["frappe.provide('posnext.PointOfSale');\nvar selected_item = null\n\nposnext.PointOfSale.Controller = class {\n\tconstructor(wrapper) {\n\t\tconsole.log(\"CONTROLLLLLERE\")\n\t\tthis.wrapper = $(wrapper).find('.layout-main-section');\n\t\tthis.page = wrapper.page;\n\t\tfrappe.run_serially([\n\t\t\t() => this.reload_status = false,\n\t\t\t() => this.check_opening_entry(\"\"),\n\t\t\t() => this.reload_status = true,\n\t\t]);\n\n\n\n\t}\n\n\tfetch_opening_entry(value) {\n\t\treturn frappe.call(\"posnext.posnext.page.posnext.point_of_sale.check_opening_entry\", { \"user\": frappe.session.user, \"value\": value });\n\t}\n\n\tcheck_opening_entry(value = \"\") {\n\t\tthis.fetch_opening_entry(value).then((r) => {\n\t\t\tif (r.message.length) {\n\t\t\t\t// assuming only one opening voucher is available for the current user\n\t\t\t\tthis.prepare_app_defaults(r.message[0]);\n\t\t\t} else {\n\t\t\t\tthis.create_opening_voucher();\n\t\t\t}\n\t\t});\n\t}\n\n\tcreate_opening_voucher() {\n\t\tconst me = this;\n\t\tconst table_fields = [\n\t\t\t{\n\t\t\t\tfieldname: \"mode_of_payment\", fieldtype: \"Link\",\n\t\t\t\tin_list_view: 1, label: \"Mode of Payment\",\n\t\t\t\toptions: \"Mode of Payment\", reqd: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tfieldname: \"opening_amount\", fieldtype: \"Currency\",\n\t\t\t\tin_list_view: 1, label: \"Opening Amount\",\n\t\t\t\toptions: \"company:company_currency\",\n\t\t\t\tchange: function () {\n\t\t\t\t\tdialog.fields_dict.balance_details.df.data.some(d => {\n\t\t\t\t\t\tif (d.idx == this.doc.idx) {\n\t\t\t\t\t\t\td.opening_amount = this.value;\n\t\t\t\t\t\t\tdialog.fields_dict.balance_details.grid.refresh();\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\t\tconst fetch_pos_payment_methods = () => {\n\t\t\tconst pos_profile = dialog.fields_dict.pos_profile.get_value();\n\t\t\tif (!pos_profile) return;\n\t\t\tfrappe.db.get_doc(\"POS Profile\", pos_profile).then(({ payments }) => {\n\t\t\t\tdialog.fields_dict.balance_details.df.data = [];\n\t\t\t\tpayments.forEach(pay => {\n\t\t\t\t\tconst { mode_of_payment } = pay;\n\t\t\t\t\tdialog.fields_dict.balance_details.df.data.push({ mode_of_payment, opening_amount: '0' });\n\t\t\t\t});\n\t\t\t\tdialog.fields_dict.balance_details.grid.refresh();\n\t\t\t});\n\t\t}\n\t\tconst dialog = new frappe.ui.Dialog({\n\t\t\ttitle: __('Create POS Opening Entry'),\n\t\t\tstatic: true,\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tfieldtype: 'Link', label: __('Company'), default: frappe.defaults.get_default('company'),\n\t\t\t\t\toptions: 'Company', fieldname: 'company', reqd: 1\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfieldtype: 'Link', label: __('POS Profile'),\n\t\t\t\t\toptions: 'POS Profile', fieldname: 'pos_profile', reqd: 1,\n\t\t\t\t\tget_query: () => pos_profile_query(),\n\t\t\t\t\tonchange: () => fetch_pos_payment_methods()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfieldname: \"balance_details\",\n\t\t\t\t\tfieldtype: \"Table\",\n\t\t\t\t\tlabel: \"Opening Balance Details\",\n\t\t\t\t\tcannot_add_rows: false,\n\t\t\t\t\tin_place_edit: true,\n\t\t\t\t\treqd: 1,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tfields: table_fields\n\t\t\t\t}\n\t\t\t],\n\t\t\tprimary_action: async function({ company, pos_profile, balance_details }) {\n\t\t\t\tif (!balance_details.length) {\n\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\tmessage: __(\"Please add Mode of payments and opening balance details.\"),\n\t\t\t\t\t\tindicator: 'red'\n\t\t\t\t\t})\n\t\t\t\t\treturn frappe.utils.play_sound(\"error\");\n\t\t\t\t}\n\n\t\t\t\t// filter balance details for empty rows\n\t\t\t\tbalance_details = balance_details.filter(d => d.mode_of_payment);\n\n\t\t\t\tconst method = \"posnext.posnext.page.posnext.point_of_sale.create_opening_voucher\";\n\t\t\t\tconst res = await frappe.call({ method, args: { pos_profile, company, balance_details }, freeze:true });\n\t\t\t\t!res.exc && me.prepare_app_defaults(res.message);\n\t\t\t\tdialog.hide();\n\t\t\t},\n\t\t\tprimary_action_label: __('Submit')\n\t\t});\n\t\tdialog.show();\n\t\tconst pos_profile_query = () => {\n\t\t\treturn {\n\t\t\t\tquery: 'erpnext.accounts.doctype.pos_profile.pos_profile.pos_profile_query',\n\t\t\t\tfilters: { company: dialog.fields_dict.company.get_value() }\n\t\t\t}\n\t\t};\n\t}\n\n\tasync prepare_app_defaults(data) {\n\t\tthis.pos_opening = data.name;\n\t\tthis.company = data.company;\n\t\tthis.pos_profile = data.pos_profile;\n\t\tthis.pos_opening_time = data.period_start_date;\n\t\tthis.item_stock_map = {};\n\t\tthis.settings = {};\n\t\twindow.current_pos_profile = this.pos_profile\n\t\tfrappe.db.get_value('Stock Settings', undefined, 'allow_negative_stock').then(({ message }) => {\n\t\t\tthis.allow_negative_stock = flt(message.allow_negative_stock) || false;\n\t\t});\n\n\t\tfrappe.call({\n\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.get_pos_profile_data\",\n\t\t\targs: { \"pos_profile\": this.pos_profile },\n\t\t\tcallback: (res) => {\n\t\t\t\tconst profile = res.message;\n\n\t\t\t\tObject.assign(this.settings, profile);\n\t\t\t\tthis.settings.customer_groups = profile.customer_groups.map(group => group.name);\n\n\t\t\t\tthis.make_app();\n\t\t\t}\n\t\t});\n\t}\n\n\tset_opening_entry_status() {\n\t\tthis.page.set_title_sub(\n\t\t\t`\n\t\t\t\t\n\t\t\t\t\tOpened at ${moment(this.pos_opening_time).format(\"Do MMMM, h:mma\")}\n\t\t\t\t\n\t\t\t`);\n\t}\n\n\tmake_app() {\n\t\tthis.prepare_dom();\n\t\tthis.prepare_components();\n\t\tthis.prepare_menu();\n\t\tthis.make_new_invoice();\n\t}\n\n\tprepare_dom() {\n\t\tthis.wrapper.append(\n\t\t\t`
`\n\t\t);\n\n\t\tthis.$components_wrapper = this.wrapper.find('.point-of-sale-app');\n\t}\n\n\tprepare_components() {\n\t\tthis.init_item_selector();\n\t\tthis.init_item_details();\n\t\tthis.init_item_cart();\n\t\tthis.init_payments();\n\t\tthis.init_recent_order_list();\n\t\tthis.init_order_summary();\n\t}\n\n\tprepare_menu() {\n\t\tthis.page.clear_menu();\n\t\tif(this.settings.custom_show_open_form_view){\n\t\t\tthis.page.add_menu_item(__(\"Open Form View\"), this.open_form_view.bind(this), false, 'Ctrl+F');\n\t\t}\n\t\tif(this.settings.custom_show_toggle_recent_orders) {\n\t\t\tthis.page.add_menu_item(__(\"Toggle Recent Orders\"), this.toggle_recent_order.bind(this), false, 'Ctrl+O');\n\t\t}\n\t\tif(this.settings.custom_show_save_as_draft) {\n\t\t\tthis.page.add_menu_item(__(\"Save as Draft\"), this.save_draft_invoice.bind(this), false, 'Ctrl+S');\n\t\t}\n\t\tif(this.settings.custom_show_close_the_pos) {\n\t\t\tthis.page.add_menu_item(__('Close the POS'), this.close_pos.bind(this), false, 'Shift+Ctrl+C');\n\t\t}\n\t}\n\n\topen_form_view() {\n\t\tfrappe.model.sync(this.frm.doc);\n\t\tfrappe.set_route(\"Form\", this.frm.doc.doctype, this.frm.doc.name);\n\t}\n\n\ttoggle_recent_order() {\n\t\tconst show = this.recent_order_list.$component.is(':hidden');\n\t\tthis.toggle_recent_order_list(show);\n\t}\n\n\tsave_draft_invoice() {\n\t\tif (!this.$components_wrapper.is(\":visible\")) return;\n\t\tconsole.log(this.frm.doc.items)\n\t\tif (this.frm.doc.items.length == 0) {\n\t\t\tfrappe.show_alert({\n\t\t\t\tmessage: __(\"You must add atleast one item to save it as draft.\"),\n\t\t\t\tindicator:'red'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.frm.save(undefined, undefined, undefined, () => {\n\t\t\tfrappe.show_alert({\n\t\t\t\tmessage: __(\"There was an error saving the document.\"),\n\t\t\t\tindicator: 'red'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t}).then(() => {\n\t\t\tfrappe.run_serially([\n\t\t\t\t() => frappe.dom.freeze(),\n\t\t\t\t() => this.make_new_invoice(false),\n\t\t\t\t() => frappe.dom.unfreeze()\n\n\n\t\t\t]);\n\n\n\n\t\t});\n\t}\n\n\tclose_pos() {\n\t\tif (!this.$components_wrapper.is(\":visible\")) return;\n\n\t\tlet voucher = frappe.model.get_new_doc('POS Closing Entry');\n\t\tvoucher.pos_profile = this.frm.doc.pos_profile;\n\t\tvoucher.user = frappe.session.user;\n\t\tvoucher.company = this.frm.doc.company;\n\t\tvoucher.pos_opening_entry = this.pos_opening;\n\t\tvoucher.period_end_date = frappe.datetime.now_datetime();\n\t\tvoucher.posting_date = frappe.datetime.now_date();\n\t\tvoucher.posting_time = frappe.datetime.now_time();\n\t\tfrappe.set_route('Form', 'POS Closing Entry', voucher.name);\n\t}\n\n\tinit_item_selector() {\n\t\tif(this.frm){\n\t\tthis.frm.doc.set_warehouse = this.settings.warehouse\n\t\t}\n\t\tthis.item_selector = new posnext.PointOfSale.ItemSelector({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tpos_profile: this.pos_profile,\n\t\t\tsettings: this.settings,\n\t\t\treload_status: this.reload_status,\n\t\t\tcurrency: this.settings.currency,\n\t\t\tevents: {\n\t\t\t\tcheck_opening_entry: () => this.check_opening_entry(),\n\t\t\t\titem_selected: args => this.on_cart_update(args),\n\t\t\t\tinit_item_cart: () => this.init_item_cart(),\n\t\t\t\tinit_item_details: () => this.init_item_details(),\n\t\t\t\tchange_items: (args) => this.change_items(args),\n\t\t\t\tget_frm: () => this.frm || {}\n\t\t\t}\n\t\t})\n\t}\n\tchange_items(items){\n\t\tvar me = this\n\t\tthis.frm = items;\n\t\tthis.cart.load_invoice()\n\t}\n\n\tinit_item_cart() {\n\t\tthis.cart = new posnext.PointOfSale.ItemCart({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tsettings: this.settings,\n\t\t\tevents: {\n\t\t\t\tget_frm: () => this.frm,\n\t\t\t\tremove_item_from_cart: (item) => {\n\t\t\t\t\tthis.item_details.current_item = item\n\t\t\t\t\tthis.item_details.name = item.name\n\t\t\t\t\tthis.item_details.doctype= item.doctype\n\n\t\t\t\t},\n\t\t\t\tform_updated: (item, field, value) => {\n\t\t\t\t\tthis.item_details.current_item = item\n\t\t\t\t\tconst item_row = frappe.model.get_doc(item.doctype, item.name);\n\t\t\t\t\tif(field === 'qty' && this.frm.doc.is_return && value >=0){\n\t\t\t\t\t\tfrappe.throw(\"Qty must be negative for return document\" )\n\t\t\t\t\t}\n\t\t\t\t\tif (item_row && item_row[field] != value) {\n\t\t\t\t\t\tconst args = {\n\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\titem: this.item_details.current_item\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn this.on_cart_update(args);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t},\n\t\t\t\tcart_item_clicked: (item) => {\n\n\t\t\t\t\tconst item_row = this.get_item_from_frm(item);\n\n\t\t\t\t\tif(selected_item && selected_item['name'] == item['name']){\n\t\t\t\t\t\tselected_item = null\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselected_item = item_row\n\t\t\t\t\t}\n\t\t\t\t\tthis.item_details.toggle_item_details_section(item_row);\n\t\t\t\t},\n\n\t\t\t\tnumpad_event: (value, action) => this.update_item_field(value, action),\n\n\t\t\t\tcheckout: () => this.save_and_checkout(),\n\n\t\t\t\tedit_cart: () => this.payment.edit_cart(),\n\t\t\t\tsave_draft_invoice: () => this.save_draft_invoice(),\n\t\t\t\ttoggle_recent_order: () => this.toggle_recent_order(),\n\t\t\t\tcustomer_details_updated: (details) => {\n\t\t\t\t\tthis.customer_details = details;\n\t\t\t\t\t// will add/remove LP payment method\n\t\t\t\t\tthis.payment.render_loyalty_points_payment_mode();\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tinit_item_details() {\n\t\tthis.item_details = new posnext.PointOfSale.ItemDetails({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tsettings: this.settings,\n\t\t\tevents: {\n\t\t\t\tget_frm: () => this.frm,\n\n\t\t\t\ttoggle_item_selector: (minimize) => {\n\t\t\t\t\tthis.item_selector.resize_selector(minimize);\n\t\t\t\t\tthis.cart.toggle_numpad(minimize);\n\t\t\t\t},\n\n\t\t\t\tform_updated: (item, field, value) => {\n\t\t\t\t\tconst item_row = frappe.model.get_doc(item.doctype, item.name);\n\t\t\t\t\tif(field === 'qty' && this.frm.doc.is_return && value >=0){\n\t\t\t\t\t\tfrappe.throw(\"Qty must be negative for return document\" )\n\t\t\t\t\t}\n\t\t\t\t\tif (item_row && item_row[field] != value) {\n\t\t\t\t\t\tconst args = {\n\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\titem: this.item_details.current_item\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn this.on_cart_update(args);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t},\n\n\t\t\t\thighlight_cart_item: (item) => {\n\t\t\t\t\tconst cart_item = this.cart.get_cart_item(item);\n\t\t\t\t\tthis.cart.toggle_item_highlight(cart_item);\n\t\t\t\t},\n\n\t\t\t\titem_field_focused: (fieldname) => {\n\t\t\t\t\tthis.cart.toggle_numpad_field_edit(fieldname);\n\t\t\t\t},\n\t\t\t\tset_value_in_current_cart_item: (selector, value) => {\n\t\t\t\t\tthis.cart.update_selector_value_in_cart_item(selector, value, this.item_details.current_item);\n\t\t\t\t},\n\t\t\t\tclone_new_batch_item_in_frm: (batch_serial_map, item) => {\n\t\t\t\t\t// called if serial nos are 'auto_selected' and if those serial nos belongs to multiple batches\n\t\t\t\t\t// for each unique batch new item row is added in the form & cart\n\t\t\t\t\tObject.keys(batch_serial_map).forEach(batch => {\n\t\t\t\t\t\tconst item_to_clone = this.frm.doc.items.find(i => i.name == item.name);\n\t\t\t\t\t\tconst new_row = this.frm.add_child(\"items\", { ...item_to_clone });\n\t\t\t\t\t\t// update new serialno and batch\n\t\t\t\t\t\tnew_row.batch_no = batch;\n\t\t\t\t\t\tnew_row.serial_no = batch_serial_map[batch].join(`\\n`);\n\t\t\t\t\t\tnew_row.qty = batch_serial_map[batch].length;\n\t\t\t\t\t\tthis.frm.doc.items.forEach(row => {\n\t\t\t\t\t\t\tif (item.item_code === row.item_code) {\n\t\t\t\t\t\t\t\tthis.update_cart_html(row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tremove_item_from_cart: () => this.remove_item_from_cart(),\n\t\t\t\tget_item_stock_map: () => this.item_stock_map,\n\t\t\t\tclose_item_details: () => {\n\t\t\t\t\tselected_item = null\n\t\t\t\t\tthis.item_details.toggle_item_details_section(null);\n\t\t\t\t\tthis.cart.prev_action = null;\n\t\t\t\t\tthis.cart.toggle_item_highlight();\n\t\t\t\t},\n\t\t\t\tget_available_stock: (item_code, warehouse) => this.get_available_stock(item_code, warehouse)\n\t\t\t}\n\t\t});\n\t\tif(selected_item){\n\t\t\tthis.item_details.toggle_item_details_section(selected_item);\n\t\t}\n\t}\n\n\tinit_payments() {\n\t\tthis.payment = new posnext.PointOfSale.Payment({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tsettings: this.settings,\n\t\t\tevents: {\n\t\t\t\tget_frm: () => this.frm || {},\n\n\t\t\t\tget_customer_details: () => this.customer_details || {},\n\n\t\t\t\ttoggle_other_sections: (show) => {\n\t\t\t\t\tif (show) {\n\t\t\t\t\t\tthis.item_details.$component.is(':visible') ? this.item_details.$component.css('display', 'none') : '';\n\t\t\t\t\t\tthis.item_selector.toggle_component(false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.item_selector.toggle_component(true);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tsubmit_invoice: () => {\n\t\t\t\t\tthis.frm.savesubmit()\n\t\t\t\t\t\t.then((r) => {\n\t\t\t\t\t\t\tthis.toggle_components(false);\n\t\t\t\t\t\t\tthis.order_summary.toggle_component(true);\n\t\t\t\t\t\t\tthis.order_summary.load_summary_of(this.frm.doc, true);\n\t\t\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\t\t\tindicator: 'green',\n\t\t\t\t\t\t\t\tmessage: __('POS invoice {0} created succesfully', [r.doc.name])\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tinit_recent_order_list() {\n\t\tthis.recent_order_list = new posnext.PointOfSale.PastOrderList({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tevents: {\n\t\t\t\topen_invoice_data: (name) => {\n\t\t\t\t\tfrappe.db.get_doc('Sales Invoice', name).then((doc) => {\n\t\t\t\t\t\tthis.order_summary.load_summary_of(doc);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\treset_summary: () => this.order_summary.toggle_summary_placeholder(true),\n\t\t\t\tprevious_screen: () => {\n\t\t\t\t\tthis.recent_order_list.toggle_component(false);\n\t\t\t\t\tthis.cart.load_invoice()\n\t\t\t\t\tthis.item_selector.toggle_component(true)\n\t\t\t\t\tthis.wrapper.find('.past-order-summary').css(\"display\",\"none\");\n\t\t\t\t},\n\n\t\t\t},\n\t\t\tsettings: this.settings,\n\t\t})\n\t}\n\n\tinit_order_summary() {\n\t\tthis.order_summary = new posnext.PointOfSale.PastOrderSummary({\n\t\t\twrapper: this.$components_wrapper,\n\t\t\tpos_profile: this.settings,\n\t\t\tevents: {\n\t\t\t\tget_frm: () => this.frm,\n\n\t\t\t\tprocess_return: (name) => {\n\t\t\t\t\tthis.recent_order_list.toggle_component(false);\n\t\t\t\t\tfrappe.db.get_doc('Sales Invoice', name).then((doc) => {\n\t\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t\t() => this.make_return_invoice(doc),\n\t\t\t\t\t\t\t() => this.cart.load_invoice(),\n\t\t\t\t\t\t\t() => this.item_selector.toggle_component(true)\n\t\t\t\t\t\t]);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tedit_order: (name) => {\n\t\t\t\t\tconsole.log(\"Edit Order...\")\n\t\t\t\t\tthis.recent_order_list.toggle_component(false);\n\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t() => this.frm.refresh(name),\n\t\t\t\t\t\t() => this.frm.call('reset_mode_of_payments'),\n\t\t\t\t\t\t() => this.cart.load_invoice(),\n\t\t\t\t\t\t() => this.item_selector.toggle_component(true)\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t\tdelete_order: (name) => {\n\t\t\t\t\tfrappe.model.delete_doc(this.frm.doc.doctype, name, () => {\n\t\t\t\t\t\tthis.recent_order_list.refresh_list();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tnew_order: () => {\n\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t() => frappe.dom.freeze(),\n\t\t\t\t\t\t() => this.make_new_invoice(),\n\t\t\t\t\t\t() => this.item_selector.toggle_component(true),\n\t\t\t\t\t\t() => frappe.dom.unfreeze(),\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\ttoggle_recent_order_list(show) {\n\t\tthis.toggle_components(!show);\n\t\tthis.recent_order_list.toggle_component(show);\n\t\tthis.order_summary.toggle_component(show);\n\t}\n\n\ttoggle_components(show) {\n\t\tthis.cart.toggle_component(show);\n\t\tthis.item_selector.toggle_component(show);\n\n\t\t// do not show item details or payment if recent order is toggled off\n\t\t!show ? (this.item_details.toggle_component(false) || this.payment.toggle_component(false)) : '';\n\t}\n\n\tmake_new_invoice(from_held=false) {\n\t\tif(from_held){\n\t\t\treturn frappe.run_serially([\n\t\t\t\t() => frappe.dom.freeze(),\n\t\t\t\t() => this.make_sales_invoice_frm(),\n\t\t\t\t() => this.set_pos_profile_data(),\n\t\t\t\t() => this.set_pos_profile_status(),\n\t\t\t\t() => this.cart.load_invoice(),\n\t\t\t\t() => frappe.dom.unfreeze(),\n\t\t\t\t() => this.toggle_recent_order(),\n\t\t\t]);\n\t\t} else {\n\t\t\treturn frappe.run_serially([\n\t\t\t\t() => frappe.dom.freeze(),\n\t\t\t\t() => this.make_sales_invoice_frm(),\n\t\t\t\t() => this.set_pos_profile_data(),\n\t\t\t\t() => this.set_pos_profile_status(),\n\t\t\t\t() => this.cart.load_invoice(),\n\t\t\t\t() => frappe.dom.unfreeze(),\n\t\t\t]);\n\t\t}\n\n\t}\n\n\tmake_sales_invoice_frm() {\n\t\tconst doctype = 'Sales Invoice';\n\t\treturn new Promise(resolve => {\n\t\t\tif (this.frm) {\n\t\t\t\tthis.frm = this.get_new_frm(this.frm);\n\t\t\t\tthis.frm.doc.items = [];\n\t\t\t\tthis.frm.doc.is_pos = 1\n\t\t\t\tthis.frm.doc.set_warehouse = this.settings.warehouse\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tfrappe.model.with_doctype(doctype, () => {\n\t\t\t\t\tthis.frm = this.get_new_frm();\n\t\t\t\t\tthis.frm.doc.items = [];\n\t\t\t\t\tthis.frm.doc.is_pos = 1\n\t\t\t\t\tthis.frm.doc.set_warehouse = this.settings.warehouse\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tget_new_frm(_frm) {\n\t\tconst doctype = 'Sales Invoice';\n\t\tconst page = $('
');\n\t\tconst frm = _frm || new frappe.ui.form.Form(doctype, page, false);\n\t\tconst name = frappe.model.make_new_doc_and_get_name(doctype, true);\n\t\tfrm.refresh(name);\n\n\t\treturn frm;\n\t}\n\n\tasync make_return_invoice(doc) {\n\t\tfrappe.dom.freeze();\n\t\tthis.frm = this.get_new_frm(this.frm);\n\t\tthis.frm.doc.items = [];\n\t\treturn frappe.call({\n\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.make_sales_return\",\n\t\t\targs: {\n\t\t\t\t'source_name': doc.name,\n\t\t\t\t'target_doc': this.frm.doc\n\t\t\t},\n\t\t\tcallback: (r) => {\n\t\t\t\t// console.log(r.message)\n\t\t\t\tfrappe.model.sync(r.message);\n\t\t\t\tfrappe.get_doc(r.message.doctype, r.message.name).__run_link_triggers = false;\n\t\t\t\tthis.set_pos_profile_data().then(() => {\n\t\t\t\t\tfrappe.dom.unfreeze();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tset_pos_profile_data() {\n\t\tif (this.company && !this.frm.doc.company) this.frm.doc.company = this.company;\n\t\tif ((this.pos_profile && !this.frm.doc.pos_profile) | (this.frm.doc.is_return && this.pos_profile != this.frm.doc.pos_profile)) {\n\t\t\tthis.frm.doc.pos_profile = this.pos_profile;\n\t\t}\n\n\t\tif (!this.frm.doc.company) return;\n\n\t\treturn this.frm.trigger(\"set_pos_data\");\n\t}\n\n\tset_pos_profile_status() {\n\t\tthis.page.set_indicator(this.pos_profile, \"blue\");\n\t}\n\n\tasync on_cart_update(args) {\n\t\t// frappe.dom.freeze();\n\t\tconsole.log(\"Updating Cart\")\n\t\tlet item_row = undefined;\n\t\ttry {\n\t\t\tlet { field, value, item } = args;\n\t\t\titem_row = this.get_item_from_frm(item);\n\t\t\tconst item_row_exists = !$.isEmptyObject(item_row);\n\t\n\t\t\tconst from_selector = field === 'qty' && value === \"+1\";\n\t\t\tif (from_selector)\n\t\t\t\tvalue = flt(item_row.stock_qty) + flt(value);\n\t\n\t\t\tif (item_row_exists) {\n\t\t\t\tif (field === 'qty')\n\t\t\t\t\tvalue = flt(value);\n\t\n\t\t\t\tif (['qty', 'conversion_factor'].includes(field) && value > 0 && !this.allow_negative_stock) {\n\t\t\t\t\tconst qty_needed = field === 'qty' ? value * item_row.conversion_factor : item_row.qty * value;\n\t\t\t\t\t// await this.check_stock_availability(item_row, qty_needed, this.frm.doc.set_warehouse);\n\t\t\t\t}\n\t\n\t\t\t\tif (this.is_current_item_being_edited(item_row) || from_selector) {\n\t\t\t\t\tawait frappe.model.set_value(item_row.doctype, item_row.name, field, value)\n\t\t\t\t\t// this.update_cart_html(item_row);\n\t\t\t\t}\n\t\n\t\t\t} else {\n\t\t\t\tif (!this.frm.doc.customer && !this.settings.custom_mobile_number_based_customer){\n\t\t\t\t\treturn this.raise_customer_selection_alert();\n\t\t\t\t}\n\t\t\t\tfrappe.flags.ignore_company_party_validation = true\n\t\t\t\tconst { item_code, batch_no, serial_no, rate, uom, valuation_rate, custom_item_uoms, custom_logical_rack } = item;\n\t\t\t\tif (!item_code)\n\t\t\t\t\treturn;\n\t\n\t\t\t\tif (this.settings.custom_product_bundle) {\n\t\t\t\t\tconst product_bundle = await this.get_product_bundle(item_code);\n\t\t\t\t\tif (product_bundle && Array.isArray(product_bundle.items)) {\n\t\t\t\t\t\tconst bundle_items = product_bundle.items.map(bundle_item => ({\n\t\t\t\t\t\t\titem_code: bundle_item.item_code,\n\t\t\t\t\t\t\tqty: bundle_item.qty * value,\n\t\t\t\t\t\t\trate: bundle_item.rate,\n\t\t\t\t\t\t\tuom: bundle_item.uom\n\t\t\t\t\t\t}));\n\t\n\t\t\t\t\t\tfor (const bundle_item of bundle_items) {\n\t\t\t\t\t\t\tconst bundle_item_row = this.frm.add_child('items', bundle_item);\n\t\t\t\t\t\t\tawait this.trigger_new_item_events(bundle_item_row);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tthis.update_cart_html();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\tconst new_item = { item_code, batch_no, rate, uom, [field]: value };\n\t\t\t\tif(value){\n\t\t\t\t\tnew_item['qty'] = value\n\t\t\t\t}\n\t\t\t\tif (serial_no) {\n\t\t\t\t\tawait this.check_serial_no_availablilty(item_code, this.frm.doc.set_warehouse, serial_no);\n\t\t\t\t\tnew_item['serial_no'] = serial_no;\n\t\t\t\t}\n\t\n\t\t\t\tif (field === 'serial_no')\n\t\t\t\t\tnew_item['qty'] = value.split(`\\n`).length || 0;\n\t\t\t\titem_row = this.frm.add_child('items', new_item);\n\t\n\t\t\t\tawait this.trigger_new_item_events(item_row);\n\t\t\t\titem_row['rate'] = rate\n\t\t\t\titem_row['valuation_rate'] = valuation_rate;\n\t\t\t\titem_row['custom_valuation_rate'] = valuation_rate;\n\t\t\t\titem_row['custom_item_uoms'] = custom_item_uoms;\n\t\t\t\titem_row['custom_logical_rack'] = custom_logical_rack;\n\t\t\t\t// this.update_cart_html(item_row);\n\t\t\t\tif (this.item_details.$component.is(':visible'))\n\t\t\t\t\tthis.edit_item_details_of(item_row);\n\t\n\t\t\t\tif (this.check_serial_batch_selection_needed(item_row) && !this.item_details.$component.is(':visible'))\n\t\t\t\t\tthis.edit_item_details_of(item_row);\n\t\t\t}\n\t\n\t\t} catch (error) {\n\t\t\tconsole.log(error);\n\t\t} finally {\n\t\t\t// frappe.dom.unfreeze();\n\t\n\t\t\tvar total_incoming_rate = 0\n\t\t\tthis.frm.doc.items.forEach(item => {\n\t\t\t\ttotal_incoming_rate += (parseFloat(item.valuation_rate) * item.qty)\n\t\t\t});\n\t\t\tthis.item_selector.update_total_incoming_rate(total_incoming_rate)\n\t\n\t\t\treturn item_row; // eslint-disable-line no-unsafe-finally\n\t\t}\n\t}\n\n\traise_customer_selection_alert() {\n\t\tfrappe.dom.unfreeze();\n\t\tfrappe.show_alert({\n\t\t\tmessage: __('You must select a customer before adding an item.'),\n\t\t\tindicator: 'orange'\n\t\t});\n\t\tfrappe.utils.play_sound(\"error\");\n\t}\n\tasync get_product_bundle(item_code) {\n\t\tconst response = await frappe.call({\n\t\t\tmethod: \"posnext.doc_events.item.get_product_bundle_with_items\",\n\t\t\targs: {\n\t\t\t\titem_code: item_code\n\t\t\t}\n\t\t\t});\n\t\treturn response.message;\n\t}\n\n\tget_item_from_frm({ name, item_code, batch_no, uom, rate }) {\n\t\tlet item_row = null;\n\t\n\t\tif (name) {\n\t\t\titem_row = this.frm.doc.items.find(i => i.name == name);\n\t\t} else {\n\t\t\t// if item is clicked twice from item selector\n\t\t\t// then \"item_code, batch_no, uom, rate\" will help in getting the exact item\n\t\t\t// to increase the qty by one\n\t\t\tfor (var i = 0; i < cur_frm.doc.items.length; i += 1) {\n\t\t\t\tconst has_batch_no = (batch_no !== 'null' && batch_no !== null);\n\t\t\t\tconst batch_no_check = this.settings.custom_allow_add_new_items_on_new_line\n\t\t\t\t\t? (has_batch_no && cur_frm.doc.items[i].batch_no === batch_no)\n\t\t\t\t\t: true;\n\t\n\t\t\t\tif (\n\t\t\t\t\tcur_frm.doc.items[i].item_code === item_code &&\n\t\t\t\t\tcur_frm.doc.items[i].uom === uom &&\n\t\t\t\t\tparseFloat(cur_frm.doc.items[i].rate) === parseFloat(rate) &&\n\t\t\t\t\tbatch_no_check\n\t\t\t\t) {\n\t\t\t\t\titem_row = cur_frm.doc.items[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconsole.log(item_row);\n\t\t}\n\t\treturn item_row || {};\n\t}\n\t\n\n\tedit_item_details_of(item_row) {\n\t\tthis.item_details.toggle_item_details_section(item_row);\n\t}\n\n\tis_current_item_being_edited(item_row) {\n\t\treturn item_row.name == this.item_details.current_item.name;\n\t}\n\n\tupdate_cart_html(item_row, remove_item) {\n\t\tthis.cart.update_item_html(item_row, remove_item);\n\n\t\tthis.cart.update_totals_section(this.frm);\n\n\t}\n\n\tcheck_serial_batch_selection_needed(item_row) {\n\t\t// right now item details is shown for every type of item.\n\t\t// if item details is not shown for every item then this fn will be needed\n\t\tconst serialized = item_row.has_serial_no;\n\t\tconst batched = item_row.has_batch_no;\n\t\tconst no_serial_selected = !item_row.serial_no;\n\t\tconst no_batch_selected = !item_row.batch_no;\n\n\t\tif ((serialized && no_serial_selected) || (batched && no_batch_selected) ||\n\t\t\t(serialized && batched && (no_batch_selected || no_serial_selected))) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tasync trigger_new_item_events(item_row) {\n\t\tawait this.frm.script_manager.trigger('item_code', item_row.doctype, item_row.name);\n\t\tawait this.frm.script_manager.trigger('qty', item_row.doctype, item_row.name);\n\t\tawait this.frm.script_manager.trigger('discount_percentage', item_row.doctype, item_row.name);\n\t}\n\n\tasync check_stock_availability(item_row, qty_needed, warehouse) {\n\t\tconst resp = (await this.get_available_stock(item_row.item_code, warehouse)).message;\n\t\tconst available_qty = resp[0];\n\t\tconst is_stock_item = resp[1];\n\n\t\tfrappe.dom.unfreeze();\n\t\tconst bold_uom = item_row.uom.bold();\n\t\tconst bold_item_code = item_row.item_code.bold();\n\t\tconst bold_warehouse = warehouse.bold();\n\t\tconst bold_available_qty = available_qty.toString().bold()\n\t\tif (!(available_qty > 0)) {\n\t\t\tif (is_stock_item) {\n\t\t\t\tfrappe.model.clear_doc(item_row.doctype, item_row.name);\n\t\t\t\tfrappe.throw({\n\t\t\t\t\ttitle: __(\"Not Available\"),\n\t\t\t\t\tmessage: __('Item Code: {0} is not available under warehouse {1}.', [bold_item_code, bold_warehouse])\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (is_stock_item && available_qty < qty_needed) {\n\t\t\tfrappe.throw({\n\t\t\t\tmessage: __('Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}.', [bold_item_code, bold_warehouse, bold_available_qty, bold_uom]),\n\t\t\t\tindicator: 'orange'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t}\n\t\tfrappe.dom.freeze();\n\t}\n\n\tasync check_serial_no_availablilty(item_code, warehouse, serial_no) {\n\t\tconst method = \"erpnext.stock.doctype.serial_no.serial_no.get_pos_reserved_serial_nos\";\n\t\tconst args = {filters: { item_code, warehouse }}\n\t\tconst res = await frappe.call({ method, args });\n\n\t\tif (res.message.includes(serial_no)) {\n\t\t\tfrappe.throw({\n\t\t\t\ttitle: __(\"Not Available\"),\n\t\t\t\tmessage: __('Serial No: {0} has already been transacted into another Sales Invoice.', [serial_no.bold()])\n\t\t\t});\n\t\t}\n\t}\n\n\tget_available_stock(item_code, warehouse) {\n\t\tconst me = this;\n\t\treturn frappe.call({\n\t\t\tmethod: \"erpnext.accounts.doctype.pos_invoice.pos_invoice.get_stock_availability\",\n\t\t\targs: {\n\t\t\t\t'item_code': item_code,\n\t\t\t\t'warehouse': warehouse,\n\t\t\t},\n\t\t\tcallback(res) {\n\t\t\t\tif (!me.item_stock_map[item_code])\n\t\t\t\t\tme.item_stock_map[item_code] = {};\n\t\t\t\tme.item_stock_map[item_code][warehouse] = res.message;\n\t\t\t}\n\t\t});\n\t}\n\n\tupdate_item_field(value, field_or_action) {\n\t\tif (field_or_action === 'checkout') {\n\t\t\tthis.item_details.toggle_item_details_section(null);\n\t\t} else if (field_or_action === 'remove') {\n\t\t\tthis.remove_item_from_cart();\n\t\t} else {\n\t\t\tconst field_control = this.item_details[`${field_or_action}_control`];\n\t\t\tif (!field_control) return;\n\t\t\tfield_control.set_focus();\n\t\t\tvalue != \"\" && field_control.set_value(value);\n\t\t}\n\t}\n\n\tremove_item_from_cart() {\n\t\tfrappe.dom.freeze();\n\t\tconst { doctype, name, current_item } = this.item_details;\n\t\treturn frappe.model.set_value(doctype, name, 'qty', 0)\n\t\t\t.then(() => {\n\t\t\t\tfrappe.model.clear_doc(doctype, name);\n\t\t\t\tthis.update_cart_html(current_item, true);\n\t\t\t\tthis.item_details.toggle_item_details_section(null);\n\t\t\t\tfrappe.dom.unfreeze();\n\n\t\t\t\tvar total_incoming_rate = 0\n\t\t\t\tthis.frm.doc.items.forEach(item => {\n\t\t\t\t\ttotal_incoming_rate += (parseFloat(item.valuation_rate) * item.qty)\n\t\t\t\t});\n\t\t\t\tthis.item_selector.update_total_incoming_rate(total_incoming_rate)\n\t\t\t})\n\t\t\t.catch(e => console.log(e));\n\t}\n\n\tasync save_and_checkout() {\n\t\tif (this.frm.is_dirty()) {\n\t\t\tconst div = document.getElementById(\"customer-cart-container2\");\n\t\t\tdiv.style.gridColumn = \"\";\n\t\t\tlet save_error = false;\n\t\t\tawait this.frm.save(null, null, null, () => save_error = true);\n\t\t\t// only move to payment section if save is successful\n\t\t\t!save_error && this.payment.checkout();\n\t\t\t// show checkout button on error\n\t\t\tsave_error && setTimeout(() => {\n\t\t\t\tthis.cart.toggle_checkout_btn(true);\n\t\t\t}, 300); // wait for save to finish\n\t\t} else {\n\t\t\tthis.payment.checkout();\n\t\t}\n\t}\n\tasync save_and_checkout() {\n\t\tif (!this.frm.doc.items || this.frm.doc.items.length === 0) {\n\t\t\tfrappe.show_alert({\n\t\t\t\tmessage: __('Please add items to cart before checkout.'),\n\t\t\t\tindicator: 'red'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (this.frm.is_dirty()) {\n\t\t\tif(this.settings.custom_add_reference_details){\n\t\t\tconst dialog = new frappe.ui.Dialog({\n\t\t\t\ttitle: __('Enter Reference Details'),\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\t\tlabel: __('Reference Number'),\n\t\t\t\t\t\tfieldname: 'reference_no',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\t\tlabel: __('Reference Name'),\n\t\t\t\t\t\tfieldname: 'reference_name',\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tprimary_action_label: __('Proceed to Payment'),\n\t\t\t\tprimary_action: async (values) => {\n\t\t\t\t\tthis.frm.doc.custom_reference_no = values.reference_no;\n\t\t\t\t\tthis.frm.doc.custom_reference_name = values.reference_name;\n\n\t\t\t\t\tconst div = document.getElementById(\"customer-cart-container2\");\n\t\t\t\t\tdiv.style.gridColumn = \"\";\n\t\t\t\t\t\n\t\t\t\t\tlet save_error = false;\n\t\t\t\t\tawait this.frm.save(null, null, null, () => save_error = true);\n\t\t\t\t\t\n\t\t\t\t\tdialog.hide();\n\t\t\t\t\t\n\t\t\t\t\tif (!save_error) {\n\t\t\t\t\t\tthis.payment.checkout();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.cart.toggle_checkout_btn(true);\n\t\t\t\t\t\t}, 300); // wait for save to finish\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t\n\t\t\tdialog.show();\n\t\t\t}else{\n\n\t\t\tconst div = document.getElementById(\"customer-cart-container2\");\n\t\t\tdiv.style.gridColumn = \"\";\n\t\t\tlet save_error = false;\n\t\t\tawait this.frm.save(null, null, null, () => save_error = true);\n\t\t\t// only move to payment section if save is successful\n\t\t\t!save_error && this.payment.checkout();\n\t\t\t// show checkout button on error\n\t\t\tsave_error && setTimeout(() => {\n\t\t\t\tthis.cart.toggle_checkout_btn(true);\n\t\t\t}, 300); // wait for save to finish\n\t\t\t}\n\n\n\n\t\t} else {\n\t\t\tthis.payment.checkout();\n\t\t}\n\t}\n};\n", "frappe.provide('posnext.PointOfSale');\nvar view = \"List\"\n\nposnext.PointOfSale.ItemSelector = class {\n\t// eslint-disable-next-line no-unused-vars\n\tconstructor({ frm, wrapper, events, pos_profile, settings,currency,init_item_cart,reload_status }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.currency = currency;\n\t\tthis.pos_profile = pos_profile;\n\t\tthis.hide_images = settings.hide_images;\n\t\tthis.reload_status = reload_status\n\t\tthis.auto_add_item = settings.auto_add_item_to_cart;\n\t\tif(settings.custom_default_view){\n\t\t\tview = settings.custom_default_view\n\t\t}\n\t\tif(settings.custom_show_only_list_view){\n\t\t\tview = \"List\"\n\t\t}\n\t\tif(settings.custom_show_only_card_view){\n\t\t\tview = \"Card\"\n\t\t}\n\t\tthis.custom_show_item_code = settings.custom_show_item_code\n\t\tthis.custom_show_last_incoming_rate = settings.custom_show_last_incoming_rate\n\t\tthis.custom_show_oem_part_number = settings.custom_show_oem_part_number\n\t\tthis.custom_show_posting_date = settings.custom_show_posting_date\n\t\tthis.custom_show_logical_rack = settings.custom_show_logical_rack\n\t\tthis.show_only_list_view = settings.custom_show_only_list_view\n\t\tthis.show_only_card_view = settings.custom_show_only_card_view\n\t\tthis.custom_edit_rate = settings.custom_edit_rate_and_uom\n\t\tthis.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom;\n\t\t// this.custom_edit_uom = settings.custom_edit_uom\n\t\tthis.inti_component();\n\t}\n\n\tinti_component() {\n\n\t\tthis.prepare_dom();\n\t\tthis.make_search_bar();\n\t\tthis.load_items_data();\n\t\tthis.bind_events();\n\t\tthis.attach_shortcuts();\n\t}\n\n\tprepare_dom() {\n\t\tvar cardlist = ``\n\t\tif(!this.show_only_list_view && !this.show_only_card_view){\n\t\t\tcardlist = `\n\t\t\t\n\t\t\t\n\t\t\t`\n\t\t}\n\n\t\tif(view === \"Card\" && !this.show_only_list_view){\n\t\t\tvar tir = ``\n\t\t\tif(this.custom_show_last_incoming_rate || this.custom_show_incoming_rate){\n\t\t\t\ttir = `
`\n\t\t\t}\n\t\t\tthis.wrapper.append(\n\t\t\t\t`
\n\t\t\t\t\t
` + cardlist + `
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
` + tir + `\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t`\n\t\t\t);\n\n\t\t\tthis.$component = this.wrapper.find('.items-selector');\n\t\t\tthis.$items_container = this.$component.find('.items-container');\n\t\t} else if(view === \"List\" && !this.show_only_card_view) {\n var section = `
`\n\t\t\tvar tir = ``\n\t\t\tif(this.custom_edit_rate){\n\t\t\t section = `
`\n\t\t\t}\n\t\t\tif(this.custom_show_last_incoming_rate || this.custom_show_incoming_rate){\n\t\t\t\ttir = `
`\n\t\t\t}\n\n\n\t\t\tthis.wrapper.append(\n\t\t\t\tsection + `
` + cardlist + `
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
` + tir + `\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
`\n\t\t\t);\n\n\t\t\tthis.$component = this.wrapper.find('.customer-cart-container');\n\t\t\tthis.$items_container = this.$component.find('.cart-container');\n\t\t}\n if(!this.show_only_list_view && !this.show_only_card_view) {\n this.$list_view = this.$component.find('.list-view');\n this.$card_view = this.$component.find('.card-view');\n if (view === \"List\" && !this.show_only_list_view) {\n this.$list_view.find('.list-span').css({\n \"display\": \"inline-block\",\n \"background-color\": \"#3498db\",\n \"color\": \"white\",\n \"padding\": \"3px 3px\",\n \"border-radius\": \"20px\",\n \"font-size\": \"12px\",\n \"font-weight\": \"bold\",\n \"text-transform\": \"uppercase\",\n \"letter-spacing\": \"1px\",\n \"cursor\": \"pointer\",\n \"transition\": \"background-color 0.3s ease\"\n });\n this.$card_view.find('.card-span').css({\n \"display\": \"\",\n \"background-color\": \"\",\n \"color\": \"\",\n \"padding\": \"3px 3px\",\n \"border-radius\": \"\",\n \"font-size\": \"\",\n \"font-weight\": \"\",\n \"text-transform\": \"\",\n \"letter-spacing\": \"\",\n \"cursor\": \"\",\n \"transition\": \"\"\n });\n } else if (view === \"Card\" && !this.show_only_card_view) {\n this.$card_view.find('.card-span').css({\n \"display\": \"inline-block\",\n \"background-color\": \"#3498db\",\n \"color\": \"white\",\n \"padding\": \"3px 3px\",\n \"border-radius\": \"20px\",\n \"font-size\": \"12px\",\n \"font-weight\": \"bold\",\n \"text-transform\": \"uppercase\",\n \"letter-spacing\": \"1px\",\n \"cursor\": \"pointer\",\n \"transition\": \"background-color 0.3s ease\"\n });\n this.$list_view.find('.list-span').css({\n \"display\": \"\",\n \"background-color\": \"\",\n \"color\": \"\",\n \"padding\": \"3px 3px\",\n \"border-radius\": \"\",\n \"font-size\": \"\",\n \"font-weight\": \"\",\n \"text-transform\": \"\",\n \"letter-spacing\": \"\",\n \"cursor\": \"\",\n \"transition\": \"\"\n });\n } else {\n this.$list_view.find('.list-span').css({\"display\": \"none\"});\n this.$card_view.find('.card-span').css({\"display\": \"none\"});\n\n }\n if (!this.show_only_card_view && !this.show_only_list_view) {\n this.click_functions()\n }\n }\n\t}\n\tclick_functions(){\n\t\tthis.$list_view.on('click', 'a', () => {\n\n\t\t\tthis.$list_view.find('.list-span').css({\"display\": \"inline-block\",\"background-color\": \"#3498db\",\"color\": \"white\",\"padding\": \"5px 10px\", \"border-radius\": \"20px\", \"font-size\": \"14px\",\"font-weight\": \"bold\", \"text-transform\": \"uppercase\",\"letter-spacing\": \"1px\",\"cursor\": \"pointer\", \"transition\": \"background-color 0.3s ease\"});\n\t\t\tthis.$card_view.find('.card-span').css({\"display\": \"\",\"background-color\": \"\",\"color\": \"\",\"padding\": \"\", \"border-radius\": \"\", \"font-size\": \"\",\"font-weight\": \"\", \"text-transform\": \"\",\"letter-spacing\": \"\",\"cursor\": \"\", \"transition\": \"\"});\n\t\t\tview = \"List\"\n\t\t\tif(document.getElementById(\"card-view-section\")) document.getElementById(\"card-view-section\").remove()\n\t\t\tif(document.getElementById(\"list-view-section\")) document.getElementById(\"list-view-section\").remove()\n\t\t\tif(document.getElementById(\"customer-cart-container2\")) document.getElementById(\"customer-cart-container2\").remove()\n\t\t\tif(document.getElementById(\"item-details-container\")) document.getElementById(\"item-details-container\").remove()\n\n\t\t\tthis.inti_component()\n\t\t\tthis.events.init_item_details()\n\t\t\tthis.events.init_item_cart()\n\t\t\tthis.events.change_items(this.events.get_frm())\n\n\n\t\t});\n\t\tthis.$card_view.on('click', 'a', () => {\n\t\t\tthis.$card_view.find('.card-span').css({\"display\": \"inline-block\",\"background-color\": \"#3498db\",\"color\": \"white\",\"padding\": \"5px 10px\", \"border-radius\": \"20px\", \"font-size\": \"14px\",\"font-weight\": \"bold\", \"text-transform\": \"uppercase\",\"letter-spacing\": \"1px\",\"cursor\": \"pointer\", \"transition\": \"background-color 0.3s ease\"});\n\t\t\tthis.$list_view.find('.list-span').css({\"display\": \"\",\"background-color\": \"\",\"color\": \"\",\"padding\": \"\", \"border-radius\": \"\", \"font-size\": \"\",\"font-weight\": \"\", \"text-transform\": \"\",\"letter-spacing\": \"\",\"cursor\": \"\", \"transition\": \"\"});\n\t\t\tview = \"Card\"\n\t\t\tif(document.getElementById(\"card-view-section\")) document.getElementById(\"card-view-section\").remove()\n\t\t\tif(document.getElementById(\"list-view-section\")) document.getElementById(\"list-view-section\").remove()\n\t\t\tif(document.getElementById(\"customer-cart-container2\")) document.getElementById(\"customer-cart-container2\").remove()\n\t\t\tif(document.getElementById(\"item-details-container\")) document.getElementById(\"item-details-container\").remove()\n\n\t\t\tthis.inti_component()\n\t\t\tthis.events.init_item_details()\n\t\t\tthis.events.init_item_cart()\n\t\t\tthis.events.change_items(this.events.get_frm())\n\n\t\t});\n\t}\n\tasync load_items_data() {\n\t\tif (!this.item_group) {\n\t\t\tconst res = await frappe.db.get_value(\"Item Group\", {lft: 1, is_group: 1}, \"name\");\n\t\t\tthis.parent_item_group = res.message.name;\n\t\t}\n\t\tif (!this.price_list) {\n\t\t\tconst res = await frappe.db.get_value(\"POS Profile\", this.pos_profile, \"selling_price_list\");\n\t\t\tthis.price_list = res.message.selling_price_list;\n\t\t}\n\n\t\tthis.get_items({}).then(({message}) => {\n\t\t\tthis.render_item_list(message.items);\n\t\t});\n\t}\n\n\tget_items({start = 0, page_length = 40, search_term=''}) {\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst price_list = (doc && doc.selling_price_list) || this.price_list;\n\t\tlet { item_group, pos_profile } = this;\n\n\t\t!item_group && (item_group = this.parent_item_group);\n\n\t\treturn frappe.call({\n\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.get_items\",\n\t\t\tfreeze: true,\n\t\t\targs: { start, page_length, price_list, item_group, search_term, pos_profile },\n\t\t});\n\t}\n\n\n\trender_item_list(items) {\n\t\tthis.$items_container.html('');\n\t\tvar me = this\n\t\tif(view === \"List\"){\n\t\t\tthis.$items_container.append(\n\t\t\t\t`
\n\t\t\t\t\t
\n\t\t\t\t\t${get_item_code_header()}\n\t\t\t\t\t\t
${__('Rate')}
\n\t\t\t\t\t\t
${__('Avail. Qty')}
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
`)\n\n\t\t\tfunction get_item_code_header() {\n\t\t\t\tvar flex_value = 3\n\t\t\t\t if(!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack){\n\t\t\t\t\tflex_value = 2\n\t\t\t\t}\n\t\t\t\tvar html_header = ``\n\t\t\t\tif(me.custom_show_item_code){\n\t\t\t\t\t// flex_value -= 1\n\t\t\t\t\thtml_header += `
${__('Item Code')}
`\n\t\t\t\t}\n\t\t\t\tif(me.custom_show_last_incoming_rate){\n\t\t\t\t\t// flex_value -= 1\n\t\t\t\t\thtml_header += `
${__('Inc.Rate')}
`\n\t\t\t\t}\n\t\t\t\tif(me.custom_show_oem_part_number){\n\t\t\t\t\t// flex_value -= 1\n\t\t\t\t\thtml_header += `
${__('OEM')}
${__('Part No.')}
`\n\t\t\t\t}\n\t\t\t\tif(me.custom_show_logical_rack){\n\t\t\t\t\t// flex_value -= 1\n\t\t\t\t\thtml_header += `
${__('Rack')}
`\n\t\t\t\t}\n\t\t\t\tif(flex_value > 0){\n\t\t\t\t\treturn `
${__('Item')}
` + html_header\n\t\t\t\t} else {\n\t\t\t\t\treturn `
${__('Item')}
` + html_header\n\t\t\t\t}\n\n\n }\n\t\t\tthis.make_cart_items_section();\n\n\t\t\titems.forEach(item => {\n\t\t\t\tthis.render_cart_item(item);\n\t\t\t});\n\t\t} else {\n\t\t\titems.forEach(item => {\n var item_html = this.get_item_html(item);\n this.$items_container.append(item_html);\n \t})\n\t\t}\n\n\t\t// this.$cart_container = this.$component.find('.cart-container');\n\n\n\t}\n\tmake_cart_items_section() {\n\t\tthis.$cart_header = this.$component.find('.cart-header');\n\t\tthis.$cart_items_wrapper = this.$component.find('.cart-items-section');\n\n\t}\n\tget_cart_item({ name }) {\n\t\tconst item_selector = `.cart-item-wrapper[data-row-name=\"${escape(name)}\"]`;\n\t\treturn this.$cart_items_wrapper.find(item_selector);\n\t}\n\tget_cart_item1({ item_code }) {\n\t\tconst item_selector = `.cart-item-wrapper[data-row-name=\"${escape(item_code)}\"]`;\n\t\treturn this.$cart_items_wrapper.find(item_selector);\n\t}\n\trender_cart_item(item_data) {\n\t\tconsole.log(\"Rener cart item\")\n\t\tconsole.log(item_data)\n\t\tconst me = this;\n\t\tconst currency = me.events.get_frm().currency || me.currency;\n\t\tthis.$cart_items_wrapper.append(\n\t\t\t`
\n\t\t\t
`\n\t\t)\n\t\tvar $item_to_update = this.get_cart_item1(item_data);\n\n\t\t$item_to_update.html(\n\t\t\t`${get_item_image_html()}\n\t\t\t${get_item_name()}\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t${item_data.item_name}\n\t\t\t\t
\n\t\t\t\t${get_description_html()}\n\t\t\t
\n\t\t\t${get_item_code()}\n\t\t\t${get_rate_discount_html()}`\n\t\t)\n\n\t\tfunction get_item_name() {\n\t\t\tvar flex_value = 4\n if(me.custom_show_item_code && me.custom_show_last_incoming_rate && me.custom_show_oem_part_number){\n\t\t\t\tflex_value = 3\n }\n // if(me.custom_show_item_code && me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number){\n\t\t\t\t// flex_value = 3\n // }\n if(!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack){\n\t\t\t\tflex_value = 2\n }\n // if(me.custom_show_last_incoming_rate && me.custom_show_item_code){\n\t\t\t\t// flex_value -= 1\n // }\n // if(me.custom_show_oem_part_number){\n\t\t\t\t// flex_value -= 1\n // }\n\t\t\treturn `
`\n }\n\t\tset_dynamic_rate_header_width();\n\n\t\tfunction set_dynamic_rate_header_width() {\n\t\t\tconst rate_cols = Array.from(me.$cart_items_wrapper.find(\".item-rate-amount\"));\n\t\t\tme.$cart_header.find(\".rate-amount-header\").css(\"width\", \"\");\n\t\t\tme.$cart_items_wrapper.find(\".item-rate-amount\").css(\"width\", \"\");\n\t\t\tvar max_width = rate_cols.reduce((max_width, elm) => {\n\t\t\t\tif ($(elm).width() > max_width)\n\t\t\t\t\tmax_width = $(elm).width();\n\t\t\t\treturn max_width;\n\t\t\t}, 0);\n\n\t\t\tmax_width += 1;\n\t\t\tif (max_width == 1) max_width = \"\";\n\n\t\t\tme.$cart_header.find(\".rate-amount-header\").css(\"width\", max_width);\n\t\t\tme.$cart_items_wrapper.find(\".item-rate-amount\").css(\"width\", max_width);\n\t\t}\n\t\tfunction get_item_code() {\n\t\t\tvar html_code = ``\n\t\t\tif(me.custom_show_item_code){\n\t\t\t\tvar item_code_flex_value = 1\n\t\t\t\thtml_code += `
\n\t\t\t\t\t
\n\t\t\t\t\t\t${item_data.item_code}
\n\t\t\t\t\t\t${item_data.uom}\n\t\t\t\t\t
\n\t\t\t\t
`\n\t\t\t}\n\t\t\tif(me.custom_show_last_incoming_rate){\n\t\t\t\thtml_code += `
\n\t\t\t\t\t
\n\t\t\t\t\t\t${parseFloat(item_data.valuation_rate).toFixed(2)}\n\t\t\t\t\t
\n\t\t\t\t
`\n }\n if(me.custom_show_oem_part_number){\n\t\t\t\thtml_code += `
\n\t\t\t\t\t
\n\t\t\t\t\t\t${item_data.custom_oem_part_number || \"\"}\n\t\t\t\t\t
\n\t\t\t\t
`\n }\n if(me.custom_show_logical_rack){\n\t\t\t\thtml_code += `
\n\t\t\t\t\t
\n\t\t\t\t\t\t${item_data.rack || \"\"}\n\t\t\t\t\t
\n\t\t\t\t
`\n }\n return html_code\n }\n\t\tfunction get_rate_discount_html() {\n\t\t\tif (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) {\n\t\t\t\treturn `\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
${format_currency(item_data.price_list_rate, currency)}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${item_data.actual_qty || 0}
\n\t\t\t\t\t\t
${item_data.batch_no || 0}
\n\t\t\t\t\t\t\n\t\t\t\t\t
`\n\t\t\t} else {\n\t\t\t\treturn `\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
${format_currency(item_data.price_list_rate, currency)}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${item_data.actual_qty || 0}
\n\t\t\t\t\t\t
${item_data.batch_no || 0}
\n\t\t\t\t\t\t\n\t\t\t\t\t
`\n\t\t\t}\n\t\t}\n\n\t\tfunction get_description_html() {\n\t\t\tif (item_data.description) {\n\t\t\t\tif (item_data.description.indexOf('
') != -1) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\titem_data.description = $(item_data.description).text();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\titem_data.description = item_data.description.replace(/
/g, ' ').replace(/<\\/div>/g, ' ').replace(/ +/g, ' ');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titem_data.description = frappe.ellipsis(item_data.description, 45);\n\t\t\t\treturn `
${item_data.description}
`;\n\t\t\t}\n\t\t\treturn ``;\n\t\t}\n\n\t\tfunction get_item_image_html() {\n\t\t\tconst { image, item_name } = item_data;\n\t\t\tif (!me.hide_images && image) {\n\t\t\t\treturn `\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
`;\n\t\t\t} else {\n\t\t\t\treturn `
${frappe.get_abbr(item_name)}
`;\n\t\t\t}\n\t\t}\n\t}\n\tget_item_html(item) {\n\t\tconst me = this;\n\t\titem.currency = item.currency || me.currency\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tconst { item_image, serial_no, batch_no, barcode, actual_qty, uom, price_list_rate } = item;\n\t\tconst precision = flt(price_list_rate, 2) % 1 != 0 ? 2 : 0;\n\t\tlet indicator_color;\n\t\tlet qty_to_display = actual_qty;\n\n\t\tif (item.is_stock_item) {\n\t\t\tindicator_color = (actual_qty > 10 ? \"green\" : actual_qty <= 0 ? \"red\" : \"orange\");\n\n\t\t\tif (Math.round(qty_to_display) > 999) {\n\t\t\t\tqty_to_display = Math.round(qty_to_display)/1000;\n\t\t\t\tqty_to_display = qty_to_display.toFixed(1) + 'K';\n\t\t\t}\n\t\t} else {\n\t\t\tindicator_color = '';\n\t\t\tqty_to_display = '';\n\t\t}\n\n\t\tfunction get_item_image_html() {\n\t\t\tif (!me.hide_images && item_image) {\n\t\t\t\treturn `
\n\t\t\t\t\t\t\t${qty_to_display}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
`;\n\t\t\t} else {\n\t\t\t\treturn `
\n\t\t\t\t\t\t\t${qty_to_display}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${frappe.get_abbr(item.item_name)}
`;\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t`
\n\n\t\t\t\t${get_item_image_html()}\n\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t${frappe.ellipsis(item.item_name, 18)}\n\t\t\t\t\t
\n\t\t\t\t\t
${format_currency(price_list_rate, item.currency, precision) || 0} / ${uom}
\n\t\t\t\t
\n\t\t\t
`\n\t\t);\n\t}\n\n\thandle_broken_image($img) {\n\t\tconst item_abbr = $($img).attr('alt');\n\t\t$($img).parent().replaceWith(`
${item_abbr}
`);\n\t}\n\tupdate_total_incoming_rate(total_rate){\n\t\tif(this.total_incoming_rate){\n\t\t\tthis.total_incoming_rate.set_value(total_rate)\n\t\t}\n\t}\n\tmake_search_bar() {\n\t\tconst me = this;\n\t\tconst doc = me.events.get_frm().doc;\n\t\tthis.$component.find('.search-field').html('');\n\t\t// this.$component.find('.item-code-search-field').html('');\n\t\tthis.$component.find('.pos-profile').html('');\n\t\tthis.$component.find('.total-incoming-rate').html('');\n\t\tthis.$component.find('.item-group-field').html('');\n\t\tthis.$component.find('.invoice-posting-date').html('');\n\t\tfrappe.db.get_single_value(\"POS Settings\",\"custom_profile_lock\").then(doc => {\n\t\t\tthis.pos_profile_field = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: __('POS Profile'),\n\t\t\t\t\tfieldtype: 'Link',\n\t\t\t\t\toptions: 'POS Profile',\n\t\t\t\t\tplaceholder: __('POS Profile'),\n\t\t\t\t\tread_only: doc,\n\t\t\t\t\tonchange: function () {\n\n\t\t\t\t\t\tif(me.reload_status && me.pos_profile !== this.value){\n\t\t\t\t\t\t\tfrappe.pages['posnext'].refresh(window.wrapper,window.onScan,this.value)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// console.log(\"ON ON CHANGE\")\n\t\t\t\t\t\t// console.log(this.pos_profile_field)\n\t\t\t\t\t\t// var value = this.pos_profile_field.get_value()\n\t\t\t\t\t\t// if(value !== me.pos_profile){\n\t\t\t\t\t\t// \tthis.events.check_opening_entry()\n\t\t\t\t\t\t// }\n\t\t\t\t\t\t// window.wrapper.please_refresh = true\n\t\t\t\t\t\t// frappe.pages['posnext'].refresh_data(window.wrapper)\n\t\t\t\t\t\t// console.log(\"HEEEERE\")\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tparent: this.$component.find('.pos-profile'),\n\t\t\t\trender_input: false,\n\t\t\t});\n\t\tthis.pos_profile_field.set_value(me.pos_profile)\n\t\tthis.pos_profile_field.refresh()\n\t\tthis.pos_profile_field.toggle_label(false);\n\n\t\t})\n\n\t\tthis.search_field = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Search'),\n\t\t\t\tfieldtype: 'Data',\n\t\t\t\tplaceholder: __('Search by serial number or barcode')\n\t\t\t},\n\t\t\tparent: this.$component.find('.search-field'),\n\t\t\trender_input: true,\n\t\t});\n\n\t\tthis.item_group_field = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Item Group'),\n\t\t\t\tfieldtype: 'Link',\n\t\t\t\toptions: 'Item Group',\n\t\t\t\tplaceholder: __('Select item group'),\n\t\t\t\tonchange: function() {\n\t\t\t\t\tme.item_group = this.value;\n\t\t\t\t\t!me.item_group && (me.item_group = me.parent_item_group);\n\t\t\t\t\tme.filter_items();\n\t\t\t\t},\n\t\t\t\tget_query: function () {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tquery: 'posnext.posnext.page.posnext.point_of_sale.item_group_query',\n\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\tpos_profile: doc ? doc.pos_profile : ''\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t\tparent: this.$component.find('.item-group-field'),\n\t\t\trender_input: true,\n\t\t});\n\t\tif(this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) {\n this.total_incoming_rate = frappe.ui.form.make_control({\n df: {\n label: __(''),\n fieldtype: 'Currency',\n read_only: 1,\n placeholder: __('Total Incoming Rate'),\n default: 0\n },\n parent: this.$component.find('.total-incoming-rate'),\n render_input: true,\n });\n }\n\t\tif(me.custom_show_posting_date){\n\t\t\tthis.invoice_posting_date = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: __('Posting Date'),\n\t\t\t\t\tfieldtype: 'Date',\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tme.events.get_frm().doc.posting_date= this.value;\n\t\t\t\t\t\tme.events.get_frm().doc.set_posting_time= 1;\n\t\t\t\t\t},\n\n\t\t\t\t},\n\t\t\t\tparent: this.$component.find('.invoice-posting-date'),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t}\n\n\n\t\tthis.search_field.toggle_label(false);\n\t\tthis.item_group_field.toggle_label(false);\n\t\tif(this.custom_show_last_incoming_rate) {\n this.total_incoming_rate.toggle_label(false);\n }\n\t\tif(me.custom_show_posting_date) {\n this.invoice_posting_date.toggle_label(false);\n this.invoice_posting_date.set_value(frappe.datetime.get_today())\n\n }\n\n\t\tthis.attach_clear_btn();\n\t}\n\n\tattach_clear_btn() {\n\t\tthis.search_field.$wrapper.find('.control-input').append(\n\t\t\t`\n\t\t\t\t\n\t\t\t\t\t${frappe.utils.icon('close', 'sm')}\n\t\t\t\t\n\t\t\t`\n\t\t);\n\n\t\tthis.$clear_search_btn = this.search_field.$wrapper.find('.link-btn');\n\n\t\tthis.$clear_search_btn.on('click', 'a', () => {\n\t\t\tthis.set_search_value('');\n\t\t\tthis.search_field.set_focus();\n\t\t});\n\t}\n\n\tset_search_value(value) {\n\t\t$(this.search_field.$input[0]).val(value).trigger(\"input\");\n\t}\n\n\tbind_events() {\n\t\tconst me = this;\n\t\tif(!window.onScan){\n\t\t\tfrappe.require(\"https://cdn.jsdelivr.net/npm/onscan.js/onscan.min.js\", function() {\n\t\t\twindow.onScan = onScan;\n\n\t\t\tonScan.decodeKeyEvent = function (oEvent) {\n\t\t\t\tvar iCode = this._getNormalizedKeyNum(oEvent);\n\t\t\t\tswitch (true) {\n\t\t\t\t\tcase iCode >= 48 && iCode <= 90: // numbers and letters\n\t\t\t\t\tcase iCode >= 106 && iCode <= 111: // operations on numeric keypad (+, -, etc.)\n\t\t\t\t\tcase (iCode >= 160 && iCode <= 164) || iCode == 170: // ^ ! # $ *\n\t\t\t\t\tcase iCode >= 186 && iCode <= 194: // (; = , - . / `)\n\t\t\t\t\tcase iCode >= 219 && iCode <= 222: // ([ \\ ] ')\n\t\t\t\t\tcase iCode == 32: // spacebar\n\t\t\t\t\t\tif (oEvent.key !== undefined && oEvent.key !== '') {\n\t\t\t\t\t\t\treturn oEvent.key;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar sDecoded = String.fromCharCode(iCode);\n\t\t\t\t\t\tswitch (oEvent.shiftKey) {\n\t\t\t\t\t\t\tcase false: sDecoded = sDecoded.toLowerCase(); break;\n\t\t\t\t\t\t\tcase true: sDecoded = sDecoded.toUpperCase(); break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn sDecoded;\n\t\t\t\t\tcase iCode >= 96 && iCode <= 105: // numbers on numeric keypad\n\t\t\t\t\t\treturn 0 + (iCode - 96);\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t};\n\n\t\t\tonScan.attachTo(document, {\n\t\t\t\tonScan: (sScancode) => {\n\t\t\t\t\tif (this.search_field && this.$component.is(':visible')) {\n\t\t\t\t\t\tthis.search_field.set_focus();\n\t\t\t\t\t\tthis.set_search_value(sScancode);\n\t\t\t\t\t\tthis.barcode_scanned = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t})\n\t\t}\n\n\n\n\t\tthis.$component.on('click', '.item-wrapper', function() {\n\t\t\tconsole.log(\"Item Selected\")\n\t\t\tconst $item = $(this);\n\t\t\tconst item_code = unescape($item.attr('data-item-code'));\n\t\t\tlet batch_no = unescape($item.attr('data-batch-no'));\n\t\t\tlet serial_no = unescape($item.attr('data-serial-no'));\n\t\t\tlet uom = unescape($item.attr('data-uom'));\n\t\t\tlet rate = unescape($item.attr('data-rate'));\n\t\t\tlet valuation_rate = unescape($item.attr('data-valuation-rate'));\n\t\t\tlet custom_item_uoms = $item.attr('data-item-uoms');\n\t\t\tlet custom_logical_rack = $item.attr('data-item-logical-rack')\n\t\t\t// escape(undefined) returns \"un\tdefined\" then unescape returns \"undefined\"\n\t\t\tbatch_no = batch_no === \"undefined\" ? undefined : batch_no;\n\t\t\tserial_no = serial_no === \"undefined\" ? undefined : serial_no;\n\t\t\tuom = uom === \"undefined\" ? undefined : uom;\n\t\t\trate = rate === \"undefined\" ? undefined : rate;\n\t\t\tme.events.item_selected({\n\t\t\t\tfield: 'qty',\n\t\t\t\tvalue: \"+1\",\n\t\t\t\titem: { item_code, batch_no, serial_no, uom, rate ,valuation_rate, custom_item_uoms, custom_logical_rack}\n\t\t\t});\n\t\t\t// me.search_field.set_focus();\n\t\t});\n\n\t\tthis.search_field.$input.on('input', (e) => {\n\t\t\tclearTimeout(this.last_search);\n\t\t\tthis.last_search = setTimeout(() => {\n\t\t\t\tconst search_term = e.target.value;\n\t\t\t\tthis.filter_items({ search_term });\n\t\t\t}, 300);\n\n\t\t\t// this.$clear_search_btn.toggle(\n\t\t\t// \tBoolean(this.search_field.$input.val())\n\t\t\t// );\n\t\t});\n\n\t\t// this.search_field.$input.on('focus', () => {\n\t\t// \tthis.$clear_search_btn.toggle(\n\t\t// \t\tBoolean(this.search_field.$input.val())\n\t\t// \t);\n\t\t// });\n\t}\n\n\tattach_shortcuts() {\n\t\tconst ctrl_label = frappe.utils.is_mac() ? '\u2318' : 'Ctrl';\n\t\tthis.search_field.parent.attr(\"title\", `${ctrl_label}+I`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+i\",\n\t\t\taction: () => this.search_field.set_focus(),\n\t\t\tcondition: () => this.$component.is(':visible'),\n\t\t\tdescription: __(\"Focus on search input\"),\n\t\t\tignore_inputs: true,\n\t\t\tpage: cur_page.page.page\n\t\t});\n\t\tthis.item_group_field.parent.attr(\"title\", `${ctrl_label}+G`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+g\",\n\t\t\taction: () => this.item_group_field.set_focus(),\n\t\t\tcondition: () => this.$component.is(':visible'),\n\t\t\tdescription: __(\"Focus on Item Group filter\"),\n\t\t\tignore_inputs: true,\n\t\t\tpage: cur_page.page.page\n\t\t});\n\n\t\t// for selecting the last filtered item on search\n\t\tfrappe.ui.keys.on(\"enter\", () => {\n\t\t\tconst selector_is_visible = this.$component.is(':visible');\n\t\t\tif (!selector_is_visible || this.search_field.get_value() === \"\") return;\n\n\t\t\tif (this.items.length == 1) {\n\t\t\t\tthis.$items_container.find(\".item-wrapper\").click();\n\t\t\t\tfrappe.utils.play_sound(\"submit\");\n\t\t\t\tthis.set_search_value('');\n\t\t\t} else if (this.items.length == 0 && this.barcode_scanned) {\n\t\t\t\t// only show alert of barcode is scanned and enter is pressed\n\t\t\t\tfrappe.show_alert({\n\t\t\t\t\tmessage: __(\"No items found. Scan barcode again.\"),\n\t\t\t\t\tindicator: 'orange'\n\t\t\t\t});\n\t\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\t\tthis.barcode_scanned = false;\n\t\t\t\tthis.set_search_value('');\n\t\t\t}\n\t\t});\n\t}\n\n\tfilter_items({ search_term='' }={}) {\n\t\tif (search_term) {\n\t\t\tsearch_term = search_term.toLowerCase();\n\n\t\t\t// memoize\n\t\t\tthis.search_index = this.search_index || {};\n\t\t\tif (this.search_index[search_term]) {\n\t\t\t\tconst items = this.search_index[search_term];\n\t\t\t\tthis.items = items;\n\t\t\t\tthis.render_item_list(items);\n\t\t\t\tthis.auto_add_item && this.items.length == 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.get_items({ search_term })\n\t\t\t.then(({ message }) => {\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tconst { items, serial_no, batch_no, barcode } = message;\n\t\t\t\tif (search_term && !barcode) {\n\t\t\t\t\tthis.search_index[search_term] = items;\n\t\t\t\t}\n\t\t\t\tthis.items = items;\n\t\t\t\tthis.render_item_list(items);\n\t\t\t\tthis.auto_add_item && this.items.length == 1;\n\t\t\t});\n\t}\n\n\tadd_filtered_item_to_cart() {\n\t\tthis.$items_container.find(\".item-wrapper\").click();\n\t\tthis.set_search_value('');\n\t}\n\n\tresize_selector(minimize) {\n\t\tminimize ?\n\t\t\tthis.$component.find('.filter-section').css('grid-template-columns', 'repeat(1, minmax(0, 1fr))') :\n\t\t\tthis.$component.find('.filter-section').css('grid-template-columns', 'repeat(12, minmax(0, 1fr))');\n\n\t\tminimize ?\n\t\t\tthis.$component.find('.search-field').css('margin', 'var(--margin-sm) 0px') :\n\t\t\tthis.$component.find('.search-field').css('margin', '0px var(--margin-sm)');\n\n\t\tminimize ?\n\t\t\tthis.$component.css('grid-column', 'span 2 / span 2') :\n\t\t\tthis.$component.css('grid-column', 'span 6 / span 6');\n\n\t\tminimize ?\n\t\t\tthis.$items_container.css('grid-template-columns', 'repeat(1, minmax(0, 1fr))') :\n\t\t\tthis.$items_container.css('grid-template-columns', 'repeat(4, minmax(0, 1fr))');\n\t}\n\n\ttoggle_component(show) {\n\t\tthis.set_search_value('');\n\t\tthis.$component.css('display', show ? 'flex': 'none');\n\t}\n};\n", "frappe.provide('posnext.PointOfSale');\nposnext.PointOfSale.ItemCart = class {\n\tconstructor({ wrapper, events, settings }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.customer_info = undefined;\n\t\tthis.hide_images = settings.hide_images;\n\t\tthis.allowed_customer_groups = settings.customer_groups;\n\t\tthis.allow_rate_change = settings.allow_rate_change;\n\t\tthis.allow_discount_change = settings.allow_discount_change;\n\t\tthis.show_held_button = settings.custom_show_held_button;\n\t\tthis.show_order_list_button = settings.custom_show_order_list_button;\n\t\tthis.mobile_number_based_customer = settings.custom_mobile_number_based_customer;\n\t\tthis.show_checkout_button = settings.custom_show_checkout_button;\n\t\tthis.custom_edit_rate = settings.custom_edit_rate_and_uom;\n\t\tthis.custom_use_discount_percentage = settings.custom_use_discount_percentage;\n\t\tthis.custom_use_discount_amount = settings.custom_use_discount_amount;\n\t\tthis.custom_use_additional_discount_amount = settings.custom_use_additional_discount_amount;\n\t\tthis.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom;\n\t\tthis.custom_show_last_customer_rate = settings.custom_show_last_customer_rate;\n\t\tthis.custom_show_logical_rack_in_cart = settings.custom_show_logical_rack_in_cart && settings.custom_edit_rate_and_uom;\n\t\tthis.custom_show_uom_in_cart = settings.custom_show_uom_in_cart && settings.custom_edit_rate_and_uom;\n\t\tthis.show_branch = settings.show_branch;\n\t\tthis.show_batch_in_cart = settings.show_batch_in_cart\n\t\t// this.custom_edit_uom = settings.custom_edit_uom;\n\t\tthis.settings = settings;\n\t\tthis.warehouse = settings.warehouse;\n\t\tthis.init_component();\n\t}\n\n\tinit_component() {\n\n\t\tthis.prepare_dom();\n\t\tthis.init_child_components();\n\t\tthis.bind_events();\n\t\tthis.attach_shortcuts();\n\t}\n\n\tprepare_dom() {\n\t\tif(this.custom_edit_rate){\n\t\t this.wrapper.append(\n\t\t\t `
`\n\t\t )\n\t\t} else {\n\t\t\tthis.wrapper.append(\n\t\t\t `
`\n\t\t )\n\t\t}\n\n\t\tthis.$component = this.wrapper.find('.customer-cart-container1');\n\t}\n\n\tinit_child_components() {\n\t\tthis.init_customer_selector();\n\t\tthis.init_cart_components();\n\t}\n\n\tinit_customer_selector() {\n\t\tthis.$component.append(\n\t\t\t`
`\n\t\t)\n\t\tthis.$customer_section = this.$component.find('.customer-section');\n\t\tthis.make_customer_selector();\n\t}\n\n\treset_customer_selector() {\n\t\tconst frm = this.events.get_frm();\n\t\tfrm.set_value('customer', '');\n\t\tthis.make_customer_selector();\n\t\tthis.customer_field.set_focus();\n\t}\n\n\tinit_cart_components() {\n\t\tvar html = `
\n\t\t\t\t
\n\t\t\t\t\t
${__('Item Cart')}
\n\t\t\t\t\t
\n\t\t\t\t\t\t
${__('Item')}
\n\t\t\t\t\t\t
${__('Qty')}
\n\t\t\t\t\t\t`\n\t\t\tif(this.custom_show_uom_in_cart){\n\t\t\t\thtml += `
${__('UOM')}
`\n\t\t\t}\n\t\t\tif(this.show_batch_in_cart){\n\t\t\t\thtml += `
${__('Batch')}
`\n\t\t\t}\n\t\t\tif(this.custom_edit_rate){\n\t\t\t\thtml += `
${__('Rate')}
`\n\t\t\t}\n\t\t\tif(this.custom_use_discount_percentage){\n\t\t\t\thtml += `
${__('Disc%')}
`\n\t\t\t}\n\t\t\tif(this.custom_use_discount_amount){\n\t\t\t\thtml += `
${__('Disc')}
`\n\t\t\t}\n\t\t\tif(this.custom_show_incoming_rate){\n\t\t\t\thtml += `
${__('Inc.Rate')}
`\n\t\t\t}\n\t\t\tif(this.custom_show_logical_rack_in_cart){\n\t\t\t\thtml += `
${__('Rack')}
`\n\t\t\t}\n\t\t\tif(this.custom_show_last_customer_rate){\n\t\t\t\thtml += `
${__('LC Rate')}
`\n\t\t\t}\n\t\t\t\n\n\t\thtml += `
${__('Amount')}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
`\n\t\tthis.$component.append(html);\n\t\tthis.$cart_container = this.$component.find('.cart-container');\n\t\tthis.make_branch_section();\n\t\tthis.make_cart_totals_section();\n\t\tthis.make_cart_items_section();\n\t\tthis.make_cart_numpad();\n\t}\n\n\tmake_cart_items_section() {\n\t\tthis.$cart_header = this.$component.find('.cart-header');\n\t\tthis.$cart_items_wrapper = this.$component.find('.cart-items-section');\n\n\t\tthis.make_no_items_placeholder();\n\t}\n\n\tmake_no_items_placeholder() {\n\t\tthis.$cart_header.css('display', 'none');\n\t\tthis.$cart_items_wrapper.html(\n\t\t\t`
${__('No items in cart')}
`\n\t\t);\n\t}\n\n\tget_discount_icon() {\n\t\treturn (\n\t\t\t`\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t`\n\t\t);\n\t}\n\n\tget_branch_icon() {\n\t\treturn `\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`;\n\t}\n\t\n\tmake_branch_section() {\n\t\tif (this.show_branch) {\n\t\t\tthis.$branch_section = this.$component.find('.cart-branch-section');\n\t\n\t\t\tif (this.$branch_section.length) {\n\t\t\t\tthis.$branch_section.append(`\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t${this.get_branch_icon()} ${__('Add Branch')}\n\t\t\t\t\t
\n\t\t\t\t`);\n\t\n\t\t\t\t// Apply styles\n\t\t\t\tthis.$branch_section.find('.add-branch-wrapper').css({\n\t\t\t\t\t\"display\": \"flex\",\n\t\t\t\t\t\"align-items\": \"center\",\n\t\t\t\t\t\"gap\": \"8px\",\n\t\t\t\t\t\"border\": \"2px dashed #ccc\",\n\t\t\t\t\t\"padding\": \"10px\",\n\t\t\t\t\t\"border-radius\": \"6px\",\n\t\t\t\t\t\"cursor\": \"pointer\",\n\t\t\t\t\t\"font-weight\": \"bold\"\n\t\t\t\t});\n\t\n\t\t\t\t// Change cursor on hover\n\t\t\t\tthis.$branch_section.find('.add-branch-wrapper').hover(\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\t$(this).css(\"background-color\", \"#f9f9f9\");\n\t\t\t\t\t},\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\t$(this).css(\"background-color\", \"transparent\");\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\tmake_cart_totals_section() {\n\t\tthis.$totals_section = this.$component.find('.cart-totals-section');\n\t\t\n\t\tthis.$totals_section.append(\n\t\t\t`
\n\t\t\t\t${this.get_discount_icon()} ${__('Add Discount')}\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${__('Total Items')}
\n\t\t\t\t
0.00
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${__(\"Net Total\")}
\n\t\t\t\t
0.00
\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${__('Grand Total')}
\n\t\t\t\t
0.00
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${__('Checkout')}
\n\t\t\t\t
${__('Held')}
\n\t\t\t\t
${__('Order List')}
\n\t\t\t
\t\n\t\t\t
${__('Edit Cart')}
`\n\t\t)\n\n\t\tthis.$add_discount_elem = this.$component.find(\".add-discount-wrapper\");\nthis.highlight_checkout_btn(true);\n\t}\n\n\tmake_cart_numpad() {\n\t\tthis.$numpad_section = this.$component.find('.numpad-section');\n\n\t\tthis.number_pad = new posnext.PointOfSale.NumberPad({\n\t\t\twrapper: this.$numpad_section,\n\t\t\tevents: {\n\t\t\t\tnumpad_event: this.on_numpad_event.bind(this)\n\t\t\t},\n\t\t\tcols: 5,\n\t\t\tkeys: [\n\t\t\t\t[ 1, 2, 3, 'Quantity' ],\n\t\t\t\t[ 4, 5, 6, 'Discount' ],\n\t\t\t\t[ 7, 8, 9, 'Rate' ],\n\t\t\t\t[ '.', 0, 'Delete', 'Remove' ]\n\t\t\t],\n\t\t\tcss_classes: [\n\t\t\t\t[ '', '', '', 'col-span-2' ],\n\t\t\t\t[ '', '', '', 'col-span-2' ],\n\t\t\t\t[ '', '', '', 'col-span-2' ],\n\t\t\t\t[ '', '', '', 'col-span-2 remove-btn' ]\n\t\t\t],\n\t\t\tfieldnames_map: { 'Quantity': 'qty', 'Discount': 'discount_percentage' }\n\t\t})\n\n\t\tthis.$numpad_section.prepend(\n\t\t\t`
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
`\n\t\t)\n\n\t\tthis.$numpad_section.append(\n\t\t\t`
${__('Checkout')}
`\n\t\t)\n\t}\n\n\tbind_events() {\n\t\tconst me = this;\n\t\tthis.$customer_section.on('click', '.reset-customer-btn', function () {\n\t\t\tme.reset_customer_selector();\n\t\t});\n\n\t\tthis.$customer_section.on('click', '.close-details-btn', function () {\n\t\t\tme.toggle_customer_info(false);\n\t\t});\n\n\t\tthis.$customer_section.on('click', '.customer-display', function(e) {\n\t\t\tif ($(e.target).closest('.reset-customer-btn').length) return;\n\n\t\t\tconst show = me.$cart_container.is(':visible');\n\t\t\tme.toggle_customer_info(show);\n\t\t});\n //\n\t\tif(!me.custom_edit_rate){\n\t\t\tthis.$cart_items_wrapper.on('click', '.cart-item-wrapper', function() {\n const $cart_item = $(this);\n\n me.toggle_item_highlight(this);\n\n const payment_section_hidden = !me.$totals_section.find('.edit-cart-btn').is(':visible');\n if (!payment_section_hidden) {\n // payment section is visible\n // edit cart first and then open item details section\n me.$totals_section.find(\".edit-cart-btn\").click();\n }\n\n const item_row_name = unescape($cart_item.attr('data-row-name'));\n me.events.cart_item_clicked({ name: item_row_name });\n this.numpad_value = '';\n });\n\t\t}\n\n\n\t\tthis.$component.on('click', '.checkout-btn', async function() {\n\t\t\tif ($(this).attr('style').indexOf('--blue-500') == -1) return;\n\t\t\tif ($(this).attr('class').indexOf('checkout-btn-held') !== -1) return;\n\t\t\tif ($(this).attr('class').indexOf('checkout-btn-order') !== -1) return;\n\t\t\tif(!cur_frm.doc.customer && me.mobile_number_based_customer){\n\t\t\t\tlet d = new frappe.ui.Dialog({\n\t\t\t\t\ttitle: 'Enter Mobile Number',\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Mobile Number',\n\t\t\t\t\t\t\tfieldname: 'mobile_number',\n\t\t\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\t\t\treqd: 1\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: '',\n\t\t\t\t\t\t\tfieldname: 'mobile_number_numpad',\n\t\t\t\t\t\t\tfieldtype: 'HTML',\n\t\t\t\t\t\t\toptions: '
'\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tprimary_action_label: 'Continue',\n\t\t\t\t\tprimary_action: function(values) {\n\t\t\t\t\t\tif(values['mobile_number'].length !== me.settings.custom_mobile_number_length){\n\t\t\t\t\t\t\tfrappe.throw(\"Mobile Number Length is \" + me.settings.custom_mobile_number_length.toString())\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfrappe.call({\n\t\t\t\t\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.create_customer\",\n\t\t\t\t\t\t\targs: {\n\t\t\t\t\t\t\t\tcustomer: values['mobile_number']\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfreeze: true,\n\t\t\t\t\t\t\tfreeze_message: \"Creating Customer....\",\n\t\t\t\t\t\t\tcallback: async function(){\n\t\t\t\t\t\t\t\tconst frm = me.events.get_frm();\n\t\t\t\t\t\t\t\tfrappe.dom.freeze();\n\t\t\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'customer', values['mobile_number']);\n\t\t\t\t\t\t\t\tfrm.script_manager.trigger('customer', frm.doc.doctype, frm.doc.name).then(() => {\n\t\t\t\t\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t\t\t\t\t() => me.fetch_customer_details(values['mobile_number']),\n\t\t\t\t\t\t\t\t\t\t() => me.events.customer_details_updated(me.customer_info),\n\t\t\t\t\t\t\t\t\t\t() => me.update_customer_section(),\n\t\t\t\t\t\t\t\t\t\t() => frappe.dom.unfreeze()\n\t\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t// me.fetch_customer_details(values['mobile_number'])\n\t\t\t\t\t\t\t\t// me.events.customer_details_updated(me.customer_info)\n\t\t\t\t\t\t\t\t// me.update_customer_section()\n\t\t\t\t\t\t\t\tawait me.events.checkout();\n\t\t\t\t\t\t\t\tme.toggle_checkout_btn(false);\n\t\t\t\t\t\t\t\tme.allow_discount_change && me.$add_discount_elem.removeClass(\"d-none\");\n\t\t\t\t\t\t\t\td.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tvar mobile_number_numpad_div = d.wrapper.find(\".mobile_number_numpad\")\n\t\t\t\tmobile_number_numpad_div.append(`\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t \n\t\t\t\t\t
`)\n\n\t\t\t\td.show();\n\t\t\t\tvar numpad_num = d.wrapper.find(\".custom-numpad\")\n\t\t\t\tvar numbers = [\"one\",'two','three','four','five','six','seven','eight','nine','zero',\"plus\"]\n\t\t\t\tfor(var xx=0;xx
'\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tprimary_action_label: 'Continue',\n\t\t\t\t\tprimary_action: function(values) {\n\t\t\t\t\t\tif(values['mobile_number'].length !== me.settings.custom_mobile_number_length){\n\t\t\t\t\t\t\tfrappe.throw(\"Mobile Number Length is \" + me.settings.custom_mobile_number_length.toString());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.settings.custom_add_reference_details) {\n\t\t\t\t\t\t\tme.show_reference_dialog(values['mobile_number']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.hold_invoice(values['mobile_number']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\td.hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\n\t\t\t\tme.setup_mobile_numpad(d);\n\t\t\t\td.show();\n\t\t\t} else {\n\t\t\t\tif (me.settings.custom_add_reference_details) {\n\t\t\t\t\tme.show_reference_dialog();\n\t\t\t\t} else {\n\t\t\t\t\tme.hold_invoice();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\n\t\tthis.$component.on('click', '.checkout-btn-order', () => {\n\t\t\tthis.events.toggle_recent_order();\n\t\t});\n\n\t\tthis.$totals_section.on('click', '.edit-cart-btn', () => {\n\t\t\tthis.events.edit_cart();\n\n\t\t\tthis.toggle_checkout_btn(true);\n\t\t});\n\n\t\tthis.$component.on('click', '.add-discount-wrapper', () => {\n\t\t\tconst can_edit_discount = this.$add_discount_elem.find('.edit-discount-btn').length;\n\n\t\t\tif(!this.discount_field || can_edit_discount) this.show_discount_control();\n\t\t});\n\n\t\tthis.$component.on('click', '.add-branch-wrapper', function () {\n\t\t\tconst $wrapper = $(this); // Store reference to the clicked element\n\t\t\n\t\t\t// Create a div container for the link field\n\t\t\tconst branchFieldWrapper = $('
');\n\t\t\n\t\t\t// Replace the wrapper with the new div\n\t\t\t$wrapper.replaceWith(branchFieldWrapper);\n\t\t\n\t\t\t// Create a Frappe Link Field dynamically\n\t\t\tlet branchField = new frappe.ui.form.ControlLink({\n\t\t\t\tdf: {\n\t\t\t\t\tfieldtype: 'Link',\n\t\t\t\t\toptions: 'Branch', // Link to Branch Doctype\n\t\t\t\t\tfieldname: 'branch',\n\t\t\t\t\tlabel: 'Branch',\n\t\t\t\t\tplaceholder: 'Select Branch',\n\t\t\t\t},\n\t\t\t\tparent: branchFieldWrapper, // Append inside the same container\n\t\t\t\tvalue: '',\n\t\t\t\tchange: function (value) {\n\t\t\t\t\tconsole.log('Selected Branch:', value);\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\t\t// Render the field\n\t\t\tbranchField.refresh();\n\t\t});\n\t\t\n\t\tfrappe.ui.form.on(\"Sales Invoice\", \"paid_amount\", frm => {\n\t\t\t// called when discount is applied\n\t\t\tthis.update_totals_section(frm);\n\t\t});\n\t}\n\n\tattach_shortcuts() {\n\t\tfor (let row of this.number_pad.keys) {\n\t\t\tfor (let btn of row) {\n\t\t\t\tif (typeof btn !== 'string') continue; // do not make shortcuts for numbers\n\n\t\t\t\tlet shortcut_key = `ctrl+${frappe.scrub(String(btn))[0]}`;\n\t\t\t\tif (btn === 'Delete') shortcut_key = 'ctrl+backspace';\n\t\t\t\tif (btn === 'Remove') shortcut_key = 'shift+ctrl+backspace'\n\t\t\t\tif (btn === '.') shortcut_key = 'ctrl+>';\n\n\t\t\t\t// to account for fieldname map\n\t\t\t\tconst fieldname = this.number_pad.fieldnames[btn] ? this.number_pad.fieldnames[btn] :\n\t\t\t\t\ttypeof btn === 'string' ? frappe.scrub(btn) : btn;\n\n\t\t\t\tlet shortcut_label = shortcut_key.split('+').map(frappe.utils.to_title_case).join('+');\n\t\t\t\tshortcut_label = frappe.utils.is_mac() ? shortcut_label.replace('Ctrl', '\u2318') : shortcut_label;\n\t\t\t\tthis.$numpad_section.find(`.numpad-btn[data-button-value=\"${fieldname}\"]`).attr(\"title\", shortcut_label);\n\n\t\t\t\tfrappe.ui.keys.on(`${shortcut_key}`, () => {\n\t\t\t\t\tconst cart_is_visible = this.$component.is(\":visible\");\n\t\t\t\t\tif (cart_is_visible && this.item_is_selected && this.$numpad_section.is(\":visible\")) {\n\t\t\t\t\t\tthis.$numpad_section.find(`.numpad-btn[data-button-value=\"${fieldname}\"]`).click();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst ctrl_label = frappe.utils.is_mac() ? '\u2318' : 'Ctrl';\n\t\tthis.$component.find(\".checkout-btn\").attr(\"title\", `${ctrl_label}+Enter`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+enter\",\n\t\t\taction: () => this.$component.find(\".checkout-btn\").click(),\n\t\t\tcondition: () => this.$component.is(\":visible\") && !this.$totals_section.find('.edit-cart-btn').is(':visible'),\n\t\t\tdescription: __(\"Checkout Order / Submit Order / New Order\"),\n\t\t\tignore_inputs: true,\n\t\t\tpage: cur_page.page.page\n\t\t});\n\t\tthis.$component.find(\".edit-cart-btn\").attr(\"title\", `${ctrl_label}+E`);\n\t\tfrappe.ui.keys.on(\"ctrl+e\", () => {\n\t\t\tconst item_cart_visible = this.$component.is(\":visible\");\n\t\t\tconst checkout_btn_invisible = !this.$totals_section.find('.checkout-btn').is('visible');\n\t\t\tif (item_cart_visible && checkout_btn_invisible) {\n\t\t\t\tthis.$component.find(\".edit-cart-btn\").click();\n\t\t\t}\n\t\t});\n\t\tthis.$component.find(\".add-discount-wrapper\").attr(\"title\", `${ctrl_label}+D`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+d\",\n\t\t\taction: () => this.$component.find(\".add-discount-wrapper\").click(),\n\t\t\tcondition: () => this.$add_discount_elem.is(\":visible\"),\n\t\t\tdescription: __(\"Add Order Discount\"),\n\t\t\tignore_inputs: true,\n\t\t\tpage: cur_page.page.page\n\t\t});\n\n\n\t\tfrappe.ui.keys.on(\"escape\", () => {\n\t\t\tconst item_cart_visible = this.$component.is(\":visible\");\n\t\t\tif (item_cart_visible && this.discount_field && this.discount_field.parent.is(\":visible\")) {\n\t\t\t\tthis.discount_field.set_value(0);\n\t\t\t}\n\t\t});\n\t}\n\n\ttoggle_item_highlight(item) {\n\t\tconst $cart_item = $(item);\n\t\tconst item_is_highlighted = $cart_item.attr(\"style\") == \"background-color:var(--gray-50);\";\n\n\t\tif (!item || item_is_highlighted) {\n\t\t\tthis.item_is_selected = false;\n\t\t\tthis.$cart_container.find('.cart-item-wrapper').css(\"background-color\", \"\");\n\t\t} else {\n\t\t\t$cart_item.css(\"background-color\", \"var(--control-bg)\");\n\t\t\tthis.item_is_selected = true;\n\t\t\tthis.$cart_container.find('.cart-item-wrapper').not(item).css(\"background-color\", \"\");\n\t\t}\n\t}\n\n\tmake_customer_selector() {\n\t\tthis.$customer_section.html(`\n\t\t\t
\n\t\t`);\n\t\tconst me = this;\n\t\tconst query = { query: 'posnext.controllers.queries.customer_query' };\n\t\tconst allowed_customer_group = this.allowed_customer_groups || [];\n\t\tif (allowed_customer_group.length) {\n\t\t\tquery.filters = {\n\t\t\t\tcustomer_group: ['in', allowed_customer_group]\n\t\t\t}\n\t\t}\n\t\tthis.customer_field = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Customer'),\n\t\t\t\tfieldtype: 'Link',\n\t\t\t\toptions: 'Customer',\n\t\t\t\tplaceholder: __('Search by customer name, phone, email.'),\n\t\t\t\tread_only: this.mobile_number_based_customer,\n\t\t\t\tget_query: () => query,\n\t\t\t\tonchange: function() {\n\t\t\t\t\tif (this.value) {\n\t\t\t\t\t\tconst frm = me.events.get_frm();\n\t\t\t\t\t\tfrappe.dom.freeze();\n\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'customer', this.value);\n\t\t\t\t\t\tfrm.script_manager.trigger('customer', frm.doc.doctype, frm.doc.name).then(() => {\n\t\t\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t\t\t() => me.fetch_customer_details(this.value),\n\t\t\t\t\t\t\t\t() => me.events.customer_details_updated(me.customer_info),\n\t\t\t\t\t\t\t\t() => me.update_customer_section(),\n\t\t\t\t\t\t\t\t() => me.update_totals_section(),\n\t\t\t\t\t\t\t\t() => frappe.dom.unfreeze()\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tparent: this.$customer_section.find('.customer-field'),\n\t\t\trender_input: true,\n\t\t});\n\t\tthis.customer_field.toggle_label(false);\n\t}\n\n\tfetch_customer_details(customer) {\n\t\tif (customer) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tfrappe.db.get_value('Customer', customer, [\"email_id\", \"mobile_no\", \"image\", \"loyalty_program\"]).then(({ message }) => {\n\t\t\t\t\tconst { loyalty_program } = message;\n\t\t\t\t\t// if loyalty program then fetch loyalty points too\n\t\t\t\t\tif (loyalty_program) {\n\t\t\t\t\t\tfrappe.call({\n\t\t\t\t\t\t\tmethod: \"erpnext.accounts.doctype.loyalty_program.loyalty_program.get_loyalty_program_details_with_points\",\n\t\t\t\t\t\t\targs: { customer, loyalty_program, \"silent\": true },\n\t\t\t\t\t\t\tcallback: (r) => {\n\t\t\t\t\t\t\t\tconst { loyalty_points, conversion_factor } = r.message;\n\t\t\t\t\t\t\t\tif (!r.exc) {\n\t\t\t\t\t\t\t\t\tthis.customer_info = { ...message, customer, loyalty_points, conversion_factor };\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.customer_info = { ...message, customer };\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.customer_info = {}\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\t}\n\n\tshow_discount_control() {\n\t\tthis.$add_discount_elem.css({ 'padding': '0px', 'border': 'none' });\n\t\tthis.$add_discount_elem.html(\n\t\t\t`
`\n\t\t);\n\t\tconst me = this;\n\t\tconst frm = me.events.get_frm();\n\t\tlet discount = frm.doc.additional_discount_percentage;\n\t\tthis.discount_field = null;\n\t\tif(me.custom_use_additional_discount_amount){\n\t\t\tthis.discount_field = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: __('Discount'),\n\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\tplaceholder: ( discount ? discount : __('Enter discount amount.') ),\n\t\t\t\t\tinput_class: 'input-xs',\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\t\t\tif (flt(this.value) != 0) {\n\t\t\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'discount_amount', flt(this.value));\n\t\t\t\t\t\t\t\tme.hide_discount_control(this.value);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'discount_amount', 0);\n\t\t\t\t\t\t\t\tme.$add_discount_elem.css({\n\t\t\t\t\t\t\t\t\t'border': '1px dashed var(--gray-500)',\n\t\t\t\t\t\t\t\t\t'padding': 'var(--padding-sm) var(--padding-md)'\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tme.$add_discount_elem.html(`${me.get_discount_icon()} ${__('Add Discount')}`);\n\t\t\t\t\t\t\t\tme.discount_field = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 3000);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tparent: this.$add_discount_elem.find('.add-discount-field'),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t}else{\n\t\t\tthis.discount_field = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: __('Discount'),\n\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\tplaceholder: ( discount ? discount + '%' : __('Enter discount percentage.') ),\n\t\t\t\t\tinput_class: 'input-xs',\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\t\t\tif (flt(this.value) != 0) {\n\t\t\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'additional_discount_percentage', flt(this.value));\n\t\t\t\t\t\t\t\tme.hide_discount_control(this.value);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfrappe.model.set_value(frm.doc.doctype, frm.doc.name, 'additional_discount_percentage', 0);\n\t\t\t\t\t\t\t\tme.$add_discount_elem.css({\n\t\t\t\t\t\t\t\t\t'border': '1px dashed var(--gray-500)',\n\t\t\t\t\t\t\t\t\t'padding': 'var(--padding-sm) var(--padding-md)'\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tme.$add_discount_elem.html(`${me.get_discount_icon()} ${__('Add Discount')}`);\n\t\t\t\t\t\t\t\tme.discount_field = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tparent: this.$add_discount_elem.find('.add-discount-field'),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t}\n\t\tthis.discount_field.toggle_label(false);\n\t\tthis.discount_field.set_focus();\n\t}\n\n\thide_discount_control(discount) {\n\t\tif (!discount) {\n\t\t\tthis.$add_discount_elem.css({ 'padding': '0px', 'border': 'none' });\n\t\t\tthis.$add_discount_elem.html(\n\t\t\t\t`
`\n\t\t\t);\n\t\t} else {\n\t\t\tthis.$add_discount_elem.css({\n\t\t\t\t'border': '1px dashed var(--dark-green-500)',\n\t\t\t\t'padding': 'var(--padding-sm) var(--padding-md)'\n\t\t\t});\n\t\t\tif(this.custom_use_additional_discount_amount){\n\t\t\t\tthis.$add_discount_elem.html(\n\t\t\t\t\t`
\n\t\t\t\t\t\t${this.get_discount_icon()} ${__(\"Additional\")} ${String(discount).bold()} ${this.events.get_frm().doc.currency} ${__(\"discount applied\")}\n\t\t\t\t\t
`\n\t\t\t\t);\n\t\t\t}else{\n\t\t\t\tthis.$add_discount_elem.html(\n\t\t\t\t\t`
\n\t\t\t\t\t\t${this.get_discount_icon()} ${__(\"Additional\")} ${String(discount).bold()}% ${__(\"discount applied\")}\n\t\t\t\t\t
`\n\t\t\t\t);\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\n\tupdate_customer_section() {\n\t\tconst me = this;\n\t\tconst { customer, email_id='', mobile_no='', image } = this.customer_info || {};\n\n\t\tif (customer) {\n\t\t\tthis.$customer_section.html(\n\t\t\t\t`
\n\t\t\t\t\t
\n\t\t\t\t\t\t${this.get_customer_image()}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
${customer}
\n\t\t\t\t\t\t\t${get_customer_description()}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
`\n\t\t\t);\n\t\t\tif(this.mobile_number_based_customer){\n\t\t\t\tthis.$customer_section.find('.reset-customer-btn').css('display', 'none');\n\t\t\t} else {\n\t\t\t\tthis.$customer_section.find('.reset-customer-btn').css('display', 'flex');\n\t\t\t}\n\t\t} else {\n\t\t\t// reset customer selector\n\t\t\tthis.reset_customer_selector();\n\t\t}\n\n\t\tfunction get_customer_description() {\n\t\t\tif (!email_id && !mobile_no) {\n\t\t\t\treturn `
${__('Click to add email / phone')}
`;\n\t\t\t} else if (email_id && !mobile_no) {\n\t\t\t\treturn `
${email_id}
`;\n\t\t\t} else if (mobile_no && !email_id) {\n\t\t\t\treturn `
${mobile_no}
`;\n\t\t\t} else {\n\t\t\t\treturn `
${email_id} - ${mobile_no}
`;\n\t\t\t}\n\t\t}\n\n\t}\n\n\tget_customer_image() {\n\t\tconst { customer, image } = this.customer_info || {};\n\t\tif (image) {\n\t\t\treturn `
\"${image}\"\"
`;\n\t\t} else {\n\t\t\treturn `
${frappe.get_abbr(customer)}
`;\n\t\t}\n\t}\n\n\tupdate_totals_section(frm) {\n\t\tif (!frm) frm = this.events.get_frm();\n\t\tthis.render_net_total(frm.doc.net_total);\n\t\tthis.render_total_item_qty(frm.doc.items);\n\t\tconst grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? frm.doc.grand_total : frm.doc.rounded_total;\n\t\tthis.render_grand_total(grand_total);\n\n\t\tthis.render_taxes(frm.doc.taxes);\n\t}\n\n\trender_net_total(value) {\n\t\tconst currency = this.events.get_frm().doc.currency;\n\t\tthis.$totals_section.find('.net-total-container').html(\n\t\t\t`
${__('Net Total')}
${format_currency(value, currency)}
`\n\t\t)\n\n\t\tthis.$numpad_section.find('.numpad-net-total').html(\n\t\t\t`
${__('Net Total')}: ${format_currency(value, currency)}
`\n\t\t);\n\t}\n\n\trender_total_item_qty(items) {\n\t\tvar total_item_qty = 0;\n\t\titems.map((item) => {\n\t\t\ttotal_item_qty = total_item_qty + item.qty;\n\t\t});\n\n\t\tthis.$totals_section.find('.item-qty-total-container').html(\n\t\t\t`
${__('Total Quantity')}
${total_item_qty}
`\n\t\t);\n\n\t\tthis.$numpad_section.find('.numpad-item-qty-total').html(\n\t\t\t`
${__('Total Quantity')}: ${total_item_qty}
`\n\t\t);\n\t}\n\n\trender_grand_total(value) {\n\t\tconst currency = this.events.get_frm().doc.currency;\n\t\tthis.$totals_section.find('.grand-total-container').html(\n\t\t\t`
${__('Grand Total')}
${format_currency(value, currency)}
`\n\t\t)\n\n\t\tthis.$numpad_section.find('.numpad-grand-total').html(\n\t\t\t`
${__('Grand Total')}: ${format_currency(value, currency)}
`\n\t\t);\n\t}\n\n\trender_taxes(taxes) {\n\t\tif (taxes && taxes.length) {\n\t\t\tconst currency = this.events.get_frm().doc.currency;\n\t\t\tconst taxes_html = taxes.map(t => {\n\t\t\t\tif (t.tax_amount_after_discount_amount == 0.0) return;\n\t\t\t\t// if tax rate is 0, don't print it.\n\t\t\t\tconst description = /[0-9]+/.test(t.description) ? t.description : ((t.rate != 0) ? `${t.description} @ ${t.rate}%`: t.description);\n\t\t\t\treturn `
\n\t\t\t\t\t
${description}
\n\t\t\t\t\t
${format_currency(t.tax_amount_after_discount_amount, currency)}
\n\t\t\t\t
`;\n\t\t\t}).join('');\n\t\t\tthis.$totals_section.find('.taxes-container').css('display', 'flex').html(taxes_html);\n\t\t} else {\n\t\t\tthis.$totals_section.find('.taxes-container').css('display', 'none').html('');\n\t\t}\n\t}\n\n\tget_cart_item({ name }) {\n\t\tconst item_selector = `.cart-item-wrapper[data-row-name=\"${escape(name)}\"]`;\n\t\treturn this.$cart_items_wrapper.find(item_selector);\n\t}\n\n\tget_item_from_frm(item) {\n\t\tconst doc = this.events.get_frm().doc;\n\t\treturn doc.items.find(i => i.name == item.name);\n\t}\n\n\tupdate_item_html(item, remove_item) {\n\t\tconst $item = this.get_cart_item(item);\n\n\t\tif (remove_item) {\n\t\t\t$item && $item.next().remove() && $item.remove();\n\t\t} else {\n\t\t\tconst item_row = this.get_item_from_frm(item);\n\t\t\tthis.render_cart_item(item_row, $item);\n\t\t}\n\n\t\tconst no_of_cart_items = this.$cart_items_wrapper.find('.cart-item-wrapper').length;\n\t\tthis.highlight_checkout_btn(true);\n\n\t\tthis.update_empty_cart_section(no_of_cart_items);\n\t}\n\n\trender_cart_item(item_data, $item_to_update) {\n\t\tconst currency = this.events.get_frm().doc.currency;\n\t\tconst me = this;\n\n\t\tif (!$item_to_update.length) {\n\t\t\tthis.$cart_items_wrapper.prepend(\n\t\t\t\t`
\n\t\t\t\t
`\n\t\t\t)\n\t\t\t$item_to_update = this.get_cart_item(item_data);\n\t\t}\n\t\tvar item_html = `${get_item_image_html()}`\n\n\t\tif(me.custom_use_discount_percentage && !me.custom_use_discount_amount){\n\t\t\titem_html += `
`\n\t\t}\n\t\tif(me.custom_use_discount_amount && !me.custom_use_discount_percentage){\n\t\t\titem_html += `
`\n\t\t}\n\t\tif(me.custom_use_discount_amount && me.custom_use_discount_percentage){\n\t\t\titem_html += `
`\n\t\t}\n\t\tif(!me.custom_use_discount_amount && !me.custom_use_discount_percentage){\n\t\t\titem_html += `
`\n\t\t}\n\n\t\titem_html += `
\n\t\t\t\t\t${item_data.item_name}\n\t\t\t\t
\n\t\t\t\t${get_description_html()}\n\t\t\t
\n\t\t\t${get_rate_discount_html()}`\n\n\t\t$item_to_update.html(item_html)\n\t\tif(me.custom_edit_rate){\n\t\t this[item_data.item_code + \"_qty\"] = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tfieldname: \"qty\",\n\t\t\t\t\tfieldtype: \"Float\",\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t// me.events.cart_item_clicked({ name: item_data.name });\n\t\t\t\t\t\tme.events.form_updated(item_data, \"qty\", this.value);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tparent: $item_to_update.find(`.item-qty`),\n\t\t\t\trender_input: true,\n\t\t\t});\n var uoms = [];\n\t\t\tif(item_data.custom_item_uoms){\n\t\t\t\tuoms = item_data.custom_item_uoms.split(\",\");\n\t\t\t}else if(item_data.uom){\n\t\t\t\tuoms = [item_data.uom];\n\t\t\t}\n\t\t\tif(me.custom_show_uom_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_uom\"] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldname: \"uom\",\n\t\t\t\t\t\tfieldtype: \"Select\",\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tme.events.form_updated(item_data, \"uom\", this.value);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tparent: $item_to_update.find(`.item-uom`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(me.show_batch_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_batch\"] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldname: \"batch\",\n\t\t\t\t\t\tfieldtype: \"Link\",\n\t\t\t\t\t\toptions: \"Batch\",\n\t\t\t\t\t\tget_query: function() {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\t\t\titem: item_data.item_code\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tme.events.form_updated(item_data, \"batch_no\", this.value);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tparent: $item_to_update.find(`.item-batch`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\t\t\t\t\n\t\t\t}\n this[item_data.item_code + \"_rate\"] = frappe.ui.form.make_control({\n df: {\n fieldname: \"rate\",\n fieldtype: \"Float\",\n\t\t\t\t\t\tread_only: !me.allow_rate_change,\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tme.events.form_updated(item_data, \"rate\", this.value);\n\t\t\t\t\t\t},\n },\n parent: $item_to_update.find(`.item-rate`),\n render_input: true,\n\n });\n if(me.custom_use_discount_percentage){\n \tthis[item_data.item_code + \"_discount\"] = frappe.ui.form.make_control({\n df: {\n fieldname: \"discount\",\n fieldtype: \"Float\",\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tme.events.form_updated(item_data, \"discount_percentage\", this.value);\n\t\t\t\t\t\t},\n\n },\n parent: $item_to_update.find(`.item-rate-discount`),\n render_input: true,\n });\n\t\t\t}\n\t\t\tif(me.custom_use_discount_amount){\n \tthis[item_data.item_code + \"_discount_amount\"] = frappe.ui.form.make_control({\n df: {\n fieldname: \"discount_amount\",\n fieldtype: \"Currency\",\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tme.events.form_updated(item_data, \"discount_amount\", this.value);\n\t\t\t\t\t\t},\n\n },\n parent: $item_to_update.find(`.item-rate-discount-amount`),\n render_input: true,\n });\n\t\t\t}\n\t\t\tif(this.custom_show_incoming_rate){\n\t\t\t\tthis[item_data.item_code + \"_incoming_rate\"] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldname: \"incoming_rate\",\n\t\t\t\t\t\tfieldtype: \"Float\",\n\t\t\t\t\t\tread_only: 1\n\t\t\t\t\t},\n\t\t\t\t\tparent: $item_to_update.find(`.item-incoming-rate`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(this.custom_show_logical_rack_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_logical_rack\"] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldname: \"logical_rack\",\n\t\t\t\t\t\tfieldtype: \"Data\",\n\t\t\t\t\t\tread_only: 1\n\t\t\t\t\t},\n\t\t\t\t\tparent: $item_to_update.find(`.item-logical-rack`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(this.custom_show_last_customer_rate){\n\t\t\t\tthis[item_data.item_code + \"_last_customer_rate\"] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldname: \"last_customer_rate\",\n\t\t\t\t\t\tfieldtype: \"Float\",\n\t\t\t\t\t\tread_only: 1\n\t\t\t\t\t},\n\t\t\t\t\tparent: $item_to_update.find(`.item-last-customer-rate`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis[item_data.item_code + \"_amount\"] = frappe.ui.form.make_control({\n df: {\n fieldname: \"amount\",\n fieldtype: \"Float\",\n\t\t\t\t\t\tread_only: 1\n\t\t\t\t\t},\n parent: $item_to_update.find(`.item-rate-amount`),\n render_input: true,\n });\n\n var delete_button = ` `\n var remove_button = frappe.ui.form.make_control({\n df: {\n fieldname: \"remove\",\n fieldtype: \"Button\",\n\t\t\t\t\t\tlabel: delete_button,\n\n },\n parent: $item_to_update.find(`.remove-button`),\n render_input: true,\n });\n remove_button.refresh(); // Make sure button is rendered\n $(remove_button.$input).on(\"click\", function() {\n\t\t\t\tme.events.remove_item_from_cart(item_data)\n\t\t\t\tme.prev_action = undefined;\n\t\t\t\tme.toggle_item_highlight();\n\t\t\t\tme.events.numpad_event(undefined, \"remove\");\n\n });\n this[item_data.item_code + \"_qty\"].set_value(item_data.qty)\n\t\t\tif(me.custom_show_uom_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_uom\"].df.options = uoms;\n\t\t\t\tthis[item_data.item_code + \"_uom\"].set_value(item_data.uom);\n\t\t\t\tthis[item_data.item_code + \"_uom\"].refresh();\n\t\t\t}\n\t\t\tif(me.show_batch_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_batch\"].set_value(item_data.batch_no);\n\t\t\t}\n // this[item_data.item_code + \"_amount\"].set_value(parseFloat(item_data.amount).toFixed(3));\n // this[item_data.item_code + \"_rate\"].set_value(parseFloat(item_data.rate).toFixed(3));\n\t\t\tthis[item_data.item_code + \"_amount\"].set_value(item_data.amount);\n\t\t\tthis[item_data.item_code + \"_rate\"].set_value(item_data.rate);\n\t\t\t\n\t\t\tif(me.custom_use_discount_percentage){\n\t\t\t\tthis[item_data.item_code + \"_discount\"].set_value(item_data.discount_percentage)\n\t\t\t}\n\t\t\tif(me.custom_use_discount_amount){\n\t\t\t\tthis[item_data.item_code + \"_discount_amount\"].set_value(item_data.discount_amount)\n\t\t\t}\n\t\t\tif(me.custom_show_incoming_rate){\n\t\t\t\tthis[item_data.item_code + \"_incoming_rate\"].set_value(item_data.custom_valuation_rate);\n\t\t\t}\n\t\t\tif(me.custom_show_logical_rack_in_cart){\n\t\t\t\tthis[item_data.item_code + \"_logical_rack\"].set_value(item_data.custom_logical_rack);\n\t\t\t}\n\t\t\tif(me.custom_show_last_customer_rate){\n\t\t\t\tif (me.customer_info.customer){\n\t\t\t\t\tfrappe.xcall(\"posnext.posnext.page.posnext.point_of_sale.get_lcr\", {\n\t\t\t\t\t\t\"customer\": me.customer_info.customer, \"item_code\": item_data.item_code\n\t\t\t\t\t}).then(d=>{\n\t\t\t\t\t\tthis[item_data.item_code + \"_last_customer_rate\"].set_value(d)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(me.custom_show_uom_in_cart){\n\t\t\t\tfrappe.xcall(\"posnext.posnext.page.posnext.point_of_sale.get_uoms\", {\n\t\t\t\t\t\"item_code\": item_data.item_code\n\t\t\t\t}).then(d=>{\n\t\t\t\t\tthis[item_data.item_code + \"_uom\"].df.options = d;\n\t\t\t\t\tthis[item_data.item_code + \"_uom\"].refresh();\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tset_dynamic_rate_header_width();\n\n\t\tfunction set_dynamic_rate_header_width() {\n\t\t\tconst rate_cols = Array.from(me.$cart_items_wrapper.find(\".item-rate-amount\"));\n\t\t\tme.$cart_header.find(\".rate-amount-header\").css(\"width\", \"\");\n\t\t\tme.$cart_items_wrapper.find(\".item-rate-amount\").css(\"width\", \"\");\n\t\t\tlet max_width = rate_cols.reduce((max_width, elm) => {\n\t\t\t\tif ($(elm).width() > max_width)\n\t\t\t\t\tmax_width = $(elm).width();\n\t\t\t\treturn max_width;\n\t\t\t}, 0);\n\n\t\t\tmax_width += 1;\n\t\t\tif (max_width == 1) max_width = \"\";\n\n\t\t\tme.$cart_header.find(\".rate-amount-header\").css(\"width\", max_width);\n\t\t\tme.$cart_items_wrapper.find(\".item-rate-amount\").css(\"width\", max_width);\n\t\t}\n\n\t\tfunction get_rate_discount_html() {\n\t\t\tif(me.custom_edit_rate){\n\t\t\t\tif (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) {\n\t\t\t\t\tvar html = `\n
\n
`;\n\n\t\t\t\t\tif(me.custom_show_uom_in_cart){\n\t\t\t\t\t\thtml += `
`;\n\t\t\t\t\t}\n\t\t\t\t\tif(me.show_batch_in_cart){\n\t\t\t\t\t\thtml += `
`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += `
`;\n\t\t\t\t\tif(me.custom_use_discount_percentage){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_use_discount_amount){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_incoming_rate){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_logical_rack_in_cart){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_last_customer_rate){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n html += `
\n\t\t\t\t\t\t\t
\n
`\n return html\n } else {\n\t\t\t\t\tvar html = `\n
\n
`;\n\t\t\t\t\tif(me.custom_show_uom_in_cart){\n\t\t\t\t\t\thtml += `
`;\n\t\t\t\t\t}\n\t\t\t\t\tif(me.show_batch_in_cart){\n\t\t\t\t\t\thtml += `
`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += `
`;\n\t\t\t\t\tif(me.custom_use_discount_percentage){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_use_discount_amount){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_incoming_rate){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_logical_rack_in_cart){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n\t\t\t\t\tif(me.custom_show_last_customer_rate){\n\t\t\t\t\t\thtml += `
`\n\t\t\t\t\t}\n html += `
\n
\n
`\n return html\n }\n\t\t\t} else {\n\t\t\t\tif (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) {\n return `\n
\n
${item_data.qty || 0}
\n
${item_data.uom}
\n\t\t\t\t\t\t\t
${item_data.batch}
\n
\n
${parseFloat(item_data.amount).toFixed(2)}
\n
${parseFloat(item_data.rate).toFixed(2)}
\n
\n
`\n } else {\n return `\n
\n
${item_data.qty || 0}
\n
${item_data.uom}
\n\t\t\t\t\t\t\t
${item_data.batch}
\n
\n
${parseFloat(item_data.rate).toFixed(2)}
\n
\n
`\n }\n\t\t\t}\n\n\t\t}\n\n\t\tfunction get_description_html() {\n\t\t\tif (item_data.description) {\n\t\t\t\tif (item_data.description.indexOf('
') != -1) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\titem_data.description = $(item_data.description).text();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\titem_data.description = item_data.description.replace(/
/g, ' ').replace(/<\\/div>/g, ' ').replace(/ +/g, ' ');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titem_data.description = frappe.ellipsis(item_data.description, 45);\n\t\t\t\treturn `
${item_data.description}
`;\n\t\t\t}\n\t\t\treturn ``;\n\t\t}\n\n\t\tfunction get_item_image_html() {\n\t\t\tconst { image, item_name } = item_data;\n\t\t\tif (!me.hide_images && image) {\n\t\t\t\treturn `\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
`;\n\t\t\t} else {\n\t\t\t\treturn `
${frappe.get_abbr(item_name)}
`;\n\t\t\t}\n\t\t}\n\t}\n\n\thandle_broken_image($img) {\n\t\tconst item_abbr = $($img).attr('alt');\n\t\t$($img).parent().replaceWith(`
${item_abbr}
`);\n\t}\n\n\tupdate_selector_value_in_cart_item(selector, value, item) {\n\t\tconst $item_to_update = this.get_cart_item(item);\n\t\t$item_to_update.attr(`data-${selector}`, escape(value));\n\t}\n\n\ttoggle_checkout_btn(show_checkout) {\n\t\tif (show_checkout) {\n\t\t\tif(this.show_checkout_button){\n\t\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'flex');\n\t\t\t} else {\n\t\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'none');\n\t\t\t}\n\n\t\t\tif(this.show_held_button){\n\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'flex');\n\t\t\t} else {\n\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'none');\n\t\t\t}\n\t\t\tif(this.show_order_list_button){\n\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'flex');\n\t\t\t} else {\n\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'none');\n\t\t\t}\n\t\t\tthis.$totals_section.find('.edit-cart-btn').css('display', 'none');\n\t\t} else {\n\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'none');\n\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'none');\n\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'none');\n\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'none');\n\t\t\tthis.$totals_section.find('.edit-cart-btn').css('display', 'flex');\n\t\t}\n\t}\n\n\thighlight_checkout_btn(toggle) {\n\t\tif (toggle) {\n\t\t\tthis.$add_discount_elem.css('display', 'flex');\n\t\t\tthis.$cart_container.find('.checkout-btn').css({\n\t\t\t\t'background-color': 'var(--blue-500)'\n\t\t\t});\n\t\t\tif(this.show_held_button){\n\t\t\t\tthis.$cart_container.find('.checkout-btn-held').css({\n\t\t\t\t\t'background-color': 'var(--blue-500)'\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$cart_container.find('.checkout-btn-held').css({\n\t\t\t\t\t'background-color': 'var(--blue-200)'\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(this.show_order_list_button){\n\t\t\t\tthis.$cart_container.find('.checkout-btn-order').css({\n\t\t\t\t\t'background-color': 'var(--blue-500)'\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$cart_container.find('.checkout-btn-order').css({\n\t\t\t\t\t'background-color': 'var(--blue-500)'\n\t\t\t\t});\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis.$add_discount_elem.css('display', 'none');\n\t\t\tthis.$cart_container.find('.checkout-btn').css({\n\t\t\t\t'background-color': 'var(--blue-200)'\n\t\t\t});\n\t\t\tthis.$cart_container.find('.checkout-btn-held').css({\n\t\t\t\t'background-color': 'var(--blue-200)'\n\t\t\t});\n\n\t\t\tthis.$cart_container.find('.checkout-btn-order').css({\n\t\t\t\t'background-color': 'var(--blue-500)'\n\t\t\t});\n\t\t}\n\t}\n\n\tupdate_empty_cart_section(no_of_cart_items) {\n\t\tconst $no_item_element = this.$cart_items_wrapper.find('.no-item-wrapper');\n\n\t\t// if cart has items and no item is present\n\t\tno_of_cart_items > 0 && $no_item_element && $no_item_element.remove() && this.$cart_header.css('display', 'flex');\n\n\t\tno_of_cart_items === 0 && !$no_item_element.length && this.make_no_items_placeholder();\n\t}\n\n\ton_numpad_event($btn) {\n\t\tconst current_action = $btn.attr('data-button-value');\n\t\tconst action_is_field_edit = ['qty', 'discount_percentage', 'rate'].includes(current_action);\n\t\tconst action_is_allowed = action_is_field_edit ? (\n\t\t\t(current_action == 'rate' && this.allow_rate_change) ||\n\t\t\t(current_action == 'discount_percentage' && this.allow_discount_change) ||\n\t\t\t(current_action == 'qty')) : true;\n\n\t\tconst action_is_pressed_twice = this.prev_action === current_action;\n\t\tconst first_click_event = !this.prev_action;\n\t\tconst field_to_edit_changed = this.prev_action && this.prev_action != current_action;\n\n\t\tif (action_is_field_edit) {\n\t\t\tif (!action_is_allowed) {\n\t\t\t\tconst label = current_action == 'rate' ? 'Rate'.bold() : 'Discount'.bold();\n\t\t\t\tconst message = __('Editing {0} is not allowed as per POS Profile settings', [label]);\n\t\t\t\tfrappe.show_alert({\n\t\t\t\t\tindicator: 'red',\n\t\t\t\t\tmessage: message\n\t\t\t\t});\n\t\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (first_click_event || field_to_edit_changed) {\n\t\t\t\tthis.prev_action = current_action;\n\t\t\t} else if (action_is_pressed_twice) {\n\t\t\t\tthis.prev_action = undefined;\n\t\t\t}\n\t\t\tthis.numpad_value = '';\n\n\t\t} else if (current_action === 'checkout') {\n\t\t\tthis.prev_action = undefined;\n\t\t\tthis.toggle_item_highlight();\n\t\t\tthis.events.numpad_event(undefined, current_action);\n\t\t\treturn;\n\t\t} else if (current_action === 'remove') {\n\t\t\tthis.prev_action = undefined;\n\t\t\tthis.toggle_item_highlight();\n\t\t\tthis.events.numpad_event(undefined, current_action);\n\t\t\treturn;\n\t\t} else {\n\t\t\tthis.numpad_value = current_action === 'delete' ? this.numpad_value.slice(0, -1) : this.numpad_value + current_action;\n\t\t\tthis.numpad_value = this.numpad_value || 0;\n\t\t}\n\n\t\tconst first_click_event_is_not_field_edit = !action_is_field_edit && first_click_event;\n\n\t\tif (first_click_event_is_not_field_edit) {\n\t\t\tfrappe.show_alert({\n\t\t\t\tindicator: 'red',\n\t\t\t\tmessage: __('Please select a field to edit from numpad')\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (flt(this.numpad_value) > 100 && this.prev_action === 'discount_percentage') {\n\t\t\tfrappe.show_alert({\n\t\t\t\tmessage: __('Discount cannot be greater than 100%'),\n\t\t\t\tindicator: 'orange'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\tthis.numpad_value = current_action;\n\t\t}\n\n\t\tthis.highlight_numpad_btn($btn, current_action);\n\t\tthis.events.numpad_event(this.numpad_value, this.prev_action);\n\t}\n\n\thighlight_numpad_btn($btn, curr_action) {\n\t\tconst curr_action_is_highlighted = $btn.hasClass('highlighted-numpad-btn');\n\t\tconst curr_action_is_action = ['qty', 'discount_percentage', 'rate', 'done'].includes(curr_action);\n\n\t\tif (!curr_action_is_highlighted) {\n\t\t\t$btn.addClass('highlighted-numpad-btn');\n\t\t}\n\t\tif (this.prev_action === curr_action && curr_action_is_highlighted) {\n\t\t\t// if Qty is pressed twice\n\t\t\t$btn.removeClass('highlighted-numpad-btn');\n\t\t}\n\t\tif (this.prev_action && this.prev_action !== curr_action && curr_action_is_action) {\n\t\t\t// Order: Qty -> Rate then remove Qty highlight\n\t\t\tconst prev_btn = $(`[data-button-value='${this.prev_action}']`);\n\t\t\tprev_btn.removeClass('highlighted-numpad-btn');\n\t\t}\n\t\tif (!curr_action_is_action || curr_action === 'done') {\n\t\t\t// if numbers are clicked\n\t\t\tsetTimeout(() => {\n\t\t\t\t$btn.removeClass('highlighted-numpad-btn');\n\t\t\t}, 200);\n\t\t}\n\t}\n\n\ttoggle_numpad(show) {\n\t\tif (show) {\n\t\t\tthis.$totals_section.css('display', 'none');\n\t\t\tthis.$numpad_section.css('display', 'flex');\n\t\t} else {\n\t\t\tthis.$totals_section.css('display', 'flex');\n\t\t\tthis.$numpad_section.css('display', 'none');\n\t\t}\n\t\tthis.reset_numpad();\n\t}\n\n\treset_numpad() {\n\t\tthis.numpad_value = '';\n\t\tthis.prev_action = undefined;\n\t\tthis.$numpad_section.find('.highlighted-numpad-btn').removeClass('highlighted-numpad-btn');\n\t}\n\n\ttoggle_numpad_field_edit(fieldname) {\n\t\tif (['qty', 'discount_percentage', 'rate'].includes(fieldname)) {\n\t\t\tthis.$numpad_section.find(`[data-button-value=\"${fieldname}\"]`).click();\n\t\t}\n\t}\n\n\ttoggle_customer_info(show) {\n\t\tif (show) {\n\t\t\tconst { customer } = this.customer_info || {};\n\n\t\t\tthis.$cart_container.css('display', 'none');\n\t\t\tthis.$customer_section.css({\n\t\t\t\t'height': '100%',\n\t\t\t\t'padding-top': '0px'\n\t\t\t});\n\t\t\tthis.$customer_section.find('.customer-details').html(\n\t\t\t\t`
\n\n\t\t\t\t\t
Contact Details
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t${this.get_customer_image()}\n\t\t\t\t\t
\n\t\t\t\t\t\t
${customer}
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
Recent Transactions
`\n\t\t\t);\n\t\t\t// transactions need to be in diff div from sticky elem for scrolling\n\t\t\tthis.$customer_section.append(`
`);\n\t\t\tif(this.mobile_number_based_customer){\n\t\t\t\tthis.$customer_section.find('.mobile_no-field').css('display', 'none');\n\t\t\t\tthis.$customer_section.find('.close-details-btn').css('display', 'none');\n\t\t\t} else {\n\t\t\t\tthis.$customer_section.find('.mobile_no-field').css('display', 'flex');\n\t\t\t\tthis.$customer_section.find('.close-details-btn').css('display', 'flex');\n\t\t\t}\n\t\t\tthis.render_customer_fields();\n\t\t\tthis.fetch_customer_transactions();\n\n\t\t} else {\n\t\t\tthis.$cart_container.css('display', 'flex');\n\t\t\tthis.$customer_section.css({\n\t\t\t\t'height': '',\n\t\t\t\t'padding-top': ''\n\t\t\t});\n\n\t\t\tthis.update_customer_section();\n\t\t}\n\t}\n\n\trender_customer_fields() {\n\t\tconst $customer_form = this.$customer_section.find('.customer-fields-container');\n\n\t\tconst dfs = [{\n\t\t\tfieldname: 'email_id',\n\t\t\tlabel: __('Email'),\n\t\t\tfieldtype: 'Data',\n\t\t\toptions: 'email',\n\t\t\tplaceholder: __(\"Enter customer's email\")\n\t\t},{\n\t\t\tfieldname: 'mobile_no',\n\t\t\tlabel: __('Phone Number'),\n\t\t\tfieldtype: 'Data',\n\t\t\tplaceholder: __(\"Enter customer's phone number\")\n\t\t},{\n\t\t\tfieldname: 'loyalty_program',\n\t\t\tlabel: __('Loyalty Program'),\n\t\t\tfieldtype: 'Link',\n\t\t\toptions: 'Loyalty Program',\n\t\t\tplaceholder: __(\"Select Loyalty Program\")\n\t\t},{\n\t\t\tfieldname: 'loyalty_points',\n\t\t\tlabel: __('Loyalty Points'),\n\t\t\tfieldtype: 'Data',\n\t\t\tread_only: 1\n\t\t}];\n\n\t\tconst me = this;\n\t\tdfs.forEach(df => {\n\t\t\tthis[`customer_${df.fieldname}_field`] = frappe.ui.form.make_control({\n\t\t\t\tdf: { ...df,\n\t\t\t\t\tonchange: handle_customer_field_change,\n\t\t\t\t},\n\t\t\t\tparent: $customer_form.find(`.${df.fieldname}-field`),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t\tthis[`customer_${df.fieldname}_field`].set_value(this.customer_info[df.fieldname]);\n\t\t})\n\n\t\tfunction handle_customer_field_change() {\n\t\t\tconst current_value = me.customer_info[this.df.fieldname];\n\t\t\tconst current_customer = me.customer_info.customer;\n\n\t\t\tif (this.value && current_value != this.value && this.df.fieldname != 'loyalty_points') {\n\t\t\t\tfrappe.call({\n\t\t\t\t\tmethod: 'posnext.posnext.page.posnext.point_of_sale.set_customer_info',\n\t\t\t\t\targs: {\n\t\t\t\t\t\tfieldname: this.df.fieldname,\n\t\t\t\t\t\tcustomer: current_customer,\n\t\t\t\t\t\tvalue: this.value\n\t\t\t\t\t},\n\t\t\t\t\tcallback: (r) => {\n\t\t\t\t\t\tif(!r.exc) {\n\t\t\t\t\t\t\tme.customer_info[this.df.fieldname] = this.value;\n\t\t\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\t\t\tmessage: __(\"Customer contact updated successfully.\"),\n\t\t\t\t\t\t\t\tindicator: 'green'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tfrappe.utils.play_sound(\"submit\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tfetch_customer_transactions() {\n\t\tfrappe.db.get_list('Sales Invoice', {\n\t\t\tfilters: { customer: this.customer_info.customer, docstatus: 1 },\n\t\t\tfields: ['name', 'grand_total', 'status', 'posting_date', 'posting_time', 'currency'],\n\t\t\tlimit: 20\n\t\t}).then((res) => {\n\t\t\tconst transaction_container = this.$customer_section.find('.customer-transactions');\n\n\t\t\tif (!res.length) {\n\t\t\t\ttransaction_container.html(\n\t\t\t\t\t`
No recent transactions found
`\n\t\t\t\t)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst elapsed_time = moment(res[0].posting_date+\" \"+res[0].posting_time).fromNow();\n\t\t\tthis.$customer_section.find('.customer-desc').html(`Last transacted ${elapsed_time}`);\n\n\t\t\tres.forEach(invoice => {\n\t\t\t\tconst posting_datetime = moment(invoice.posting_date+\" \"+invoice.posting_time).format(\"Do MMMM, h:mma\");\n\t\t\t\tlet indicator_color = {\n\t\t\t\t\t'Paid': 'green',\n\t\t\t\t\t'Draft': 'red',\n\t\t\t\t\t'Return': 'gray',\n\t\t\t\t\t'Consolidated': 'blue'\n\t\t\t\t};\n\n\t\t\t\ttransaction_container.append(\n\t\t\t\t\t`
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
${invoice.name}
\n\t\t\t\t\t\t\t
${posting_datetime}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t${format_currency(invoice.grand_total, invoice.currency, 0) || 0}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t${invoice.status}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
`\n\t\t\t\t)\n\t\t\t});\n\t\t});\n\t}\n\n\tattach_refresh_field_event(frm) {\n\t\t$(frm.wrapper).off('refresh-fields');\n\t\t$(frm.wrapper).on('refresh-fields', () => {\n\t\t\tif (frm.doc.items.length) {\n\t\t\t\tthis.$cart_items_wrapper.html('');\n\t\t\t\tfrm.doc.items.forEach(item => {\n\t\t\t\t\tthis.update_item_html(item);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.update_totals_section(frm);\n\t\t});\n\t}\n\n\tload_invoice() {\n\t\tconsole.log(\"Load invoice\")\n\t\tconst frm = this.events.get_frm();\n\n\t\tthis.attach_refresh_field_event(frm);\n\n\t\tthis.fetch_customer_details(frm.doc.customer).then(() => {\n\t\t\tthis.events.customer_details_updated(this.customer_info);\n\t\t\tthis.update_customer_section();\n\t\t\n\t\t\tthis.$cart_items_wrapper.html('');\n\t\t\tif (frm.doc.items.length) {\n\t\t\t\tfrm.doc.items.forEach(item => {\n\t\t\t\t\tthis.update_item_html(item);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.make_no_items_placeholder();\n\t\t\t\tthis.highlight_checkout_btn(true);\n\t\t\t}\n\n\t\t\tthis.update_totals_section(frm);\n\n\t\t\tif(frm.doc.docstatus === 1) {\n\t\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'none');\n\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'none');\n\t\t\t\tif(this.show_order_list_button){\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'flex');\n\t\t\t\t} else {\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'none');\n\t\t\t\t}\n\t\t\t\tthis.$totals_section.find('.edit-cart-btn').css('display', 'none');\n\t\t\t} else {\n\t\t\t\tif(this.show_checkout_button) {\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'flex');\n\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.$totals_section.find('.checkout-btn').css('display', 'none');\n\n\t\t\t\t}\n\t\t\t\tif(this.show_held_button){\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'flex');\n\t\t\t\t} else {\n\t\t\t\tthis.$totals_section.find('.checkout-btn-held').css('display', 'none');\n\t\t\t\t}\n\t\t\t\tif(this.show_order_list_button){\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'flex');\n\t\t\t\t} else {\n\t\t\t\t\tthis.$totals_section.find('.checkout-btn-order').css('display', 'none');\n\t\t\t\t}\n\t\t\t\tthis.$totals_section.find('.edit-cart-btn').css('display', 'none');\n\t\t\t}\n\n\t\t\tthis.toggle_component(true);\n\t\t});\n\t}\n\n\ttoggle_component(show) {\n\t\tshow ? this.$component.css('display', 'flex') : this.$component.css('display', 'none');\n\t}\n\n\tshow_reference_dialog(mobile_number = null) {\n\t\tconst me = this;\n\t\tconst dialog = new frappe.ui.Dialog({\n\t\t\ttitle: __('Enter Reference Details'),\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\tlabel: __('Reference Number'),\n\t\t\t\t\tfieldname: 'reference_no',\n\t\t\t\t\treqd: 1\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\tlabel: __('Reference Name'),\n\t\t\t\t\tfieldname: 'reference_name',\n\t\t\t\t\treqd: 1\n\t\t\t\t}\n\t\t\t],\n\t\t\tprimary_action_label: __('Hold Invoice'),\n\t\t\tprimary_action: async (values) => {\n\t\t\t\tif (mobile_number) {\n\t\t\t\t\t// Create customer if mobile number provided\n\t\t\t\t\tawait frappe.call({\n\t\t\t\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.create_customer\",\n\t\t\t\t\t\targs: { customer: mobile_number },\n\t\t\t\t\t\tfreeze: true,\n\t\t\t\t\t\tfreeze_message: \"Creating Customer....\"\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tconst frm = me.events.get_frm();\n\t\t\t\t\tawait frappe.model.set_value(frm.doc.doctype, frm.doc.name, 'customer', mobile_number);\n\t\t\t\t\tawait frm.script_manager.trigger('customer', frm.doc.doctype, frm.doc.name);\n\t\t\t\t}\n\n\t\t\t\t// Update reference details\n\t\t\t\tconst frm = me.events.get_frm();\n\t\t\t\tfrm.doc.custom_reference_no = values.reference_no;\n\t\t\t\tfrm.doc.custom_reference_name = values.reference_name;\n\t\t\t\t\n\t\t\t\tdialog.hide();\n\t\t\t\tawait me.events.save_draft_invoice();\n\t\t\t}\n\t\t});\n\t\tdialog.show();\n\t}\n\n\tasync hold_invoice(mobile_number = null) {\n\t\tif (mobile_number) {\n\t\t\tawait frappe.call({\n\t\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.create_customer\",\n\t\t\t\targs: { customer: mobile_number },\n\t\t\t\tfreeze: true,\n\t\t\t\tfreeze_message: \"Creating Customer....\"\n\t\t\t});\n\t\t\t\n\t\t\tconst frm = this.events.get_frm();\n\t\t\tawait frappe.model.set_value(frm.doc.doctype, frm.doc.name, 'customer', mobile_number);\n\t\t\tawait frm.script_manager.trigger('customer', frm.doc.doctype, frm.doc.name);\n\t\t}\n\t\t\n\t\tawait this.events.save_draft_invoice();\n\t}\n}\n", "frappe.provide('posnext.PointOfSale');\nposnext.PointOfSale.ItemDetails = class {\n\tconstructor({ wrapper, events, settings }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.hide_images = settings.hide_images;\n\t\tthis.allow_rate_change = settings.allow_rate_change;\n\t\tthis.allow_discount_change = settings.allow_discount_change;\n\t\tthis.custom_edit_rate_and_uom = settings.custom_edit_rate_and_uom;\n\t\tthis.current_item = {};\n\n\t\tthis.init_component();\n\t}\n\n\tinit_component() {\n\t\tthis.prepare_dom();\n\t\tthis.init_child_components();\n\t\tthis.bind_events();\n\t\tthis.attach_shortcuts();\n\t}\n\n\tprepare_dom() {\n\t\tthis.wrapper.append(\n\t\t\t`
`\n\t\t)\n\n\t\tthis.$component = this.wrapper.find('.item-details-container');\n\t}\n\n\tinit_child_components() {\n\t\tthis.$component.html(\n\t\t\t`
\n\t\t\t\t
${__('Item Detailss')}
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t
`\n\t\t)\n\n\t\tthis.$item_name = this.$component.find('.item-name');\n\t\tthis.$item_description = this.$component.find('.item-desc');\n\t\tthis.$item_price = this.$component.find('.item-price');\n\t\tthis.$item_image = this.$component.find('.item-image');\n\t\tthis.$form_container = this.$component.find('.form-container');\n\t\tthis.$dicount_section = this.$component.find('.discount-section');\n\t\tthis.$serial_batch_container = this.$component.find('.serial-batch-container');\n\t}\n\n\tcompare_with_current_item(item) {\n\t\t// returns true if `item` is currently being edited\n\t\treturn item && item.name == this.current_item.name;\n\t}\n\n\tasync toggle_item_details_section(item) {\n\t\tconst current_item_changed = !this.compare_with_current_item(item);\n\n\t\t// if item is null or highlighted cart item is clicked twice\n\t\tconst hide_item_details = !Boolean(item) || !current_item_changed;\n\n\t\tif ((!hide_item_details && current_item_changed) || hide_item_details) {\n\t\t\t// if item details is being closed OR if item details is opened but item is changed\n\t\t\t// in both cases, if the current item is a serialized item, then validate and remove the item\n\t\t\tawait this.validate_serial_batch_item();\n\t\t}\n\t\tif(!this.custom_edit_rate_and_uom){\n\t\t\tthis.events.toggle_item_selector(!hide_item_details);\n\t\t\tthis.toggle_component(!hide_item_details);\n\t\t}\n\n\n\t\tif (item && current_item_changed) {\n\t\t\tthis.doctype = item.doctype;\n\t\t\tthis.item_meta = frappe.get_meta(this.doctype);\n\t\t\tthis.name = item.name;\n\t\t\tthis.item_row = item;\n\t\t\tthis.currency = this.events.get_frm().doc.currency;\n\n\t\t\tthis.current_item = item;\n\n\t\t\tthis.render_dom(item);\n\t\t\tthis.render_discount_dom(item);\n\t\t\tthis.render_form(item);\n\t\t\tthis.events.highlight_cart_item(item);\n\t\t} else {\n\t\t\tthis.current_item = {};\n\t\t}\n\t}\n\n\tvalidate_serial_batch_item() {\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst item_row = doc.items.find(item => item.name === this.name);\n\n\t\tif (!item_row) return;\n\n\t\tconst serialized = item_row.has_serial_no;\n\t\tconst batched = item_row.has_batch_no;\n\t\tconst no_bundle_selected = !item_row.serial_and_batch_bundle;\n\n\t\tif ((serialized && no_bundle_selected) || (batched && no_bundle_selected)) {\n\t\t\tfrappe.show_alert({\n\t\t\t\tmessage: __(\"Item is removed since no serial / batch no selected.\"),\n\t\t\t\tindicator: 'orange'\n\t\t\t});\n\t\t\tfrappe.utils.play_sound(\"cancel\");\n\t\t\treturn this.events.remove_item_from_cart();\n\t\t}\n\t}\n\n\trender_dom(item) {\n\t\tlet { item_name, description, image, price_list_rate } = item;\n\n\t\tfunction get_description_html() {\n\t\t\tif (description) {\n\t\t\t\tdescription = description.indexOf('...') === -1 && description.length > 140 ? description.substr(0, 139) + '...' : description;\n\t\t\t\treturn description;\n\t\t\t}\n\t\t\treturn ``;\n\t\t}\n\n\t\tthis.$item_name.html(item_name);\n\t\tthis.$item_description.html(get_description_html());\n\t\tthis.$item_price.html(format_currency(price_list_rate, this.currency));\n\t\tif (!this.hide_images && image) {\n\t\t\tthis.$item_image.html(\n\t\t\t\t``\n\t\t\t);\n\t\t} else {\n\t\t\tthis.$item_image.html(`
${frappe.get_abbr(item_name)}
`);\n\t\t}\n\n\t}\n\n\thandle_broken_image($img) {\n\t\tconst item_abbr = $($img).attr('alt');\n\t\t$($img).replaceWith(`
${item_abbr}
`);\n\t}\n\n\trender_discount_dom(item) {\n\t\tif (item.discount_percentage) {\n\t\t\tthis.$dicount_section.html(\n\t\t\t\t`
${format_currency(item.price_list_rate, this.currency)}
\n\t\t\t\t
${item.discount_percentage}% off
`\n\t\t\t)\n\t\t\tthis.$item_price.html(format_currency(item.rate, this.currency));\n\t\t} else {\n\t\t\tthis.$dicount_section.html(``)\n\t\t}\n\t}\n\n\trender_form(item) {\n\t\tconst fields_to_display = this.get_form_fields(item);\n\t\tthis.$form_container.html('');\n\n\t\tfields_to_display.forEach((fieldname, idx) => {\n\t\t\tthis.$form_container.append(\n\t\t\t\t`
`\n\t\t\t)\n\n\t\t\tconst field_meta = this.item_meta.fields.find(df => df.fieldname === fieldname);\n\t\t\tfieldname === 'discount_percentage' ? (field_meta.label = __('Discount (%)')) : '';\n\t\t\tconst me = this;\n\t\t\tvar uoms = []\n\t\t\tfrappe.db.get_doc(\"Item\",me.current_item.item_code).then(doc => {\n\t\t\t\tuoms = doc.uoms.map(item => item.uom);\n\t\t\t})\n\t\t\tthis[`${fieldname}_control`] = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\t...field_meta,\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tme.events.form_updated(me.current_item, fieldname, this.value);\n\t\t\t\t\t},\n\t\t\t\t\tget_query:function () {\n\t\t\t\t\t\tif(fieldname === 'uom'){\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\t\t\tname: ['in',uoms]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n }\n\t\t\t\t},\n\t\t\t\tparent: this.$form_container.find(`.${fieldname}-control`),\n\t\t\t\trender_input: true,\n\t\t\t})\n\t\t\tthis[`${fieldname}_control`].set_value(item[fieldname]);\n\t\t});\n\n\t\tthis.make_auto_serial_selection_btn(item);\n\n\t\tthis.bind_custom_control_change_event();\n\t}\n\n\tget_form_fields(item) {\n\t\tconst fields = ['qty', 'uom', 'rate', 'conversion_factor', 'discount_percentage', 'warehouse', 'actual_qty', 'price_list_rate'];\n\t\tif (item.has_serial_no) fields.push('serial_no');\n\t\tif (item.has_batch_no) fields.push('batch_no');\n\t\treturn fields;\n\t}\n\n\tmake_auto_serial_selection_btn(item) {\n\t\tif (item.has_serial_no || item.has_batch_no) {\n\t\t\tconst label = item.has_serial_no ? __('Select Serial No') : __('Select Batch No');\n\t\t\tthis.$form_container.append(\n\t\t\t\t`
${label}
`\n\t\t\t);\n\t\t\tthis.$form_container.find('.serial_no-control').find('textarea').css('height', '6rem');\n\t\t}\n\t}\n\n\tbind_custom_control_change_event() {\n\t\tconst me = this;\n\t\tif (this.rate_control) {\n\t\t\tthis.rate_control.df.onchange = function() {\n\t\t\t\tif (this.value || flt(this.value) === 0) {\n\t\t\t\t\tme.events.form_updated(me.current_item, 'rate', this.value).then(() => {\n\t\t\t\t\t\tconst item_row = frappe.get_doc(me.doctype, me.name);\n\t\t\t\t\t\tconst doc = me.events.get_frm().doc;\n\t\t\t\t\t\tme.$item_price.html(format_currency(item_row.rate, doc.currency));\n\t\t\t\t\t\tme.render_discount_dom(item_row);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.rate_control.df.read_only = !this.allow_rate_change;\n\t\t\tthis.rate_control.refresh();\n\t\t}\n\n\t\tif (this.discount_percentage_control && !this.allow_discount_change) {\n\t\t\tthis.discount_percentage_control.df.read_only = 1;\n\t\t\tthis.discount_percentage_control.refresh();\n\t\t}\n\n\t\tif (this.warehouse_control) {\n\t\t\tthis.warehouse_control.df.reqd = 1;\n\t\t\tthis.warehouse_control.df.onchange = function() {\n\t\t\t\tif (this.value) {\n\t\t\t\t\tme.events.form_updated(me.current_item, 'warehouse', this.value).then(() => {\n\t\t\t\t\t\tme.item_stock_map = me.events.get_item_stock_map();\n\t\t\t\t\t\tconst available_qty = me.item_stock_map[me.item_row.item_code][this.value][0];\n\t\t\t\t\t\tconst is_stock_item = Boolean(me.item_stock_map[me.item_row.item_code][this.value][1]);\n\t\t\t\t\t\tif (available_qty === undefined) {\n\t\t\t\t\t\t\tme.events.get_available_stock(me.item_row.item_code, this.value).then(() => {\n\t\t\t\t\t\t\t\t// item stock map is updated now reset warehouse\n\t\t\t\t\t\t\t\tme.warehouse_control.set_value(this.value);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else if (available_qty === 0 && is_stock_item) {\n\t\t\t\t\t\t\tme.warehouse_control.set_value('');\n\t\t\t\t\t\t\tconst bold_item_code = me.item_row.item_code.bold();\n\t\t\t\t\t\t\tconst bold_warehouse = this.value.bold();\n\t\t\t\t\t\t\tfrappe.throw(\n\t\t\t\t\t\t\t\t__('Item Code: {0} is not available under warehouse {1}.', [bold_item_code, bold_warehouse])\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tme.actual_qty_control.set_value(available_qty);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.warehouse_control.df.get_query = () => {\n\t\t\t\treturn {\n\t\t\t\t\tfilters: { company: this.events.get_frm().doc.company }\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.warehouse_control.refresh();\n\t\t}\n\n\t\tif (this.serial_no_control) {\n\t\t\tthis.serial_no_control.df.reqd = 1;\n\t\t\tthis.serial_no_control.df.onchange = async function() {\n\t\t\t\t!me.current_item.batch_no && await me.auto_update_batch_no();\n\t\t\t\tme.events.form_updated(me.current_item, 'serial_no', this.value);\n\t\t\t}\n\t\t\tthis.serial_no_control.refresh();\n\t\t}\n\n\t\tif (this.batch_no_control) {\n\t\t\tthis.batch_no_control.df.reqd = 1;\n\t\t\tthis.batch_no_control.df.get_query = () => {\n\t\t\t\treturn {\n\t\t\t\t\tquery: 'erpnext.controllers.queries.get_batch_no',\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\titem_code: me.item_row.item_code,\n\t\t\t\t\t\twarehouse: me.item_row.warehouse,\n\t\t\t\t\t\tposting_date: me.events.get_frm().doc.posting_date\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.batch_no_control.refresh();\n\t\t}\n\n\t\tif (this.uom_control) {\n\t\t\tthis.uom_control.df.onchange = function() {\n\t\t\t\tme.events.form_updated(me.current_item, 'uom', this.value);\n\n\t\t\t\tconst item_row = frappe.get_doc(me.doctype, me.name);\n\t\t\t\tme.conversion_factor_control.df.read_only = (item_row.stock_uom == this.value);\n\t\t\t\tme.conversion_factor_control.refresh();\n\t\t\t}\n\t\t}\n\n\t\tfrappe.model.on(\"POS Invoice Item\", \"*\", (fieldname, value, item_row) => {\n\t\t\tconst field_control = this[`${fieldname}_control`];\n\t\t\tconst item_row_is_being_edited = this.compare_with_current_item(item_row);\n\n\t\t\tif (item_row_is_being_edited && field_control && field_control.get_value() !== value) {\n\t\t\t\tfield_control.set_value(value);\n\t\t\t\tcur_pos.update_cart_html(item_row);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync auto_update_batch_no() {\n\t\tif (this.serial_no_control && this.batch_no_control) {\n\t\t\tconst selected_serial_nos = this.serial_no_control.get_value().split(`\\n`).filter(s => s);\n\t\t\tif (!selected_serial_nos.length) return;\n\n\t\t\t// find batch nos of the selected serial no\n\t\t\tconst serials_with_batch_no = await frappe.db.get_list(\"Serial No\", {\n\t\t\t\tfilters: { 'name': [\"in\", selected_serial_nos]},\n\t\t\t\tfields: [\"batch_no\", \"name\"]\n\t\t\t});\n\t\t\tconst batch_serial_map = serials_with_batch_no.reduce((acc, r) => {\n\t\t\t\tif (!acc[r.batch_no]) {\n\t\t\t\t\tacc[r.batch_no] = [];\n\t\t\t\t}\n\t\t\t\tacc[r.batch_no] = [...acc[r.batch_no], r.name];\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t\t// set current item's batch no and serial no\n\t\t\tconst batch_no = Object.keys(batch_serial_map)[0];\n\t\t\tconst batch_serial_nos = batch_serial_map[batch_no].join(`\\n`);\n\t\t\t// eg. 10 selected serial no. -> 5 belongs to first batch other 5 belongs to second batch\n\t\t\tconst serial_nos_belongs_to_other_batch = selected_serial_nos.length !== batch_serial_map[batch_no].length;\n\n\t\t\tconst current_batch_no = this.batch_no_control.get_value();\n\t\t\tcurrent_batch_no != batch_no && await this.batch_no_control.set_value(batch_no);\n\n\t\t\tif (serial_nos_belongs_to_other_batch) {\n\t\t\t\tthis.serial_no_control.set_value(batch_serial_nos);\n\t\t\t\tthis.qty_control.set_value(batch_serial_map[batch_no].length);\n\n\t\t\t\tdelete batch_serial_map[batch_no];\n\t\t\t\tthis.events.clone_new_batch_item_in_frm(batch_serial_map, this.current_item);\n\t\t\t}\n\t\t}\n\t}\n\n\tbind_events() {\n\t\tthis.bind_auto_serial_fetch_event();\n\t\tthis.bind_fields_to_numpad_fields();\n\n\t\tthis.$component.on('click', '.close-btn', () => {\n\t\t\tthis.events.close_item_details();\n\t\t});\n\t}\n\n\tattach_shortcuts() {\n\t\tthis.wrapper.find('.close-btn').attr(\"title\", \"Esc\");\n\t\tfrappe.ui.keys.on(\"escape\", () => {\n\t\t\tconst item_details_visible = this.$component.is(\":visible\");\n\t\t\tif (item_details_visible) {\n\t\t\t\tthis.events.close_item_details();\n\t\t\t}\n\t\t});\n\t}\n\n\tbind_fields_to_numpad_fields() {\n\t\tconst me = this;\n\t\tthis.$form_container.on('click', '.input-with-feedback', function() {\n\t\t\tconst fieldname = $(this).attr('data-fieldname');\n\t\t\tif (this.last_field_focused != fieldname) {\n\t\t\t\tme.events.item_field_focused(fieldname);\n\t\t\t\tthis.last_field_focused = fieldname;\n\t\t\t}\n\t\t});\n\t}\n\n\tbind_auto_serial_fetch_event() {\n\t\tthis.$form_container.on('click', '.auto-fetch-btn', () => {\n\t\t\tfrappe.require(\"assets/erpnext/js/utils/serial_no_batch_selector.js\", () => {\n\t\t\t\tlet frm = this.events.get_frm();\n\t\t\t\tlet item_row = this.item_row;\n\t\t\t\titem_row.type_of_transaction = \"Outward\";\n\n\t\t\t\tnew erpnext.SerialBatchPackageSelector(frm, item_row, (r) => {\n\t\t\t\t\tif (r) {\n\t\t\t\t\t\tfrappe.model.set_value(item_row.doctype, item_row.name, {\n\t\t\t\t\t\t\t\"serial_and_batch_bundle\": r.name,\n\t\t\t\t\t\t\t\"qty\": Math.abs(r.total_qty)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t})\n\t}\n\n\ttoggle_component(show) {\n\t\tshow ? this.$component.css('display', 'flex') : this.$component.css('display', 'none');\n\t}\n}\n", "frappe.provide('posnext.PointOfSale');\nposnext.PointOfSale.NumberPad = class {\n\tconstructor({ wrapper, events, cols, keys, css_classes, fieldnames_map }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.cols = cols;\n\t\tthis.keys = keys;\n\t\tthis.css_classes = css_classes || [];\n\t\tthis.fieldnames = fieldnames_map || {};\n\n\t\tthis.init_component();\n\t}\n\n\tinit_component() {\n\t\tthis.prepare_dom();\n\t\tthis.bind_events();\n\t}\n\n\tprepare_dom() {\n\t\tconst { cols, keys, css_classes, fieldnames } = this;\n\n\t\tfunction get_keys() {\n\t\t\treturn keys.reduce((a, row, i) => {\n\t\t\t\treturn a + row.reduce((a2, number, j) => {\n\t\t\t\t\tconst class_to_append = css_classes && css_classes[i] ? css_classes[i][j] : '';\n\t\t\t\t\tconst fieldname = fieldnames && fieldnames[number] ?\n\t\t\t\t\t\tfieldnames[number] : typeof number === 'string' ? frappe.scrub(number) : number;\n\n\t\t\t\t\treturn a2 + `
${__(number)}
`;\n\t\t\t\t}, '');\n\t\t\t}, '');\n\t\t}\n\n\t\tthis.wrapper.html(\n\t\t\t`
\n\t\t\t\t${get_keys()}\n\t\t\t
`\n\t\t)\n\t}\n\n\tbind_events() {\n\t\tconst me = this;\n\t\tthis.wrapper.on('click', '.numpad-btn', function() {\n\t\t\tconst $btn = $(this);\n\t\t\tme.events.numpad_event($btn);\n\t\t});\n\t}\n}\n", "/* eslint-disable no-unused-vars */\nfrappe.provide('posnext.PointOfSale');\nposnext.PointOfSale.Payment = class {\n\tconstructor({ events, wrapper, settings }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.custom_show_sales_man = settings.custom_show_sales_man\n\t\tthis.custom_show_additional_note = settings.custom_show_additional_note\n\t\tthis.custom_edit_rate = settings.custom_edit_rate_and_uom\n\t\tthis.custom_show_credit_sales = settings.custom_show_credit_sales\n\t\tthis.default_payment = settings.default_payment\n\t\tthis.current_payments = []\n\t\tthis.enable_coupon_code = settings.enable_coupon_code\n\n\t\tthis.init_component();\n\t\t// this.init_component();\n\t\tif (this.enable_coupon_code){\n\t\t\tthis.render_coupon_code_field();\n\t\t}\n\t}\n\n\tinit_component() {\n\t\tthis.prepare_dom();\n\t\tthis.initialize_numpad();\n\t\tthis.bind_events();\n\t\tthis.attach_shortcuts();\n\n\t}\n\n\tprepare_dom() {\n\t\tthis.wrapper.append(\n\t\t\t`
\n\t\t\t\t
${__('Payment Method')}
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
${__('Additional Information')}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
${__(\"Complete Order\")}
\n\t\t\t
`\n\t\t);\n\t\n\t\t// \u2705 Assign to the right class\n\t\tthis.$component = this.wrapper.find('.payment-container');\n\t\tthis.$payment_modes = this.$component.find('.payment-modes');\n\t\tthis.$totals_section = this.$component.find('.totals-section');\n\t\tthis.$totals = this.$component.find('.totals');\n\t\tthis.$numpad = this.$component.find('.number-pad');\n\t\tthis.$coupon_code = this.$component.find('.coupon-code');\n\t\tthis.$invoice_fields_section = this.$component.find('.fields-section');\n\t}\n\t\n\trender_coupon_code_field() {\n\t\tfrappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Coupon Code'),\n\t\t\t\tfieldtype: 'Link',\n\t\t\t\toptions: 'Coupon Code',\n\t\t\t\tfieldname: 'coupon_code',\n\t\t\t\tplaceholder: __('Select a coupon'),\n\t\t\t},\n\t\t\tparent: this.$component.find('.coupon-code'),\n\t\t\trender_input: true\n\t\t});\n\t}\n\t\n\n\tmake_invoice_fields_control() {\n\t\t// frappe.db.get_doc(\"POS Settings\", undefined).then((doc) => {\n\t\t\tvar me = this\n\t\t\tconst fields = [];\n\t\t\tif(this.custom_show_credit_sales){\n\t\t\t\tfields.push({\n\t\t\t\t\tfieldname: \"custom_credit_sales\",\n\t\t\t\t\tlabel: \"Credit Sales\",\n\t\t\t\t\tfieldtype: \"Check\",\n\t\t\t\t})\n\t\t\t\t// fields.push({\n\t\t\t\t// \tfieldname: \"custom_credit_sales_date\",\n\t\t\t\t// \tlabel: \"Credit Sales Date\",\n\t\t\t\t// \tfieldtype: \"Date\"\n\t\t\t\t// })\n\t\t\t}\n\t\t\tif(this.custom_show_sales_man){\n\t\t\t\tfields.push({\n\t\t\t\t\tfieldname: \"sales_person\",\n\t\t\t\t\tlabel: \"Sales Man\",\n\t\t\t\t\tfieldtype: \"Link\",\n\t\t\t\t\toptions: \"Sales Person\",\n\t\t\t\t})\n\t\t\t}\n\t\t\tif(this.custom_show_additional_note){\n\t\t\t\tfields.push({\n\t\t\t\t\tfieldname: \"remarks\",\n\t\t\t\t\tlabel: \"Additional Note\",\n\t\t\t\t\tfieldtype: \"Small Text\",\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (!fields.length) return;\n\t\t\tthis.$invoice_fields = this.$invoice_fields_section.find('.invoice-fields');\n\t\t\tthis.$invoice_fields.html('');\n\t\t\tconst frm = this.events.get_frm();\n\t\t\tme.current_payments = frm.doc.payments\n\t\t\tfields.forEach(df => {\n\t\t\t\tthis.$invoice_fields.append(\n\t\t\t\t\t`
`\n\t\t\t\t);\n\t\t\t\tlet df_events = {\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tif(this.df.fieldname === 'sales_person'){\n\t\t\t\t\t\t\tfrm.clear_table(\"sales_team\")\n\t\t\t\t\t\t\tcur_frm.add_child(\"sales_team\", {\n\t\t\t\t\t\t\t\tsales_person: this.get_value(),\n\t\t\t\t\t\t\t\tallocated_percentage: 100,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(this.df.fieldname === 'custom_credit_sales'){\n\t\t\t\t\t\t\t\t// $('input[data-fieldname=\"custom_credit_sales_date\"]').css(\"pointer-events\",this.get_value() ? \"\" : \"none\")\n\t\t\t\t\t\t\t\tif(this.get_value()){\n\t\t\t\t\t\t\t\t\t// $('input[data-fieldname=\"custom_credit_sales_date\"]').removeAttr('readonly')\n\n\t\t\t\t\t\t\t\t\tfrm.doc.payments.forEach(p => {\n\t\t\t\t\t\t\t\t\t\tconst mode = p.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\t\t\t\t\t\t\t\tme[`${mode}_control`].set_value(0);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.log(me.current_payments)\n\t\t\t\t\t\t\t\t\t// $('input[data-fieldname=\"custom_credit_sales_date\"]').attr('readonly', true);\n\t\t\t\t\t\t\t\t\tme.current_payments.forEach(p => {\n\t\t\t\t\t\t\t\t\t\tif(p.mode_of_payment === me.default_payment){\n\t\t\t\t\t\t\t\t\t\t\tconst mode = p.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\tme[`${mode}_control`].set_value(frm.doc.grand_total);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfrm.set_value(this.df.fieldname, this.get_value());\n\t\t\t\t\t\t}\n\t\t// \t\t\t\tif(this.df.fieldname === 'custom_credit_sales' && this.get_value()){\n\t\t// \t\t\t\t\tconsole.log(\"SELECTEEED MODE\")\n\t\t// console.log(me.$payment_modes)\n\t\t// \t\t\t\t\tthis.selected_mode.set_value(0);\n\t\t// \t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (df.fieldtype == \"Button\") {\n\t\t\t\t\tdf_events = {\n\t\t\t\t\t\tclick: function() {\n\t\t\t\t\t\t\tif (frm.script_manager.has_handlers(df.fieldname, frm.doc.doctype)) {\n\t\t\t\t\t\t\t\tfrm.script_manager.trigger(df.fieldname, frm.doc.doctype, frm.doc.docname);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tthis[`${df.fieldname}_field`] = frappe.ui.form.make_control({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\t...df,\n\t\t\t\t\t\t...df_events\n\t\t\t\t\t},\n\t\t\t\t\tparent: this.$invoice_fields.find(`.${df.fieldname}-field`),\n\t\t\t\t\trender_input: true,\n\t\t\t\t});\n\t\t\t\tif(df.fieldname !== 'remarks'){\n\t\t\t\t\tthis[`${df.fieldname}_field`].set_value(frm.doc[df.fieldname]);\n\t\t\t\t}\n\t\t\t\t// if(df.fieldname === 'custom_credit_sales_date'){\n\t\t\t\t// \tthis[`${df.fieldname}_field`].set_value(frappe.datetime.get_today());\n\t\t\t\t// }\n\t\t\t});\n\t\t// });\n\t}\n\n\tinitialize_numpad() {\n\t\tconst me = this;\n\t\tthis.number_pad = new posnext.PointOfSale.NumberPad({\n\t\t\twrapper: this.$numpad,\n\t\t\tevents: {\n\t\t\t\tnumpad_event: function($btn) {\n\t\t\t\t\tme.on_numpad_clicked($btn);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcols: 3,\n\t\t\tkeys: [\n\t\t\t\t[ 1, 2, 3 ],\n\t\t\t\t[ 4, 5, 6 ],\n\t\t\t\t[ 7, 8, 9 ],\n\t\t\t\t[ '.', 0, 'Delete' ]\n\t\t\t],\n\t\t});\n\n\t\tthis.numpad_value = '';\n\t}\n\n\ton_numpad_clicked($btn) {\n\t\tconst button_value = $btn.attr('data-button-value');\n\n\t\thighlight_numpad_btn($btn);\n\t\tthis.numpad_value = button_value === 'delete' ? this.numpad_value.slice(0, -1) : this.numpad_value + button_value;\n\t\tthis.selected_mode.$input.get(0).focus();\n\t\tthis.selected_mode.set_value(this.numpad_value);\n\n\t\tfunction highlight_numpad_btn($btn) {\n\t\t\t$btn.addClass('shadow-base-inner bg-selected');\n\t\t\tsetTimeout(() => {\n\t\t\t\t$btn.removeClass('shadow-base-inner bg-selected');\n\t\t\t}, 100);\n\t\t}\n\t}\n\n\tbind_events() {\n\t\tconst me = this;\n\n\t\tthis.$payment_modes.on('click', '.mode-of-payment', function(e) {\n\t\t\tconst mode_clicked = $(this);\n\t\t\t// if clicked element doesn't have .mode-of-payment class then return\n\t\t\tif (!$(e.target).is(mode_clicked)) return;\n\n\t\t\tconst scrollLeft = mode_clicked.offset().left - me.$payment_modes.offset().left + me.$payment_modes.scrollLeft();\n\t\t\tme.$payment_modes.animate({ scrollLeft });\n\n\t\t\tconst mode = mode_clicked.attr('data-mode');\n\n\t\t\t// hide all control fields and shortcuts\n\t\t\t$(`.mode-of-payment-control`).css('display', 'none');\n\t\t\t$(`.cash-shortcuts`).css('display', 'none');\n\t\t\tme.$payment_modes.find(`.pay-amount`).css('display', 'inline');\n\t\t\tme.$payment_modes.find(`.loyalty-amount-name`).css('display', 'none');\n\n\t\t\t// remove highlight from all mode-of-payments\n\t\t\t$('.mode-of-payment').removeClass('border-primary');\n\n\t\t\tif (mode_clicked.hasClass('border-primary')) {\n\t\t\t\t// clicked one is selected then unselect it\n\t\t\t\tmode_clicked.removeClass('border-primary');\n\t\t\t\tme.selected_mode = '';\n\t\t\t} else {\n\t\t\t\t// clicked one is not selected then select it\n\t\t\t\tmode_clicked.addClass('border-primary');\n\t\t\t\tmode_clicked.find('.mode-of-payment-control').css('display', 'flex');\n\t\t\t\tmode_clicked.find('.cash-shortcuts').css('display', 'grid');\n\t\t\t\tme.$payment_modes.find(`.${mode}-amount`).css('display', 'none');\n\t\t\t\tme.$payment_modes.find(`.${mode}-name`).css('display', 'inline');\n\n\t\t\t\tme.selected_mode = me[`${mode}_control`];\n\t\t\t\tme.selected_mode && me.selected_mode.$input.get(0).focus();\n\t\t\t\tme.auto_set_remaining_amount();\n\t\t\t}\n\t\t});\n\n\t\tfrappe.ui.form.on('POS Invoice', 'contact_mobile', (frm) => {\n\t\t\tconst contact = frm.doc.contact_mobile;\n\t\t\tconst request_button = $(this.request_for_payment_field?.$input[0]);\n\t\t\tif (contact) {\n\t\t\t\trequest_button.removeClass('btn-default').addClass('btn-primary');\n\t\t\t} else {\n\t\t\t\trequest_button.removeClass('btn-primary').addClass('btn-default');\n\t\t\t}\n\t\t});\n\n\t\tfrappe.ui.form.on('POS Invoice', 'coupon_code', (frm) => {\n\t\t\tif (frm.doc.coupon_code && !frm.applying_pos_coupon_code) {\n\t\t\t\tif (!frm.doc.ignore_pricing_rule) {\n\t\t\t\t\tfrm.applying_pos_coupon_code = true;\n\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t() => frm.doc.ignore_pricing_rule=1,\n\t\t\t\t\t\t() => frm.trigger('ignore_pricing_rule'),\n\t\t\t\t\t\t() => frm.doc.ignore_pricing_rule=0,\n\t\t\t\t\t\t() => frm.trigger('apply_pricing_rule'),\n\t\t\t\t\t\t() => frm.save(),\n\t\t\t\t\t\t() => this.update_totals_section(frm.doc),\n\t\t\t\t\t\t() => (frm.applying_pos_coupon_code = false)\n\t\t\t\t\t]);\n\t\t\t\t} else if (frm.doc.ignore_pricing_rule) {\n\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\tmessage: __(\"Ignore Pricing Rule is enabled. Cannot apply coupon code.\"),\n\t\t\t\t\t\tindicator: \"orange\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.setup_listener_for_payments();\n\n\t\tthis.$payment_modes.on('click', '.shortcut', function() {\n\t\t\tconst value = $(this).attr('data-value');\n\t\t\tme.selected_mode.set_value(value);\n\t\t});\n\n\t\tthis.$component.on('click', '.submit-order-btn', () => {\n\t\t\tconst doc = this.events.get_frm().doc;\n\t\t\tlet paid_amount = doc.paid_amount\n\t\t\tif(cur_frm.doc.custom_credit_sales && this.custom_show_credit_sales){\n\t\t\t\tcur_frm.clear_table(\"payments\")\n\t\t\t\tpaid_amount = 0;\n\t\t\t}\n\n\t\t\tconst items = doc.items;\n\n\t\t\tif ((paid_amount == 0 || !items.length) && !this.custom_show_credit_sales) {\n\t\t\t\tconst message = items.length ? __(\"You cannot submit the order without payment.\") : __(\"You cannot submit empty order.\");\n\t\t\t\tfrappe.show_alert({ message, indicator: \"orange\" });\n\t\t\t\tfrappe.utils.play_sound(\"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.events.submit_invoice();\n\t\t});\n\n\t\tfrappe.ui.form.on('POS Invoice', 'paid_amount', (frm) => {\n\t\t\tthis.update_totals_section(frm.doc);\n\n\t\t\t// need to re calculate cash shortcuts after discount is applied\n\t\t\tconst is_cash_shortcuts_invisible = !this.$payment_modes.find('.cash-shortcuts').is(':visible');\n\t\t\tthis.attach_cash_shortcuts(frm.doc);\n\t\t\t!is_cash_shortcuts_invisible && this.$payment_modes.find('.cash-shortcuts').css('display', 'grid');\n\t\t\tthis.render_payment_mode_dom();\n\t\t});\n\n\t\tfrappe.ui.form.on('POS Invoice', 'loyalty_amount', (frm) => {\n\t\t\tconst formatted_currency = format_currency(frm.doc.loyalty_amount, frm.doc.currency);\n\t\t\tthis.$payment_modes.find(`.loyalty-amount-amount`).html(formatted_currency);\n\t\t});\n\n\t\tfrappe.ui.form.on(\"Sales Invoice Payment\", \"amount\", (frm, cdt, cdn) => {\n\t\t\t// for setting correct amount after loyalty points are redeemed\n\t\t\tconst default_mop = locals[cdt][cdn];\n\t\t\tconst mode = default_mop.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\tif (this[`${mode}_control`] && this[`${mode}_control`].get_value() != default_mop.amount) {\n\t\t\t\tthis[`${mode}_control`].set_value(default_mop.amount);\n\t\t\t}\n\t\t});\n\t}\n\n\tsetup_listener_for_payments() {\n\t\tfrappe.realtime.on(\"process_phone_payment\", (data) => {\n\t\t\tconst doc = this.events.get_frm().doc;\n\t\t\tconst { response, amount, success, failure_message } = data;\n\t\t\tlet message, title;\n\n\t\t\tif (success) {\n\t\t\t\ttitle = __(\"Payment Received\");\n\t\t\t\tconst grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total;\n\t\t\t\tif (amount >= grand_total) {\n\t\t\t\t\tfrappe.dom.unfreeze();\n\t\t\t\t\tmessage = __(\"Payment of {0} received successfully.\", [format_currency(amount, doc.currency, 0)]);\n\t\t\t\t\tthis.events.submit_invoice();\n\t\t\t\t\tcur_frm.reload_doc();\n\n\t\t\t\t} else {\n\t\t\t\t\tmessage = __(\"Payment of {0} received successfully. Waiting for other requests to complete...\", [format_currency(amount, doc.currency, 0)]);\n\t\t\t\t}\n\t\t\t} else if (failure_message) {\n\t\t\t\tmessage = failure_message;\n\t\t\t\ttitle = __(\"Payment Failed\");\n\t\t\t}\n\n\t\t\tfrappe.msgprint({ \"message\": message, \"title\": title });\n\t\t});\n\t}\n\n\tauto_set_remaining_amount() {\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total;\n\t\tconst remaining_amount = grand_total - doc.paid_amount;\n\t\tconst current_value = this.selected_mode ? this.selected_mode.get_value() : undefined;\n\t\tif (!current_value && remaining_amount > 0 && this.selected_mode) {\n\t\t\tthis.selected_mode.set_value(remaining_amount);\n\t\t}\n\t}\n\n\tattach_shortcuts() {\n\t\tconst ctrl_label = frappe.utils.is_mac() ? '\u2318' : 'Ctrl';\n\t\tthis.$component.find('.submit-order-btn').attr(\"title\", `${ctrl_label}+Enter`);\n\t\tfrappe.ui.keys.on(\"ctrl+enter\", () => {\n\t\t\tconst payment_is_visible = this.$component.is(\":visible\");\n\t\t\tconst active_mode = this.$payment_modes.find(\".border-primary\");\n\t\t\tif (payment_is_visible && active_mode.length) {\n\t\t\t\tthis.$component.find('.submit-order-btn').click();\n\t\t\t}\n\t\t});\n\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"tab\",\n\t\t\taction: () => {\n\t\t\t\tconst payment_is_visible = this.$component.is(\":visible\");\n\t\t\t\tlet active_mode = this.$payment_modes.find(\".border-primary\");\n\t\t\t\tactive_mode = active_mode.length ? active_mode.attr(\"data-mode\") : undefined;\n\n\t\t\t\tif (!active_mode) return;\n\n\t\t\t\tconst mode_of_payments = Array.from(this.$payment_modes.find(\".mode-of-payment\")).map(m => $(m).attr(\"data-mode\"));\n\t\t\t\tconst mode_index = mode_of_payments.indexOf(active_mode);\n\t\t\t\tconst next_mode_index = (mode_index + 1) % mode_of_payments.length;\n\t\t\t\tconst next_mode_to_be_clicked = this.$payment_modes.find(`.mode-of-payment[data-mode=\"${mode_of_payments[next_mode_index]}\"]`);\n\n\t\t\t\tif (payment_is_visible && mode_index != next_mode_index) {\n\t\t\t\t\tnext_mode_to_be_clicked.click();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcondition: () => this.$component.is(':visible') && this.$payment_modes.find(\".border-primary\").length,\n\t\t\tdescription: __(\"Switch Between Payment Modes\"),\n\t\t\tignore_inputs: true,\n\t\t\tpage: cur_page.page.page\n\t\t});\n\t}\n\n\ttoggle_numpad() {\n\t\t// pass\n\t}\n\n\trender_payment_section() {\n\t\tthis.render_payment_mode_dom();\n\t\tthis.make_invoice_fields_control();\n\t\tthis.update_totals_section();\n\t\tthis.focus_on_default_mop();\n\t}\n\n\tafter_render() {\n\t\tconst frm = this.events.get_frm();\n\t\tfrm.script_manager.trigger(\"after_payment_render\", frm.doc.doctype, frm.doc.docname);\n\t}\n\n\tedit_cart() {\n\t\tif(this.custom_edit_rate){\n\t\t\tconst div = document.getElementById(\"customer-cart-container2\");\n\t\t\tdiv.style.gridColumn = \"span 5 / span 5\";\n\t\t}\n\n\t\tthis.events.toggle_other_sections(false);\n\t\tthis.toggle_component(false);\n\t}\n\n\tcheckout() {\n\t\tthis.events.toggle_other_sections(true);\n\t\tthis.toggle_component(true);\n\n\t\tthis.render_payment_section();\n\t\tthis.after_render();\n\t}\n\n\ttoggle_remarks_control() {\n\t\tif (this.$remarks.find('.frappe-control').length) {\n\t\t\tthis.$remarks.html('+ Add Remark');\n\t\t} else {\n\t\t\tthis.$remarks.html('');\n\t\t\tthis[`remark_control`] = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: __('Remark'),\n\t\t\t\t\tfieldtype: 'Data',\n\t\t\t\t\tonchange: function() {}\n\t\t\t\t},\n\t\t\t\tparent: this.$totals_section.find(`.remarks`),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t\tthis[`remark_control`].set_value('');\n\t\t}\n\t}\n\n\trender_payment_mode_dom() {\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst payments = doc.payments;\n\t\tconst currency = doc.currency;\n\n\t\tthis.$payment_modes.html(`${\n\t\t\tpayments.map((p, i) => {\n\t\t\t\tconst mode = p.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\t\tconst payment_type = p.type;\n\t\t\t\tconst margin = i % 2 === 0 ? 'pr-2' : 'pl-2';\n\t\t\t\tconst amount = p.amount > 0 ? format_currency(p.amount, currency) : '';\n\n\t\t\t\treturn (`\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t${p.mode_of_payment}\n\t\t\t\t\t\t\t
${amount}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t`);\n\t\t\t}).join('')\n\t\t}`);\n\t\tthis.current_payments = payments\n\t\tpayments.forEach(p => {\n\t\t\tconst mode = p.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\tconst me = this;\n\t\t\tthis[`${mode}_control`] = frappe.ui.form.make_control({\n\t\t\t\tdf: {\n\t\t\t\t\tlabel: p.mode_of_payment,\n\t\t\t\t\tfieldtype: 'Currency',\n\t\t\t\t\tplaceholder: __('Enter {0} amount.', [p.mode_of_payment]),\n\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\tconsole.log(p.doctype)\n\t\t\t\t\t\tconsole.log(p.name)\n\t\t\t\t\t\tconst current_value = frappe.model.get_value(p.doctype, p.name, 'amount');\n\t\t\t\t\t\tif (current_value != this.value) {\n\t\t\t\t\t\t\tfrappe.model\n\t\t\t\t\t\t\t\t.set_value(p.doctype, p.name, 'amount', flt(this.value))\n\t\t\t\t\t\t\t\t.then(() => me.update_totals_section())\n\n\t\t\t\t\t\t\tconst formatted_currency = format_currency(this.value, currency);\n\t\t\t\t\t\t\tme.$payment_modes.find(`.${mode}-amount`).html(formatted_currency);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tparent: this.$payment_modes.find(`.${mode}.mode-of-payment-control`),\n\t\t\t\trender_input: true,\n\t\t\t});\n\t\t\tthis[`${mode}_control`].toggle_label(false);\n\t\t\tthis[`${mode}_control`].set_value(p.amount);\n\t\t});\n\n\t\tthis.render_loyalty_points_payment_mode();\n\n\t\tthis.attach_cash_shortcuts(doc);\n\t}\n\n\tfocus_on_default_mop() {\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst payments = doc.payments;\n\t\tpayments.forEach(p => {\n\t\t\tconst mode = p.mode_of_payment.replace(/ +/g, \"_\").toLowerCase();\n\t\t\tif (p.default) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$payment_modes.find(`.${mode}.mode-of-payment-control`).parent().click();\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t});\n\t}\n\n\tattach_cash_shortcuts(doc) {\n\t\tconst grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total;\n\t\tconst currency = doc.currency;\n\n\t\tconst shortcuts = this.get_cash_shortcuts(flt(grand_total));\n\n\t\tthis.$payment_modes.find('.cash-shortcuts').remove();\n\t\tlet shortcuts_html = shortcuts.map(s => {\n\t\t\treturn `
${format_currency(s, currency, 0)}
`;\n\t\t}).join('');\n\n\t\tthis.$payment_modes.find('[data-payment-type=\"Cash\"]').find('.mode-of-payment-control')\n\t\t\t.after(`
${shortcuts_html}
`);\n\t}\n\n\tget_cash_shortcuts(grand_total) {\n\t\tlet steps = [1, 5, 10];\n\t\tconst digits = String(Math.round(grand_total)).length;\n\n\t\tsteps = steps.map(x => x * (10 ** (digits - 2)));\n\n\t\tconst get_nearest = (amount, x) => {\n\t\t\tlet nearest_x = Math.ceil((amount / x)) * x;\n\t\t\treturn nearest_x === amount ? nearest_x + x : nearest_x;\n\t\t};\n\n\t\treturn steps.reduce((finalArr, x) => {\n\t\t\tlet nearest_x = get_nearest(grand_total, x);\n\t\t\tnearest_x = finalArr.indexOf(nearest_x) != -1 ? nearest_x + x : nearest_x;\n\t\t\treturn [...finalArr, nearest_x];\n\t\t}, []);\n\t}\n\n\trender_loyalty_points_payment_mode() {\n\t\tconst me = this;\n\t\tconst doc = this.events.get_frm().doc;\n\t\tconst { loyalty_program, loyalty_points, conversion_factor } = this.events.get_customer_details();\n\n\t\tthis.$payment_modes.find(`.mode-of-payment[data-mode=\"loyalty-amount\"]`).parent().remove();\n\n\t\tif (!loyalty_program) return;\n\n\t\tlet description, read_only, max_redeemable_amount;\n\t\tif (!loyalty_points) {\n\t\t\tdescription = __(\"You don't have enough points to redeem.\");\n\t\t\tread_only = true;\n\t\t} else {\n\t\t\tmax_redeemable_amount = flt(flt(loyalty_points) * flt(conversion_factor), precision(\"loyalty_amount\", doc));\n\t\t\tdescription = __(\"You can redeem upto {0}.\", [format_currency(max_redeemable_amount)]);\n\t\t\tread_only = false;\n\t\t}\n\n\t\tconst margin = this.$payment_modes.children().length % 2 === 0 ? 'pr-2' : 'pl-2';\n\t\tconst amount = doc.loyalty_amount > 0 ? format_currency(doc.loyalty_amount, doc.currency) : '';\n\t\tthis.$payment_modes.append(\n\t\t\t`
\n\t\t\t\t
\n\t\t\t\t\tRedeem Loyalty Points\n\t\t\t\t\t
${amount}
\n\t\t\t\t\t
${loyalty_program}
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
`\n\t\t);\n\n\t\tthis['loyalty-amount_control'] = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __(\"Redeem Loyalty Points\"),\n\t\t\t\tfieldtype: 'Currency',\n\t\t\t\tplaceholder: __(\"Enter amount to be redeemed.\"),\n\t\t\t\toptions: 'company:currency',\n\t\t\t\tread_only,\n\t\t\t\tonchange: async function() {\n\t\t\t\t\tif (!loyalty_points) return;\n\n\t\t\t\t\tif (this.value > max_redeemable_amount) {\n\t\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\t\tmessage: __(\"You cannot redeem more than {0}.\", [format_currency(max_redeemable_amount)]),\n\t\t\t\t\t\t\tindicator: \"red\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfrappe.utils.play_sound(\"submit\");\n\t\t\t\t\t\tme['loyalty-amount_control'].set_value(0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst redeem_loyalty_points = this.value > 0 ? 1 : 0;\n\t\t\t\t\tawait frappe.model.set_value(doc.doctype, doc.name, 'redeem_loyalty_points', redeem_loyalty_points);\n\t\t\t\t\tfrappe.model.set_value(doc.doctype, doc.name, 'loyalty_points', parseInt(this.value / conversion_factor));\n\t\t\t\t},\n\t\t\t\tdescription\n\t\t\t},\n\t\t\tparent: this.$payment_modes.find(`.loyalty-amount.mode-of-payment-control`),\n\t\t\trender_input: true,\n\t\t});\n\t\tthis['loyalty-amount_control'].toggle_label(false);\n\n\t\t// this.render_add_payment_method_dom();\n\t}\n\n\trender_add_payment_method_dom() {\n\t\tconst docstatus = this.events.get_frm().doc.docstatus;\n\t\tif (docstatus === 0)\n\t\t\tthis.$payment_modes.append(\n\t\t\t\t`
\n\t\t\t\t\t
+ Add Payment Method
\n\t\t\t\t
`\n\t\t\t);\n\t}\n\n\tupdate_totals_section(doc) {\n\t\tif (!doc) doc = this.events.get_frm().doc;\n\t\tlet branch_value = $('.input-with-feedback[data-fieldname=\"branch\"]').val();\n\t\tfrappe.model.set_value(cur_frm.doctype, cur_frm.docname, 'branch', branch_value);\n\t\tcur_frm.save()\n\t\t// doc.paid_amount = doc.grand_total\n\t\t\tconst paid_amount = doc.paid_amount;\n\n\t\tif(cur_frm.doc.custom_credit_sales){\n\t\t\tconst paid_amount = 0\n\t\t}\n\t\tconst grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total;\n\t\tconst remaining = grand_total - doc.paid_amount;\n\t\tconst change = doc.change_amount || remaining <= 0 ? -1 * remaining : undefined;\n\t\tconst currency = doc.currency;\n\t\tconst label = change ? __('Change') : __('To Be Paid');\n\n\t\tthis.$totals.html(\n\t\t\t`
\n\t\t\t\t
${__('Grand Total')}
\n\t\t\t\t
${format_currency(grand_total, currency)}
\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${__('Paid Amount')}
\n\t\t\t\t
${format_currency(paid_amount, currency)}
\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
${label}
\n\t\t\t\t
${format_currency(change || remaining, currency)}
\n\t\t\t
`\n\t\t);\n\t}\n\n\ttoggle_component(show) {\n\t\tshow ? this.$component.css('display', 'flex') : this.$component.css('display', 'none');\n\t}\n};\n", "frappe.provide('posnext.PointOfSale');\nvar invoicess = []\nposnext.PointOfSale.PastOrderList = class {\n\tconstructor({ wrapper, events, settings }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.events = events;\n\t\tthis.pos_profile = settings.name\n\t\tthis.custom_filter_order_list_by_profile = settings.custom_filter_order_list_by_profile\n\t\tthis.init_component();\n\t}\n\n\tinit_component() {\n\t\tthis.prepare_dom();\n\t\tthis.make_filter_section();\n\t\tthis.bind_events();\n\t}\n\n\tprepare_dom() {\n\t\tthis.wrapper.append(\n\t\t\t`
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
${__('Recent Orders')}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
`\n\t\t);\n\n\t\tthis.$component = this.wrapper.find('.past-order-list');\n\t\tthis.$invoices_container = this.$component.find('.invoices-container');\n\n\t}\n\n\tbind_events() {\n\t\tthis.search_field.$input.on('input', (e) => {\n\t\t\tclearTimeout(this.last_search);\n\t\t\tthis.last_search = setTimeout(() => {\n\t\t\t\tconst search_term = e.target.value;\n\t\t\t\tthis.refresh_list(search_term, this.status_field.get_value());\n\t\t\t}, 300);\n\t\t});\n\t\tconst me = this;\n\t\tthis.$invoices_container.on('click', '.invoice-wrapper', function() {\n\t\t\tconst invoice_name = unescape($(this).attr('data-invoice-name'));\n\t\t\tme.events.open_invoice_data(invoice_name);\n\t\t});\n\t\tthis.$component.on('click', '.back', function() {\n\t\t\tme.events.previous_screen()\n\t\t});\n\t}\n\n\tmake_filter_section() {\n\t\tconst me = this;\n\t\tthis.search_field = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Search'),\n\t\t\t\tfieldtype: 'Data',\n\t\t\t\tplaceholder: __('Search by invoice id or customer name')\n\t\t\t},\n\t\t\tparent: this.$component.find('.search-field'),\n\t\t\trender_input: true,\n\t\t});\n\t\tthis.status_field = frappe.ui.form.make_control({\n\t\t\tdf: {\n\t\t\t\tlabel: __('Invoice Status'),\n\t\t\t\tfieldtype: 'Select',\n\t\t\t\toptions: `Draft\\nPaid\\nUnpaid\\nReturn`,\n\t\t\t\tplaceholder: __('Filter by invoice status'),\n\t\t\t\tonchange: function() {\n\t\t\t\t\tif (me.$component.is(':visible')) me.refresh_list();\n\t\t\t\t}\n\t\t\t},\n\t\t\tparent: this.$component.find('.status-field'),\n\t\t\trender_input: true,\n\t\t});\n\t\tthis.search_field.toggle_label(false);\n\t\tthis.status_field.toggle_label(false);\n\t\tthis.status_field.set_value('Draft');\n\t}\n\n\trefresh_list() {\n\t\tfrappe.dom.freeze();\n\t\tthis.events.reset_summary();\n\t\tconst search_term = this.search_field.get_value();\n\t\tconst status = this.status_field.get_value();\n\t\tconst pos_profile = this.pos_profile;\n\t\tthis.$invoices_container.html('');\n\t\tlet filter = { search_term, status };\n\t\tif(this.custom_filter_order_list_by_profile){\n\t\t\tfilter = { search_term, status, pos_profile }\n\t\t}\n\t\t\n\t\treturn frappe.call({\n\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.get_past_order_list\",\n\t\t\tfreeze: true,\n\t\t\targs: filter,\n\t\t\tcallback: (response) => {\n\t\t\t\tfrappe.dom.unfreeze();\n\t\t\t\tinvoicess = response.message\n\t\t\t\tresponse.message.forEach(invoice => {\n\t\t\t\t\tconst invoice_html = this.get_invoice_html(invoice);\n\t\t\t\t\tthis.$invoices_container.append(invoice_html);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t}\n\n\tget_invoice_html(invoice) {\n\t\tconst posting_datetime = moment(invoice.posting_date+\" \"+invoice.posting_time).format(\"Do MMMM, h:mma\");\n\t\treturn (\n\t\t\t`
\n\t\t\t\t
\n\t\t\t\t\t
${invoice.name}
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t${frappe.ellipsis(invoice.customer, 20)}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${format_currency(invoice.grand_total, invoice.currency, 0) || 0}
\n\t\t\t\t\t
${posting_datetime}
\n\t\t\t\t
\n\t\t\t
\n\t\t\t
`\n\t\t);\n\t}\n\n\ttoggle_component(show) {\n\t\tfrappe.run_serially([\n\t\t\t() => show ? this.$component.css('display', 'flex') && this.refresh_list() : this.$component.css('display', 'none'),\n\t\t\t() => this.events.open_invoice_data(invoicess[0].name)\n\t\t])\n\n\n\n\t}\n};\n", "frappe.provide('posnext.PointOfSale');\nposnext.PointOfSale.PastOrderSummary = class {\n\tconstructor({ wrapper, pos_profile,events }) {\n\t\tthis.wrapper = wrapper;\n\t\tthis.pos_profile = pos_profile;\n\t\tthis.events = events;\n\n\t\tthis.init_component();\n\t}\n\n\tinit_component() {\n\t\tthis.prepare_dom();\n\t\tthis.init_email_print_dialog();\n\t\tthis.bind_events();\n\t\tthis.attach_shortcuts();\n\t}\n\n\tprepare_dom() {\n\t\tthis.wrapper.append(\n\t\t\t`
\n\t\t\t\t
\n\t\t\t\t\t${__('Select an invoice to load summary data')}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${__('Items')}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${__('Totals')}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
${__('Payments')}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
`\n\t\t);\n\n\t\tthis.$component = this.wrapper.find('.past-order-summary');\n\t\tthis.$summary_wrapper = this.$component.find('.invoice-summary-wrapper');\n\t\tthis.$summary_container = this.$component.find('.abs-container');\n\t\tthis.$upper_section = this.$summary_container.find('.upper-section');\n\t\tthis.$items_container = this.$summary_container.find('.items-container');\n\t\tthis.$totals_container = this.$summary_container.find('.totals-container');\n\t\tthis.$payment_container = this.$summary_container.find('.payments-container');\n\t\tthis.$summary_btns = this.$summary_container.find('.summary-btns');\n\t}\n\n\tinit_email_print_dialog() {\n\t\tconst email_dialog = new frappe.ui.Dialog({\n\t\t\ttitle: 'Email Receipt',\n\t\t\tfields: [\n\t\t\t\t{fieldname: 'email_id', fieldtype: 'Data', options: 'Email', label: 'Email ID', reqd: 1},\n\t\t\t\t{fieldname:'content', fieldtype:'Small Text', label:'Message (if any)'}\n\t\t\t],\n\t\t\tprimary_action: () => {\n\t\t\t\tthis.send_email();\n\t\t\t},\n\t\t\tprimary_action_label: __('Send'),\n\t\t});\n\t\tthis.email_dialog = email_dialog;\n\n\t\tconst print_dialog = new frappe.ui.Dialog({\n\t\t\ttitle: 'Print Receipt',\n\t\t\tfields: [\n\t\t\t\t{fieldname: 'print', fieldtype: 'Data', label: 'Print Preview'}\n\t\t\t],\n\t\t\tprimary_action: () => {\n\t\t\t\tthis.print_receipt();\n\t\t\t},\n\t\t\tprimary_action_label: __('Print'),\n\t\t});\n\t\tthis.print_dialog = print_dialog;\n\t}\n\n\tget_upper_section_html(doc) {\n\t\tconst { status } = doc;\n\t\tlet indicator_color = '';\n\n\t\tin_list(['Paid', 'Consolidated'], status) && (indicator_color = 'green');\n\t\tstatus === 'Draft' && (indicator_color = 'red');\n\t\tstatus === 'Return' && (indicator_color = 'grey');\n\n\t\treturn `
\n\t\t\t\t\t
${doc.customer}
\n\t\t\t\t\t
${this.customer_email}
\n\t\t\t\t\t
${__('Sold by')}: ${doc.owner}
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${format_currency(doc.paid_amount, doc.currency)}
\n\t\t\t\t\t
${doc.name}
\n\t\t\t\t\t${doc.status}\n\t\t\t\t
`;\n\t}\n\n\tget_item_html(doc, item_data) {\n\t\treturn `
\n\t\t\t\t\t
${item_data.item_name}
\n\t\t\t\t\t
${item_data.qty || 0} ${item_data.uom}
\n\t\t\t\t\t
${get_rate_discount_html()}
\n\t\t\t\t
`;\n\n\t\tfunction get_rate_discount_html() {\n\t\t\tif (item_data.rate && item_data.price_list_rate && item_data.rate !== item_data.price_list_rate) {\n\t\t\t\treturn `(${item_data.discount_percentage}% off)\n\t\t\t\t\t\t
${format_currency(item_data.rate, doc.currency)}
`;\n\t\t\t} else {\n\t\t\t\treturn `
${format_currency(item_data.price_list_rate || item_data.rate, doc.currency)}
`;\n\t\t\t}\n\t\t}\n\t}\n\n\tget_discount_html(doc) {\n\t\tif (doc.discount_amount) {\n\t\t\treturn `
\n\t\t\t\t\t\t
Discount (${doc.additional_discount_percentage} %)
\n\t\t\t\t\t\t
${format_currency(doc.discount_amount, doc.currency)}
\n\t\t\t\t\t
`;\n\t\t} else {\n\t\t\treturn ``;\n\t\t}\n\t}\n\n\tget_net_total_html(doc) {\n\t\treturn `
\n\t\t\t\t\t
${__('Net Total')}
\n\t\t\t\t\t
${format_currency(doc.net_total, doc.currency)}
\n\t\t\t\t
`;\n\t}\n\n\tget_taxes_html(doc) {\n\t\tif (!doc.taxes.length) return '';\n\n\t\tlet taxes_html = doc.taxes.map(t => {\n\t\t\t// if tax rate is 0, don't print it.\n\t\t\tconst description = /[0-9]+/.test(t.description) ? t.description : ((t.rate != 0) ? `${t.description} @ ${t.rate}%`: t.description);\n\t\t\treturn `\n\t\t\t\t
\n\t\t\t\t\t
${description}
\n\t\t\t\t\t
${format_currency(t.tax_amount_after_discount_amount, doc.currency)}
\n\t\t\t\t
\n\t\t\t`;\n\t\t}).join('');\n\n\t\treturn `
${taxes_html}
`;\n\t}\n\n\tget_grand_total_html(doc) {\n\t\treturn `
\n\t\t\t\t\t
${__('Grand Total')}
\n\t\t\t\t\t
${format_currency(doc.grand_total, doc.currency)}
\n\t\t\t\t
`;\n\t}\n\n\tget_payment_html(doc, payment) {\n\t\treturn `
\n\t\t\t\t\t
${__(payment.mode_of_payment)}
\n\t\t\t\t\t
${format_currency(payment.amount, doc.currency)}
\n\t\t\t\t
`;\n\t}\n\n\tbind_events() {\n\t\tthis.$summary_container.on('click', '.return-btn', () => {\n\t\t\tthis.events.process_return(this.doc.name);\n\t\t\tthis.toggle_component(false);\n\t\t\tthis.$component.find('.no-summary-placeholder').css('display', 'flex');\n\t\t\tthis.$summary_wrapper.css('display', 'none');\n\t\t});\n\n\t\tthis.$summary_container.on('click', '.edit-btn', () => {\n\t\t\tthis.events.edit_order(this.doc.name);\n\t\t\tthis.toggle_component(false);\n\t\t\tthis.$component.find('.no-summary-placeholder').css('display', 'flex');\n\t\t\tthis.$summary_wrapper.css('display', 'none');\n\t\t});\n\n\t\tthis.$summary_container.on('click', '.delete-btn', () => {\n\t\t\tthis.events.delete_order(this.doc.name);\n\t\t\tthis.show_summary_placeholder();\n\t\t});\n\n\t\tthis.$summary_container.on('click', '.send-btn', () => {\n\t\t\t// this.events.delete_order(this.doc.name);\n\t\t\t// this.show_summary_placeholder();\n\t\tconsole.log(this.pos_profile)\n\t\tvar field_names = this.pos_profile.custom_whatsapp_field_names.map(x => this.doc[x.field_names.toString()]);\n\t\t\tconsole.log(field_names)\n\t\t\tconsole.log(field_names.join(\",\"))\n\t\t\tvar message = \"https://wa.me/\" + this.doc.customer +\"?text=\"\n\t\t\tmessage += formatString(this.pos_profile.custom_whatsapp_message, field_names);\n\t\t\tconsole.log(message)\n\t\t\t// message += \"Hello, here is the file you requested.\"\n\t\t\tfrappe.call({\n\t\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.generate_pdf_and_save\",\n\t\t\t\targs: {\n\t\t\t\t\tdocname: this.doc.name,\n\t\t\t\t\tdoctype: this.doc.doctype,\n\t\t\t\t\tprint_format: this.pos_profile.print_format\n\t\t\t\t},\n\t\t\t\tfreeze: true,\n\t\t\t\tfreeze_message: \"Creating file then send to whatsapp thru link....\",\n\t\t\t\tcallback: function (r) {\n\t\t\t\t\tmessage += \"Please Find your invoice here \\n \"+window.origin+r.message.file_url\n\t\t\t\t\twindow.open(message)\n }\n\t\t\t})\n\t\t\t// this.toggle_component(false);\n\t\t\t// this.$component.find('.no-summary-placeholder').removeClass('d-none');\n\t\t\t// this.$summary_wrapper.addClass('d-none');\n\t\t});\n\t\tfunction formatString(str, args) {\n\t\t\treturn str.replace(/{(\\d+)}/g, function(match, number) {\n\t\t\t\treturn typeof args[number] !== 'undefined'\n\t\t\t\t\t? args[number]\n\t\t\t\t\t: match;\n\t\t\t});\n\t\t}\n\n\t\tthis.$summary_container.on('click', '.new-btn', () => {\n\t\t\tthis.events.new_order();\n\t\t\tthis.toggle_component(false);\n\t\t\tthis.$component.find('.no-summary-placeholder').css('display', 'flex');\n\t\t\tthis.$summary_wrapper.css('display', 'none');\n\t\t});\n\n\t\tthis.$summary_container.on('click', '.email-btn', () => {\n\t\t\tthis.email_dialog.fields_dict.email_id.set_value(this.customer_email);\n\t\t\tthis.email_dialog.show();\n\t\t});\n\n\t\tthis.$summary_container.on('click', '.print-btn', () => {\n\t\t\tthis.print_receipt();\n\t\t});\n\t}\n\n\tprint_receipt() {\n\t\tconst frm = this.events.get_frm();\n\t\tfrappe.utils.print(\n\t\t\tthis.doc.doctype,\n\t\t\tthis.doc.name,\n\t\t\tfrm.pos_print_format,\n\t\t\tthis.doc.letter_head,\n\t\t\tthis.doc.language || frappe.boot.lang\n\t\t);\n\t}\n\n\tattach_shortcuts() {\n\t\tconst ctrl_label = frappe.utils.is_mac() ? '\u2318' : 'Ctrl';\n\t\tthis.$summary_container.find('.print-btn').attr(\"title\", `${ctrl_label}+P`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+p\",\n\t\t\taction: () => this.$summary_container.find('.print-btn').click(),\n\t\t\tcondition: () => this.$component.is(':visible') && this.$summary_container.find('.print-btn').is(\":visible\"),\n\t\t\tdescription: __(\"Print Receipt\"),\n\t\t\tpage: cur_page.page.page\n\t\t});\n\t\tthis.$summary_container.find('.new-btn').attr(\"title\", `${ctrl_label}+Enter`);\n\t\tfrappe.ui.keys.on(\"ctrl+enter\", () => {\n\t\t\tconst summary_is_visible = this.$component.is(\":visible\");\n\t\t\tif (summary_is_visible && this.$summary_container.find('.new-btn').is(\":visible\")) {\n\t\t\t\tthis.$summary_container.find('.new-btn').click();\n\t\t\t}\n\t\t});\n\t\tthis.$summary_container.find('.edit-btn').attr(\"title\", `${ctrl_label}+E`);\n\t\tfrappe.ui.keys.add_shortcut({\n\t\t\tshortcut: \"ctrl+e\",\n\t\t\taction: () => this.$summary_container.find('.edit-btn').click(),\n\t\t\tcondition: () => this.$component.is(':visible') && this.$summary_container.find('.edit-btn').is(\":visible\"),\n\t\t\tdescription: __(\"Edit Receipt\"),\n\t\t\tpage: cur_page.page.page\n\t\t});\n\t}\n\n\tsend_email() {\n\t\tconst frm = this.events.get_frm();\n\t\tconst recipients = this.email_dialog.get_values().email_id;\n\t\tconst content = this.email_dialog.get_values().content;\n\t\tconst doc = this.doc || frm.doc;\n\t\tconst print_format = frm.pos_print_format;\n\n\t\tfrappe.call({\n\t\t\tmethod: \"frappe.core.doctype.communication.email.make\",\n\t\t\targs: {\n\t\t\t\trecipients: recipients,\n\t\t\t\tsubject: __(frm.meta.name) + ': ' + doc.name,\n\t\t\t\tcontent: content ? content : __(frm.meta.name) + ': ' + doc.name,\n\t\t\t\tdoctype: doc.doctype,\n\t\t\t\tname: doc.name,\n\t\t\t\tsend_email: 1,\n\t\t\t\tprint_format,\n\t\t\t\tsender_full_name: frappe.user.full_name(),\n\t\t\t\t_lang: doc.language\n\t\t\t},\n\t\t\tcallback: r => {\n\t\t\t\tif (!r.exc) {\n\t\t\t\t\tfrappe.utils.play_sound(\"email\");\n\t\t\t\t\tif (r.message[\"emails_not_sent_to\"]) {\n\t\t\t\t\t\tfrappe.msgprint(__(\n\t\t\t\t\t\t\t\"Email not sent to {0} (unsubscribed / disabled)\",\n\t\t\t\t\t\t\t[ frappe.utils.escape_html(r.message[\"emails_not_sent_to\"]) ]\n\t\t\t\t\t\t));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfrappe.show_alert({\n\t\t\t\t\t\t\tmessage: __('Email sent successfully.'),\n\t\t\t\t\t\t\tindicator: 'green'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.email_dialog.hide();\n\t\t\t\t} else {\n\t\t\t\t\tfrappe.msgprint(__(\"There were errors while sending email. Please try again.\"));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tadd_summary_btns(map) {\n\t\tthis.$summary_btns.html('');\n\t\tmap.forEach(m => {\n\t\t\tif (m.condition) {\n\t\t\t\tm.visible_btns.forEach(b => {\n\t\t\t\t\tconst class_name = b.split(' ')[0].toLowerCase();\n\t\t\t\t\tconst btn = __(b);\n\t\t\t\t\tthis.$summary_btns.append(\n\t\t\t\t\t\t`
${btn}
`\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.$summary_btns.children().last().removeClass('mr-4');\n\t}\n\n\ttoggle_summary_placeholder(show) {\n\t\tif (show) {\n\t\t\tthis.$summary_wrapper.css('display', 'none');\n\t\t\tthis.$component.find('.no-summary-placeholder').css('display', 'flex');\n\t\t} else {\n\t\t\tthis.$summary_wrapper.css('display', 'flex');\n\t\t\tthis.$component.find('.no-summary-placeholder').css('display', 'none');\n\t\t}\n\t}\n\n\tget_condition_btn_map(after_submission) {\n\t\tif (after_submission)\n\t\t\treturn [{ condition: true, visible_btns: ['Print Receipt', 'Email Receipt','Send Whatsapp', 'New Order'] }];\n\n\t\treturn [\n\t\t\t{ condition: this.doc.docstatus === 0, visible_btns: ['Print Receipt','Edit Order', 'Delete Order','Send Whatsapp'] },\n\t\t\t{ condition: !this.doc.is_return && this.doc.docstatus === 1, visible_btns: ['Print Receipt', 'Email Receipt', 'Return','Send Whatsapp']},\n\t\t\t{ condition: this.doc.is_return && this.doc.docstatus === 1, visible_btns: ['Print Receipt', 'Email Receipt','Send Whatsapp']}\n\t\t];\n\t}\n\n\tload_summary_of(doc, after_submission=false) {\n\t\tafter_submission ?\n\t\t\tthis.$component.css('grid-column', 'span 10 / span 10') :\n\t\t\tthis.$component.css('grid-column', 'span 6 / span 6');\n\n\t\tthis.toggle_summary_placeholder(false);\n\n\t\tthis.doc = doc;\n\n\t\tthis.attach_document_info(doc);\n\n\t\tthis.attach_items_info(doc);\n\n\t\tthis.attach_totals_info(doc);\n\n\t\tthis.attach_payments_info(doc);\n\n\t\tconst condition_btns_map = this.get_condition_btn_map(after_submission);\n\n\t\tthis.add_summary_btns(condition_btns_map);\n\t\tthis.$summary_wrapper.css(\"width\",after_submission ? \"35%\" : \"60%\");\n\n\t\tif (after_submission) {\n\t\t\tthis.print_receipt_on_order_complete();\n\t\t}\n\t}\n\n\tattach_document_info(doc) {\n\t\tfrappe.db.get_value('Customer', this.doc.customer, 'email_id').then(({ message }) => {\n\t\t\tthis.customer_email = message.email_id || '';\n\t\t\tconst upper_section_dom = this.get_upper_section_html(doc);\n\t\t\tthis.$upper_section.html(upper_section_dom);\n\t\t});\n\t}\n\n\tattach_items_info(doc) {\n\t\tthis.$items_container.html('');\n\t\tdoc.items.forEach(item => {\n\t\t\tconst item_dom = this.get_item_html(doc, item);\n\t\t\tthis.$items_container.append(item_dom);\n\t\t\tthis.set_dynamic_rate_header_width();\n\t\t});\n\t}\n\n\tset_dynamic_rate_header_width() {\n\t\tconst rate_cols = Array.from(this.$items_container.find(\".item-rate-disc\"));\n\t\tthis.$items_container.find(\".item-rate-disc\").css(\"width\", \"\");\n\t\tlet max_width = rate_cols.reduce((max_width, elm) => {\n\t\t\tif ($(elm).width() > max_width)\n\t\t\t\tmax_width = $(elm).width();\n\t\t\treturn max_width;\n\t\t}, 0);\n\n\t\tmax_width += 1;\n\t\tif (max_width == 1) max_width = \"\";\n\n\t\tthis.$items_container.find(\".item-rate-disc\").css(\"width\", max_width);\n\t}\n\n\tattach_payments_info(doc) {\n\t\tthis.$payment_container.html('');\n\t\tdoc.payments.forEach(p => {\n\t\t\tif (p.amount) {\n\t\t\t\tconst payment_dom = this.get_payment_html(doc, p);\n\t\t\t\tthis.$payment_container.append(payment_dom);\n\t\t\t}\n\t\t});\n\t\tif (doc.redeem_loyalty_points && doc.loyalty_amount) {\n\t\t\tconst payment_dom = this.get_payment_html(doc, {\n\t\t\t\tmode_of_payment: 'Loyalty Points',\n\t\t\t\tamount: doc.loyalty_amount,\n\t\t\t});\n\t\t\tthis.$payment_container.append(payment_dom);\n\t\t}\n\t}\n\n\tattach_totals_info(doc) {\n\t\tthis.$totals_container.html('');\n\n\t\tconst net_total_dom = this.get_net_total_html(doc);\n\t\tconst taxes_dom = this.get_taxes_html(doc);\n\t\tconst discount_dom = this.get_discount_html(doc);\n\t\tconst grand_total_dom = this.get_grand_total_html(doc);\n\t\tthis.$totals_container.append(net_total_dom);\n\t\tthis.$totals_container.append(taxes_dom);\n\t\tthis.$totals_container.append(discount_dom);\n\t\tthis.$totals_container.append(grand_total_dom);\n\t}\n\n\ttoggle_component(show) {\n\t\tshow ? this.$component.css('display', 'flex') : this.$component.css('display', 'none');\n\n\t}\n\n\tasync print_receipt_on_order_complete() {\n \n const profile_name = this.pos_profile?.name || this.pos_profile;\n\n const { message } = await frappe.db.get_value(\n \"POS Profile\",\n profile_name,\n [\"print_receipt_on_order_complete\", \"print_format\"]\n );\n\n if (message?.print_receipt_on_order_complete) {\n setTimeout(() => this.print_receipt(), 300);\n }\n \n}\n\n\t\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAO,QAAQ,qBAAqB;AACpC,MAAI,gBAAgB;AAEpB,UAAQ,YAAY,aAAa,MAAM;AAAA,IACtC,YAAY,SAAS;AACpB,cAAQ,IAAI,gBAAgB;AAC5B,WAAK,UAAU,EAAE,OAAO,EAAE,KAAK,sBAAsB;AACrD,WAAK,OAAO,QAAQ;AACpB,aAAO,aAAa;AAAA,QACnB,MAAM,KAAK,gBAAgB;AAAA,QAC3B,MAAM,KAAK,oBAAoB,EAAE;AAAA,QACjC,MAAM,KAAK,gBAAgB;AAAA,MAC5B,CAAC;AAAA,IAIF;AAAA,IAEA,oBAAoB,OAAO;AAC1B,aAAO,OAAO,KAAK,kEAAkE,EAAE,QAAQ,OAAO,QAAQ,MAAM,SAAS,MAAM,CAAC;AAAA,IACrI;AAAA,IAEA,oBAAoB,QAAQ,IAAI;AAC/B,WAAK,oBAAoB,KAAK,EAAE,KAAK,CAAC,MAAM;AAC3C,YAAI,EAAE,QAAQ,QAAQ;AAErB,eAAK,qBAAqB,EAAE,QAAQ,EAAE;AAAA,QACvC,OAAO;AACN,eAAK,uBAAuB;AAAA,QAC7B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,yBAAyB;AACxB,YAAM,KAAK;AACX,YAAM,eAAe;AAAA,QACpB;AAAA,UACC,WAAW;AAAA,UAAmB,WAAW;AAAA,UACzC,cAAc;AAAA,UAAG,OAAO;AAAA,UACxB,SAAS;AAAA,UAAmB,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,UACC,WAAW;AAAA,UAAkB,WAAW;AAAA,UACxC,cAAc;AAAA,UAAG,OAAO;AAAA,UACxB,SAAS;AAAA,UACT,QAAQ,WAAY;AACnB,mBAAO,YAAY,gBAAgB,GAAG,KAAK,KAAK,OAAK;AACpD,kBAAI,EAAE,OAAO,KAAK,IAAI,KAAK;AAC1B,kBAAE,iBAAiB,KAAK;AACxB,uBAAO,YAAY,gBAAgB,KAAK,QAAQ;AAChD,uBAAO;AAAA,cACR;AAAA,YACD,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AACA,YAAM,4BAA4B,MAAM;AACvC,cAAM,cAAc,OAAO,YAAY,YAAY,UAAU;AAC7D,YAAI,CAAC;AAAa;AAClB,eAAO,GAAG,QAAQ,eAAe,WAAW,EAAE,KAAK,CAAC,EAAE,SAAS,MAAM;AACpE,iBAAO,YAAY,gBAAgB,GAAG,OAAO,CAAC;AAC9C,mBAAS,QAAQ,SAAO;AACvB,kBAAM,EAAE,gBAAgB,IAAI;AAC5B,mBAAO,YAAY,gBAAgB,GAAG,KAAK,KAAK,EAAE,iBAAiB,gBAAgB,IAAI,CAAC;AAAA,UACzF,CAAC;AACD,iBAAO,YAAY,gBAAgB,KAAK,QAAQ;AAAA,QACjD,CAAC;AAAA,MACF;AACA,YAAM,SAAS,IAAI,OAAO,GAAG,OAAO;AAAA,QACnC,OAAO,GAAG,0BAA0B;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACP;AAAA,YACC,WAAW;AAAA,YAAQ,OAAO,GAAG,SAAS;AAAA,YAAG,SAAS,OAAO,SAAS,YAAY,SAAS;AAAA,YACvF,SAAS;AAAA,YAAW,WAAW;AAAA,YAAW,MAAM;AAAA,UACjD;AAAA,UACA;AAAA,YACC,WAAW;AAAA,YAAQ,OAAO,GAAG,aAAa;AAAA,YAC1C,SAAS;AAAA,YAAe,WAAW;AAAA,YAAe,MAAM;AAAA,YACxD,WAAW,MAAM,kBAAkB;AAAA,YACnC,UAAU,MAAM,0BAA0B;AAAA,UAC3C;AAAA,UACA;AAAA,YACC,WAAW;AAAA,YACX,WAAW;AAAA,YACX,OAAO;AAAA,YACP,iBAAiB;AAAA,YACjB,eAAe;AAAA,YACf,MAAM;AAAA,YACN,MAAM,CAAC;AAAA,YACP,QAAQ;AAAA,UACT;AAAA,QACD;AAAA,QACA,gBAAgB,eAAe,EAAE,SAAS,aAAa,gBAAgB,GAAG;AACzE,cAAI,CAAC,gBAAgB,QAAQ;AAC5B,mBAAO,WAAW;AAAA,cACjB,SAAS,GAAG,0DAA0D;AAAA,cACtE,WAAW;AAAA,YACZ,CAAC;AACD,mBAAO,OAAO,MAAM,WAAW,OAAO;AAAA,UACvC;AAGA,4BAAkB,gBAAgB,OAAO,OAAK,EAAE,eAAe;AAE/D,gBAAM,SAAS;AACf,gBAAM,MAAM,MAAM,OAAO,KAAK,EAAE,QAAQ,MAAM,EAAE,aAAa,SAAS,gBAAgB,GAAG,QAAO,KAAK,CAAC;AACtG,WAAC,IAAI,OAAO,GAAG,qBAAqB,IAAI,OAAO;AAC/C,iBAAO,KAAK;AAAA,QACb;AAAA,QACA,sBAAsB,GAAG,QAAQ;AAAA,MAClC,CAAC;AACD,aAAO,KAAK;AACZ,YAAM,oBAAoB,MAAM;AAC/B,eAAO;AAAA,UACN,OAAO;AAAA,UACP,SAAS,EAAE,SAAS,OAAO,YAAY,QAAQ,UAAU,EAAE;AAAA,QAC5D;AAAA,MACD;AAAA,IACD;AAAA,IAEA,MAAM,qBAAqB,MAAM;AAChC,WAAK,cAAc,KAAK;AACxB,WAAK,UAAU,KAAK;AACpB,WAAK,cAAc,KAAK;AACxB,WAAK,mBAAmB,KAAK;AAC7B,WAAK,iBAAiB,CAAC;AACvB,WAAK,WAAW,CAAC;AACjB,aAAO,sBAAsB,KAAK;AAClC,aAAO,GAAG,UAAU,kBAAkB,QAAW,sBAAsB,EAAE,KAAK,CAAC,EAAE,QAAQ,MAAM;AAC9F,aAAK,uBAAuB,IAAI,QAAQ,oBAAoB,KAAK;AAAA,MAClE,CAAC;AAED,aAAO,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,MAAM,EAAE,eAAe,KAAK,YAAY;AAAA,QACxC,UAAU,CAAC,QAAQ;AAClB,gBAAM,UAAU,IAAI;AAEpB,iBAAO,OAAO,KAAK,UAAU,OAAO;AACpC,eAAK,SAAS,kBAAkB,QAAQ,gBAAgB,IAAI,WAAS,MAAM,IAAI;AAE/E,eAAK,SAAS;AAAA,QACf;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,2BAA2B;AAC1B,WAAK,KAAK;AAAA,QACT;AAAA,8DAC2D,KAAK;AAAA,iBAClD,OAAO,KAAK,gBAAgB,EAAE,OAAO,gBAAgB;AAAA;AAAA;AAAA,MAE3D;AAAA,IACV;AAAA,IAEA,WAAW;AACV,WAAK,YAAY;AACjB,WAAK,mBAAmB;AACxB,WAAK,aAAa;AAClB,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,cAAc;AACb,WAAK,QAAQ;AAAA,QACZ;AAAA,MACD;AAEA,WAAK,sBAAsB,KAAK,QAAQ,KAAK,oBAAoB;AAAA,IAClE;AAAA,IAEA,qBAAqB;AACpB,WAAK,mBAAmB;AACxB,WAAK,kBAAkB;AACvB,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,uBAAuB;AAC5B,WAAK,mBAAmB;AAAA,IACzB;AAAA,IAEA,eAAe;AACd,WAAK,KAAK,WAAW;AACrB,UAAG,KAAK,SAAS,4BAA2B;AAC3C,aAAK,KAAK,cAAc,GAAG,gBAAgB,GAAG,KAAK,eAAe,KAAK,IAAI,GAAG,OAAO,QAAQ;AAAA,MAC9F;AACA,UAAG,KAAK,SAAS,kCAAkC;AAClD,aAAK,KAAK,cAAc,GAAG,sBAAsB,GAAG,KAAK,oBAAoB,KAAK,IAAI,GAAG,OAAO,QAAQ;AAAA,MACzG;AACA,UAAG,KAAK,SAAS,2BAA2B;AAC3C,aAAK,KAAK,cAAc,GAAG,eAAe,GAAG,KAAK,mBAAmB,KAAK,IAAI,GAAG,OAAO,QAAQ;AAAA,MACjG;AACA,UAAG,KAAK,SAAS,2BAA2B;AAC3C,aAAK,KAAK,cAAc,GAAG,eAAe,GAAG,KAAK,UAAU,KAAK,IAAI,GAAG,OAAO,cAAc;AAAA,MAC9F;AAAA,IACD;AAAA,IAEA,iBAAiB;AAChB,aAAO,MAAM,KAAK,KAAK,IAAI,GAAG;AAC9B,aAAO,UAAU,QAAQ,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI;AAAA,IACjE;AAAA,IAEA,sBAAsB;AACrB,YAAM,OAAO,KAAK,kBAAkB,WAAW,GAAG,SAAS;AAC3D,WAAK,yBAAyB,IAAI;AAAA,IACnC;AAAA,IAEA,qBAAqB;AACpB,UAAI,CAAC,KAAK,oBAAoB,GAAG,UAAU;AAAG;AAC9C,cAAQ,IAAI,KAAK,IAAI,IAAI,KAAK;AAC9B,UAAI,KAAK,IAAI,IAAI,MAAM,UAAU,GAAG;AACnC,eAAO,WAAW;AAAA,UACjB,SAAS,GAAG,oDAAoD;AAAA,UAChE,WAAU;AAAA,QACX,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,MACD;AAEA,WAAK,IAAI,KAAK,QAAW,QAAW,QAAW,MAAM;AACpD,eAAO,WAAW;AAAA,UACjB,SAAS,GAAG,yCAAyC;AAAA,UACrD,WAAW;AAAA,QACZ,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAAA,MAChC,CAAC,EAAE,KAAK,MAAM;AACb,eAAO,aAAa;AAAA,UACnB,MAAM,OAAO,IAAI,OAAO;AAAA,UACxB,MAAM,KAAK,iBAAiB,KAAK;AAAA,UACjC,MAAM,OAAO,IAAI,SAAS;AAAA,QAG3B,CAAC;AAAA,MAIF,CAAC;AAAA,IACF;AAAA,IAEA,YAAY;AACX,UAAI,CAAC,KAAK,oBAAoB,GAAG,UAAU;AAAG;AAE9C,UAAI,UAAU,OAAO,MAAM,YAAY,mBAAmB;AAC1D,cAAQ,cAAc,KAAK,IAAI,IAAI;AACnC,cAAQ,OAAO,OAAO,QAAQ;AAC9B,cAAQ,UAAU,KAAK,IAAI,IAAI;AAC/B,cAAQ,oBAAoB,KAAK;AACjC,cAAQ,kBAAkB,OAAO,SAAS,aAAa;AACvD,cAAQ,eAAe,OAAO,SAAS,SAAS;AAChD,cAAQ,eAAe,OAAO,SAAS,SAAS;AAChD,aAAO,UAAU,QAAQ,qBAAqB,QAAQ,IAAI;AAAA,IAC3D;AAAA,IAEA,qBAAqB;AACpB,UAAG,KAAK,KAAI;AACZ,aAAK,IAAI,IAAI,gBAAgB,KAAK,SAAS;AAAA,MAC3C;AACA,WAAK,gBAAgB,IAAI,QAAQ,YAAY,aAAa;AAAA,QACzD,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,QACf,eAAe,KAAK;AAAA,QACpB,UAAU,KAAK,SAAS;AAAA,QACxB,QAAQ;AAAA,UACP,qBAAqB,MAAM,KAAK,oBAAoB;AAAA,UACpD,eAAe,UAAQ,KAAK,eAAe,IAAI;AAAA,UAC/C,gBAAgB,MAAM,KAAK,eAAe;AAAA,UAC1C,mBAAmB,MAAM,KAAK,kBAAkB;AAAA,UAChD,cAAc,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,UAC9C,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,QAC7B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,aAAa,OAAM;AAClB,UAAI,KAAK;AACT,WAAK,MAAM;AACX,WAAK,KAAK,aAAa;AAAA,IACxB;AAAA,IAEA,iBAAiB;AAChB,WAAK,OAAO,IAAI,QAAQ,YAAY,SAAS;AAAA,QAC5C,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,UACP,SAAS,MAAM,KAAK;AAAA,UACpB,uBAAuB,CAAC,SAAS;AAChC,iBAAK,aAAa,eAAe;AACjC,iBAAK,aAAa,OAAO,KAAK;AAC9B,iBAAK,aAAa,UAAS,KAAK;AAAA,UAEjC;AAAA,UACA,cAAc,CAAC,MAAM,OAAO,UAAU;AACrC,iBAAK,aAAa,eAAe;AACjC,kBAAM,WAAW,OAAO,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI;AAC7D,gBAAG,UAAU,SAAS,KAAK,IAAI,IAAI,aAAa,SAAQ,GAAE;AACzD,qBAAO,MAAM,0CAA2C;AAAA,YACzD;AACA,gBAAI,YAAY,SAAS,UAAU,OAAO;AACzC,oBAAM,OAAO;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA,MAAM,KAAK,aAAa;AAAA,cACzB;AACA,qBAAO,KAAK,eAAe,IAAI;AAAA,YAChC;AAEA,mBAAO,QAAQ,QAAQ;AAAA,UACxB;AAAA,UACA,mBAAmB,CAAC,SAAS;AAE5B,kBAAM,WAAW,KAAK,kBAAkB,IAAI;AAE5C,gBAAG,iBAAiB,cAAc,WAAW,KAAK,SAAQ;AACzD,8BAAgB;AAAA,YACjB,OAAO;AACN,8BAAgB;AAAA,YACjB;AACA,iBAAK,aAAa,4BAA4B,QAAQ;AAAA,UACvD;AAAA,UAEA,cAAc,CAAC,OAAO,WAAW,KAAK,kBAAkB,OAAO,MAAM;AAAA,UAErE,UAAU,MAAM,KAAK,kBAAkB;AAAA,UAEvC,WAAW,MAAM,KAAK,QAAQ,UAAU;AAAA,UACxC,oBAAoB,MAAM,KAAK,mBAAmB;AAAA,UAClD,qBAAqB,MAAM,KAAK,oBAAoB;AAAA,UACpD,0BAA0B,CAAC,YAAY;AACtC,iBAAK,mBAAmB;AAExB,iBAAK,QAAQ,mCAAmC;AAAA,UACjD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,oBAAoB;AACnB,WAAK,eAAe,IAAI,QAAQ,YAAY,YAAY;AAAA,QACvD,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,UACP,SAAS,MAAM,KAAK;AAAA,UAEpB,sBAAsB,CAAC,aAAa;AACnC,iBAAK,cAAc,gBAAgB,QAAQ;AAC3C,iBAAK,KAAK,cAAc,QAAQ;AAAA,UACjC;AAAA,UAEA,cAAc,CAAC,MAAM,OAAO,UAAU;AACrC,kBAAM,WAAW,OAAO,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI;AAC7D,gBAAG,UAAU,SAAS,KAAK,IAAI,IAAI,aAAa,SAAQ,GAAE;AACzD,qBAAO,MAAM,0CAA2C;AAAA,YACzD;AACA,gBAAI,YAAY,SAAS,UAAU,OAAO;AACzC,oBAAM,OAAO;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA,MAAM,KAAK,aAAa;AAAA,cACzB;AACA,qBAAO,KAAK,eAAe,IAAI;AAAA,YAChC;AAEA,mBAAO,QAAQ,QAAQ;AAAA,UACxB;AAAA,UAEA,qBAAqB,CAAC,SAAS;AAC9B,kBAAM,YAAY,KAAK,KAAK,cAAc,IAAI;AAC9C,iBAAK,KAAK,sBAAsB,SAAS;AAAA,UAC1C;AAAA,UAEA,oBAAoB,CAAC,cAAc;AAClC,iBAAK,KAAK,yBAAyB,SAAS;AAAA,UAC7C;AAAA,UACA,gCAAgC,CAAC,UAAU,UAAU;AACpD,iBAAK,KAAK,mCAAmC,UAAU,OAAO,KAAK,aAAa,YAAY;AAAA,UAC7F;AAAA,UACA,6BAA6B,CAAC,kBAAkB,SAAS;AAGxD,mBAAO,KAAK,gBAAgB,EAAE,QAAQ,WAAS;AAC9C,oBAAM,gBAAgB,KAAK,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,QAAQ,KAAK,IAAI;AACtE,oBAAM,UAAU,KAAK,IAAI,UAAU,SAAS,mBAAK,cAAe;AAEhE,sBAAQ,WAAW;AACnB,sBAAQ,YAAY,iBAAiB,OAAO,KAAK;AAAA,CAAI;AACrD,sBAAQ,MAAM,iBAAiB,OAAO;AACtC,mBAAK,IAAI,IAAI,MAAM,QAAQ,SAAO;AACjC,oBAAI,KAAK,cAAc,IAAI,WAAW;AACrC,uBAAK,iBAAiB,GAAG;AAAA,gBAC1B;AAAA,cACD,CAAC;AAAA,YACF,CAAC;AAAA,UACF;AAAA,UACA,uBAAuB,MAAM,KAAK,sBAAsB;AAAA,UACxD,oBAAoB,MAAM,KAAK;AAAA,UAC/B,oBAAoB,MAAM;AACzB,4BAAgB;AAChB,iBAAK,aAAa,4BAA4B,IAAI;AAClD,iBAAK,KAAK,cAAc;AACxB,iBAAK,KAAK,sBAAsB;AAAA,UACjC;AAAA,UACA,qBAAqB,CAAC,WAAW,cAAc,KAAK,oBAAoB,WAAW,SAAS;AAAA,QAC7F;AAAA,MACD,CAAC;AACD,UAAG,eAAc;AAChB,aAAK,aAAa,4BAA4B,aAAa;AAAA,MAC5D;AAAA,IACD;AAAA,IAEA,gBAAgB;AACf,WAAK,UAAU,IAAI,QAAQ,YAAY,QAAQ;AAAA,QAC9C,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,UACP,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,UAE5B,sBAAsB,MAAM,KAAK,oBAAoB,CAAC;AAAA,UAEtD,uBAAuB,CAAC,SAAS;AAChC,gBAAI,MAAM;AACT,mBAAK,aAAa,WAAW,GAAG,UAAU,IAAI,KAAK,aAAa,WAAW,IAAI,WAAW,MAAM,IAAI;AACpG,mBAAK,cAAc,iBAAiB,KAAK;AAAA,YAC1C,OAAO;AACN,mBAAK,cAAc,iBAAiB,IAAI;AAAA,YACzC;AAAA,UACD;AAAA,UAEA,gBAAgB,MAAM;AACrB,iBAAK,IAAI,WAAW,EAClB,KAAK,CAAC,MAAM;AACZ,mBAAK,kBAAkB,KAAK;AAC5B,mBAAK,cAAc,iBAAiB,IAAI;AACxC,mBAAK,cAAc,gBAAgB,KAAK,IAAI,KAAK,IAAI;AACrD,qBAAO,WAAW;AAAA,gBACjB,WAAW;AAAA,gBACX,SAAS,GAAG,uCAAuC,CAAC,EAAE,IAAI,IAAI,CAAC;AAAA,cAChE,CAAC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,yBAAyB;AACxB,WAAK,oBAAoB,IAAI,QAAQ,YAAY,cAAc;AAAA,QAC9D,SAAS,KAAK;AAAA,QACd,QAAQ;AAAA,UACP,mBAAmB,CAAC,SAAS;AAC5B,mBAAO,GAAG,QAAQ,iBAAiB,IAAI,EAAE,KAAK,CAAC,QAAQ;AACtD,mBAAK,cAAc,gBAAgB,GAAG;AAAA,YACvC,CAAC;AAAA,UACF;AAAA,UACA,eAAe,MAAM,KAAK,cAAc,2BAA2B,IAAI;AAAA,UACvE,iBAAiB,MAAM;AACtB,iBAAK,kBAAkB,iBAAiB,KAAK;AAC7C,iBAAK,KAAK,aAAa;AACvB,iBAAK,cAAc,iBAAiB,IAAI;AACxC,iBAAK,QAAQ,KAAK,qBAAqB,EAAE,IAAI,WAAU,MAAM;AAAA,UAC9D;AAAA,QAED;AAAA,QACA,UAAU,KAAK;AAAA,MAChB,CAAC;AAAA,IACF;AAAA,IAEA,qBAAqB;AACpB,WAAK,gBAAgB,IAAI,QAAQ,YAAY,iBAAiB;AAAA,QAC7D,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,QAAQ;AAAA,UACP,SAAS,MAAM,KAAK;AAAA,UAEpB,gBAAgB,CAAC,SAAS;AACzB,iBAAK,kBAAkB,iBAAiB,KAAK;AAC7C,mBAAO,GAAG,QAAQ,iBAAiB,IAAI,EAAE,KAAK,CAAC,QAAQ;AACtD,qBAAO,aAAa;AAAA,gBACnB,MAAM,KAAK,oBAAoB,GAAG;AAAA,gBAClC,MAAM,KAAK,KAAK,aAAa;AAAA,gBAC7B,MAAM,KAAK,cAAc,iBAAiB,IAAI;AAAA,cAC/C,CAAC;AAAA,YACF,CAAC;AAAA,UACF;AAAA,UACA,YAAY,CAAC,SAAS;AACrB,oBAAQ,IAAI,eAAe;AAC3B,iBAAK,kBAAkB,iBAAiB,KAAK;AAC7C,mBAAO,aAAa;AAAA,cACnB,MAAM,KAAK,IAAI,QAAQ,IAAI;AAAA,cAC3B,MAAM,KAAK,IAAI,KAAK,wBAAwB;AAAA,cAC5C,MAAM,KAAK,KAAK,aAAa;AAAA,cAC7B,MAAM,KAAK,cAAc,iBAAiB,IAAI;AAAA,YAC/C,CAAC;AAAA,UACF;AAAA,UACA,cAAc,CAAC,SAAS;AACvB,mBAAO,MAAM,WAAW,KAAK,IAAI,IAAI,SAAS,MAAM,MAAM;AACzD,mBAAK,kBAAkB,aAAa;AAAA,YACrC,CAAC;AAAA,UACF;AAAA,UACA,WAAW,MAAM;AAChB,mBAAO,aAAa;AAAA,cACnB,MAAM,OAAO,IAAI,OAAO;AAAA,cACxB,MAAM,KAAK,iBAAiB;AAAA,cAC5B,MAAM,KAAK,cAAc,iBAAiB,IAAI;AAAA,cAC9C,MAAM,OAAO,IAAI,SAAS;AAAA,YAC3B,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,yBAAyB,MAAM;AAC9B,WAAK,kBAAkB,CAAC,IAAI;AAC5B,WAAK,kBAAkB,iBAAiB,IAAI;AAC5C,WAAK,cAAc,iBAAiB,IAAI;AAAA,IACzC;AAAA,IAEA,kBAAkB,MAAM;AACvB,WAAK,KAAK,iBAAiB,IAAI;AAC/B,WAAK,cAAc,iBAAiB,IAAI;AAGxC,OAAC,OAAQ,KAAK,aAAa,iBAAiB,KAAK,KAAK,KAAK,QAAQ,iBAAiB,KAAK,IAAK;AAAA,IAC/F;AAAA,IAEA,iBAAiB,YAAU,OAAO;AACjC,UAAG,WAAU;AACZ,eAAO,OAAO,aAAa;AAAA,UAC1B,MAAM,OAAO,IAAI,OAAO;AAAA,UACxB,MAAM,KAAK,uBAAuB;AAAA,UAClC,MAAM,KAAK,qBAAqB;AAAA,UAChC,MAAM,KAAK,uBAAuB;AAAA,UAClC,MAAM,KAAK,KAAK,aAAa;AAAA,UAC7B,MAAM,OAAO,IAAI,SAAS;AAAA,UAC1B,MAAM,KAAK,oBAAoB;AAAA,QAChC,CAAC;AAAA,MACF,OAAO;AACN,eAAO,OAAO,aAAa;AAAA,UAC1B,MAAM,OAAO,IAAI,OAAO;AAAA,UACxB,MAAM,KAAK,uBAAuB;AAAA,UAClC,MAAM,KAAK,qBAAqB;AAAA,UAChC,MAAM,KAAK,uBAAuB;AAAA,UAClC,MAAM,KAAK,KAAK,aAAa;AAAA,UAC7B,MAAM,OAAO,IAAI,SAAS;AAAA,QAC3B,CAAC;AAAA,MACF;AAAA,IAED;AAAA,IAEA,yBAAyB;AACxB,YAAM,UAAU;AAChB,aAAO,IAAI,QAAQ,aAAW;AAC7B,YAAI,KAAK,KAAK;AACb,eAAK,MAAM,KAAK,YAAY,KAAK,GAAG;AACpC,eAAK,IAAI,IAAI,QAAQ,CAAC;AACtB,eAAK,IAAI,IAAI,SAAS;AACtB,eAAK,IAAI,IAAI,gBAAgB,KAAK,SAAS;AAC3C,kBAAQ;AAAA,QACT,OAAO;AACN,iBAAO,MAAM,aAAa,SAAS,MAAM;AACxC,iBAAK,MAAM,KAAK,YAAY;AAC5B,iBAAK,IAAI,IAAI,QAAQ,CAAC;AACtB,iBAAK,IAAI,IAAI,SAAS;AACtB,iBAAK,IAAI,IAAI,gBAAgB,KAAK,SAAS;AAC3C,oBAAQ;AAAA,UACT,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,YAAY,MAAM;AACjB,YAAM,UAAU;AAChB,YAAM,OAAO,EAAE,OAAO;AACtB,YAAM,MAAM,QAAQ,IAAI,OAAO,GAAG,KAAK,KAAK,SAAS,MAAM,KAAK;AAChE,YAAM,OAAO,OAAO,MAAM,0BAA0B,SAAS,IAAI;AACjE,UAAI,QAAQ,IAAI;AAEhB,aAAO;AAAA,IACR;AAAA,IAEA,MAAM,oBAAoB,KAAK;AAC9B,aAAO,IAAI,OAAO;AAClB,WAAK,MAAM,KAAK,YAAY,KAAK,GAAG;AACpC,WAAK,IAAI,IAAI,QAAQ,CAAC;AACtB,aAAO,OAAO,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM;AAAA,UACL,eAAe,IAAI;AAAA,UACnB,cAAc,KAAK,IAAI;AAAA,QACxB;AAAA,QACA,UAAU,CAAC,MAAM;AAEhB,iBAAO,MAAM,KAAK,EAAE,OAAO;AAC3B,iBAAO,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,IAAI,EAAE,sBAAsB;AACxE,eAAK,qBAAqB,EAAE,KAAK,MAAM;AACtC,mBAAO,IAAI,SAAS;AAAA,UACrB,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,uBAAuB;AACtB,UAAI,KAAK,WAAW,CAAC,KAAK,IAAI,IAAI;AAAS,aAAK,IAAI,IAAI,UAAU,KAAK;AACvE,WAAK,KAAK,eAAe,CAAC,KAAK,IAAI,IAAI,gBAAgB,KAAK,IAAI,IAAI,aAAa,KAAK,eAAe,KAAK,IAAI,IAAI,cAAc;AAC/H,aAAK,IAAI,IAAI,cAAc,KAAK;AAAA,MACjC;AAEA,UAAI,CAAC,KAAK,IAAI,IAAI;AAAS;AAE3B,aAAO,KAAK,IAAI,QAAQ,cAAc;AAAA,IACvC;AAAA,IAEA,yBAAyB;AACxB,WAAK,KAAK,cAAc,KAAK,aAAa,MAAM;AAAA,IACjD;AAAA,IAEA,MAAM,eAAe,MAAM;AAE1B,cAAQ,IAAI,eAAe;AAC3B,UAAI,WAAW;AACf,UAAI;AACH,YAAI,EAAE,OAAO,OAAO,KAAK,IAAI;AAC7B,mBAAW,KAAK,kBAAkB,IAAI;AACtC,cAAM,kBAAkB,CAAC,EAAE,cAAc,QAAQ;AAEjD,cAAM,gBAAgB,UAAU,SAAS,UAAU;AACnD,YAAI;AACH,kBAAQ,IAAI,SAAS,SAAS,IAAI,IAAI,KAAK;AAE5C,YAAI,iBAAiB;AACpB,cAAI,UAAU;AACb,oBAAQ,IAAI,KAAK;AAElB,cAAI,CAAC,OAAO,mBAAmB,EAAE,SAAS,KAAK,KAAK,QAAQ,KAAK,CAAC,KAAK,sBAAsB;AAC5F,kBAAM,aAAa,UAAU,QAAQ,QAAQ,SAAS,oBAAoB,SAAS,MAAM;AAAA,UAE1F;AAEA,cAAI,KAAK,6BAA6B,QAAQ,KAAK,eAAe;AACjE,kBAAM,OAAO,MAAM,UAAU,SAAS,SAAS,SAAS,MAAM,OAAO,KAAK;AAAA,UAE3E;AAAA,QAED,OAAO;AACN,cAAI,CAAC,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,SAAS,qCAAoC;AAChF,mBAAO,KAAK,+BAA+B;AAAA,UAC5C;AACA,iBAAO,MAAM,kCAAkC;AAC/C,gBAAM,EAAE,WAAW,UAAU,WAAW,MAAM,KAAK,gBAAgB,kBAAkB,oBAAoB,IAAI;AAC7G,cAAI,CAAC;AACJ;AAED,cAAI,KAAK,SAAS,uBAAuB;AACxC,kBAAM,iBAAiB,MAAM,KAAK,mBAAmB,SAAS;AAC9D,gBAAI,kBAAkB,MAAM,QAAQ,eAAe,KAAK,GAAG;AAC1D,oBAAM,eAAe,eAAe,MAAM,IAAI,kBAAgB;AAAA,gBAC7D,WAAW,YAAY;AAAA,gBACvB,KAAK,YAAY,MAAM;AAAA,gBACvB,MAAM,YAAY;AAAA,gBAClB,KAAK,YAAY;AAAA,cAClB,EAAE;AAEF,yBAAW,eAAe,cAAc;AACvC,sBAAM,kBAAkB,KAAK,IAAI,UAAU,SAAS,WAAW;AAC/D,sBAAM,KAAK,wBAAwB,eAAe;AAAA,cACnD;AAEA,mBAAK,iBAAiB;AACtB;AAAA,YACD;AAAA,UACD;AAEA,gBAAM,WAAW,EAAE,WAAW,UAAU,MAAM,KAAK,CAAC,QAAQ,MAAM;AAClE,cAAG,OAAM;AACR,qBAAS,SAAS;AAAA,UACnB;AACA,cAAI,WAAW;AACd,kBAAM,KAAK,6BAA6B,WAAW,KAAK,IAAI,IAAI,eAAe,SAAS;AACxF,qBAAS,eAAe;AAAA,UACzB;AAEA,cAAI,UAAU;AACb,qBAAS,SAAS,MAAM,MAAM;AAAA,CAAI,EAAE,UAAU;AAC/C,qBAAW,KAAK,IAAI,UAAU,SAAS,QAAQ;AAE/C,gBAAM,KAAK,wBAAwB,QAAQ;AAC3C,mBAAS,UAAU;AACnB,mBAAS,oBAAoB;AAC7B,mBAAS,2BAA2B;AACpC,mBAAS,sBAAsB;AAC/B,mBAAS,yBAAyB;AAElC,cAAI,KAAK,aAAa,WAAW,GAAG,UAAU;AAC7C,iBAAK,qBAAqB,QAAQ;AAEnC,cAAI,KAAK,oCAAoC,QAAQ,KAAK,CAAC,KAAK,aAAa,WAAW,GAAG,UAAU;AACpG,iBAAK,qBAAqB,QAAQ;AAAA,QACpC;AAAA,MAED,SAAS,OAAP;AACD,gBAAQ,IAAI,KAAK;AAAA,MAClB,UAAE;AAGD,YAAI,sBAAsB;AAC1B,aAAK,IAAI,IAAI,MAAM,QAAQ,UAAQ;AAClC,iCAAwB,WAAW,KAAK,cAAc,IAAI,KAAK;AAAA,QAChE,CAAC;AACD,aAAK,cAAc,2BAA2B,mBAAmB;AAEjE,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IAEA,iCAAiC;AAChC,aAAO,IAAI,SAAS;AACpB,aAAO,WAAW;AAAA,QACjB,SAAS,GAAG,mDAAmD;AAAA,QAC/D,WAAW;AAAA,MACZ,CAAC;AACD,aAAO,MAAM,WAAW,OAAO;AAAA,IAChC;AAAA,IACA,MAAM,mBAAmB,WAAW;AACnC,YAAM,WAAW,MAAM,OAAO,KAAK;AAAA,QAClC,QAAQ;AAAA,QACR,MAAM;AAAA,UACL;AAAA,QACD;AAAA,MACA,CAAC;AACF,aAAO,SAAS;AAAA,IACjB;AAAA,IAEA,kBAAkB,EAAE,MAAM,WAAW,UAAU,KAAK,KAAK,GAAG;AAC3D,UAAI,WAAW;AAEf,UAAI,MAAM;AACT,mBAAW,KAAK,IAAI,IAAI,MAAM,KAAK,CAAAA,OAAKA,GAAE,QAAQ,IAAI;AAAA,MACvD,OAAO;AAIN,iBAAS,IAAI,GAAG,IAAI,QAAQ,IAAI,MAAM,QAAQ,KAAK,GAAG;AACrD,gBAAM,eAAgB,aAAa,UAAU,aAAa;AAC1D,gBAAM,iBAAiB,KAAK,SAAS,yCACjC,gBAAgB,QAAQ,IAAI,MAAM,GAAG,aAAa,WACnD;AAEH,cACC,QAAQ,IAAI,MAAM,GAAG,cAAc,aACnC,QAAQ,IAAI,MAAM,GAAG,QAAQ,OAC7B,WAAW,QAAQ,IAAI,MAAM,GAAG,IAAI,MAAM,WAAW,IAAI,KACzD,gBACC;AACD,uBAAW,QAAQ,IAAI,MAAM;AAC7B;AAAA,UACD;AAAA,QACD;AACA,gBAAQ,IAAI,QAAQ;AAAA,MACrB;AACA,aAAO,YAAY,CAAC;AAAA,IACrB;AAAA,IAGA,qBAAqB,UAAU;AAC9B,WAAK,aAAa,4BAA4B,QAAQ;AAAA,IACvD;AAAA,IAEA,6BAA6B,UAAU;AACtC,aAAO,SAAS,QAAQ,KAAK,aAAa,aAAa;AAAA,IACxD;AAAA,IAEA,iBAAiB,UAAU,aAAa;AACvC,WAAK,KAAK,iBAAiB,UAAU,WAAW;AAEhD,WAAK,KAAK,sBAAsB,KAAK,GAAG;AAAA,IAEzC;AAAA,IAEA,oCAAoC,UAAU;AAG7C,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,SAAS;AACzB,YAAM,qBAAqB,CAAC,SAAS;AACrC,YAAM,oBAAoB,CAAC,SAAS;AAEpC,UAAK,cAAc,sBAAwB,WAAW,qBACpD,cAAc,YAAY,qBAAqB,qBAAsB;AACtE,eAAO;AAAA,MACR;AACA,aAAO;AAAA,IACR;AAAA,IAEA,MAAM,wBAAwB,UAAU;AACvC,YAAM,KAAK,IAAI,eAAe,QAAQ,aAAa,SAAS,SAAS,SAAS,IAAI;AAClF,YAAM,KAAK,IAAI,eAAe,QAAQ,OAAO,SAAS,SAAS,SAAS,IAAI;AAC5E,YAAM,KAAK,IAAI,eAAe,QAAQ,uBAAuB,SAAS,SAAS,SAAS,IAAI;AAAA,IAC7F;AAAA,IAEA,MAAM,yBAAyB,UAAU,YAAY,WAAW;AAC/D,YAAM,QAAQ,MAAM,KAAK,oBAAoB,SAAS,WAAW,SAAS,GAAG;AAC7E,YAAM,gBAAgB,KAAK;AAC3B,YAAM,gBAAgB,KAAK;AAE3B,aAAO,IAAI,SAAS;AACpB,YAAM,WAAW,SAAS,IAAI,KAAK;AACnC,YAAM,iBAAiB,SAAS,UAAU,KAAK;AAC/C,YAAM,iBAAiB,UAAU,KAAK;AACtC,YAAM,qBAAqB,cAAc,SAAS,EAAE,KAAK;AACzD,UAAI,EAAE,gBAAgB,IAAI;AACzB,YAAI,eAAe;AAClB,iBAAO,MAAM,UAAU,SAAS,SAAS,SAAS,IAAI;AACtD,iBAAO,MAAM;AAAA,YACZ,OAAO,GAAG,eAAe;AAAA,YACzB,SAAS,GAAG,wDAAwD,CAAC,gBAAgB,cAAc,CAAC;AAAA,UACrG,CAAC;AAAA,QACF,OAAO;AACN;AAAA,QACD;AAAA,MACD,WAAW,iBAAiB,gBAAgB,YAAY;AACvD,eAAO,MAAM;AAAA,UACZ,SAAS,GAAG,iGAAiG,CAAC,gBAAgB,gBAAgB,oBAAoB,QAAQ,CAAC;AAAA,UAC3K,WAAW;AAAA,QACZ,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAAA,MAChC;AACA,aAAO,IAAI,OAAO;AAAA,IACnB;AAAA,IAEA,MAAM,6BAA6B,WAAW,WAAW,WAAW;AACnE,YAAM,SAAS;AACf,YAAM,OAAO,EAAC,SAAS,EAAE,WAAW,UAAU,EAAC;AAC/C,YAAM,MAAM,MAAM,OAAO,KAAK,EAAE,QAAQ,KAAK,CAAC;AAE9C,UAAI,IAAI,QAAQ,SAAS,SAAS,GAAG;AACpC,eAAO,MAAM;AAAA,UACZ,OAAO,GAAG,eAAe;AAAA,UACzB,SAAS,GAAG,0EAA0E,CAAC,UAAU,KAAK,CAAC,CAAC;AAAA,QACzG,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IAEA,oBAAoB,WAAW,WAAW;AACzC,YAAM,KAAK;AACX,aAAO,OAAO,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM;AAAA,UACL,aAAa;AAAA,UACb,aAAa;AAAA,QACd;AAAA,QACA,SAAS,KAAK;AACb,cAAI,CAAC,GAAG,eAAe;AACtB,eAAG,eAAe,aAAa,CAAC;AACjC,aAAG,eAAe,WAAW,aAAa,IAAI;AAAA,QAC/C;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,kBAAkB,OAAO,iBAAiB;AACzC,UAAI,oBAAoB,YAAY;AACnC,aAAK,aAAa,4BAA4B,IAAI;AAAA,MACnD,WAAW,oBAAoB,UAAU;AACxC,aAAK,sBAAsB;AAAA,MAC5B,OAAO;AACN,cAAM,gBAAgB,KAAK,aAAa,GAAG;AAC3C,YAAI,CAAC;AAAe;AACpB,sBAAc,UAAU;AACxB,iBAAS,MAAM,cAAc,UAAU,KAAK;AAAA,MAC7C;AAAA,IACD;AAAA,IAEA,wBAAwB;AACvB,aAAO,IAAI,OAAO;AAClB,YAAM,EAAE,SAAS,MAAM,aAAa,IAAI,KAAK;AAC7C,aAAO,OAAO,MAAM,UAAU,SAAS,MAAM,OAAO,CAAC,EACnD,KAAK,MAAM;AACX,eAAO,MAAM,UAAU,SAAS,IAAI;AACpC,aAAK,iBAAiB,cAAc,IAAI;AACxC,aAAK,aAAa,4BAA4B,IAAI;AAClD,eAAO,IAAI,SAAS;AAEpB,YAAI,sBAAsB;AAC1B,aAAK,IAAI,IAAI,MAAM,QAAQ,UAAQ;AAClC,iCAAwB,WAAW,KAAK,cAAc,IAAI,KAAK;AAAA,QAChE,CAAC;AACD,aAAK,cAAc,2BAA2B,mBAAmB;AAAA,MAClE,CAAC,EACA,MAAM,OAAK,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC5B;AAAA,IAEA,MAAM,oBAAoB;AACzB,UAAI,KAAK,IAAI,SAAS,GAAG;AACxB,cAAM,MAAM,SAAS,eAAe,0BAA0B;AAC9D,YAAI,MAAM,aAAa;AACvB,YAAI,aAAa;AACjB,cAAM,KAAK,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,aAAa,IAAI;AAE7D,SAAC,cAAc,KAAK,QAAQ,SAAS;AAErC,sBAAc,WAAW,MAAM;AAC9B,eAAK,KAAK,oBAAoB,IAAI;AAAA,QACnC,GAAG,GAAG;AAAA,MACP,OAAO;AACN,aAAK,QAAQ,SAAS;AAAA,MACvB;AAAA,IACD;AAAA,IACA,MAAM,oBAAoB;AACzB,UAAI,CAAC,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,WAAW,GAAG;AAC3D,eAAO,WAAW;AAAA,UACjB,SAAS,GAAG,2CAA2C;AAAA,UACvD,WAAW;AAAA,QACZ,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,MACD;AACA,UAAI,KAAK,IAAI,SAAS,GAAG;AACxB,YAAG,KAAK,SAAS,8BAA6B;AAC9C,gBAAM,SAAS,IAAI,OAAO,GAAG,OAAO;AAAA,YACnC,OAAO,GAAG,yBAAyB;AAAA,YACnC,QAAQ;AAAA,cACP;AAAA,gBACC,WAAW;AAAA,gBACX,OAAO,GAAG,kBAAkB;AAAA,gBAC5B,WAAW;AAAA,cACZ;AAAA,cACA;AAAA,gBACC,WAAW;AAAA,gBACX,OAAO,GAAG,gBAAgB;AAAA,gBAC1B,WAAW;AAAA,cACZ;AAAA,YACD;AAAA,YACA,sBAAsB,GAAG,oBAAoB;AAAA,YAC7C,gBAAgB,OAAO,WAAW;AACjC,mBAAK,IAAI,IAAI,sBAAsB,OAAO;AAC1C,mBAAK,IAAI,IAAI,wBAAwB,OAAO;AAE5C,oBAAM,MAAM,SAAS,eAAe,0BAA0B;AAC9D,kBAAI,MAAM,aAAa;AAEvB,kBAAI,aAAa;AACjB,oBAAM,KAAK,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,aAAa,IAAI;AAE7D,qBAAO,KAAK;AAEZ,kBAAI,CAAC,YAAY;AAChB,qBAAK,QAAQ,SAAS;AAAA,cACvB,OAAO;AACN,2BAAW,MAAM;AAChB,uBAAK,KAAK,oBAAoB,IAAI;AAAA,gBACnC,GAAG,GAAG;AAAA,cACP;AAAA,YACD;AAAA,UACD,CAAC;AAGD,iBAAO,KAAK;AAAA,QACZ,OAAK;AAEL,gBAAM,MAAM,SAAS,eAAe,0BAA0B;AAC9D,cAAI,MAAM,aAAa;AACvB,cAAI,aAAa;AACjB,gBAAM,KAAK,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,aAAa,IAAI;AAE7D,WAAC,cAAc,KAAK,QAAQ,SAAS;AAErC,wBAAc,WAAW,MAAM;AAC9B,iBAAK,KAAK,oBAAoB,IAAI;AAAA,UACnC,GAAG,GAAG;AAAA,QACN;AAAA,MAID,OAAO;AACN,aAAK,QAAQ,SAAS;AAAA,MACvB;AAAA,IACD;AAAA,EACD;;;AC78BA,SAAO,QAAQ,qBAAqB;AACpC,MAAI,OAAO;AAEX,UAAQ,YAAY,eAAe,MAAM;AAAA,IAExC,YAAY,EAAE,KAAK,SAAS,QAAQ,aAAa,UAAS,UAAS,gBAAe,cAAc,GAAG;AAClG,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,WAAW;AAChB,WAAK,cAAc;AACnB,WAAK,cAAc,SAAS;AAC5B,WAAK,gBAAgB;AACrB,WAAK,gBAAgB,SAAS;AAC9B,UAAG,SAAS,qBAAoB;AAC/B,eAAO,SAAS;AAAA,MACjB;AACA,UAAG,SAAS,4BAA2B;AACtC,eAAO;AAAA,MACR;AACA,UAAG,SAAS,4BAA2B;AACtC,eAAO;AAAA,MACR;AACA,WAAK,wBAAwB,SAAS;AACtC,WAAK,iCAAiC,SAAS;AAC/C,WAAK,8BAA8B,SAAS;AAC5C,WAAK,2BAA2B,SAAS;AACzC,WAAK,2BAA2B,SAAS;AACzC,WAAK,sBAAsB,SAAS;AACpC,WAAK,sBAAsB,SAAS;AACpC,WAAK,mBAAmB,SAAS;AACjC,WAAK,4BAA4B,SAAS,6BAA6B,SAAS;AAEhF,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAEhB,WAAK,YAAY;AACjB,WAAK,gBAAgB;AACrB,WAAK,gBAAgB;AACrB,WAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,cAAc;AACb,UAAI,WAAW;AACf,UAAG,CAAC,KAAK,uBAAuB,CAAC,KAAK,qBAAoB;AACzD,mBAAW;AAAA;AAAA;AAAA;AAAA,MAIZ;AAEA,UAAG,SAAS,UAAU,CAAC,KAAK,qBAAoB;AAC/C,YAAI,MAAM;AACV,YAAG,KAAK,kCAAkC,KAAK,2BAA0B;AACxE,gBAAM;AAAA,QACP;AACA,aAAK,QAAQ;AAAA,UACZ;AAAA,qCACiC,WAAW;AAAA;AAAA;AAAA;AAAA,yGAIyD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAM5G;AAEA,aAAK,aAAa,KAAK,QAAQ,KAAK,iBAAiB;AACrD,aAAK,mBAAmB,KAAK,WAAW,KAAK,kBAAkB;AAAA,MAChE,WAAU,SAAS,UAAU,CAAC,KAAK,qBAAqB;AAC9C,YAAI,UAAU;AACvB,YAAI,MAAM;AACV,YAAG,KAAK,kBAAiB;AACrB,oBAAU;AAAA,QACd;AACA,YAAG,KAAK,kCAAkC,KAAK,2BAA0B;AACxE,gBAAM;AAAA,QACP;AAGA,aAAK,QAAQ;AAAA,UACZ,UAAU,iCAAiC,WAAW;AAAA;AAAA;AAAA;AAAA,yGAI+C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAK5G;AAEA,aAAK,aAAa,KAAK,QAAQ,KAAK,0BAA0B;AAC9D,aAAK,mBAAmB,KAAK,WAAW,KAAK,iBAAiB;AAAA,MAC/D;AACM,UAAG,CAAC,KAAK,uBAAuB,CAAC,KAAK,qBAAqB;AACvD,aAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACnD,aAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACnD,YAAI,SAAS,UAAU,CAAC,KAAK,qBAAqB;AAC9C,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI;AAAA,YACnC,WAAW;AAAA,YACX,oBAAoB;AAAA,YACpB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,kBAAkB;AAAA,YAClB,UAAU;AAAA,YACV,cAAc;AAAA,UAClB,CAAC;AACD,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI;AAAA,YACnC,WAAW;AAAA,YACX,oBAAoB;AAAA,YACpB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,kBAAkB;AAAA,YAClB,UAAU;AAAA,YACV,cAAc;AAAA,UAClB,CAAC;AAAA,QACL,WAAW,SAAS,UAAU,CAAC,KAAK,qBAAqB;AACrD,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI;AAAA,YACnC,WAAW;AAAA,YACX,oBAAoB;AAAA,YACpB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,kBAAkB;AAAA,YAClB,UAAU;AAAA,YACV,cAAc;AAAA,UAClB,CAAC;AACD,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI;AAAA,YACnC,WAAW;AAAA,YACX,oBAAoB;AAAA,YACpB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,kBAAkB;AAAA,YAClB,UAAU;AAAA,YACV,cAAc;AAAA,UAClB,CAAC;AAAA,QACL,OAAO;AACH,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,OAAM,CAAC;AAC1D,eAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,OAAM,CAAC;AAAA,QAE9D;AACA,YAAI,CAAC,KAAK,uBAAuB,CAAC,KAAK,qBAAqB;AACxD,eAAK,gBAAgB;AAAA,QACzB;AAAA,MACJ;AAAA,IACP;AAAA,IACA,kBAAiB;AAChB,WAAK,WAAW,GAAG,SAAS,KAAK,MAAM;AAEtC,aAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,gBAAe,oBAAoB,WAAU,SAAS,SAAQ,WAAW,YAAY,iBAAiB,QAAQ,aAAa,QAAO,eAAe,QAAQ,kBAAkB,aAAY,kBAAkB,OAAM,UAAU,WAAW,cAAc,6BAA4B,CAAC;AAClU,aAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,IAAG,oBAAoB,IAAG,SAAS,IAAG,WAAW,IAAI,iBAAiB,IAAI,aAAa,IAAG,eAAe,IAAI,kBAAkB,IAAG,kBAAkB,IAAG,UAAU,IAAI,cAAc,GAAE,CAAC;AACzO,eAAO;AACP,YAAG,SAAS,eAAe,mBAAmB;AAAG,mBAAS,eAAe,mBAAmB,EAAE,OAAO;AACrG,YAAG,SAAS,eAAe,mBAAmB;AAAG,mBAAS,eAAe,mBAAmB,EAAE,OAAO;AACrG,YAAG,SAAS,eAAe,0BAA0B;AAAG,mBAAS,eAAe,0BAA0B,EAAE,OAAO;AACnH,YAAG,SAAS,eAAe,wBAAwB;AAAG,mBAAS,eAAe,wBAAwB,EAAE,OAAO;AAE/G,aAAK,eAAe;AACpB,aAAK,OAAO,kBAAkB;AAC9B,aAAK,OAAO,eAAe;AAC3B,aAAK,OAAO,aAAa,KAAK,OAAO,QAAQ,CAAC;AAAA,MAG/C,CAAC;AACD,WAAK,WAAW,GAAG,SAAS,KAAK,MAAM;AACtC,aAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,gBAAe,oBAAoB,WAAU,SAAS,SAAQ,WAAW,YAAY,iBAAiB,QAAQ,aAAa,QAAO,eAAe,QAAQ,kBAAkB,aAAY,kBAAkB,OAAM,UAAU,WAAW,cAAc,6BAA4B,CAAC;AAClU,aAAK,WAAW,KAAK,YAAY,EAAE,IAAI,EAAC,WAAW,IAAG,oBAAoB,IAAG,SAAS,IAAG,WAAW,IAAI,iBAAiB,IAAI,aAAa,IAAG,eAAe,IAAI,kBAAkB,IAAG,kBAAkB,IAAG,UAAU,IAAI,cAAc,GAAE,CAAC;AACzO,eAAO;AACP,YAAG,SAAS,eAAe,mBAAmB;AAAG,mBAAS,eAAe,mBAAmB,EAAE,OAAO;AACrG,YAAG,SAAS,eAAe,mBAAmB;AAAG,mBAAS,eAAe,mBAAmB,EAAE,OAAO;AACrG,YAAG,SAAS,eAAe,0BAA0B;AAAG,mBAAS,eAAe,0BAA0B,EAAE,OAAO;AACnH,YAAG,SAAS,eAAe,wBAAwB;AAAG,mBAAS,eAAe,wBAAwB,EAAE,OAAO;AAE/G,aAAK,eAAe;AACpB,aAAK,OAAO,kBAAkB;AAC9B,aAAK,OAAO,eAAe;AAC3B,aAAK,OAAO,aAAa,KAAK,OAAO,QAAQ,CAAC;AAAA,MAE/C,CAAC;AAAA,IACF;AAAA,IACA,MAAM,kBAAkB;AACvB,UAAI,CAAC,KAAK,YAAY;AACrB,cAAM,MAAM,MAAM,OAAO,GAAG,UAAU,cAAc,EAAC,KAAK,GAAG,UAAU,EAAC,GAAG,MAAM;AACjF,aAAK,oBAAoB,IAAI,QAAQ;AAAA,MACtC;AACA,UAAI,CAAC,KAAK,YAAY;AACrB,cAAM,MAAM,MAAM,OAAO,GAAG,UAAU,eAAe,KAAK,aAAa,oBAAoB;AAC3F,aAAK,aAAa,IAAI,QAAQ;AAAA,MAC/B;AAEA,WAAK,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,EAAC,QAAO,MAAM;AACtC,aAAK,iBAAiB,QAAQ,KAAK;AAAA,MACpC,CAAC;AAAA,IACF;AAAA,IAEA,UAAU,EAAC,QAAQ,GAAG,cAAc,IAAI,cAAY,GAAE,GAAG;AACxD,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,aAAc,OAAO,IAAI,sBAAuB,KAAK;AAC3D,UAAI,EAAE,YAAY,YAAY,IAAI;AAElC,OAAC,eAAe,aAAa,KAAK;AAElC,aAAO,OAAO,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,aAAa,YAAY,YAAY,aAAa,YAAY;AAAA,MAC9E,CAAC;AAAA,IACF;AAAA,IAGA,iBAAiB,OAAO;AACvB,WAAK,iBAAiB,KAAK,EAAE;AAC7B,UAAI,KAAK;AACT,UAAG,SAAS,QAAO;AAYlB,YAASC,wBAAT,WAAgC;AAC/B,cAAI,aAAa;AAChB,cAAG,CAAC,GAAG,yBAAyB,CAAC,GAAG,kCAAkC,CAAC,GAAG,+BAA+B,CAAC,GAAG,0BAAyB;AACtI,yBAAa;AAAA,UACd;AACA,cAAI,cAAc;AAClB,cAAG,GAAG,uBAAsB;AAE3B,2BAAe,wBAAwB,GAAG,WAAW;AAAA,UACtD;AACA,cAAG,GAAG,gCAA+B;AAEpC,2BAAe,wBAAwB,GAAG,UAAU;AAAA,UACrD;AACA,cAAG,GAAG,6BAA4B;AAEjC,2BAAe,wBAAwB,GAAG,KAAK,UAAU,GAAG,UAAU;AAAA,UACvE;AACA,cAAG,GAAG,0BAAyB;AAE9B,2BAAe,wBAAwB,GAAG,MAAM;AAAA,UACjD;AACA,cAAG,aAAa,GAAE;AACjB,mBAAO,uBAAuB,aAAa,KAAK,GAAG,MAAM,YAAY;AAAA,UACtE,OAAO;AACN,mBAAO,QAAQ,GAAG,MAAM,YAAY;AAAA,UACrC;AAAA,QAGQ;AA7BA,mCAAAA;AAXT,aAAK,iBAAiB;AAAA,UACrB;AAAA;AAAA,OAEGA,sBAAqB;AAAA,6BACC,GAAG,MAAM;AAAA,6BACT,GAAG,YAAY;AAAA,oCACR,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA,QAGjC;AAgCR,aAAK,wBAAwB;AAE7B,cAAM,QAAQ,UAAQ;AACrB,eAAK,iBAAiB,IAAI;AAAA,QAC3B,CAAC;AAAA,MACF,OAAO;AACN,cAAM,QAAQ,UAAQ;AACT,cAAI,YAAY,KAAK,cAAc,IAAI;AACvC,eAAK,iBAAiB,OAAO,SAAS;AAAA,QAC7C,CAAC;AAAA,MACR;AAAA,IAKD;AAAA,IACA,0BAA0B;AACzB,WAAK,eAAe,KAAK,WAAW,KAAK,cAAc;AACvD,WAAK,sBAAsB,KAAK,WAAW,KAAK,qBAAqB;AAAA,IAEtE;AAAA,IACA,cAAc,EAAE,KAAK,GAAG;AACvB,YAAM,gBAAgB,qCAAqC,OAAO,IAAI;AACtE,aAAO,KAAK,oBAAoB,KAAK,aAAa;AAAA,IACnD;AAAA,IACA,eAAe,EAAE,UAAU,GAAG;AAC7B,YAAM,gBAAgB,qCAAqC,OAAO,SAAS;AAC3E,aAAO,KAAK,oBAAoB,KAAK,aAAa;AAAA,IACnD;AAAA,IACA,iBAAiB,WAAW;AAC3B,cAAQ,IAAI,iBAAiB;AAC7B,cAAQ,IAAI,SAAS;AACrB,YAAM,KAAK;AACX,YAAM,WAAW,GAAG,OAAO,QAAQ,EAAE,YAAY,GAAG;AACpD,WAAK,oBAAoB;AAAA,QACxB;AAAA,qBACkB,OAAO,UAAU,SAAS;AAAA,qBAC1B,OAAO,UAAU,SAAS;AAAA,oBAC3B,OAAO,UAAU,QAAQ;AAAA,eAC9B,OAAO,UAAU,GAAG;AAAA,gBACnB,OAAO,UAAU,mBAAmB,CAAC;AAAA,0BAC3B,OAAO,UAAU,kBAAkB,UAAU,qBAAqB;AAAA,qBACvE,UAAU;AAAA,6BACF,UAAU;AAAA,YAC3B,UAAU;AAAA,oBACF,OAAO,UAAU,SAAS;AAAA;AAAA,MAE5C;AACA,UAAI,kBAAkB,KAAK,eAAe,SAAS;AAEnD,sBAAgB;AAAA,QACf,GAAG,oBAAoB;AAAA,KACrB,cAAc;AAAA;AAAA;AAAA,OAGZ,UAAU;AAAA;AAAA,MAEX,qBAAqB;AAAA;AAAA,KAEtB,cAAc;AAAA,KACd,uBAAuB;AAAA,MAC1B;AAEA,eAAS,gBAAgB;AACxB,YAAI,aAAa;AACR,YAAG,GAAG,yBAAyB,GAAG,kCAAkC,GAAG,6BAA4B;AAC3G,uBAAa;AAAA,QACL;AAIA,YAAG,CAAC,GAAG,yBAAyB,CAAC,GAAG,kCAAkC,CAAC,GAAG,+BAA+B,CAAC,GAAG,0BAAyB;AAC9I,uBAAa;AAAA,QACL;AAOT,eAAO,gCAAgC,aAAY;AAAA,MAC9C;AACN,oCAA8B;AAE9B,eAAS,gCAAgC;AACxC,cAAM,YAAY,MAAM,KAAK,GAAG,oBAAoB,KAAK,mBAAmB,CAAC;AAC7E,WAAG,aAAa,KAAK,qBAAqB,EAAE,IAAI,SAAS,EAAE;AAC3D,WAAG,oBAAoB,KAAK,mBAAmB,EAAE,IAAI,SAAS,EAAE;AAChE,YAAI,YAAY,UAAU,OAAO,CAACC,YAAW,QAAQ;AACpD,cAAI,EAAE,GAAG,EAAE,MAAM,IAAIA;AACpB,YAAAA,aAAY,EAAE,GAAG,EAAE,MAAM;AAC1B,iBAAOA;AAAA,QACR,GAAG,CAAC;AAEJ,qBAAa;AACb,YAAI,aAAa;AAAG,sBAAY;AAEhC,WAAG,aAAa,KAAK,qBAAqB,EAAE,IAAI,SAAS,SAAS;AAClE,WAAG,oBAAoB,KAAK,mBAAmB,EAAE,IAAI,SAAS,SAAS;AAAA,MACxE;AACA,eAAS,gBAAgB;AACxB,YAAI,YAAY;AAChB,YAAG,GAAG,uBAAsB;AAC3B,cAAI,uBAAwB;AAC5B,uBAAa,8CAA8C,uBAAuB;AAAA;AAAA,WAE3E,UAAU;AAAA,QACb,UAAU;AAAA;AAAA;AAAA,QAGf;AACA,YAAG,GAAG,gCAA+B;AACpC,uBAAa;AAAA;AAAA,QAET,WAAW,UAAU,cAAc,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA,QAG1C;AACA,YAAG,GAAG,6BAA4B;AAC1C,uBAAa;AAAA;AAAA,QAET,UAAU,0BAA0B;AAAA;AAAA;AAAA,QAGhC;AACA,YAAG,GAAG,0BAAyB;AACvC,uBAAa;AAAA;AAAA,QAET,UAAU,QAAQ;AAAA;AAAA;AAAA,QAGd;AACA,eAAO;AAAA,MACX;AACN,eAAS,yBAAyB;AACjC,YAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,SAAS,UAAU,QAAQ;AAC9E,iBAAO;AAAA;AAAA;AAAA,yDAG8C,gBAAgB,UAAU,iBAAiB,QAAQ;AAAA;AAAA,sFAEtB,UAAU,cAAc;AAAA,wFACtB,UAAU,YAAY;AAAA;AAAA;AAAA,QAG3G,OAAO;AACN,iBAAO;AAAA;AAAA;AAAA,yDAG8C,gBAAgB,UAAU,iBAAiB,QAAQ;AAAA;AAAA,sFAEtB,UAAU,cAAc;AAAA,wFACtB,UAAU,YAAY;AAAA;AAAA;AAAA,QAG3G;AAAA,MACD;AAEA,eAAS,uBAAuB;AAC/B,YAAI,UAAU,aAAa;AAC1B,cAAI,UAAU,YAAY,QAAQ,OAAO,KAAK,IAAI;AACjD,gBAAI;AACH,wBAAU,cAAc,EAAE,UAAU,WAAW,EAAE,KAAK;AAAA,YACvD,SAAS,OAAP;AACD,wBAAU,cAAc,UAAU,YAAY,QAAQ,UAAU,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,YACjH;AAAA,UACD;AACA,oBAAU,cAAc,OAAO,SAAS,UAAU,aAAa,EAAE;AACjE,iBAAO,0BAA0B,UAAU;AAAA,QAC5C;AACA,eAAO;AAAA,MACR;AAEA,eAAS,sBAAsB;AAC9B,cAAM,EAAE,OAAO,UAAU,IAAI;AAC7B,YAAI,CAAC,GAAG,eAAe,OAAO;AAC7B,iBAAO;AAAA;AAAA;AAAA;AAAA,cAIG,eAAe,OAAO,SAAS,SAAS;AAAA;AAAA,QAEnD,OAAO;AACN,iBAAO,qCAAqC,OAAO,SAAS,SAAS;AAAA,QACtE;AAAA,MACD;AAAA,IACD;AAAA,IACA,cAAc,MAAM;AACnB,YAAM,KAAK;AACX,WAAK,WAAW,KAAK,YAAa,GAAG;AAErC,YAAM,EAAE,YAAY,WAAW,UAAU,SAAS,YAAY,KAAK,gBAAgB,IAAI;AACvF,YAAMC,aAAY,IAAI,iBAAiB,CAAC,IAAI,KAAK,IAAI,IAAI;AACzD,UAAI;AACJ,UAAI,iBAAiB;AAErB,UAAI,KAAK,eAAe;AACvB,0BAAmB,aAAa,KAAK,UAAU,cAAc,IAAI,QAAQ;AAEzE,YAAI,KAAK,MAAM,cAAc,IAAI,KAAK;AACrC,2BAAiB,KAAK,MAAM,cAAc,IAAE;AAC5C,2BAAiB,eAAe,QAAQ,CAAC,IAAI;AAAA,QAC9C;AAAA,MACD,OAAO;AACN,0BAAkB;AAClB,yBAAiB;AAAA,MAClB;AAEA,eAAS,sBAAsB;AAC9B,YAAI,CAAC,GAAG,eAAe,YAAY;AAClC,iBAAO;AAAA,uDAC4C,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKpC;AAAA,eACxB,OAAO,SAAS,KAAK,SAAS;AAAA;AAAA;AAAA,QAG1C,OAAO;AACN,iBAAO;AAAA,uDAC4C,oBAAoB;AAAA;AAAA,uCAEpC,OAAO,SAAS,KAAK,SAAS;AAAA,QAClE;AAAA,MACD;AAEA,aACC;AAAA,sBACmB,OAAO,KAAK,SAAS,sBAAsB,OAAO,SAAS;AAAA,qBAC5D,OAAO,QAAQ,gBAAgB,OAAO,GAAG;AAAA,iBAC7C,OAAO,mBAAmB,CAAC;AAAA,aAC/B,KAAK;AAAA;AAAA,MAEZ,oBAAoB;AAAA;AAAA;AAAA;AAAA,QAIlB,OAAO,SAAS,KAAK,WAAW,EAAE;AAAA;AAAA,8BAEZ,gBAAgB,iBAAiB,KAAK,UAAUA,UAAS,KAAK,OAAO;AAAA;AAAA;AAAA,IAIlG;AAAA,IAEA,oBAAoB,MAAM;AACzB,YAAM,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK;AACpC,QAAE,IAAI,EAAE,OAAO,EAAE,YAAY,kCAAkC,iBAAiB;AAAA,IACjF;AAAA,IACA,2BAA2B,YAAW;AACrC,UAAG,KAAK,qBAAoB;AAC3B,aAAK,oBAAoB,UAAU,UAAU;AAAA,MAC9C;AAAA,IACD;AAAA,IACA,kBAAkB;AACjB,YAAM,KAAK;AACX,YAAM,MAAM,GAAG,OAAO,QAAQ,EAAE;AAChC,WAAK,WAAW,KAAK,eAAe,EAAE,KAAK,EAAE;AAE7C,WAAK,WAAW,KAAK,cAAc,EAAE,KAAK,EAAE;AAC5C,WAAK,WAAW,KAAK,sBAAsB,EAAE,KAAK,EAAE;AACpD,WAAK,WAAW,KAAK,mBAAmB,EAAE,KAAK,EAAE;AACjD,WAAK,WAAW,KAAK,uBAAuB,EAAE,KAAK,EAAE;AACrD,aAAO,GAAG,iBAAiB,gBAAe,qBAAqB,EAAE,KAAK,CAAAC,SAAO;AAC5E,aAAK,oBAAoB,OAAO,GAAG,KAAK,aAAa;AAAA,UACpD,IAAI;AAAA,YACH,OAAO,GAAG,aAAa;AAAA,YACvB,WAAW;AAAA,YACX,SAAS;AAAA,YACT,aAAa,GAAG,aAAa;AAAA,YAC7B,WAAWA;AAAA,YACX,UAAU,WAAY;AAErB,kBAAG,GAAG,iBAAiB,GAAG,gBAAgB,KAAK,OAAM;AACpD,uBAAO,MAAM,WAAW,QAAQ,OAAO,SAAQ,OAAO,QAAO,KAAK,KAAK;AAAA,cACxE;AAAA,YAWD;AAAA,UACD;AAAA,UACA,QAAQ,KAAK,WAAW,KAAK,cAAc;AAAA,UAC3C,cAAc;AAAA,QACf,CAAC;AACF,aAAK,kBAAkB,UAAU,GAAG,WAAW;AAC/C,aAAK,kBAAkB,QAAQ;AAC/B,aAAK,kBAAkB,aAAa,KAAK;AAAA,MAEzC,CAAC;AAED,WAAK,eAAe,OAAO,GAAG,KAAK,aAAa;AAAA,QAC/C,IAAI;AAAA,UACH,OAAO,GAAG,QAAQ;AAAA,UAClB,WAAW;AAAA,UACX,aAAa,GAAG,oCAAoC;AAAA,QACrD;AAAA,QACA,QAAQ,KAAK,WAAW,KAAK,eAAe;AAAA,QAC5C,cAAc;AAAA,MACf,CAAC;AAED,WAAK,mBAAmB,OAAO,GAAG,KAAK,aAAa;AAAA,QACnD,IAAI;AAAA,UACH,OAAO,GAAG,YAAY;AAAA,UACtB,WAAW;AAAA,UACX,SAAS;AAAA,UACT,aAAa,GAAG,mBAAmB;AAAA,UACnC,UAAU,WAAW;AACpB,eAAG,aAAa,KAAK;AACrB,aAAC,GAAG,eAAe,GAAG,aAAa,GAAG;AACtC,eAAG,aAAa;AAAA,UACjB;AAAA,UACA,WAAW,WAAY;AACtB,mBAAO;AAAA,cACN,OAAO;AAAA,cACP,SAAS;AAAA,gBACR,aAAa,MAAM,IAAI,cAAc;AAAA,cACtC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ,KAAK,WAAW,KAAK,mBAAmB;AAAA,QAChD,cAAc;AAAA,MACf,CAAC;AACD,UAAG,KAAK,kCAAkC,KAAK,2BAA2B;AAChE,aAAK,sBAAsB,OAAO,GAAG,KAAK,aAAa;AAAA,UACnD,IAAI;AAAA,YACA,OAAO,GAAG,EAAE;AAAA,YACZ,WAAW;AAAA,YACX,WAAW;AAAA,YACX,aAAa,GAAG,qBAAqB;AAAA,YACrC,SAAS;AAAA,UACb;AAAA,UACA,QAAQ,KAAK,WAAW,KAAK,sBAAsB;AAAA,UACnD,cAAc;AAAA,QAClB,CAAC;AAAA,MACL;AACN,UAAG,GAAG,0BAAyB;AAC9B,aAAK,uBAAuB,OAAO,GAAG,KAAK,aAAa;AAAA,UACvD,IAAI;AAAA,YACH,OAAO,GAAG,cAAc;AAAA,YACxB,WAAW;AAAA,YACX,UAAU,WAAW;AACpB,iBAAG,OAAO,QAAQ,EAAE,IAAI,eAAc,KAAK;AAC3C,iBAAG,OAAO,QAAQ,EAAE,IAAI,mBAAkB;AAAA,YAC3C;AAAA,UAED;AAAA,UACA,QAAQ,KAAK,WAAW,KAAK,uBAAuB;AAAA,UACpD,cAAc;AAAA,QACf,CAAC;AAAA,MACF;AAGA,WAAK,aAAa,aAAa,KAAK;AACpC,WAAK,iBAAiB,aAAa,KAAK;AACxC,UAAG,KAAK,gCAAgC;AAC9B,aAAK,oBAAoB,aAAa,KAAK;AAAA,MAC/C;AACN,UAAG,GAAG,0BAA0B;AACtB,aAAK,qBAAqB,aAAa,KAAK;AAC5C,aAAK,qBAAqB,UAAU,OAAO,SAAS,UAAU,CAAC;AAAA,MAEnE;AAEN,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,mBAAmB;AAClB,WAAK,aAAa,SAAS,KAAK,gBAAgB,EAAE;AAAA,QACjD;AAAA,+CAC4C,GAAG,OAAO;AAAA,OAClD,OAAO,MAAM,KAAK,SAAS,IAAI;AAAA;AAAA;AAAA,MAGpC;AAEA,WAAK,oBAAoB,KAAK,aAAa,SAAS,KAAK,WAAW;AAEpE,WAAK,kBAAkB,GAAG,SAAS,KAAK,MAAM;AAC7C,aAAK,iBAAiB,EAAE;AACxB,aAAK,aAAa,UAAU;AAAA,MAC7B,CAAC;AAAA,IACF;AAAA,IAEA,iBAAiB,OAAO;AACvB,QAAE,KAAK,aAAa,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,QAAQ,OAAO;AAAA,IAC1D;AAAA,IAEA,cAAc;AACb,YAAM,KAAK;AACX,UAAG,CAAC,OAAO,QAAO;AACjB,eAAO,QAAQ,wDAAwD,WAAW;AAClF,iBAAO,SAAS;AAEhB,iBAAO,iBAAiB,SAAU,QAAQ;AACzC,gBAAI,QAAQ,KAAK,qBAAqB,MAAM;AAC5C,oBAAQ;AAAA,oBACF,SAAS,MAAM,SAAS;AAAA,oBACxB,SAAS,OAAO,SAAS;AAAA,oBACxB,SAAS,OAAO,SAAS,OAAQ,SAAS;AAAA,oBAC3C,SAAS,OAAO,SAAS;AAAA,oBACzB,SAAS,OAAO,SAAS;AAAA,mBACzB,SAAS;AACb,oBAAI,OAAO,QAAQ,UAAa,OAAO,QAAQ,IAAI;AAClD,yBAAO,OAAO;AAAA,gBACf;AAEA,oBAAI,WAAW,OAAO,aAAa,KAAK;AACxC,wBAAQ,OAAO;AAAA,uBACT;AAAO,+BAAW,SAAS,YAAY;AAAG;AAAA,uBAC1C;AAAM,+BAAW,SAAS,YAAY;AAAG;AAAA;AAE/C,uBAAO;AAAA,oBACH,SAAS,MAAM,SAAS;AAC5B,uBAAO,KAAK,QAAQ;AAAA;AAEtB,mBAAO;AAAA,UACR;AAEA,iBAAO,SAAS,UAAU;AAAA,YACzB,QAAQ,CAAC,cAAc;AACtB,kBAAI,KAAK,gBAAgB,KAAK,WAAW,GAAG,UAAU,GAAG;AACxD,qBAAK,aAAa,UAAU;AAC5B,qBAAK,iBAAiB,SAAS;AAC/B,qBAAK,kBAAkB;AAAA,cACxB;AAAA,YACD;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACD;AAIA,WAAK,WAAW,GAAG,SAAS,iBAAiB,WAAW;AACvD,gBAAQ,IAAI,eAAe;AAC3B,cAAM,QAAQ,EAAE,IAAI;AACpB,cAAM,YAAY,SAAS,MAAM,KAAK,gBAAgB,CAAC;AACvD,YAAI,WAAW,SAAS,MAAM,KAAK,eAAe,CAAC;AACnD,YAAI,YAAY,SAAS,MAAM,KAAK,gBAAgB,CAAC;AACrD,YAAI,MAAM,SAAS,MAAM,KAAK,UAAU,CAAC;AACzC,YAAI,OAAO,SAAS,MAAM,KAAK,WAAW,CAAC;AAC3C,YAAI,iBAAiB,SAAS,MAAM,KAAK,qBAAqB,CAAC;AAC/D,YAAI,mBAAmB,MAAM,KAAK,gBAAgB;AAClD,YAAI,sBAAsB,MAAM,KAAK,wBAAwB;AAE7D,mBAAW,aAAa,cAAc,SAAY;AAClD,oBAAY,cAAc,cAAc,SAAY;AACpD,cAAM,QAAQ,cAAc,SAAY;AACxC,eAAO,SAAS,cAAc,SAAY;AAC1C,WAAG,OAAO,cAAc;AAAA,UACvB,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,EAAE,WAAW,UAAU,WAAW,KAAK,MAAM,gBAAgB,kBAAkB,oBAAmB;AAAA,QACzG,CAAC;AAAA,MAEF,CAAC;AAED,WAAK,aAAa,OAAO,GAAG,SAAS,CAAC,MAAM;AAC3C,qBAAa,KAAK,WAAW;AAC7B,aAAK,cAAc,WAAW,MAAM;AACnC,gBAAM,cAAc,EAAE,OAAO;AAC7B,eAAK,aAAa,EAAE,YAAY,CAAC;AAAA,QAClC,GAAG,GAAG;AAAA,MAKP,CAAC;AAAA,IAOF;AAAA,IAEA,mBAAmB;AAClB,YAAM,aAAa,OAAO,MAAM,OAAO,IAAI,WAAM;AACjD,WAAK,aAAa,OAAO,KAAK,SAAS,GAAG,cAAc;AACxD,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,aAAa,UAAU;AAAA,QAC1C,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU;AAAA,QAC9C,aAAa,GAAG,uBAAuB;AAAA,QACvC,eAAe;AAAA,QACf,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AACD,WAAK,iBAAiB,OAAO,KAAK,SAAS,GAAG,cAAc;AAC5D,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,iBAAiB,UAAU;AAAA,QAC9C,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU;AAAA,QAC9C,aAAa,GAAG,4BAA4B;AAAA,QAC5C,eAAe;AAAA,QACf,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AAGD,aAAO,GAAG,KAAK,GAAG,SAAS,MAAM;AAChC,cAAM,sBAAsB,KAAK,WAAW,GAAG,UAAU;AACzD,YAAI,CAAC,uBAAuB,KAAK,aAAa,UAAU,MAAM;AAAI;AAElE,YAAI,KAAK,MAAM,UAAU,GAAG;AAC3B,eAAK,iBAAiB,KAAK,eAAe,EAAE,MAAM;AAClD,iBAAO,MAAM,WAAW,QAAQ;AAChC,eAAK,iBAAiB,EAAE;AAAA,QACzB,WAAW,KAAK,MAAM,UAAU,KAAK,KAAK,iBAAiB;AAE1D,iBAAO,WAAW;AAAA,YACjB,SAAS,GAAG,qCAAqC;AAAA,YACjD,WAAW;AAAA,UACZ,CAAC;AACD,iBAAO,MAAM,WAAW,OAAO;AAC/B,eAAK,kBAAkB;AACvB,eAAK,iBAAiB,EAAE;AAAA,QACzB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,aAAa,EAAE,cAAY,GAAG,IAAE,CAAC,GAAG;AACnC,UAAI,aAAa;AAChB,sBAAc,YAAY,YAAY;AAGtC,aAAK,eAAe,KAAK,gBAAgB,CAAC;AAC1C,YAAI,KAAK,aAAa,cAAc;AACnC,gBAAM,QAAQ,KAAK,aAAa;AAChC,eAAK,QAAQ;AACb,eAAK,iBAAiB,KAAK;AAC3B,eAAK,iBAAiB,KAAK,MAAM,UAAU;AAC3C;AAAA,QACD;AAAA,MACD;AAEA,WAAK,UAAU,EAAE,YAAY,CAAC,EAC5B,KAAK,CAAC,EAAE,QAAQ,MAAM;AAEtB,cAAM,EAAE,OAAO,WAAW,UAAU,QAAQ,IAAI;AAChD,YAAI,eAAe,CAAC,SAAS;AAC5B,eAAK,aAAa,eAAe;AAAA,QAClC;AACA,aAAK,QAAQ;AACb,aAAK,iBAAiB,KAAK;AAC3B,aAAK,iBAAiB,KAAK,MAAM,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IAEA,4BAA4B;AAC3B,WAAK,iBAAiB,KAAK,eAAe,EAAE,MAAM;AAClD,WAAK,iBAAiB,EAAE;AAAA,IACzB;AAAA,IAEA,gBAAgB,UAAU;AACzB,iBACC,KAAK,WAAW,KAAK,iBAAiB,EAAE,IAAI,yBAAyB,2BAA2B,IAChG,KAAK,WAAW,KAAK,iBAAiB,EAAE,IAAI,yBAAyB,4BAA4B;AAElG,iBACC,KAAK,WAAW,KAAK,eAAe,EAAE,IAAI,UAAU,sBAAsB,IAC1E,KAAK,WAAW,KAAK,eAAe,EAAE,IAAI,UAAU,sBAAsB;AAE3E,iBACC,KAAK,WAAW,IAAI,eAAe,iBAAiB,IACpD,KAAK,WAAW,IAAI,eAAe,iBAAiB;AAErD,iBACC,KAAK,iBAAiB,IAAI,yBAAyB,2BAA2B,IAC9E,KAAK,iBAAiB,IAAI,yBAAyB,2BAA2B;AAAA,IAChF;AAAA,IAEA,iBAAiB,MAAM;AACtB,WAAK,iBAAiB,EAAE;AACxB,WAAK,WAAW,IAAI,WAAW,OAAO,SAAQ,MAAM;AAAA,IACrD;AAAA,EACD;;;AC31BA,SAAO,QAAQ,qBAAqB;AACpC,UAAQ,YAAY,WAAW,MAAM;AAAA,IACpC,YAAY,EAAE,SAAS,QAAQ,SAAS,GAAG;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,gBAAgB;AACrB,WAAK,cAAc,SAAS;AAC5B,WAAK,0BAA0B,SAAS;AACxC,WAAK,oBAAoB,SAAS;AAClC,WAAK,wBAAwB,SAAS;AACtC,WAAK,mBAAmB,SAAS;AACjC,WAAK,yBAAyB,SAAS;AACvC,WAAK,+BAA+B,SAAS;AAC7C,WAAK,uBAAuB,SAAS;AACrC,WAAK,mBAAmB,SAAS;AACjC,WAAK,iCAAiC,SAAS;AAC/C,WAAK,6BAA6B,SAAS;AAC3C,WAAK,wCAAwC,SAAS;AACtD,WAAK,4BAA4B,SAAS,6BAA6B,SAAS;AAChF,WAAK,iCAAiC,SAAS;AAC/C,WAAK,mCAAmC,SAAS,oCAAoC,SAAS;AAC9F,WAAK,0BAA0B,SAAS,2BAA2B,SAAS;AAC5E,WAAK,cAAc,SAAS;AAC5B,WAAK,qBAAqB,SAAS;AAEnC,WAAK,WAAW;AAChB,WAAK,YAAY,SAAS;AAC1B,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAEhB,WAAK,YAAY;AACjB,WAAK,sBAAsB;AAC3B,WAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,cAAc;AACb,UAAG,KAAK,kBAAiB;AACrB,aAAK,QAAQ;AAAA,UACZ;AAAA,QACD;AAAA,MACJ,OAAO;AACN,aAAK,QAAQ;AAAA,UACT;AAAA,QACD;AAAA,MACJ;AAEA,WAAK,aAAa,KAAK,QAAQ,KAAK,2BAA2B;AAAA,IAChE;AAAA,IAEA,wBAAwB;AACvB,WAAK,uBAAuB;AAC5B,WAAK,qBAAqB;AAAA,IAC3B;AAAA,IAEA,yBAAyB;AACxB,WAAK,WAAW;AAAA,QACf;AAAA,MACD;AACA,WAAK,oBAAoB,KAAK,WAAW,KAAK,mBAAmB;AACjE,WAAK,uBAAuB;AAAA,IAC7B;AAAA,IAEA,0BAA0B;AACzB,YAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,UAAI,UAAU,YAAY,EAAE;AAC5B,WAAK,uBAAuB;AAC5B,WAAK,eAAe,UAAU;AAAA,IAC/B;AAAA,IAEA,uBAAuB;AACtB,UAAI,OAAO;AAAA;AAAA,+BAEkB,GAAG,WAAW;AAAA;AAAA,gDAEG,GAAG,MAAM;AAAA,gDACT,GAAG,KAAK;AAAA;AAErD,UAAG,KAAK,yBAAwB;AAC/B,gBAAQ,2CAA2C,GAAG,KAAK;AAAA,MAC5D;AACA,UAAG,KAAK,oBAAmB;AAC1B,gBAAQ,6CAA6C,GAAG,OAAO;AAAA,MAChE;AACA,UAAG,KAAK,kBAAiB;AACxB,gBAAQ,4CAA4C,GAAG,MAAM;AAAA,MAC9D;AACA,UAAG,KAAK,gCAA+B;AACtC,gBAAQ,qDAAqD,GAAG,OAAO;AAAA,MACxE;AACA,UAAG,KAAK,4BAA2B;AAClC,gBAAQ,uDAAuD,GAAG,MAAM;AAAA,MACzE;AACA,UAAG,KAAK,2BAA0B;AACjC,gBAAQ,qDAAqD,GAAG,UAAU;AAAA,MAC3E;AACA,UAAG,KAAK,kCAAiC;AACxC,gBAAQ,qDAAqD,GAAG,MAAM;AAAA,MACvE;AACA,UAAG,KAAK,gCAA+B;AACtC,gBAAQ,0DAA0D,GAAG,SAAS;AAAA,MAC/E;AAGD,cAAQ,oEAAoE,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvF,WAAK,WAAW,OAAO,IAAI;AAC3B,WAAK,kBAAkB,KAAK,WAAW,KAAK,iBAAiB;AAC7D,WAAK,oBAAoB;AACzB,WAAK,yBAAyB;AAC9B,WAAK,wBAAwB;AAC7B,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,0BAA0B;AACzB,WAAK,eAAe,KAAK,WAAW,KAAK,cAAc;AACvD,WAAK,sBAAsB,KAAK,WAAW,KAAK,qBAAqB;AAErE,WAAK,0BAA0B;AAAA,IAChC;AAAA,IAEA,4BAA4B;AAC3B,WAAK,aAAa,IAAI,WAAW,MAAM;AACvC,WAAK,oBAAoB;AAAA,QACxB,gCAAgC,GAAG,kBAAkB;AAAA,MACtD;AAAA,IACD;AAAA,IAEA,oBAAoB;AACnB,aACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF;AAAA,IAEA,kBAAkB;AACjB,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKR;AAAA,IAEA,sBAAsB;AACrB,UAAI,KAAK,aAAa;AACrB,aAAK,kBAAkB,KAAK,WAAW,KAAK,sBAAsB;AAElE,YAAI,KAAK,gBAAgB,QAAQ;AAChC,eAAK,gBAAgB,OAAO;AAAA;AAAA;AAAA,QAGxB,KAAK,gBAAgB,mCAAmC,GAAG,YAAY;AAAA;AAAA,KAE1E;AAGD,eAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI;AAAA,YACpD,WAAW;AAAA,YACX,eAAe;AAAA,YACf,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,eAAe;AAAA,UAChB,CAAC;AAGD,eAAK,gBAAgB,KAAK,qBAAqB,EAAE;AAAA,YAChD,WAAY;AACX,gBAAE,IAAI,EAAE,IAAI,oBAAoB,SAAS;AAAA,YAC1C;AAAA,YACA,WAAY;AACX,gBAAE,IAAI,EAAE,IAAI,oBAAoB,aAAa;AAAA,YAC9C;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IAGA,2BAA2B;AAC1B,WAAK,kBAAkB,KAAK,WAAW,KAAK,sBAAsB;AAElE,WAAK,gBAAgB;AAAA,QACpB;AAAA,MACG,KAAK,kBAAkB,KAAK,GAAG,cAAc;AAAA;AAAA;AAAA,wCAGX,GAAG,aAAa;AAAA;AAAA;AAAA;AAAA,mCAIrB,GAAG,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,WAKtC,GAAG,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAYP,GAAG,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBASd,GAAG,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAST,GAAG,YAAY;AAAA;AAAA,gCAEF,GAAG,WAAW;AAAA,MAC5C;AAEA,WAAK,qBAAqB,KAAK,WAAW,KAAK,uBAAuB;AACxE,WAAK,uBAAuB,IAAI;AAAA,IAC/B;AAAA,IAEA,mBAAmB;AAClB,WAAK,kBAAkB,KAAK,WAAW,KAAK,iBAAiB;AAE7D,WAAK,aAAa,IAAI,QAAQ,YAAY,UAAU;AAAA,QACnD,SAAS,KAAK;AAAA,QACd,QAAQ;AAAA,UACP,cAAc,KAAK,gBAAgB,KAAK,IAAI;AAAA,QAC7C;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,UACL,CAAE,GAAG,GAAG,GAAG,UAAW;AAAA,UACtB,CAAE,GAAG,GAAG,GAAG,UAAW;AAAA,UACtB,CAAE,GAAG,GAAG,GAAG,MAAO;AAAA,UAClB,CAAE,KAAK,GAAG,UAAU,QAAS;AAAA,QAC9B;AAAA,QACA,aAAa;AAAA,UACZ,CAAE,IAAI,IAAI,IAAI,YAAa;AAAA,UAC3B,CAAE,IAAI,IAAI,IAAI,YAAa;AAAA,UAC3B,CAAE,IAAI,IAAI,IAAI,YAAa;AAAA,UAC3B,CAAE,IAAI,IAAI,IAAI,uBAAwB;AAAA,QACvC;AAAA,QACA,gBAAgB,EAAE,YAAY,OAAO,YAAY,sBAAsB;AAAA,MACxE,CAAC;AAED,WAAK,gBAAgB;AAAA,QACpB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD;AAEA,WAAK,gBAAgB;AAAA,QACpB,qEAAqE,GAAG,UAAU;AAAA,MACnF;AAAA,IACD;AAAA,IAEA,cAAc;AACb,YAAM,KAAK;AACX,WAAK,kBAAkB,GAAG,SAAS,uBAAuB,WAAY;AACrE,WAAG,wBAAwB;AAAA,MAC5B,CAAC;AAED,WAAK,kBAAkB,GAAG,SAAS,sBAAsB,WAAY;AACpE,WAAG,qBAAqB,KAAK;AAAA,MAC9B,CAAC;AAED,WAAK,kBAAkB,GAAG,SAAS,qBAAqB,SAAS,GAAG;AACnE,YAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,qBAAqB,EAAE;AAAQ;AAEvD,cAAM,OAAO,GAAG,gBAAgB,GAAG,UAAU;AAC7C,WAAG,qBAAqB,IAAI;AAAA,MAC7B,CAAC;AAED,UAAG,CAAC,GAAG,kBAAiB;AACvB,aAAK,oBAAoB,GAAG,SAAS,sBAAsB,WAAW;AACzD,gBAAM,aAAa,EAAE,IAAI;AAEzB,aAAG,sBAAsB,IAAI;AAE7B,gBAAM,yBAAyB,CAAC,GAAG,gBAAgB,KAAK,gBAAgB,EAAE,GAAG,UAAU;AACvF,cAAI,CAAC,wBAAwB;AAGzB,eAAG,gBAAgB,KAAK,gBAAgB,EAAE,MAAM;AAAA,UACpD;AAEA,gBAAM,gBAAgB,SAAS,WAAW,KAAK,eAAe,CAAC;AAC/D,aAAG,OAAO,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACnD,eAAK,eAAe;AAAA,QACxB,CAAC;AAAA,MACX;AAGA,WAAK,WAAW,GAAG,SAAS,iBAAiB,iBAAiB;AAC7D,YAAI,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,YAAY,KAAK;AAAI;AACvD,YAAI,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,mBAAmB,MAAM;AAAI;AAC/D,YAAI,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,oBAAoB,MAAM;AAAI;AAChE,YAAG,CAAC,QAAQ,IAAI,YAAa,GAAG,8BAA6B;AAC5D,cAAI,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,YAC5B,OAAO;AAAA,YACP,QAAQ;AAAA,cACP;AAAA,gBACC,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,MAAM;AAAA,cACP;AAAA,cACA;AAAA,gBACC,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,SAAS;AAAA,cACV;AAAA,YACD;AAAA,YACA,MAAM;AAAA,YACN,sBAAsB;AAAA,YACtB,gBAAgB,SAAS,QAAQ;AAChC,kBAAG,OAAO,iBAAiB,WAAW,GAAG,SAAS,6BAA4B;AAC7E,uBAAO,MAAM,6BAA6B,GAAG,SAAS,4BAA4B,SAAS,CAAC;AAAA,cAC7F;AACA,qBAAO,KAAK;AAAA,gBACX,QAAQ;AAAA,gBACR,MAAM;AAAA,kBACL,UAAU,OAAO;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR,gBAAgB;AAAA,gBAChB,UAAU,iBAAgB;AACzB,wBAAM,MAAM,GAAG,OAAO,QAAQ;AAC9B,yBAAO,IAAI,OAAO;AAClB,yBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,YAAY,OAAO,gBAAgB;AACzF,sBAAI,eAAe,QAAQ,YAAY,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,EAAE,KAAK,MAAM;AAChF,2BAAO,aAAa;AAAA,sBACnB,MAAM,GAAG,uBAAuB,OAAO,gBAAgB;AAAA,sBACvD,MAAM,GAAG,OAAO,yBAAyB,GAAG,aAAa;AAAA,sBACzD,MAAM,GAAG,wBAAwB;AAAA,sBACjC,MAAM,OAAO,IAAI,SAAS;AAAA,oBAC3B,CAAC;AAAA,kBACF,CAAC;AAID,wBAAM,GAAG,OAAO,SAAS;AACzB,qBAAG,oBAAoB,KAAK;AAC5B,qBAAG,yBAAyB,GAAG,mBAAmB,YAAY,QAAQ;AACtE,oBAAE,KAAK;AAAA,gBACR;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD,CAAC;AACD,cAAI,2BAA2B,EAAE,QAAQ,KAAK,uBAAuB;AACrE,mCAAyB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAqCxB;AAER,YAAE,KAAK;AACP,cAAI,aAAa,EAAE,QAAQ,KAAK,gBAAgB;AAChD,cAAI,UAAU,CAAC,OAAM,OAAM,SAAQ,QAAO,QAAO,OAAM,SAAQ,SAAQ,QAAO,QAAO,MAAM;AAC3F,mBAAQ,KAAG,GAAE,KAAG,QAAQ,QAAO,MAAI,GAAE;AACpC,uBAAW,GAAG,SAAS,MAAM,QAAQ,KAAK,WAAW;AACpD,kBAAI,gBAAgB,EAAE,UAAU,eAAe;AAC/C,gBAAE,UAAU,iBAAiB,gBAAgB,EAAE,IAAI,EAAE,GAAG,UAAU,SAAS,CAAC;AAAA,YAC7E,CAAC;AAAA,UACF;AACA,qBAAW,GAAG,SAAS,UAAU,WAAW;AAC1C,cAAE,UAAU,iBAAiB,EAAE;AAAA,UAChC,CAAC;AACF,qBAAW,GAAG,SAAS,WAAW,WAAW;AAC5C,gBAAI,gBAAgB,EAAE,UAAU,eAAe;AAC9C,cAAE,UAAU,iBAAiB,cAAc,MAAM,GAAG,EAAE,CAAC;AAAA,UACxD,CAAC;AAAA,QAGH,OAAO;AACN,cAAG,CAAC,QAAQ,IAAI,YAAa,CAAC,GAAG,8BAA6B;AAC7D,mBAAO,MAAM,8CAA8C;AAAA,UAC5D;AACA,gBAAM,GAAG,OAAO,SAAS;AACzB,aAAG,oBAAoB,KAAK;AAC5B,aAAG,yBAAyB,GAAG,mBAAmB,YAAY,QAAQ;AAAA,QACvE;AAAA,MAID,CAAC;AAED,WAAK,WAAW,GAAG,SAAS,sBAAsB,WAAW;AAC5D,YAAI,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,YAAY,KAAK;AAAI;AAGvD,YAAI,CAAC,QAAQ,IAAI,SAAS,QAAQ,IAAI,MAAM,WAAW,GAAG;AACzD,iBAAO,WAAW;AAAA,YACjB,SAAS,GAAG,0CAA0C;AAAA,YACtD,WAAW;AAAA,UACZ,CAAC;AACD,iBAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,QACD;AAEA,YAAG,CAAC,QAAQ,IAAI,YAAY,GAAG,8BAA8B;AAC5D,cAAI,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,YAC5B,OAAO;AAAA,YACP,QAAQ;AAAA,cACP;AAAA,gBACC,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,MAAM;AAAA,cACP;AAAA,cACA;AAAA,gBACC,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,SAAS;AAAA,cACV;AAAA,YACD;AAAA,YACA,MAAM;AAAA,YACN,sBAAsB;AAAA,YACtB,gBAAgB,SAAS,QAAQ;AAChC,kBAAG,OAAO,iBAAiB,WAAW,GAAG,SAAS,6BAA4B;AAC7E,uBAAO,MAAM,6BAA6B,GAAG,SAAS,4BAA4B,SAAS,CAAC;AAAA,cAC7F;AACA,kBAAI,GAAG,SAAS,8BAA8B;AAC7C,mBAAG,sBAAsB,OAAO,gBAAgB;AAAA,cACjD,OAAO;AACN,mBAAG,aAAa,OAAO,gBAAgB;AAAA,cACxC;AACA,gBAAE,KAAK;AAAA,YACR;AAAA,UACD,CAAC;AAED,aAAG,oBAAoB,CAAC;AACxB,YAAE,KAAK;AAAA,QACR,OAAO;AACN,cAAI,GAAG,SAAS,8BAA8B;AAC7C,eAAG,sBAAsB;AAAA,UAC1B,OAAO;AACN,eAAG,aAAa;AAAA,UACjB;AAAA,QACD;AAAA,MACD,CAAC;AAGD,WAAK,WAAW,GAAG,SAAS,uBAAuB,MAAM;AACxD,aAAK,OAAO,oBAAoB;AAAA,MACjC,CAAC;AAED,WAAK,gBAAgB,GAAG,SAAS,kBAAkB,MAAM;AACxD,aAAK,OAAO,UAAU;AAEtB,aAAK,oBAAoB,IAAI;AAAA,MAC9B,CAAC;AAED,WAAK,WAAW,GAAG,SAAS,yBAAyB,MAAM;AAC1D,cAAM,oBAAoB,KAAK,mBAAmB,KAAK,oBAAoB,EAAE;AAE7E,YAAG,CAAC,KAAK,kBAAkB;AAAmB,eAAK,sBAAsB;AAAA,MAC1E,CAAC;AAED,WAAK,WAAW,GAAG,SAAS,uBAAuB,WAAY;AAC9D,cAAM,WAAW,EAAE,IAAI;AAGvB,cAAM,qBAAqB,EAAE,kCAAkC;AAG/D,iBAAS,YAAY,kBAAkB;AAGvC,YAAI,cAAc,IAAI,OAAO,GAAG,KAAK,YAAY;AAAA,UAChD,IAAI;AAAA,YACH,WAAW;AAAA,YACX,SAAS;AAAA,YACT,WAAW;AAAA,YACX,OAAO;AAAA,YACP,aAAa;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ,SAAU,OAAO;AACxB,oBAAQ,IAAI,oBAAoB,KAAK;AAAA,UACtC;AAAA,QACD,CAAC;AAGD,oBAAY,QAAQ;AAAA,MACrB,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,iBAAiB,eAAe,SAAO;AAExD,aAAK,sBAAsB,GAAG;AAAA,MAC/B,CAAC;AAAA,IACF;AAAA,IAEA,mBAAmB;AAClB,eAAS,OAAO,KAAK,WAAW,MAAM;AACrC,iBAAS,OAAO,KAAK;AACpB,cAAI,OAAO,QAAQ;AAAU;AAE7B,cAAI,eAAe,QAAQ,OAAO,MAAM,OAAO,GAAG,CAAC,EAAE;AACrD,cAAI,QAAQ;AAAU,2BAAe;AACrC,cAAI,QAAQ;AAAU,2BAAe;AACrC,cAAI,QAAQ;AAAK,2BAAe;AAGhC,gBAAM,YAAY,KAAK,WAAW,WAAW,OAAO,KAAK,WAAW,WAAW,OAC9E,OAAO,QAAQ,WAAW,OAAO,MAAM,GAAG,IAAI;AAE/C,cAAI,iBAAiB,aAAa,MAAM,GAAG,EAAE,IAAI,OAAO,MAAM,aAAa,EAAE,KAAK,GAAG;AACrF,2BAAiB,OAAO,MAAM,OAAO,IAAI,eAAe,QAAQ,QAAQ,QAAG,IAAI;AAC/E,eAAK,gBAAgB,KAAK,kCAAkC,aAAa,EAAE,KAAK,SAAS,cAAc;AAEvG,iBAAO,GAAG,KAAK,GAAG,GAAG,gBAAgB,MAAM;AAC1C,kBAAM,kBAAkB,KAAK,WAAW,GAAG,UAAU;AACrD,gBAAI,mBAAmB,KAAK,oBAAoB,KAAK,gBAAgB,GAAG,UAAU,GAAG;AACpF,mBAAK,gBAAgB,KAAK,kCAAkC,aAAa,EAAE,MAAM;AAAA,YAClF;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AACA,YAAM,aAAa,OAAO,MAAM,OAAO,IAAI,WAAM;AACjD,WAAK,WAAW,KAAK,eAAe,EAAE,KAAK,SAAS,GAAG,kBAAkB;AACzE,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,WAAW,KAAK,eAAe,EAAE,MAAM;AAAA,QAC1D,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU,KAAK,CAAC,KAAK,gBAAgB,KAAK,gBAAgB,EAAE,GAAG,UAAU;AAAA,QAC7G,aAAa,GAAG,2CAA2C;AAAA,QAC3D,eAAe;AAAA,QACf,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AACD,WAAK,WAAW,KAAK,gBAAgB,EAAE,KAAK,SAAS,GAAG,cAAc;AACtE,aAAO,GAAG,KAAK,GAAG,UAAU,MAAM;AACjC,cAAM,oBAAoB,KAAK,WAAW,GAAG,UAAU;AACvD,cAAM,yBAAyB,CAAC,KAAK,gBAAgB,KAAK,eAAe,EAAE,GAAG,SAAS;AACvF,YAAI,qBAAqB,wBAAwB;AAChD,eAAK,WAAW,KAAK,gBAAgB,EAAE,MAAM;AAAA,QAC9C;AAAA,MACD,CAAC;AACD,WAAK,WAAW,KAAK,uBAAuB,EAAE,KAAK,SAAS,GAAG,cAAc;AAC7E,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,WAAW,KAAK,uBAAuB,EAAE,MAAM;AAAA,QAClE,WAAW,MAAM,KAAK,mBAAmB,GAAG,UAAU;AAAA,QACtD,aAAa,GAAG,oBAAoB;AAAA,QACpC,eAAe;AAAA,QACf,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AAGD,aAAO,GAAG,KAAK,GAAG,UAAU,MAAM;AACjC,cAAM,oBAAoB,KAAK,WAAW,GAAG,UAAU;AACvD,YAAI,qBAAqB,KAAK,kBAAkB,KAAK,eAAe,OAAO,GAAG,UAAU,GAAG;AAC1F,eAAK,eAAe,UAAU,CAAC;AAAA,QAChC;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,sBAAsB,MAAM;AAC3B,YAAM,aAAa,EAAE,IAAI;AACzB,YAAM,sBAAsB,WAAW,KAAK,OAAO,KAAK;AAExD,UAAI,CAAC,QAAQ,qBAAqB;AACjC,aAAK,mBAAmB;AACxB,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,oBAAoB,EAAE;AAAA,MAC3E,OAAO;AACN,mBAAW,IAAI,oBAAoB,mBAAmB;AACtD,aAAK,mBAAmB;AACxB,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,IAAI,EAAE,IAAI,oBAAoB,EAAE;AAAA,MACrF;AAAA,IACD;AAAA,IAEA,yBAAyB;AACxB,WAAK,kBAAkB,KAAK;AAAA;AAAA,GAE3B;AACD,YAAM,KAAK;AACX,YAAM,QAAQ,EAAE,OAAO,6CAA6C;AACpE,YAAM,yBAAyB,KAAK,2BAA2B,CAAC;AAChE,UAAI,uBAAuB,QAAQ;AAClC,cAAM,UAAU;AAAA,UACf,gBAAgB,CAAC,MAAM,sBAAsB;AAAA,QAC9C;AAAA,MACD;AACA,WAAK,iBAAiB,OAAO,GAAG,KAAK,aAAa;AAAA,QACjD,IAAI;AAAA,UACH,OAAO,GAAG,UAAU;AAAA,UACpB,WAAW;AAAA,UACX,SAAS;AAAA,UACT,aAAa,GAAG,wCAAwC;AAAA,UACxD,WAAW,KAAK;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,UAAU,WAAW;AACpB,gBAAI,KAAK,OAAO;AACf,oBAAM,MAAM,GAAG,OAAO,QAAQ;AAC9B,qBAAO,IAAI,OAAO;AAClB,qBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,YAAY,KAAK,KAAK;AAC5E,kBAAI,eAAe,QAAQ,YAAY,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,EAAE,KAAK,MAAM;AAChF,uBAAO,aAAa;AAAA,kBACnB,MAAM,GAAG,uBAAuB,KAAK,KAAK;AAAA,kBAC1C,MAAM,GAAG,OAAO,yBAAyB,GAAG,aAAa;AAAA,kBACzD,MAAM,GAAG,wBAAwB;AAAA,kBACjC,MAAM,GAAG,sBAAsB;AAAA,kBAC/B,MAAM,OAAO,IAAI,SAAS;AAAA,gBAC3B,CAAC;AAAA,cACF,CAAC;AAAA,YACF;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ,KAAK,kBAAkB,KAAK,iBAAiB;AAAA,QACrD,cAAc;AAAA,MACf,CAAC;AACD,WAAK,eAAe,aAAa,KAAK;AAAA,IACvC;AAAA,IAEA,uBAAuB,UAAU;AAChC,UAAI,UAAU;AACb,eAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,iBAAO,GAAG,UAAU,YAAY,UAAU,CAAC,YAAY,aAAa,SAAS,iBAAiB,CAAC,EAAE,KAAK,CAAC,EAAE,QAAQ,MAAM;AACtH,kBAAM,EAAE,gBAAgB,IAAI;AAE5B,gBAAI,iBAAiB;AACpB,qBAAO,KAAK;AAAA,gBACX,QAAQ;AAAA,gBACR,MAAM,EAAE,UAAU,iBAAiB,UAAU,KAAK;AAAA,gBAClD,UAAU,CAAC,MAAM;AAChB,wBAAM,EAAE,gBAAgB,kBAAkB,IAAI,EAAE;AAChD,sBAAI,CAAC,EAAE,KAAK;AACX,yBAAK,gBAAgB,iCAAK,UAAL,EAAc,UAAU,gBAAgB,kBAAkB;AAC/E,4BAAQ;AAAA,kBACT;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF,OAAO;AACN,mBAAK,gBAAgB,iCAAK,UAAL,EAAc,SAAS;AAC5C,sBAAQ;AAAA,YACT;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACF,OAAO;AACN,eAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,eAAK,gBAAgB,CAAC;AACtB,kBAAQ;AAAA,QACT,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IAEA,wBAAwB;AACvB,WAAK,mBAAmB,IAAI,EAAE,WAAW,OAAO,UAAU,OAAO,CAAC;AAClE,WAAK,mBAAmB;AAAA,QACvB;AAAA,MACD;AACA,YAAM,KAAK;AACX,YAAM,MAAM,GAAG,OAAO,QAAQ;AAC9B,UAAI,WAAW,IAAI,IAAI;AACvB,WAAK,iBAAiB;AACtB,UAAG,GAAG,uCAAsC;AAC3C,aAAK,iBAAiB,OAAO,GAAG,KAAK,aAAa;AAAA,UACjD,IAAI;AAAA,YACH,OAAO,GAAG,UAAU;AAAA,YACpB,WAAW;AAAA,YACX,aAAe,WAAW,WAAY,GAAG,wBAAwB;AAAA,YACjE,aAAa;AAAA,YACb,UAAU,WAAW;AACpB,yBAAW,MAAI;AACd,oBAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AACzB,yBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,mBAAmB,IAAI,KAAK,KAAK,CAAC;AACxF,qBAAG,sBAAsB,KAAK,KAAK;AAAA,gBAEpC,OAAO;AACN,yBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,mBAAmB,CAAC;AAC1E,qBAAG,mBAAmB,IAAI;AAAA,oBACzB,UAAU;AAAA,oBACV,WAAW;AAAA,kBACZ,CAAC;AACD,qBAAG,mBAAmB,KAAK,GAAG,GAAG,kBAAkB,KAAK,GAAG,cAAc,GAAG;AAC5E,qBAAG,iBAAiB;AAAA,gBACrB;AAAA,cACD,GAAG,GAAI;AAAA,YACR;AAAA,UACD;AAAA,UACA,QAAQ,KAAK,mBAAmB,KAAK,qBAAqB;AAAA,UAC1D,cAAc;AAAA,QACf,CAAC;AAAA,MACF,OAAK;AACJ,aAAK,iBAAiB,OAAO,GAAG,KAAK,aAAa;AAAA,UACjD,IAAI;AAAA,YACH,OAAO,GAAG,UAAU;AAAA,YACpB,WAAW;AAAA,YACX,aAAe,WAAW,WAAW,MAAO,GAAG,4BAA4B;AAAA,YAC3E,aAAa;AAAA,YACb,UAAU,WAAW;AACpB,yBAAW,MAAI;AACd,oBAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AACzB,yBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,kCAAkC,IAAI,KAAK,KAAK,CAAC;AACvG,qBAAG,sBAAsB,KAAK,KAAK;AAAA,gBAEpC,OAAO;AACN,yBAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,kCAAkC,CAAC;AACzF,qBAAG,mBAAmB,IAAI;AAAA,oBACzB,UAAU;AAAA,oBACV,WAAW;AAAA,kBACZ,CAAC;AACD,qBAAG,mBAAmB,KAAK,GAAG,GAAG,kBAAkB,KAAK,GAAG,cAAc,GAAG;AAC5E,qBAAG,iBAAiB;AAAA,gBACrB;AAAA,cACD,GAAG,GAAI;AAAA,YACR;AAAA,UACD;AAAA,UACA,QAAQ,KAAK,mBAAmB,KAAK,qBAAqB;AAAA,UAC1D,cAAc;AAAA,QACf,CAAC;AAAA,MACF;AACA,WAAK,eAAe,aAAa,KAAK;AACtC,WAAK,eAAe,UAAU;AAAA,IAC/B;AAAA,IAEA,sBAAsB,UAAU;AAC/B,UAAI,CAAC,UAAU;AACd,aAAK,mBAAmB,IAAI,EAAE,WAAW,OAAO,UAAU,OAAO,CAAC;AAClE,aAAK,mBAAmB;AAAA,UACvB;AAAA,QACD;AAAA,MACD,OAAO;AACN,aAAK,mBAAmB,IAAI;AAAA,UAC3B,UAAU;AAAA,UACV,WAAW;AAAA,QACZ,CAAC;AACD,YAAG,KAAK,uCAAsC;AAC7C,eAAK,mBAAmB;AAAA,YACvB;AAAA,QACG,KAAK,kBAAkB,KAAK,GAAG,YAAY,UAAU,OAAO,QAAQ,EAAE,KAAK,UAAU,KAAK,OAAO,QAAQ,EAAE,IAAI,YAAY,GAAG,kBAAkB;AAAA;AAAA,UAEpJ;AAAA,QACD,OAAK;AACJ,eAAK,mBAAmB;AAAA,YACvB;AAAA,QACG,KAAK,kBAAkB,KAAK,GAAG,YAAY,UAAU,OAAO,QAAQ,EAAE,KAAK,MAAM,GAAG,kBAAkB;AAAA;AAAA,UAE1G;AAAA,QACD;AAAA,MAED;AAAA,IACD;AAAA,IAEA,0BAA0B;AACzB,YAAM,KAAK;AACX,YAAM,EAAE,UAAU,WAAS,IAAI,YAAU,IAAI,MAAM,IAAI,KAAK,iBAAiB,CAAC;AAE9E,UAAI,UAAU;AACb,aAAK,kBAAkB;AAAA,UACtB;AAAA;AAAA,QAEI,KAAK,mBAAmB;AAAA;AAAA,oCAEI;AAAA,SAC3B,yBAAyB;AAAA;AAAA,uDAEqB,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOnE;AACA,YAAG,KAAK,8BAA6B;AACpC,eAAK,kBAAkB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,QACzE,OAAO;AACN,eAAK,kBAAkB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,QACzE;AAAA,MACD,OAAO;AAEN,aAAK,wBAAwB;AAAA,MAC9B;AAEA,eAAS,2BAA2B;AACnC,YAAI,CAAC,YAAY,CAAC,WAAW;AAC5B,iBAAO,8BAA8B,GAAG,4BAA4B;AAAA,QACrE,WAAW,YAAY,CAAC,WAAW;AAClC,iBAAO,8BAA8B;AAAA,QACtC,WAAW,aAAa,CAAC,UAAU;AAClC,iBAAO,8BAA8B;AAAA,QACtC,OAAO;AACN,iBAAO,8BAA8B,cAAc;AAAA,QACpD;AAAA,MACD;AAAA,IAED;AAAA,IAEA,qBAAqB;AACpB,YAAM,EAAE,UAAU,MAAM,IAAI,KAAK,iBAAiB,CAAC;AACnD,UAAI,OAAO;AACV,eAAO,yCAAyC,eAAe;AAAA,MAChE,OAAO;AACN,eAAO,6CAA6C,OAAO,SAAS,QAAQ;AAAA,MAC7E;AAAA,IACD;AAAA,IAEA,sBAAsB,KAAK;AAC1B,UAAI,CAAC;AAAK,cAAM,KAAK,OAAO,QAAQ;AACpC,WAAK,iBAAiB,IAAI,IAAI,SAAS;AACvC,WAAK,sBAAsB,IAAI,IAAI,KAAK;AACxC,YAAM,cAAc,KAAK,OAAO,aAAa,qBAAqB,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI;AACpG,WAAK,mBAAmB,WAAW;AAEnC,WAAK,aAAa,IAAI,IAAI,KAAK;AAAA,IAChC;AAAA,IAEA,iBAAiB,OAAO;AACvB,YAAM,WAAW,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC3C,WAAK,gBAAgB,KAAK,sBAAsB,EAAE;AAAA,QACjD,QAAQ,GAAG,WAAW,eAAe,gBAAgB,OAAO,QAAQ;AAAA,MACrE;AAEA,WAAK,gBAAgB,KAAK,mBAAmB,EAAE;AAAA,QAC9C,QAAQ,GAAG,WAAW,YAAY,gBAAgB,OAAO,QAAQ;AAAA,MAClE;AAAA,IACD;AAAA,IAEA,sBAAsB,OAAO;AAC5B,UAAI,iBAAiB;AACrB,YAAM,IAAI,CAAC,SAAS;AACnB,yBAAiB,iBAAiB,KAAK;AAAA,MACxC,CAAC;AAED,WAAK,gBAAgB,KAAK,2BAA2B,EAAE;AAAA,QACtD,QAAQ,GAAG,gBAAgB,eAAe;AAAA,MAC3C;AAEA,WAAK,gBAAgB,KAAK,wBAAwB,EAAE;AAAA,QACnD,QAAQ,GAAG,gBAAgB,YAAY;AAAA,MACxC;AAAA,IACD;AAAA,IAEA,mBAAmB,OAAO;AACzB,YAAM,WAAW,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC3C,WAAK,gBAAgB,KAAK,wBAAwB,EAAE;AAAA,QACnD,QAAQ,GAAG,aAAa,eAAe,gBAAgB,OAAO,QAAQ;AAAA,MACvE;AAEA,WAAK,gBAAgB,KAAK,qBAAqB,EAAE;AAAA,QAChD,QAAQ,GAAG,aAAa,YAAY,gBAAgB,OAAO,QAAQ;AAAA,MACpE;AAAA,IACD;AAAA,IAEA,aAAa,OAAO;AACnB,UAAI,SAAS,MAAM,QAAQ;AAC1B,cAAM,WAAW,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC3C,cAAM,aAAa,MAAM,IAAI,OAAK;AACjC,cAAI,EAAE,oCAAoC;AAAK;AAE/C,gBAAM,cAAc,SAAS,KAAK,EAAE,WAAW,IAAI,EAAE,cAAgB,EAAE,QAAQ,IAAK,GAAG,EAAE,iBAAiB,EAAE,UAAS,EAAE;AACvH,iBAAO;AAAA,8BACmB;AAAA,8BACA,gBAAgB,EAAE,kCAAkC,QAAQ;AAAA;AAAA,QAEvF,CAAC,EAAE,KAAK,EAAE;AACV,aAAK,gBAAgB,KAAK,kBAAkB,EAAE,IAAI,WAAW,MAAM,EAAE,KAAK,UAAU;AAAA,MACrF,OAAO;AACN,aAAK,gBAAgB,KAAK,kBAAkB,EAAE,IAAI,WAAW,MAAM,EAAE,KAAK,EAAE;AAAA,MAC7E;AAAA,IACD;AAAA,IAEA,cAAc,EAAE,KAAK,GAAG;AACvB,YAAM,gBAAgB,qCAAqC,OAAO,IAAI;AACtE,aAAO,KAAK,oBAAoB,KAAK,aAAa;AAAA,IACnD;AAAA,IAEA,kBAAkB,MAAM;AACvB,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,aAAO,IAAI,MAAM,KAAK,OAAK,EAAE,QAAQ,KAAK,IAAI;AAAA,IAC/C;AAAA,IAEA,iBAAiB,MAAM,aAAa;AACnC,YAAM,QAAQ,KAAK,cAAc,IAAI;AAErC,UAAI,aAAa;AAChB,iBAAS,MAAM,KAAK,EAAE,OAAO,KAAK,MAAM,OAAO;AAAA,MAChD,OAAO;AACN,cAAM,WAAW,KAAK,kBAAkB,IAAI;AAC5C,aAAK,iBAAiB,UAAU,KAAK;AAAA,MACtC;AAEA,YAAM,mBAAmB,KAAK,oBAAoB,KAAK,oBAAoB,EAAE;AAC7E,WAAK,uBAAuB,IAAI;AAEhC,WAAK,0BAA0B,gBAAgB;AAAA,IAChD;AAAA,IAEA,iBAAiB,WAAW,iBAAiB;AAC5C,YAAM,WAAW,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC3C,YAAM,KAAK;AAEX,UAAI,CAAC,gBAAgB,QAAQ;AAC5B,aAAK,oBAAoB;AAAA,UACxB,iDAAiD,OAAO,UAAU,IAAI;AAAA;AAAA,QAEvE;AACA,0BAAkB,KAAK,cAAc,SAAS;AAAA,MAC/C;AACA,UAAI,YAAY,GAAG,oBAAoB;AAEvC,UAAG,GAAG,kCAAkC,CAAC,GAAG,4BAA2B;AACtE,qBAAa;AAAA,MACd;AACA,UAAG,GAAG,8BAA8B,CAAC,GAAG,gCAA+B;AACtE,qBAAa;AAAA,MACd;AACA,UAAG,GAAG,8BAA8B,GAAG,gCAA+B;AACrE,qBAAa;AAAA,MACd;AACA,UAAG,CAAC,GAAG,8BAA8B,CAAC,GAAG,gCAA+B;AACvE,qBAAa;AAAA,MACd;AAEA,mBAAa;AAAA,OACR,UAAU;AAAA;AAAA,MAEX,qBAAqB;AAAA;AAAA,KAEtB,uBAAuB;AAE1B,sBAAgB,KAAK,SAAS;AAC9B,UAAG,GAAG,kBAAiB;AACnB,aAAK,UAAU,YAAY,UAAU,OAAO,GAAG,KAAK,aAAa;AAAA,UACnE,IAAI;AAAA,YACH,WAAW;AAAA,YACX,WAAW;AAAA,YACX,UAAU,WAAW;AAEpB,iBAAG,OAAO,aAAa,WAAW,OAAO,KAAK,KAAK;AAAA,YACpD;AAAA,UACD;AAAA,UACA,QAAQ,gBAAgB,KAAK,WAAW;AAAA,UACxC,cAAc;AAAA,QACf,CAAC;AACQ,YAAI,OAAO,CAAC;AACrB,YAAG,UAAU,kBAAiB;AAC7B,iBAAO,UAAU,iBAAiB,MAAM,GAAG;AAAA,QAC5C,WAAS,UAAU,KAAI;AACtB,iBAAO,CAAC,UAAU,GAAG;AAAA,QACtB;AACA,YAAG,GAAG,yBAAwB;AAC7B,eAAK,UAAU,YAAY,UAAU,OAAO,GAAG,KAAK,aAAa;AAAA,YAChE,IAAI;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,cACX,UAAU,WAAW;AACpB,mBAAG,OAAO,aAAa,WAAW,OAAO,KAAK,KAAK;AAAA,cACpD;AAAA,YACD;AAAA,YACA,QAAQ,gBAAgB,KAAK,WAAW;AAAA,YACxC,cAAc;AAAA,UACf,CAAC;AAAA,QACF;AACA,YAAG,GAAG,oBAAmB;AACxB,eAAK,UAAU,YAAY,YAAY,OAAO,GAAG,KAAK,aAAa;AAAA,YAClE,IAAI;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW,WAAW;AACrB,uBAAO;AAAA,kBACN,SAAS;AAAA,oBACR,MAAM,UAAU;AAAA,kBACjB;AAAA,gBACD;AAAA,cACD;AAAA,cACA,UAAU,WAAW;AACpB,mBAAG,OAAO,aAAa,WAAW,YAAY,KAAK,KAAK;AAAA,cACzD;AAAA,YACD;AAAA,YACA,QAAQ,gBAAgB,KAAK,aAAa;AAAA,YAC1C,cAAc;AAAA,UACf,CAAC;AAAA,QACF;AACS,aAAK,UAAU,YAAY,WAAW,OAAO,GAAG,KAAK,aAAa;AAAA,UAC1D,IAAI;AAAA,YACA,WAAW;AAAA,YACX,WAAW;AAAA,YAC7B,WAAW,CAAC,GAAG;AAAA,YACf,UAAU,WAAW;AACpB,iBAAG,OAAO,aAAa,WAAW,QAAQ,KAAK,KAAK;AAAA,YACrD;AAAA,UACc;AAAA,UACA,QAAQ,gBAAgB,KAAK,YAAY;AAAA,UACzC,cAAc;AAAA,QAElB,CAAC;AACL,YAAG,GAAG,gCAA+B;AACpC,eAAK,UAAU,YAAY,eAAe,OAAO,GAAG,KAAK,aAAa;AAAA,YAC/D,IAAI;AAAA,cACA,WAAW;AAAA,cACX,WAAW;AAAA,cAC7B,UAAU,WAAW;AACpB,mBAAG,OAAO,aAAa,WAAW,uBAAuB,KAAK,KAAK;AAAA,cACpE;AAAA,YAEc;AAAA,YACA,QAAQ,gBAAgB,KAAK,qBAAqB;AAAA,YAClD,cAAc;AAAA,UAClB,CAAC;AAAA,QACd;AACA,YAAG,GAAG,4BAA2B;AACvB,eAAK,UAAU,YAAY,sBAAsB,OAAO,GAAG,KAAK,aAAa;AAAA,YACtE,IAAI;AAAA,cACA,WAAW;AAAA,cACX,WAAW;AAAA,cAC7B,UAAU,WAAW;AACpB,mBAAG,OAAO,aAAa,WAAW,mBAAmB,KAAK,KAAK;AAAA,cAChE;AAAA,YAEc;AAAA,YACA,QAAQ,gBAAgB,KAAK,4BAA4B;AAAA,YACzD,cAAc;AAAA,UAClB,CAAC;AAAA,QACd;AACA,YAAG,KAAK,2BAA0B;AACjC,eAAK,UAAU,YAAY,oBAAoB,OAAO,GAAG,KAAK,aAAa;AAAA,YAC1E,IAAI;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,YACZ;AAAA,YACA,QAAQ,gBAAgB,KAAK,qBAAqB;AAAA,YAClD,cAAc;AAAA,UACf,CAAC;AAAA,QACF;AACA,YAAG,KAAK,kCAAiC;AACxC,eAAK,UAAU,YAAY,mBAAmB,OAAO,GAAG,KAAK,aAAa;AAAA,YACzE,IAAI;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,YACZ;AAAA,YACA,QAAQ,gBAAgB,KAAK,oBAAoB;AAAA,YACjD,cAAc;AAAA,UACf,CAAC;AAAA,QACF;AACA,YAAG,KAAK,gCAA+B;AACtC,eAAK,UAAU,YAAY,yBAAyB,OAAO,GAAG,KAAK,aAAa;AAAA,YAC/E,IAAI;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,YACZ;AAAA,YACA,QAAQ,gBAAgB,KAAK,0BAA0B;AAAA,YACvD,cAAc;AAAA,UACf,CAAC;AAAA,QACF;AACA,aAAK,UAAU,YAAY,aAAa,OAAO,GAAG,KAAK,aAAa;AAAA,UACnD,IAAI;AAAA,YACA,WAAW;AAAA,YACX,WAAW;AAAA,YAC7B,WAAW;AAAA,UACZ;AAAA,UACe,QAAQ,gBAAgB,KAAK,mBAAmB;AAAA,UAChD,cAAc;AAAA,QAClB,CAAC;AAEL,YAAI,gBAAgB;AACpB,YAAI,gBAAgB,OAAO,GAAG,KAAK,aAAa;AAAA,UACxC,IAAI;AAAA,YACA,WAAW;AAAA,YACX,WAAW;AAAA,YAC7B,OAAO;AAAA,UAEO;AAAA,UACA,QAAQ,gBAAgB,KAAK,gBAAgB;AAAA,UAC7C,cAAc;AAAA,QAClB,CAAC;AACL,sBAAc,QAAQ;AACtB,UAAE,cAAc,MAAM,EAAE,GAAG,SAAS,WAAW;AACvD,aAAG,OAAO,sBAAsB,SAAS;AACzC,aAAG,cAAc;AACjB,aAAG,sBAAsB;AACzB,aAAG,OAAO,aAAa,QAAW,QAAQ;AAAA,QAElC,CAAC;AACD,aAAK,UAAU,YAAY,QAAQ,UAAU,UAAU,GAAG;AACnE,YAAG,GAAG,yBAAwB;AAC7B,eAAK,UAAU,YAAY,QAAQ,GAAG,UAAU;AAChD,eAAK,UAAU,YAAY,QAAQ,UAAU,UAAU,GAAG;AAC1D,eAAK,UAAU,YAAY,QAAQ,QAAQ;AAAA,QAC5C;AACA,YAAG,GAAG,oBAAmB;AACxB,eAAK,UAAU,YAAY,UAAU,UAAU,UAAU,QAAQ;AAAA,QAClE;AAGA,aAAK,UAAU,YAAY,WAAW,UAAU,UAAU,MAAM;AAChE,aAAK,UAAU,YAAY,SAAS,UAAU,UAAU,IAAI;AAE5D,YAAG,GAAG,gCAA+B;AACpC,eAAK,UAAU,YAAY,aAAa,UAAU,UAAU,mBAAmB;AAAA,QAChF;AACA,YAAG,GAAG,4BAA2B;AAChC,eAAK,UAAU,YAAY,oBAAoB,UAAU,UAAU,eAAe;AAAA,QACnF;AACA,YAAG,GAAG,2BAA0B;AAC/B,eAAK,UAAU,YAAY,kBAAkB,UAAU,UAAU,qBAAqB;AAAA,QACvF;AACA,YAAG,GAAG,kCAAiC;AACtC,eAAK,UAAU,YAAY,iBAAiB,UAAU,UAAU,mBAAmB;AAAA,QACpF;AACA,YAAG,GAAG,gCAA+B;AACpC,cAAI,GAAG,cAAc,UAAS;AAC7B,mBAAO,MAAM,sDAAsD;AAAA,cAClE,YAAY,GAAG,cAAc;AAAA,cAAU,aAAa,UAAU;AAAA,YAC/D,CAAC,EAAE,KAAK,OAAG;AACV,mBAAK,UAAU,YAAY,uBAAuB,UAAU,CAAC;AAAA,YAC9D,CAAC;AAAA,UACF;AAAA,QACD;AACA,YAAG,GAAG,yBAAwB;AAC7B,iBAAO,MAAM,uDAAuD;AAAA,YACnE,aAAa,UAAU;AAAA,UACxB,CAAC,EAAE,KAAK,OAAG;AACV,iBAAK,UAAU,YAAY,QAAQ,GAAG,UAAU;AAChD,iBAAK,UAAU,YAAY,QAAQ,QAAQ;AAAA,UAC5C,CAAC;AAAA,QACF;AAAA,MACD;AAEA,oCAA8B;AAE9B,eAAS,gCAAgC;AACxC,cAAM,YAAY,MAAM,KAAK,GAAG,oBAAoB,KAAK,mBAAmB,CAAC;AAC7E,WAAG,aAAa,KAAK,qBAAqB,EAAE,IAAI,SAAS,EAAE;AAC3D,WAAG,oBAAoB,KAAK,mBAAmB,EAAE,IAAI,SAAS,EAAE;AAChE,YAAI,YAAY,UAAU,OAAO,CAACC,YAAW,QAAQ;AACpD,cAAI,EAAE,GAAG,EAAE,MAAM,IAAIA;AACpB,YAAAA,aAAY,EAAE,GAAG,EAAE,MAAM;AAC1B,iBAAOA;AAAA,QACR,GAAG,CAAC;AAEJ,qBAAa;AACb,YAAI,aAAa;AAAG,sBAAY;AAEhC,WAAG,aAAa,KAAK,qBAAqB,EAAE,IAAI,SAAS,SAAS;AAClE,WAAG,oBAAoB,KAAK,mBAAmB,EAAE,IAAI,SAAS,SAAS;AAAA,MACxE;AAEA,eAAS,yBAAyB;AACjC,YAAG,GAAG,kBAAiB;AACtB,cAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,SAAS,UAAU,QAAQ;AAC9E,gBAAI,OAAO;AAAA;AAAA;AAIX,gBAAG,GAAG,yBAAwB;AAC7B,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,oBAAmB;AACxB,sBAAQ;AAAA,YACT;AACA,oBAAQ;AACR,gBAAG,GAAG,gCAA+B;AACpC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,4BAA2B;AAChC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,2BAA0B;AAC/B,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,kCAAiC;AACtC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,gCAA+B;AACpC,sBAAQ;AAAA,YACT;AACe,oBAAQ;AAAA;AAAA;AAGR,mBAAO;AAAA,UACX,OAAO;AAClB,gBAAI,OAAO;AAAA;AAAA;AAGX,gBAAG,GAAG,yBAAwB;AAC7B,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,oBAAmB;AACxB,sBAAQ;AAAA,YACT;AACA,oBAAQ;AACR,gBAAG,GAAG,gCAA+B;AACpC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,4BAA2B;AAChC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,2BAA0B;AAC/B,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,kCAAiC;AACtC,sBAAQ;AAAA,YACT;AACA,gBAAG,GAAG,gCAA+B;AACpC,sBAAQ;AAAA,YACT;AACe,oBAAQ;AAAA;AAAA;AAGR,mBAAO;AAAA,UACX;AAAA,QACb,OAAO;AACN,cAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,SAAS,UAAU,QAAQ;AAC/D,mBAAO;AAAA;AAAA,0EAE+C,UAAU,OAAO;AAAA,2EAChB,UAAU;AAAA,sDAC/B,UAAU;AAAA;AAAA,yDAEP,WAAW,UAAU,MAAM,EAAE,QAAQ,CAAC;AAAA,2DACpC,WAAW,UAAU,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA,UAG/E,OAAO;AACH,mBAAO;AAAA;AAAA,2EAEgD,UAAU,OAAO;AAAA,2EACjB,UAAU;AAAA,sDAC/B,UAAU;AAAA;AAAA,yDAEP,WAAW,UAAU,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA,UAG7E;AAAA,QACb;AAAA,MAED;AAEA,eAAS,uBAAuB;AAC/B,YAAI,UAAU,aAAa;AAC1B,cAAI,UAAU,YAAY,QAAQ,OAAO,KAAK,IAAI;AACjD,gBAAI;AACH,wBAAU,cAAc,EAAE,UAAU,WAAW,EAAE,KAAK;AAAA,YACvD,SAAS,OAAP;AACD,wBAAU,cAAc,UAAU,YAAY,QAAQ,UAAU,GAAG,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,YACjH;AAAA,UACD;AACA,oBAAU,cAAc,OAAO,SAAS,UAAU,aAAa,EAAE;AACjE,iBAAO,0BAA0B,UAAU;AAAA,QAC5C;AACA,eAAO;AAAA,MACR;AAEA,eAAS,sBAAsB;AAC9B,cAAM,EAAE,OAAO,UAAU,IAAI;AAC7B,YAAI,CAAC,GAAG,eAAe,OAAO;AAC7B,iBAAO;AAAA;AAAA;AAAA;AAAA,cAIG,eAAe,OAAO,SAAS,SAAS;AAAA;AAAA,QAEnD,OAAO;AACN,iBAAO,qCAAqC,OAAO,SAAS,SAAS;AAAA,QACtE;AAAA,MACD;AAAA,IACD;AAAA,IAEA,oBAAoB,MAAM;AACzB,YAAM,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK;AACpC,QAAE,IAAI,EAAE,OAAO,EAAE,YAAY,qCAAqC,iBAAiB;AAAA,IACpF;AAAA,IAEA,mCAAmC,UAAU,OAAO,MAAM;AACzD,YAAM,kBAAkB,KAAK,cAAc,IAAI;AAC/C,sBAAgB,KAAK,QAAQ,YAAY,OAAO,KAAK,CAAC;AAAA,IACvD;AAAA,IAEA,oBAAoB,eAAe;AAClC,UAAI,eAAe;AAClB,YAAG,KAAK,sBAAqB;AAC5B,eAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAAA,QACjE,OAAO;AACN,eAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAAA,QACjE;AAEA,YAAG,KAAK,kBAAiB;AACxB,eAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,QACtE,OAAO;AACN,eAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,QACtE;AACA,YAAG,KAAK,wBAAuB;AAC9B,eAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,QACvE,OAAO;AACN,eAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,QACvE;AACA,aAAK,gBAAgB,KAAK,gBAAgB,EAAE,IAAI,WAAW,MAAM;AAAA,MAClE,OAAO;AACN,aAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAC/D,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AACtE,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AACpE,aAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AACvE,aAAK,gBAAgB,KAAK,gBAAgB,EAAE,IAAI,WAAW,MAAM;AAAA,MAClE;AAAA,IACD;AAAA,IAEA,uBAAuB,QAAQ;AAC9B,UAAI,QAAQ;AACX,aAAK,mBAAmB,IAAI,WAAW,MAAM;AAC7C,aAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI;AAAA,UAC9C,oBAAoB;AAAA,QACrB,CAAC;AACD,YAAG,KAAK,kBAAiB;AACxB,eAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI;AAAA,YACnD,oBAAoB;AAAA,UACrB,CAAC;AAAA,QACF,OAAO;AACN,eAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI;AAAA,YACnD,oBAAoB;AAAA,UACrB,CAAC;AAAA,QACF;AACA,YAAG,KAAK,wBAAuB;AAC9B,eAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI;AAAA,YACpD,oBAAoB;AAAA,UACrB,CAAC;AAAA,QACF,OAAO;AACN,eAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI;AAAA,YACpD,oBAAoB;AAAA,UACrB,CAAC;AAAA,QACF;AAAA,MAED,OAAO;AACN,aAAK,mBAAmB,IAAI,WAAW,MAAM;AAC7C,aAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI;AAAA,UAC9C,oBAAoB;AAAA,QACrB,CAAC;AACD,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI;AAAA,UACnD,oBAAoB;AAAA,QACrB,CAAC;AAED,aAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI;AAAA,UACpD,oBAAoB;AAAA,QACrB,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IAEA,0BAA0B,kBAAkB;AAC3C,YAAM,mBAAmB,KAAK,oBAAoB,KAAK,kBAAkB;AAGzE,yBAAmB,KAAK,oBAAoB,iBAAiB,OAAO,KAAK,KAAK,aAAa,IAAI,WAAW,MAAM;AAEhH,2BAAqB,KAAK,CAAC,iBAAiB,UAAU,KAAK,0BAA0B;AAAA,IACtF;AAAA,IAEA,gBAAgB,MAAM;AACrB,YAAM,iBAAiB,KAAK,KAAK,mBAAmB;AACpD,YAAM,uBAAuB,CAAC,OAAO,uBAAuB,MAAM,EAAE,SAAS,cAAc;AAC3F,YAAM,oBAAoB,uBACxB,kBAAkB,UAAU,KAAK,qBACjC,kBAAkB,yBAAyB,KAAK,yBAChD,kBAAkB,QAAU;AAE9B,YAAM,0BAA0B,KAAK,gBAAgB;AACrD,YAAM,oBAAoB,CAAC,KAAK;AAChC,YAAM,wBAAwB,KAAK,eAAe,KAAK,eAAe;AAEtE,UAAI,sBAAsB;AACzB,YAAI,CAAC,mBAAmB;AACvB,gBAAM,QAAQ,kBAAkB,SAAS,OAAO,KAAK,IAAI,WAAW,KAAK;AACzE,gBAAM,UAAU,GAAG,0DAA0D,CAAC,KAAK,CAAC;AACpF,iBAAO,WAAW;AAAA,YACjB,WAAW;AAAA,YACX;AAAA,UACD,CAAC;AACD,iBAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,QACD;AAEA,YAAI,qBAAqB,uBAAuB;AAC/C,eAAK,cAAc;AAAA,QACpB,WAAW,yBAAyB;AACnC,eAAK,cAAc;AAAA,QACpB;AACA,aAAK,eAAe;AAAA,MAErB,WAAW,mBAAmB,YAAY;AACzC,aAAK,cAAc;AACnB,aAAK,sBAAsB;AAC3B,aAAK,OAAO,aAAa,QAAW,cAAc;AAClD;AAAA,MACD,WAAW,mBAAmB,UAAU;AACvC,aAAK,cAAc;AACnB,aAAK,sBAAsB;AAC3B,aAAK,OAAO,aAAa,QAAW,cAAc;AAClD;AAAA,MACD,OAAO;AACN,aAAK,eAAe,mBAAmB,WAAW,KAAK,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK,eAAe;AACvG,aAAK,eAAe,KAAK,gBAAgB;AAAA,MAC1C;AAEA,YAAM,sCAAsC,CAAC,wBAAwB;AAErE,UAAI,qCAAqC;AACxC,eAAO,WAAW;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,GAAG,2CAA2C;AAAA,QACxD,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,MACD;AAEA,UAAI,IAAI,KAAK,YAAY,IAAI,OAAO,KAAK,gBAAgB,uBAAuB;AAC/E,eAAO,WAAW;AAAA,UACjB,SAAS,GAAG,sCAAsC;AAAA,UAClD,WAAW;AAAA,QACZ,CAAC;AACD,eAAO,MAAM,WAAW,OAAO;AAC/B,aAAK,eAAe;AAAA,MACrB;AAEA,WAAK,qBAAqB,MAAM,cAAc;AAC9C,WAAK,OAAO,aAAa,KAAK,cAAc,KAAK,WAAW;AAAA,IAC7D;AAAA,IAEA,qBAAqB,MAAM,aAAa;AACvC,YAAM,6BAA6B,KAAK,SAAS,wBAAwB;AACzE,YAAM,wBAAwB,CAAC,OAAO,uBAAuB,QAAQ,MAAM,EAAE,SAAS,WAAW;AAEjG,UAAI,CAAC,4BAA4B;AAChC,aAAK,SAAS,wBAAwB;AAAA,MACvC;AACA,UAAI,KAAK,gBAAgB,eAAe,4BAA4B;AAEnE,aAAK,YAAY,wBAAwB;AAAA,MAC1C;AACA,UAAI,KAAK,eAAe,KAAK,gBAAgB,eAAe,uBAAuB;AAElF,cAAM,WAAW,EAAE,uBAAuB,KAAK,eAAe;AAC9D,iBAAS,YAAY,wBAAwB;AAAA,MAC9C;AACA,UAAI,CAAC,yBAAyB,gBAAgB,QAAQ;AAErD,mBAAW,MAAM;AAChB,eAAK,YAAY,wBAAwB;AAAA,QAC1C,GAAG,GAAG;AAAA,MACP;AAAA,IACD;AAAA,IAEA,cAAc,MAAM;AACnB,UAAI,MAAM;AACT,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAC1C,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAAA,MAC3C,OAAO;AACN,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAC1C,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAAA,MAC3C;AACA,WAAK,aAAa;AAAA,IACnB;AAAA,IAEA,eAAe;AACd,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,gBAAgB,KAAK,yBAAyB,EAAE,YAAY,wBAAwB;AAAA,IAC1F;AAAA,IAEA,yBAAyB,WAAW;AACnC,UAAI,CAAC,OAAO,uBAAuB,MAAM,EAAE,SAAS,SAAS,GAAG;AAC/D,aAAK,gBAAgB,KAAK,uBAAuB,aAAa,EAAE,MAAM;AAAA,MACvE;AAAA,IACD;AAAA,IAEA,qBAAqB,MAAM;AAC1B,UAAI,MAAM;AACT,cAAM,EAAE,SAAS,IAAI,KAAK,iBAAiB,CAAC;AAE5C,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAC1C,aAAK,kBAAkB,IAAI;AAAA,UAC1B,UAAU;AAAA,UACV,eAAe;AAAA,QAChB,CAAC;AACD,aAAK,kBAAkB,KAAK,mBAAmB,EAAE;AAAA,UAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAUG,KAAK,mBAAmB;AAAA;AAAA,mCAEI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWhC;AAEA,aAAK,kBAAkB,OAAO,2CAA2C;AACzE,YAAG,KAAK,8BAA6B;AACpC,eAAK,kBAAkB,KAAK,kBAAkB,EAAE,IAAI,WAAW,MAAM;AACrE,eAAK,kBAAkB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,QACxE,OAAO;AACN,eAAK,kBAAkB,KAAK,kBAAkB,EAAE,IAAI,WAAW,MAAM;AACrE,eAAK,kBAAkB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,QACxE;AACA,aAAK,uBAAuB;AAC5B,aAAK,4BAA4B;AAAA,MAElC,OAAO;AACN,aAAK,gBAAgB,IAAI,WAAW,MAAM;AAC1C,aAAK,kBAAkB,IAAI;AAAA,UAC1B,UAAU;AAAA,UACV,eAAe;AAAA,QAChB,CAAC;AAED,aAAK,wBAAwB;AAAA,MAC9B;AAAA,IACD;AAAA,IAEA,yBAAyB;AACxB,YAAM,iBAAiB,KAAK,kBAAkB,KAAK,4BAA4B;AAE/E,YAAM,MAAM,CAAC;AAAA,QACZ,WAAW;AAAA,QACX,OAAO,GAAG,OAAO;AAAA,QACjB,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa,GAAG,wBAAwB;AAAA,MACzC,GAAE;AAAA,QACD,WAAW;AAAA,QACX,OAAO,GAAG,cAAc;AAAA,QACxB,WAAW;AAAA,QACX,aAAa,GAAG,+BAA+B;AAAA,MAChD,GAAE;AAAA,QACD,WAAW;AAAA,QACX,OAAO,GAAG,iBAAiB;AAAA,QAC3B,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa,GAAG,wBAAwB;AAAA,MACzC,GAAE;AAAA,QACD,WAAW;AAAA,QACX,OAAO,GAAG,gBAAgB;AAAA,QAC1B,WAAW;AAAA,QACX,WAAW;AAAA,MACZ,CAAC;AAED,YAAM,KAAK;AACX,UAAI,QAAQ,QAAM;AACjB,aAAK,YAAY,GAAG,qBAAqB,OAAO,GAAG,KAAK,aAAa;AAAA,UACpE,IAAI,iCAAK,KAAL;AAAA,YACH,UAAU;AAAA,UACX;AAAA,UACA,QAAQ,eAAe,KAAK,IAAI,GAAG,iBAAiB;AAAA,UACpD,cAAc;AAAA,QACf,CAAC;AACD,aAAK,YAAY,GAAG,mBAAmB,UAAU,KAAK,cAAc,GAAG,UAAU;AAAA,MAClF,CAAC;AAED,eAAS,+BAA+B;AACvC,cAAM,gBAAgB,GAAG,cAAc,KAAK,GAAG;AAC/C,cAAM,mBAAmB,GAAG,cAAc;AAE1C,YAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS,KAAK,GAAG,aAAa,kBAAkB;AACvF,iBAAO,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,MAAM;AAAA,cACL,WAAW,KAAK,GAAG;AAAA,cACnB,UAAU;AAAA,cACV,OAAO,KAAK;AAAA,YACb;AAAA,YACA,UAAU,CAAC,MAAM;AAChB,kBAAG,CAAC,EAAE,KAAK;AACV,mBAAG,cAAc,KAAK,GAAG,aAAa,KAAK;AAC3C,uBAAO,WAAW;AAAA,kBACjB,SAAS,GAAG,wCAAwC;AAAA,kBACpD,WAAW;AAAA,gBACZ,CAAC;AACD,uBAAO,MAAM,WAAW,QAAQ;AAAA,cACjC;AAAA,YACD;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,IAEA,8BAA8B;AAC7B,aAAO,GAAG,SAAS,iBAAiB;AAAA,QACnC,SAAS,EAAE,UAAU,KAAK,cAAc,UAAU,WAAW,EAAE;AAAA,QAC/D,QAAQ,CAAC,QAAQ,eAAe,UAAU,gBAAgB,gBAAgB,UAAU;AAAA,QACpF,OAAO;AAAA,MACR,CAAC,EAAE,KAAK,CAAC,QAAQ;AAChB,cAAM,wBAAwB,KAAK,kBAAkB,KAAK,wBAAwB;AAElF,YAAI,CAAC,IAAI,QAAQ;AAChB,gCAAsB;AAAA,YACrB;AAAA,UACD;AACA;AAAA,QACD;AAEA,cAAM,eAAe,OAAO,IAAI,GAAG,eAAa,MAAI,IAAI,GAAG,YAAY,EAAE,QAAQ;AACjF,aAAK,kBAAkB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,cAAc;AAEpF,YAAI,QAAQ,aAAW;AACtB,gBAAM,mBAAmB,OAAO,QAAQ,eAAa,MAAI,QAAQ,YAAY,EAAE,OAAO,gBAAgB;AACtG,cAAI,kBAAkB;AAAA,YACrB,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,YACV,gBAAgB;AAAA,UACjB;AAEA,gCAAsB;AAAA,YACrB,mDAAmD,OAAO,QAAQ,IAAI;AAAA;AAAA,mCAExC,QAAQ;AAAA,mCACR;AAAA;AAAA;AAAA;AAAA,UAIzB,gBAAgB,QAAQ,aAAa,QAAQ,UAAU,CAAC,KAAK;AAAA;AAAA;AAAA,wDAGf,gBAAgB,QAAQ;AAAA,iBAC/D,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMrB;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAAA,IAEA,2BAA2B,KAAK;AAC/B,QAAE,IAAI,OAAO,EAAE,IAAI,gBAAgB;AACnC,QAAE,IAAI,OAAO,EAAE,GAAG,kBAAkB,MAAM;AACzC,YAAI,IAAI,IAAI,MAAM,QAAQ;AACzB,eAAK,oBAAoB,KAAK,EAAE;AAChC,cAAI,IAAI,MAAM,QAAQ,UAAQ;AAC7B,iBAAK,iBAAiB,IAAI;AAAA,UAC3B,CAAC;AAAA,QACF;AACA,aAAK,sBAAsB,GAAG;AAAA,MAC/B,CAAC;AAAA,IACF;AAAA,IAEA,eAAe;AACd,cAAQ,IAAI,cAAc;AAC1B,YAAM,MAAM,KAAK,OAAO,QAAQ;AAEhC,WAAK,2BAA2B,GAAG;AAEnC,WAAK,uBAAuB,IAAI,IAAI,QAAQ,EAAE,KAAK,MAAM;AACxD,aAAK,OAAO,yBAAyB,KAAK,aAAa;AACvD,aAAK,wBAAwB;AAE7B,aAAK,oBAAoB,KAAK,EAAE;AAChC,YAAI,IAAI,IAAI,MAAM,QAAQ;AACzB,cAAI,IAAI,MAAM,QAAQ,UAAQ;AAC7B,iBAAK,iBAAiB,IAAI;AAAA,UAC3B,CAAC;AAAA,QACF,OAAO;AACN,eAAK,0BAA0B;AAC/B,eAAK,uBAAuB,IAAI;AAAA,QACjC;AAEA,aAAK,sBAAsB,GAAG;AAE9B,YAAG,IAAI,IAAI,cAAc,GAAG;AAC3B,eAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAChE,eAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AACrE,cAAG,KAAK,wBAAuB;AAC9B,iBAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,UACvE,OAAO;AACN,iBAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,UACvE;AACA,eAAK,gBAAgB,KAAK,gBAAgB,EAAE,IAAI,WAAW,MAAM;AAAA,QAClE,OAAO;AACN,cAAG,KAAK,sBAAsB;AAC7B,iBAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAAA,UACjE,OAAO;AACF,iBAAK,gBAAgB,KAAK,eAAe,EAAE,IAAI,WAAW,MAAM;AAAA,UAErE;AACA,cAAG,KAAK,kBAAiB;AACxB,iBAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,UACtE,OAAO;AACP,iBAAK,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,WAAW,MAAM;AAAA,UACrE;AACA,cAAG,KAAK,wBAAuB;AAC9B,iBAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,UACvE,OAAO;AACN,iBAAK,gBAAgB,KAAK,qBAAqB,EAAE,IAAI,WAAW,MAAM;AAAA,UACvE;AACA,eAAK,gBAAgB,KAAK,gBAAgB,EAAE,IAAI,WAAW,MAAM;AAAA,QAClE;AAEA,aAAK,iBAAiB,IAAI;AAAA,MAC3B,CAAC;AAAA,IACF;AAAA,IAEA,iBAAiB,MAAM;AACtB,aAAO,KAAK,WAAW,IAAI,WAAW,MAAM,IAAI,KAAK,WAAW,IAAI,WAAW,MAAM;AAAA,IACtF;AAAA,IAEA,sBAAsB,gBAAgB,MAAM;AAC3C,YAAM,KAAK;AACX,YAAM,SAAS,IAAI,OAAO,GAAG,OAAO;AAAA,QACnC,OAAO,GAAG,yBAAyB;AAAA,QACnC,QAAQ;AAAA,UACP;AAAA,YACC,WAAW;AAAA,YACX,OAAO,GAAG,kBAAkB;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM;AAAA,UACP;AAAA,UACA;AAAA,YACC,WAAW;AAAA,YACX,OAAO,GAAG,gBAAgB;AAAA,YAC1B,WAAW;AAAA,YACX,MAAM;AAAA,UACP;AAAA,QACD;AAAA,QACA,sBAAsB,GAAG,cAAc;AAAA,QACvC,gBAAgB,OAAO,WAAW;AACjC,cAAI,eAAe;AAElB,kBAAM,OAAO,KAAK;AAAA,cACjB,QAAQ;AAAA,cACR,MAAM,EAAE,UAAU,cAAc;AAAA,cAChC,QAAQ;AAAA,cACR,gBAAgB;AAAA,YACjB,CAAC;AAED,kBAAMC,OAAM,GAAG,OAAO,QAAQ;AAC9B,kBAAM,OAAO,MAAM,UAAUA,KAAI,IAAI,SAASA,KAAI,IAAI,MAAM,YAAY,aAAa;AACrF,kBAAMA,KAAI,eAAe,QAAQ,YAAYA,KAAI,IAAI,SAASA,KAAI,IAAI,IAAI;AAAA,UAC3E;AAGA,gBAAM,MAAM,GAAG,OAAO,QAAQ;AAC9B,cAAI,IAAI,sBAAsB,OAAO;AACrC,cAAI,IAAI,wBAAwB,OAAO;AAEvC,iBAAO,KAAK;AACZ,gBAAM,GAAG,OAAO,mBAAmB;AAAA,QACpC;AAAA,MACD,CAAC;AACD,aAAO,KAAK;AAAA,IACb;AAAA,IAEA,MAAM,aAAa,gBAAgB,MAAM;AACxC,UAAI,eAAe;AAClB,cAAM,OAAO,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR,MAAM,EAAE,UAAU,cAAc;AAAA,UAChC,QAAQ;AAAA,UACR,gBAAgB;AAAA,QACjB,CAAC;AAED,cAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,cAAM,OAAO,MAAM,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,MAAM,YAAY,aAAa;AACrF,cAAM,IAAI,eAAe,QAAQ,YAAY,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI;AAAA,MAC3E;AAEA,YAAM,KAAK,OAAO,mBAAmB;AAAA,IACtC;AAAA,EACD;;;AChzDA,SAAO,QAAQ,qBAAqB;AACpC,UAAQ,YAAY,cAAc,MAAM;AAAA,IACvC,YAAY,EAAE,SAAS,QAAQ,SAAS,GAAG;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,cAAc,SAAS;AAC5B,WAAK,oBAAoB,SAAS;AAClC,WAAK,wBAAwB,SAAS;AACtC,WAAK,2BAA2B,SAAS;AACzC,WAAK,eAAe,CAAC;AAErB,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAChB,WAAK,YAAY;AACjB,WAAK,sBAAsB;AAC3B,WAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,cAAc;AACb,WAAK,QAAQ;AAAA,QACZ;AAAA,MACD;AAEA,WAAK,aAAa,KAAK,QAAQ,KAAK,yBAAyB;AAAA,IAC9D;AAAA,IAEA,wBAAwB;AACvB,WAAK,WAAW;AAAA,QACf;AAAA,yBACsB,GAAG,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBzC;AAEA,WAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACnD,WAAK,oBAAoB,KAAK,WAAW,KAAK,YAAY;AAC1D,WAAK,cAAc,KAAK,WAAW,KAAK,aAAa;AACrD,WAAK,cAAc,KAAK,WAAW,KAAK,aAAa;AACrD,WAAK,kBAAkB,KAAK,WAAW,KAAK,iBAAiB;AAC7D,WAAK,mBAAmB,KAAK,WAAW,KAAK,mBAAmB;AAChE,WAAK,0BAA0B,KAAK,WAAW,KAAK,yBAAyB;AAAA,IAC9E;AAAA,IAEA,0BAA0B,MAAM;AAE/B,aAAO,QAAQ,KAAK,QAAQ,KAAK,aAAa;AAAA,IAC/C;AAAA,IAEA,MAAM,4BAA4B,MAAM;AACvC,YAAM,uBAAuB,CAAC,KAAK,0BAA0B,IAAI;AAGjE,YAAM,oBAAoB,CAAC,QAAQ,IAAI,KAAK,CAAC;AAE7C,UAAK,CAAC,qBAAqB,wBAAyB,mBAAmB;AAGtE,cAAM,KAAK,2BAA2B;AAAA,MACvC;AACA,UAAG,CAAC,KAAK,0BAAyB;AACjC,aAAK,OAAO,qBAAqB,CAAC,iBAAiB;AACnD,aAAK,iBAAiB,CAAC,iBAAiB;AAAA,MACzC;AAGA,UAAI,QAAQ,sBAAsB;AACjC,aAAK,UAAU,KAAK;AACpB,aAAK,YAAY,OAAO,SAAS,KAAK,OAAO;AAC7C,aAAK,OAAO,KAAK;AACjB,aAAK,WAAW;AAChB,aAAK,WAAW,KAAK,OAAO,QAAQ,EAAE,IAAI;AAE1C,aAAK,eAAe;AAEpB,aAAK,WAAW,IAAI;AACpB,aAAK,oBAAoB,IAAI;AAC7B,aAAK,YAAY,IAAI;AACrB,aAAK,OAAO,oBAAoB,IAAI;AAAA,MACrC,OAAO;AACN,aAAK,eAAe,CAAC;AAAA,MACtB;AAAA,IACD;AAAA,IAEA,6BAA6B;AAC5B,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,WAAW,IAAI,MAAM,KAAK,UAAQ,KAAK,SAAS,KAAK,IAAI;AAE/D,UAAI,CAAC;AAAU;AAEf,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,SAAS;AACzB,YAAM,qBAAqB,CAAC,SAAS;AAErC,UAAK,cAAc,sBAAwB,WAAW,oBAAqB;AAC1E,eAAO,WAAW;AAAA,UACjB,SAAS,GAAG,sDAAsD;AAAA,UAClE,WAAW;AAAA,QACZ,CAAC;AACD,eAAO,MAAM,WAAW,QAAQ;AAChC,eAAO,KAAK,OAAO,sBAAsB;AAAA,MAC1C;AAAA,IACD;AAAA,IAEA,WAAW,MAAM;AAChB,UAAI,EAAE,WAAW,aAAa,OAAO,gBAAgB,IAAI;AAEzD,eAAS,uBAAuB;AAC/B,YAAI,aAAa;AAChB,wBAAc,YAAY,QAAQ,KAAK,MAAM,MAAM,YAAY,SAAS,MAAM,YAAY,OAAO,GAAG,GAAG,IAAI,QAAQ;AACnH,iBAAO;AAAA,QACR;AACA,eAAO;AAAA,MACR;AAEA,WAAK,WAAW,KAAK,SAAS;AAC9B,WAAK,kBAAkB,KAAK,qBAAqB,CAAC;AAClD,WAAK,YAAY,KAAK,gBAAgB,iBAAiB,KAAK,QAAQ,CAAC;AACrE,UAAI,CAAC,KAAK,eAAe,OAAO;AAC/B,aAAK,YAAY;AAAA,UAChB;AAAA;AAAA,2BAEuB;AAAA,YACf,OAAO,SAAS,SAAS;AAAA;AAAA,QAElC;AAAA,MACD,OAAO;AACN,aAAK,YAAY,KAAK,0BAA0B,OAAO,SAAS,SAAS,SAAS;AAAA,MACnF;AAAA,IAED;AAAA,IAEA,oBAAoB,MAAM;AACzB,YAAM,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK;AACpC,QAAE,IAAI,EAAE,YAAY,0BAA0B,iBAAiB;AAAA,IAChE;AAAA,IAEA,oBAAoB,MAAM;AACzB,UAAI,KAAK,qBAAqB;AAC7B,aAAK,iBAAiB;AAAA,UACrB,0BAA0B,gBAAgB,KAAK,iBAAiB,KAAK,QAAQ;AAAA,iCAChD,KAAK;AAAA,QACnC;AACA,aAAK,YAAY,KAAK,gBAAgB,KAAK,MAAM,KAAK,QAAQ,CAAC;AAAA,MAChE,OAAO;AACN,aAAK,iBAAiB,KAAK,EAAE;AAAA,MAC9B;AAAA,IACD;AAAA,IAEA,YAAY,MAAM;AACjB,YAAM,oBAAoB,KAAK,gBAAgB,IAAI;AACnD,WAAK,gBAAgB,KAAK,EAAE;AAE5B,wBAAkB,QAAQ,CAAC,WAAW,QAAQ;AAC7C,aAAK,gBAAgB;AAAA,UACpB,eAAe,sCAAsC;AAAA,QACtD;AAEA,cAAM,aAAa,KAAK,UAAU,OAAO,KAAK,QAAM,GAAG,cAAc,SAAS;AAC9E,sBAAc,wBAAyB,WAAW,QAAQ,GAAG,cAAc,IAAK;AAChF,cAAM,KAAK;AACX,YAAI,OAAO,CAAC;AACZ,eAAO,GAAG,QAAQ,QAAO,GAAG,aAAa,SAAS,EAAE,KAAK,SAAO;AAC/D,iBAAO,IAAI,KAAK,IAAI,CAAAC,UAAQA,MAAK,GAAG;AAAA,QACrC,CAAC;AACD,aAAK,GAAG,uBAAuB,OAAO,GAAG,KAAK,aAAa;AAAA,UAC1D,IAAI,iCACA,aADA;AAAA,YAEH,UAAU,WAAW;AACpB,iBAAG,OAAO,aAAa,GAAG,cAAc,WAAW,KAAK,KAAK;AAAA,YAC9D;AAAA,YACA,WAAU,WAAY;AACrB,kBAAG,cAAc,OAAM;AACtB,uBAAO;AAAA,kBACN,SAAS;AAAA,oBACR,MAAM,CAAC,MAAK,IAAI;AAAA,kBACjB;AAAA,gBACD;AAAA,cACD;AACA;AAAA,YACc;AAAA,UAChB;AAAA,UACA,QAAQ,KAAK,gBAAgB,KAAK,IAAI,mBAAmB;AAAA,UACzD,cAAc;AAAA,QACf,CAAC;AACD,aAAK,GAAG,qBAAqB,UAAU,KAAK,UAAU;AAAA,MACvD,CAAC;AAED,WAAK,+BAA+B,IAAI;AAExC,WAAK,iCAAiC;AAAA,IACvC;AAAA,IAEA,gBAAgB,MAAM;AACrB,YAAM,SAAS,CAAC,OAAO,OAAO,QAAQ,qBAAqB,uBAAuB,aAAa,cAAc,iBAAiB;AAC9H,UAAI,KAAK;AAAe,eAAO,KAAK,WAAW;AAC/C,UAAI,KAAK;AAAc,eAAO,KAAK,UAAU;AAC7C,aAAO;AAAA,IACR;AAAA,IAEA,+BAA+B,MAAM;AACpC,UAAI,KAAK,iBAAiB,KAAK,cAAc;AAC5C,cAAM,QAAQ,KAAK,gBAAgB,GAAG,kBAAkB,IAAI,GAAG,iBAAiB;AAChF,aAAK,gBAAgB;AAAA,UACpB,wDAAwD;AAAA,QACzD;AACA,aAAK,gBAAgB,KAAK,oBAAoB,EAAE,KAAK,UAAU,EAAE,IAAI,UAAU,MAAM;AAAA,MACtF;AAAA,IACD;AAAA,IAEA,mCAAmC;AAClC,YAAM,KAAK;AACX,UAAI,KAAK,cAAc;AACtB,aAAK,aAAa,GAAG,WAAW,WAAW;AAC1C,cAAI,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG;AACxC,eAAG,OAAO,aAAa,GAAG,cAAc,QAAQ,KAAK,KAAK,EAAE,KAAK,MAAM;AACtE,oBAAM,WAAW,OAAO,QAAQ,GAAG,SAAS,GAAG,IAAI;AACnD,oBAAM,MAAM,GAAG,OAAO,QAAQ,EAAE;AAChC,iBAAG,YAAY,KAAK,gBAAgB,SAAS,MAAM,IAAI,QAAQ,CAAC;AAChE,iBAAG,oBAAoB,QAAQ;AAAA,YAChC,CAAC;AAAA,UACF;AAAA,QACD;AACA,aAAK,aAAa,GAAG,YAAY,CAAC,KAAK;AACvC,aAAK,aAAa,QAAQ;AAAA,MAC3B;AAEA,UAAI,KAAK,+BAA+B,CAAC,KAAK,uBAAuB;AACpE,aAAK,4BAA4B,GAAG,YAAY;AAChD,aAAK,4BAA4B,QAAQ;AAAA,MAC1C;AAEA,UAAI,KAAK,mBAAmB;AAC3B,aAAK,kBAAkB,GAAG,OAAO;AACjC,aAAK,kBAAkB,GAAG,WAAW,WAAW;AAC/C,cAAI,KAAK,OAAO;AACf,eAAG,OAAO,aAAa,GAAG,cAAc,aAAa,KAAK,KAAK,EAAE,KAAK,MAAM;AAC3E,iBAAG,iBAAiB,GAAG,OAAO,mBAAmB;AACjD,oBAAM,gBAAgB,GAAG,eAAe,GAAG,SAAS,WAAW,KAAK,OAAO;AAC3E,oBAAM,gBAAgB,QAAQ,GAAG,eAAe,GAAG,SAAS,WAAW,KAAK,OAAO,EAAE;AACrF,kBAAI,kBAAkB,QAAW;AAChC,mBAAG,OAAO,oBAAoB,GAAG,SAAS,WAAW,KAAK,KAAK,EAAE,KAAK,MAAM;AAE3E,qBAAG,kBAAkB,UAAU,KAAK,KAAK;AAAA,gBAC1C,CAAC;AAAA,cACF,WAAW,kBAAkB,KAAK,eAAe;AAChD,mBAAG,kBAAkB,UAAU,EAAE;AACjC,sBAAM,iBAAiB,GAAG,SAAS,UAAU,KAAK;AAClD,sBAAM,iBAAiB,KAAK,MAAM,KAAK;AACvC,uBAAO;AAAA,kBACN,GAAG,wDAAwD,CAAC,gBAAgB,cAAc,CAAC;AAAA,gBAC5F;AAAA,cACD;AACA,iBAAG,mBAAmB,UAAU,aAAa;AAAA,YAC9C,CAAC;AAAA,UACF;AAAA,QACD;AACA,aAAK,kBAAkB,GAAG,YAAY,MAAM;AAC3C,iBAAO;AAAA,YACN,SAAS,EAAE,SAAS,KAAK,OAAO,QAAQ,EAAE,IAAI,QAAQ;AAAA,UACvD;AAAA,QACD;AACA,aAAK,kBAAkB,QAAQ;AAAA,MAChC;AAEA,UAAI,KAAK,mBAAmB;AAC3B,aAAK,kBAAkB,GAAG,OAAO;AACjC,aAAK,kBAAkB,GAAG,WAAW,iBAAiB;AACrD,WAAC,GAAG,aAAa,YAAY,MAAM,GAAG,qBAAqB;AAC3D,aAAG,OAAO,aAAa,GAAG,cAAc,aAAa,KAAK,KAAK;AAAA,QAChE;AACA,aAAK,kBAAkB,QAAQ;AAAA,MAChC;AAEA,UAAI,KAAK,kBAAkB;AAC1B,aAAK,iBAAiB,GAAG,OAAO;AAChC,aAAK,iBAAiB,GAAG,YAAY,MAAM;AAC1C,iBAAO;AAAA,YACN,OAAO;AAAA,YACP,SAAS;AAAA,cACR,WAAW,GAAG,SAAS;AAAA,cACvB,WAAW,GAAG,SAAS;AAAA,cACvB,cAAc,GAAG,OAAO,QAAQ,EAAE,IAAI;AAAA,YACvC;AAAA,UACD;AAAA,QACD;AACA,aAAK,iBAAiB,QAAQ;AAAA,MAC/B;AAEA,UAAI,KAAK,aAAa;AACrB,aAAK,YAAY,GAAG,WAAW,WAAW;AACzC,aAAG,OAAO,aAAa,GAAG,cAAc,OAAO,KAAK,KAAK;AAEzD,gBAAM,WAAW,OAAO,QAAQ,GAAG,SAAS,GAAG,IAAI;AACnD,aAAG,0BAA0B,GAAG,YAAa,SAAS,aAAa,KAAK;AACxE,aAAG,0BAA0B,QAAQ;AAAA,QACtC;AAAA,MACD;AAEA,aAAO,MAAM,GAAG,oBAAoB,KAAK,CAAC,WAAW,OAAO,aAAa;AACxE,cAAM,gBAAgB,KAAK,GAAG;AAC9B,cAAM,2BAA2B,KAAK,0BAA0B,QAAQ;AAExE,YAAI,4BAA4B,iBAAiB,cAAc,UAAU,MAAM,OAAO;AACrF,wBAAc,UAAU,KAAK;AAC7B,kBAAQ,iBAAiB,QAAQ;AAAA,QAClC;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,MAAM,uBAAuB;AAC5B,UAAI,KAAK,qBAAqB,KAAK,kBAAkB;AACpD,cAAM,sBAAsB,KAAK,kBAAkB,UAAU,EAAE,MAAM;AAAA,CAAI,EAAE,OAAO,OAAK,CAAC;AACxF,YAAI,CAAC,oBAAoB;AAAQ;AAGjC,cAAM,wBAAwB,MAAM,OAAO,GAAG,SAAS,aAAa;AAAA,UACnE,SAAS,EAAE,QAAQ,CAAC,MAAM,mBAAmB,EAAC;AAAA,UAC9C,QAAQ,CAAC,YAAY,MAAM;AAAA,QAC5B,CAAC;AACD,cAAM,mBAAmB,sBAAsB,OAAO,CAAC,KAAK,MAAM;AACjE,cAAI,CAAC,IAAI,EAAE,WAAW;AACrB,gBAAI,EAAE,YAAY,CAAC;AAAA,UACpB;AACA,cAAI,EAAE,YAAY,CAAC,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI;AAC7C,iBAAO;AAAA,QACR,GAAG,CAAC,CAAC;AAEL,cAAM,WAAW,OAAO,KAAK,gBAAgB,EAAE;AAC/C,cAAM,mBAAmB,iBAAiB,UAAU,KAAK;AAAA,CAAI;AAE7D,cAAM,oCAAoC,oBAAoB,WAAW,iBAAiB,UAAU;AAEpG,cAAM,mBAAmB,KAAK,iBAAiB,UAAU;AACzD,4BAAoB,YAAY,MAAM,KAAK,iBAAiB,UAAU,QAAQ;AAE9E,YAAI,mCAAmC;AACtC,eAAK,kBAAkB,UAAU,gBAAgB;AACjD,eAAK,YAAY,UAAU,iBAAiB,UAAU,MAAM;AAE5D,iBAAO,iBAAiB;AACxB,eAAK,OAAO,4BAA4B,kBAAkB,KAAK,YAAY;AAAA,QAC5E;AAAA,MACD;AAAA,IACD;AAAA,IAEA,cAAc;AACb,WAAK,6BAA6B;AAClC,WAAK,6BAA6B;AAElC,WAAK,WAAW,GAAG,SAAS,cAAc,MAAM;AAC/C,aAAK,OAAO,mBAAmB;AAAA,MAChC,CAAC;AAAA,IACF;AAAA,IAEA,mBAAmB;AAClB,WAAK,QAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,KAAK;AACnD,aAAO,GAAG,KAAK,GAAG,UAAU,MAAM;AACjC,cAAM,uBAAuB,KAAK,WAAW,GAAG,UAAU;AAC1D,YAAI,sBAAsB;AACzB,eAAK,OAAO,mBAAmB;AAAA,QAChC;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,+BAA+B;AAC9B,YAAM,KAAK;AACX,WAAK,gBAAgB,GAAG,SAAS,wBAAwB,WAAW;AACnE,cAAM,YAAY,EAAE,IAAI,EAAE,KAAK,gBAAgB;AAC/C,YAAI,KAAK,sBAAsB,WAAW;AACzC,aAAG,OAAO,mBAAmB,SAAS;AACtC,eAAK,qBAAqB;AAAA,QAC3B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,+BAA+B;AAC9B,WAAK,gBAAgB,GAAG,SAAS,mBAAmB,MAAM;AACzD,eAAO,QAAQ,uDAAuD,MAAM;AAC3E,cAAI,MAAM,KAAK,OAAO,QAAQ;AAC9B,cAAI,WAAW,KAAK;AACpB,mBAAS,sBAAsB;AAE/B,cAAI,QAAQ,2BAA2B,KAAK,UAAU,CAAC,MAAM;AAC5D,gBAAI,GAAG;AACN,qBAAO,MAAM,UAAU,SAAS,SAAS,SAAS,MAAM;AAAA,gBACvD,2BAA2B,EAAE;AAAA,gBAC7B,OAAO,KAAK,IAAI,EAAE,SAAS;AAAA,cAC5B,CAAC;AAAA,YACF;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAAA,IAEA,iBAAiB,MAAM;AACtB,aAAO,KAAK,WAAW,IAAI,WAAW,MAAM,IAAI,KAAK,WAAW,IAAI,WAAW,MAAM;AAAA,IACtF;AAAA,EACD;;;AC/ZA,SAAO,QAAQ,qBAAqB;AACpC,UAAQ,YAAY,YAAY,MAAM;AAAA,IACrC,YAAY,EAAE,SAAS,QAAQ,MAAM,MAAM,aAAa,eAAe,GAAG;AACzE,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,OAAO;AACZ,WAAK,OAAO;AACZ,WAAK,cAAc,eAAe,CAAC;AACnC,WAAK,aAAa,kBAAkB,CAAC;AAErC,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAChB,WAAK,YAAY;AACjB,WAAK,YAAY;AAAA,IAClB;AAAA,IAEA,cAAc;AACb,YAAM,EAAE,MAAM,MAAM,aAAa,WAAW,IAAI;AAEhD,eAAS,WAAW;AACnB,eAAO,KAAK,OAAO,CAAC,GAAG,KAAK,MAAM;AACjC,iBAAO,IAAI,IAAI,OAAO,CAAC,IAAI,QAAQ,MAAM;AACxC,kBAAM,kBAAkB,eAAe,YAAY,KAAK,YAAY,GAAG,KAAK;AAC5E,kBAAM,YAAY,cAAc,WAAW,UAC1C,WAAW,UAAU,OAAO,WAAW,WAAW,OAAO,MAAM,MAAM,IAAI;AAE1E,mBAAO,KAAK,0BAA0B,uCAAuC,cAAc,GAAG,MAAM;AAAA,UACrG,GAAG,EAAE;AAAA,QACN,GAAG,EAAE;AAAA,MACN;AAEA,WAAK,QAAQ;AAAA,QACZ;AAAA,MACG,SAAS;AAAA;AAAA,MAEb;AAAA,IACD;AAAA,IAEA,cAAc;AACb,YAAM,KAAK;AACX,WAAK,QAAQ,GAAG,SAAS,eAAe,WAAW;AAClD,cAAM,OAAO,EAAE,IAAI;AACnB,WAAG,OAAO,aAAa,IAAI;AAAA,MAC5B,CAAC;AAAA,IACF;AAAA,EACD;;;AC9CA,SAAO,QAAQ,qBAAqB;AACpC,UAAQ,YAAY,UAAU,MAAM;AAAA,IACnC,YAAY,EAAE,QAAQ,SAAS,SAAS,GAAG;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,wBAAwB,SAAS;AACtC,WAAK,8BAA8B,SAAS;AAC5C,WAAK,mBAAmB,SAAS;AACjC,WAAK,2BAA2B,SAAS;AACzC,WAAK,kBAAkB,SAAS;AAChC,WAAK,mBAAmB,CAAC;AACzB,WAAK,qBAAqB,SAAS;AAEnC,WAAK,eAAe;AAEpB,UAAI,KAAK,oBAAmB;AAC3B,aAAK,yBAAyB;AAAA,MAC/B;AAAA,IACD;AAAA,IAEA,iBAAiB;AAChB,WAAK,YAAY;AACjB,WAAK,kBAAkB;AACvB,WAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IAEvB;AAAA,IAEA,cAAc;AACb,WAAK,QAAQ;AAAA,QACZ;AAAA,iDAC8C,GAAG,gBAAgB;AAAA;AAAA;AAAA;AAAA,mCAIjC,GAAG,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAS1B,GAAG,gBAAgB;AAAA;AAAA,MAErD;AAGA,WAAK,aAAa,KAAK,QAAQ,KAAK,oBAAoB;AACxD,WAAK,iBAAiB,KAAK,WAAW,KAAK,gBAAgB;AAC3D,WAAK,kBAAkB,KAAK,WAAW,KAAK,iBAAiB;AAC7D,WAAK,UAAU,KAAK,WAAW,KAAK,SAAS;AAC7C,WAAK,UAAU,KAAK,WAAW,KAAK,aAAa;AACjD,WAAK,eAAe,KAAK,WAAW,KAAK,cAAc;AACvD,WAAK,0BAA0B,KAAK,WAAW,KAAK,iBAAiB;AAAA,IACtE;AAAA,IAEA,2BAA2B;AAC1B,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,IAAI;AAAA,UACH,OAAO,GAAG,aAAa;AAAA,UACvB,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,UACX,aAAa,GAAG,iBAAiB;AAAA,QAClC;AAAA,QACA,QAAQ,KAAK,WAAW,KAAK,cAAc;AAAA,QAC3C,cAAc;AAAA,MACf,CAAC;AAAA,IACF;AAAA,IAGA,8BAA8B;AAE5B,UAAI,KAAK;AACT,YAAM,SAAS,CAAC;AAChB,UAAG,KAAK,0BAAyB;AAChC,eAAO,KAAK;AAAA,UACX,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW;AAAA,QACZ,CAAC;AAAA,MAMF;AACA,UAAG,KAAK,uBAAsB;AAC7B,eAAO,KAAK;AAAA,UACX,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW;AAAA,UACX,SAAS;AAAA,QACV,CAAC;AAAA,MACF;AACA,UAAG,KAAK,6BAA4B;AACnC,eAAO,KAAK;AAAA,UACX,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW;AAAA,QACZ,CAAC;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AAAQ;AACpB,WAAK,kBAAkB,KAAK,wBAAwB,KAAK,iBAAiB;AAC1E,WAAK,gBAAgB,KAAK,EAAE;AAC5B,YAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,SAAG,mBAAmB,IAAI,IAAI;AAC9B,aAAO,QAAQ,QAAM;AACpB,aAAK,gBAAgB;AAAA,UACpB,oCAAoC,GAAG,oCAAoC,GAAG;AAAA,QAC/E;AACA,YAAI,YAAY;AAAA,UACf,UAAU,WAAW;AACpB,gBAAG,KAAK,GAAG,cAAc,gBAAe;AACvC,kBAAI,YAAY,YAAY;AAC5B,sBAAQ,UAAU,cAAc;AAAA,gBAC/B,cAAc,KAAK,UAAU;AAAA,gBAC7B,sBAAsB;AAAA,cACvB,CAAC;AAAA,YACF,OAAO;AACN,kBAAG,KAAK,GAAG,cAAc,uBAAsB;AAE9C,oBAAG,KAAK,UAAU,GAAE;AAGnB,sBAAI,IAAI,SAAS,QAAQ,OAAK;AAC7B,0BAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/D,uBAAG,GAAG,gBAAgB,UAAU,CAAC;AAAA,kBAClC,CAAC;AAAA,gBACF,OAAO;AACN,0BAAQ,IAAI,GAAG,gBAAgB;AAE/B,qBAAG,iBAAiB,QAAQ,OAAK;AAChC,wBAAG,EAAE,oBAAoB,GAAG,iBAAgB;AAC3C,4BAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/D,yBAAG,GAAG,gBAAgB,UAAU,IAAI,IAAI,WAAW;AAAA,oBACpD;AAAA,kBAED,CAAC;AAAA,gBACF;AAAA,cACD;AACA,kBAAI,UAAU,KAAK,GAAG,WAAW,KAAK,UAAU,CAAC;AAAA,YAClD;AAAA,UAOD;AAAA,QACD;AACA,YAAI,GAAG,aAAa,UAAU;AAC7B,sBAAY;AAAA,YACX,OAAO,WAAW;AACjB,kBAAI,IAAI,eAAe,aAAa,GAAG,WAAW,IAAI,IAAI,OAAO,GAAG;AACnE,oBAAI,eAAe,QAAQ,GAAG,WAAW,IAAI,IAAI,SAAS,IAAI,IAAI,OAAO;AAAA,cAC1E;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAEA,aAAK,GAAG,GAAG,qBAAqB,OAAO,GAAG,KAAK,aAAa;AAAA,UAC3D,IAAI,kCACA,KACA;AAAA,UAEJ,QAAQ,KAAK,gBAAgB,KAAK,IAAI,GAAG,iBAAiB;AAAA,UAC1D,cAAc;AAAA,QACf,CAAC;AACD,YAAG,GAAG,cAAc,WAAU;AAC7B,eAAK,GAAG,GAAG,mBAAmB,UAAU,IAAI,IAAI,GAAG,UAAU;AAAA,QAC9D;AAAA,MAID,CAAC;AAAA,IAEH;AAAA,IAEA,oBAAoB;AACnB,YAAM,KAAK;AACX,WAAK,aAAa,IAAI,QAAQ,YAAY,UAAU;AAAA,QACnD,SAAS,KAAK;AAAA,QACd,QAAQ;AAAA,UACP,cAAc,SAAS,MAAM;AAC5B,eAAG,kBAAkB,IAAI;AAAA,UAC1B;AAAA,QACD;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,UACL,CAAE,GAAG,GAAG,CAAE;AAAA,UACV,CAAE,GAAG,GAAG,CAAE;AAAA,UACV,CAAE,GAAG,GAAG,CAAE;AAAA,UACV,CAAE,KAAK,GAAG,QAAS;AAAA,QACpB;AAAA,MACD,CAAC;AAED,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,kBAAkB,MAAM;AACvB,YAAM,eAAe,KAAK,KAAK,mBAAmB;AAElD,2BAAqB,IAAI;AACzB,WAAK,eAAe,iBAAiB,WAAW,KAAK,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK,eAAe;AACrG,WAAK,cAAc,OAAO,IAAI,CAAC,EAAE,MAAM;AACvC,WAAK,cAAc,UAAU,KAAK,YAAY;AAE9C,eAAS,qBAAqBC,OAAM;AACnC,QAAAA,MAAK,SAAS,+BAA+B;AAC7C,mBAAW,MAAM;AAChB,UAAAA,MAAK,YAAY,+BAA+B;AAAA,QACjD,GAAG,GAAG;AAAA,MACP;AAAA,IACD;AAAA,IAEA,cAAc;AACb,YAAM,KAAK;AAEX,WAAK,eAAe,GAAG,SAAS,oBAAoB,SAAS,GAAG;AAC/D,cAAM,eAAe,EAAE,IAAI;AAE3B,YAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,YAAY;AAAG;AAEnC,cAAM,aAAa,aAAa,OAAO,EAAE,OAAO,GAAG,eAAe,OAAO,EAAE,OAAO,GAAG,eAAe,WAAW;AAC/G,WAAG,eAAe,QAAQ,EAAE,WAAW,CAAC;AAExC,cAAM,OAAO,aAAa,KAAK,WAAW;AAG1C,UAAE,0BAA0B,EAAE,IAAI,WAAW,MAAM;AACnD,UAAE,iBAAiB,EAAE,IAAI,WAAW,MAAM;AAC1C,WAAG,eAAe,KAAK,aAAa,EAAE,IAAI,WAAW,QAAQ;AAC7D,WAAG,eAAe,KAAK,sBAAsB,EAAE,IAAI,WAAW,MAAM;AAGpE,UAAE,kBAAkB,EAAE,YAAY,gBAAgB;AAElD,YAAI,aAAa,SAAS,gBAAgB,GAAG;AAE5C,uBAAa,YAAY,gBAAgB;AACzC,aAAG,gBAAgB;AAAA,QACpB,OAAO;AAEN,uBAAa,SAAS,gBAAgB;AACtC,uBAAa,KAAK,0BAA0B,EAAE,IAAI,WAAW,MAAM;AACnE,uBAAa,KAAK,iBAAiB,EAAE,IAAI,WAAW,MAAM;AAC1D,aAAG,eAAe,KAAK,IAAI,aAAa,EAAE,IAAI,WAAW,MAAM;AAC/D,aAAG,eAAe,KAAK,IAAI,WAAW,EAAE,IAAI,WAAW,QAAQ;AAE/D,aAAG,gBAAgB,GAAG,GAAG;AACzB,aAAG,iBAAiB,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,MAAM;AACzD,aAAG,0BAA0B;AAAA,QAC9B;AAAA,MACD,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,eAAe,kBAAkB,CAAC,QAAQ;AApQ9D;AAqQG,cAAM,UAAU,IAAI,IAAI;AACxB,cAAM,iBAAiB,GAAE,UAAK,8BAAL,mBAAgC,OAAO,EAAE;AAClE,YAAI,SAAS;AACZ,yBAAe,YAAY,aAAa,EAAE,SAAS,aAAa;AAAA,QACjE,OAAO;AACN,yBAAe,YAAY,aAAa,EAAE,SAAS,aAAa;AAAA,QACjE;AAAA,MACD,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,eAAe,eAAe,CAAC,QAAQ;AACxD,YAAI,IAAI,IAAI,eAAe,CAAC,IAAI,0BAA0B;AACzD,cAAI,CAAC,IAAI,IAAI,qBAAqB;AACjC,gBAAI,2BAA2B;AAC/B,mBAAO,aAAa;AAAA,cACnB,MAAM,IAAI,IAAI,sBAAoB;AAAA,cAClC,MAAM,IAAI,QAAQ,qBAAqB;AAAA,cACvC,MAAM,IAAI,IAAI,sBAAoB;AAAA,cAClC,MAAM,IAAI,QAAQ,oBAAoB;AAAA,cACtC,MAAM,IAAI,KAAK;AAAA,cACf,MAAM,KAAK,sBAAsB,IAAI,GAAG;AAAA,cACxC,MAAO,IAAI,2BAA2B;AAAA,YACvC,CAAC;AAAA,UACF,WAAW,IAAI,IAAI,qBAAqB;AACvC,mBAAO,WAAW;AAAA,cACjB,SAAS,GAAG,2DAA2D;AAAA,cACvE,WAAW;AAAA,YACZ,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD,CAAC;AAED,WAAK,4BAA4B;AAEjC,WAAK,eAAe,GAAG,SAAS,aAAa,WAAW;AACvD,cAAM,QAAQ,EAAE,IAAI,EAAE,KAAK,YAAY;AACvC,WAAG,cAAc,UAAU,KAAK;AAAA,MACjC,CAAC;AAED,WAAK,WAAW,GAAG,SAAS,qBAAqB,MAAM;AACtD,cAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAI,cAAc,IAAI;AACtB,YAAG,QAAQ,IAAI,uBAAuB,KAAK,0BAAyB;AACnE,kBAAQ,YAAY,UAAU;AAC9B,wBAAc;AAAA,QACf;AAEA,cAAM,QAAQ,IAAI;AAElB,aAAK,eAAe,KAAK,CAAC,MAAM,WAAW,CAAC,KAAK,0BAA0B;AAC1E,gBAAM,UAAU,MAAM,SAAS,GAAG,8CAA8C,IAAI,GAAG,gCAAgC;AACvH,iBAAO,WAAW,EAAE,SAAS,WAAW,SAAS,CAAC;AAClD,iBAAO,MAAM,WAAW,OAAO;AAC/B;AAAA,QACD;AAEA,aAAK,OAAO,eAAe;AAAA,MAC5B,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,eAAe,eAAe,CAAC,QAAQ;AACxD,aAAK,sBAAsB,IAAI,GAAG;AAGlC,cAAM,8BAA8B,CAAC,KAAK,eAAe,KAAK,iBAAiB,EAAE,GAAG,UAAU;AAC9F,aAAK,sBAAsB,IAAI,GAAG;AAClC,SAAC,+BAA+B,KAAK,eAAe,KAAK,iBAAiB,EAAE,IAAI,WAAW,MAAM;AACjG,aAAK,wBAAwB;AAAA,MAC9B,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,eAAe,kBAAkB,CAAC,QAAQ;AAC3D,cAAM,qBAAqB,gBAAgB,IAAI,IAAI,gBAAgB,IAAI,IAAI,QAAQ;AACnF,aAAK,eAAe,KAAK,wBAAwB,EAAE,KAAK,kBAAkB;AAAA,MAC3E,CAAC;AAED,aAAO,GAAG,KAAK,GAAG,yBAAyB,UAAU,CAAC,KAAK,KAAK,QAAQ;AAEvE,cAAM,cAAc,OAAO,KAAK;AAChC,cAAM,OAAO,YAAY,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AACzE,YAAI,KAAK,GAAG,mBAAmB,KAAK,GAAG,gBAAgB,UAAU,KAAK,YAAY,QAAQ;AACzF,eAAK,GAAG,gBAAgB,UAAU,YAAY,MAAM;AAAA,QACrD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,8BAA8B;AAC7B,aAAO,SAAS,GAAG,yBAAyB,CAAC,SAAS;AACrD,cAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,cAAM,EAAE,UAAU,QAAQ,SAAS,gBAAgB,IAAI;AACvD,YAAI,SAAS;AAEb,YAAI,SAAS;AACZ,kBAAQ,GAAG,kBAAkB;AAC7B,gBAAM,cAAc,KAAK,OAAO,aAAa,qBAAqB,IAAI,IAAI,cAAc,IAAI;AAC5F,cAAI,UAAU,aAAa;AAC1B,mBAAO,IAAI,SAAS;AACpB,sBAAU,GAAG,yCAAyC,CAAC,gBAAgB,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC;AAChG,iBAAK,OAAO,eAAe;AAC3B,oBAAQ,WAAW;AAAA,UAEpB,OAAO;AACN,sBAAU,GAAG,mFAAmF,CAAC,gBAAgB,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC;AAAA,UAC3I;AAAA,QACD,WAAW,iBAAiB;AAC3B,oBAAU;AACV,kBAAQ,GAAG,gBAAgB;AAAA,QAC5B;AAEA,eAAO,SAAS,EAAE,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,MACvD,CAAC;AAAA,IACF;AAAA,IAEA,4BAA4B;AAC3B,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,cAAc,KAAK,OAAO,aAAa,qBAAqB,IAAI,IAAI,cAAc,IAAI;AAC5F,YAAM,mBAAmB,cAAc,IAAI;AAC3C,YAAM,gBAAgB,KAAK,gBAAgB,KAAK,cAAc,UAAU,IAAI;AAC5E,UAAI,CAAC,iBAAiB,mBAAmB,KAAK,KAAK,eAAe;AACjE,aAAK,cAAc,UAAU,gBAAgB;AAAA,MAC9C;AAAA,IACD;AAAA,IAEA,mBAAmB;AAClB,YAAM,aAAa,OAAO,MAAM,OAAO,IAAI,WAAM;AACjD,WAAK,WAAW,KAAK,mBAAmB,EAAE,KAAK,SAAS,GAAG,kBAAkB;AAC7E,aAAO,GAAG,KAAK,GAAG,cAAc,MAAM;AACrC,cAAM,qBAAqB,KAAK,WAAW,GAAG,UAAU;AACxD,cAAM,cAAc,KAAK,eAAe,KAAK,iBAAiB;AAC9D,YAAI,sBAAsB,YAAY,QAAQ;AAC7C,eAAK,WAAW,KAAK,mBAAmB,EAAE,MAAM;AAAA,QACjD;AAAA,MACD,CAAC;AAED,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM;AACb,gBAAM,qBAAqB,KAAK,WAAW,GAAG,UAAU;AACxD,cAAI,cAAc,KAAK,eAAe,KAAK,iBAAiB;AAC5D,wBAAc,YAAY,SAAS,YAAY,KAAK,WAAW,IAAI;AAEnE,cAAI,CAAC;AAAa;AAElB,gBAAM,mBAAmB,MAAM,KAAK,KAAK,eAAe,KAAK,kBAAkB,CAAC,EAAE,IAAI,OAAK,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC;AACjH,gBAAM,aAAa,iBAAiB,QAAQ,WAAW;AACvD,gBAAM,mBAAmB,aAAa,KAAK,iBAAiB;AAC5D,gBAAM,0BAA0B,KAAK,eAAe,KAAK,+BAA+B,iBAAiB,oBAAoB;AAE7H,cAAI,sBAAsB,cAAc,iBAAiB;AACxD,oCAAwB,MAAM;AAAA,UAC/B;AAAA,QACD;AAAA,QACA,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU,KAAK,KAAK,eAAe,KAAK,iBAAiB,EAAE;AAAA,QAC/F,aAAa,GAAG,8BAA8B;AAAA,QAC9C,eAAe;AAAA,QACf,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AAAA,IACF;AAAA,IAEA,gBAAgB;AAAA,IAEhB;AAAA,IAEA,yBAAyB;AACxB,WAAK,wBAAwB;AAC7B,WAAK,4BAA4B;AACjC,WAAK,sBAAsB;AAC3B,WAAK,qBAAqB;AAAA,IAC3B;AAAA,IAEA,eAAe;AACd,YAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,UAAI,eAAe,QAAQ,wBAAwB,IAAI,IAAI,SAAS,IAAI,IAAI,OAAO;AAAA,IACpF;AAAA,IAEA,YAAY;AACX,UAAG,KAAK,kBAAiB;AACxB,cAAM,MAAM,SAAS,eAAe,0BAA0B;AAC9D,YAAI,MAAM,aAAa;AAAA,MACxB;AAEA,WAAK,OAAO,sBAAsB,KAAK;AACvC,WAAK,iBAAiB,KAAK;AAAA,IAC5B;AAAA,IAEA,WAAW;AACV,WAAK,OAAO,sBAAsB,IAAI;AACtC,WAAK,iBAAiB,IAAI;AAE1B,WAAK,uBAAuB;AAC5B,WAAK,aAAa;AAAA,IACnB;AAAA,IAEA,yBAAyB;AACxB,UAAI,KAAK,SAAS,KAAK,iBAAiB,EAAE,QAAQ;AACjD,aAAK,SAAS,KAAK,cAAc;AAAA,MAClC,OAAO;AACN,aAAK,SAAS,KAAK,EAAE;AACrB,aAAK,oBAAoB,OAAO,GAAG,KAAK,aAAa;AAAA,UACpD,IAAI;AAAA,YACH,OAAO,GAAG,QAAQ;AAAA,YAClB,WAAW;AAAA,YACX,UAAU,WAAW;AAAA,YAAC;AAAA,UACvB;AAAA,UACA,QAAQ,KAAK,gBAAgB,KAAK,UAAU;AAAA,UAC5C,cAAc;AAAA,QACf,CAAC;AACD,aAAK,kBAAkB,UAAU,EAAE;AAAA,MACpC;AAAA,IACD;AAAA,IAEA,0BAA0B;AACzB,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,WAAW,IAAI;AACrB,YAAM,WAAW,IAAI;AAErB,WAAK,eAAe,KAAK,GACxB,SAAS,IAAI,CAAC,GAAG,MAAM;AACtB,cAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/D,cAAM,eAAe,EAAE;AACvB,cAAM,SAAS,IAAI,MAAM,IAAI,SAAS;AACtC,cAAM,SAAS,EAAE,SAAS,IAAI,gBAAgB,EAAE,QAAQ,QAAQ,IAAI;AAEpE,eAAQ;AAAA;AAAA,gDAEoC,4BAA4B;AAAA,SACnE,EAAE;AAAA,qBACU,2BAA2B;AAAA,qBAC3B;AAAA;AAAA;AAAA;AAAA,MAIlB,CAAC,EAAE,KAAK,EAAE,GACT;AACF,WAAK,mBAAmB;AACxB,eAAS,QAAQ,OAAK;AACrB,cAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/D,cAAM,KAAK;AACX,aAAK,GAAG,kBAAkB,OAAO,GAAG,KAAK,aAAa;AAAA,UACrD,IAAI;AAAA,YACH,OAAO,EAAE;AAAA,YACT,WAAW;AAAA,YACX,aAAa,GAAG,qBAAqB,CAAC,EAAE,eAAe,CAAC;AAAA,YACxD,UAAU,WAAW;AACpB,sBAAQ,IAAI,EAAE,OAAO;AACrB,sBAAQ,IAAI,EAAE,IAAI;AAClB,oBAAM,gBAAgB,OAAO,MAAM,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ;AACxE,kBAAI,iBAAiB,KAAK,OAAO;AAChC,uBAAO,MACL,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,IAAI,KAAK,KAAK,CAAC,EACtD,KAAK,MAAM,GAAG,sBAAsB,CAAC;AAEvC,sBAAM,qBAAqB,gBAAgB,KAAK,OAAO,QAAQ;AAC/D,mBAAG,eAAe,KAAK,IAAI,aAAa,EAAE,KAAK,kBAAkB;AAAA,cAClE;AAAA,YACD;AAAA,UACD;AAAA,UACA,QAAQ,KAAK,eAAe,KAAK,IAAI,8BAA8B;AAAA,UACnE,cAAc;AAAA,QACf,CAAC;AACD,aAAK,GAAG,gBAAgB,aAAa,KAAK;AAC1C,aAAK,GAAG,gBAAgB,UAAU,EAAE,MAAM;AAAA,MAC3C,CAAC;AAED,WAAK,mCAAmC;AAExC,WAAK,sBAAsB,GAAG;AAAA,IAC/B;AAAA,IAEA,uBAAuB;AACtB,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,WAAW,IAAI;AACrB,eAAS,QAAQ,OAAK;AACrB,cAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/D,YAAI,EAAE,SAAS;AACd,qBAAW,MAAM;AAChB,iBAAK,eAAe,KAAK,IAAI,8BAA8B,EAAE,OAAO,EAAE,MAAM;AAAA,UAC7E,GAAG,GAAG;AAAA,QACP;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,sBAAsB,KAAK;AAC1B,YAAM,cAAc,KAAK,OAAO,aAAa,qBAAqB,IAAI,IAAI,cAAc,IAAI;AAC5F,YAAM,WAAW,IAAI;AAErB,YAAM,YAAY,KAAK,mBAAmB,IAAI,WAAW,CAAC;AAE1D,WAAK,eAAe,KAAK,iBAAiB,EAAE,OAAO;AACnD,UAAI,iBAAiB,UAAU,IAAI,OAAK;AACvC,eAAO,qCAAqC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAAA,MACjF,CAAC,EAAE,KAAK,EAAE;AAEV,WAAK,eAAe,KAAK,4BAA4B,EAAE,KAAK,0BAA0B,EACpF,MAAM,+BAA+B,sBAAsB;AAAA,IAC9D;AAAA,IAEA,mBAAmB,aAAa;AAC/B,UAAI,QAAQ,CAAC,GAAG,GAAG,EAAE;AACrB,YAAM,SAAS,OAAO,KAAK,MAAM,WAAW,CAAC,EAAE;AAE/C,cAAQ,MAAM,IAAI,OAAK,IAAK,OAAO,SAAS,EAAG;AAE/C,YAAM,cAAc,CAAC,QAAQ,MAAM;AAClC,YAAI,YAAY,KAAK,KAAM,SAAS,CAAE,IAAI;AAC1C,eAAO,cAAc,SAAS,YAAY,IAAI;AAAA,MAC/C;AAEA,aAAO,MAAM,OAAO,CAAC,UAAU,MAAM;AACpC,YAAI,YAAY,YAAY,aAAa,CAAC;AAC1C,oBAAY,SAAS,QAAQ,SAAS,KAAK,KAAK,YAAY,IAAI;AAChE,eAAO,CAAC,GAAG,UAAU,SAAS;AAAA,MAC/B,GAAG,CAAC,CAAC;AAAA,IACN;AAAA,IAEA,qCAAqC;AACpC,YAAM,KAAK;AACX,YAAM,MAAM,KAAK,OAAO,QAAQ,EAAE;AAClC,YAAM,EAAE,iBAAiB,gBAAgB,kBAAkB,IAAI,KAAK,OAAO,qBAAqB;AAEhG,WAAK,eAAe,KAAK,8CAA8C,EAAE,OAAO,EAAE,OAAO;AAEzF,UAAI,CAAC;AAAiB;AAEtB,UAAI,aAAa,WAAW;AAC5B,UAAI,CAAC,gBAAgB;AACpB,sBAAc,GAAG,yCAAyC;AAC1D,oBAAY;AAAA,MACb,OAAO;AACN,gCAAwB,IAAI,IAAI,cAAc,IAAI,IAAI,iBAAiB,GAAG,UAAU,kBAAkB,GAAG,CAAC;AAC1G,sBAAc,GAAG,4BAA4B,CAAC,gBAAgB,qBAAqB,CAAC,CAAC;AACrF,oBAAY;AAAA,MACb;AAEA,YAAM,SAAS,KAAK,eAAe,SAAS,EAAE,SAAS,MAAM,IAAI,SAAS;AAC1E,YAAM,SAAS,IAAI,iBAAiB,IAAI,gBAAgB,IAAI,gBAAgB,IAAI,QAAQ,IAAI;AAC5F,WAAK,eAAe;AAAA,QACnB;AAAA;AAAA;AAAA,qDAGkD;AAAA,wCACb;AAAA;AAAA;AAAA;AAAA,MAItC;AAEA,WAAK,4BAA4B,OAAO,GAAG,KAAK,aAAa;AAAA,QAC5D,IAAI;AAAA,UACH,OAAO,GAAG,uBAAuB;AAAA,UACjC,WAAW;AAAA,UACX,aAAa,GAAG,8BAA8B;AAAA,UAC9C,SAAS;AAAA,UACT;AAAA,UACA,UAAU,iBAAiB;AAC1B,gBAAI,CAAC;AAAgB;AAErB,gBAAI,KAAK,QAAQ,uBAAuB;AACvC,qBAAO,WAAW;AAAA,gBACjB,SAAS,GAAG,oCAAoC,CAAC,gBAAgB,qBAAqB,CAAC,CAAC;AAAA,gBACxF,WAAW;AAAA,cACZ,CAAC;AACD,qBAAO,MAAM,WAAW,QAAQ;AAChC,iBAAG,0BAA0B,UAAU,CAAC;AACxC;AAAA,YACD;AACA,kBAAM,wBAAwB,KAAK,QAAQ,IAAI,IAAI;AACnD,kBAAM,OAAO,MAAM,UAAU,IAAI,SAAS,IAAI,MAAM,yBAAyB,qBAAqB;AAClG,mBAAO,MAAM,UAAU,IAAI,SAAS,IAAI,MAAM,kBAAkB,SAAS,KAAK,QAAQ,iBAAiB,CAAC;AAAA,UACzG;AAAA,UACA;AAAA,QACD;AAAA,QACA,QAAQ,KAAK,eAAe,KAAK,yCAAyC;AAAA,QAC1E,cAAc;AAAA,MACf,CAAC;AACD,WAAK,0BAA0B,aAAa,KAAK;AAAA,IAGlD;AAAA,IAEA,gCAAgC;AAC/B,YAAM,YAAY,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC5C,UAAI,cAAc;AACjB,aAAK,eAAe;AAAA,UACnB;AAAA;AAAA;AAAA,QAGD;AAAA,IACF;AAAA,IAEA,sBAAsB,KAAK;AAC1B,UAAI,CAAC;AAAK,cAAM,KAAK,OAAO,QAAQ,EAAE;AACtC,UAAI,eAAe,EAAE,+CAA+C,EAAE,IAAI;AAC1E,aAAO,MAAM,UAAU,QAAQ,SAAS,QAAQ,SAAS,UAAU,YAAY;AAC/E,cAAQ,KAAK;AAEZ,YAAM,cAAc,IAAI;AAEzB,UAAG,QAAQ,IAAI,qBAAoB;AAClC,cAAMC,eAAc;AAAA,MACrB;AACA,YAAM,cAAc,KAAK,OAAO,aAAa,qBAAqB,IAAI,IAAI,cAAc,IAAI;AAC5F,YAAM,YAAY,cAAc,IAAI;AACpC,YAAM,SAAS,IAAI,iBAAiB,aAAa,IAAI,KAAK,YAAY;AACtE,YAAM,WAAW,IAAI;AACrB,YAAM,QAAQ,SAAS,GAAG,QAAQ,IAAI,GAAG,YAAY;AAErD,WAAK,QAAQ;AAAA,QACZ;AAAA,+BAC4B,GAAG,aAAa;AAAA,yBACtB,gBAAgB,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,+BAI/B,GAAG,aAAa;AAAA,yBACtB,gBAAgB,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,+BAI/B;AAAA,yBACN,gBAAgB,UAAU,WAAW,QAAQ;AAAA;AAAA,MAEpE;AAAA,IACD;AAAA,IAEA,iBAAiB,MAAM;AACtB,aAAO,KAAK,WAAW,IAAI,WAAW,MAAM,IAAI,KAAK,WAAW,IAAI,WAAW,MAAM;AAAA,IACtF;AAAA,EACD;;;AC9qBA,SAAO,QAAQ,qBAAqB;AACpC,MAAI,YAAY,CAAC;AACjB,UAAQ,YAAY,gBAAgB,MAAM;AAAA,IACzC,YAAY,EAAE,SAAS,QAAQ,SAAS,GAAG;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,cAAc,SAAS;AAC5B,WAAK,sCAAsC,SAAS;AACpD,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAChB,WAAK,YAAY;AACjB,WAAK,oBAAoB;AACzB,WAAK,YAAY;AAAA,IAClB;AAAA,IAEA,cAAc;AACb,WAAK,QAAQ;AAAA,QACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASuB,GAAG,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM1C;AAEA,WAAK,aAAa,KAAK,QAAQ,KAAK,kBAAkB;AACtD,WAAK,sBAAsB,KAAK,WAAW,KAAK,qBAAqB;AAAA,IAEtE;AAAA,IAEA,cAAc;AACb,WAAK,aAAa,OAAO,GAAG,SAAS,CAAC,MAAM;AAC3C,qBAAa,KAAK,WAAW;AAC7B,aAAK,cAAc,WAAW,MAAM;AACnC,gBAAM,cAAc,EAAE,OAAO;AAC7B,eAAK,aAAa,aAAa,KAAK,aAAa,UAAU,CAAC;AAAA,QAC7D,GAAG,GAAG;AAAA,MACP,CAAC;AACD,YAAM,KAAK;AACX,WAAK,oBAAoB,GAAG,SAAS,oBAAoB,WAAW;AACnE,cAAM,eAAe,SAAS,EAAE,IAAI,EAAE,KAAK,mBAAmB,CAAC;AAC/D,WAAG,OAAO,kBAAkB,YAAY;AAAA,MACzC,CAAC;AACD,WAAK,WAAW,GAAG,SAAS,SAAS,WAAW;AAC/C,WAAG,OAAO,gBAAgB;AAAA,MAC3B,CAAC;AAAA,IACF;AAAA,IAEA,sBAAsB;AACrB,YAAM,KAAK;AACX,WAAK,eAAe,OAAO,GAAG,KAAK,aAAa;AAAA,QAC/C,IAAI;AAAA,UACH,OAAO,GAAG,QAAQ;AAAA,UAClB,WAAW;AAAA,UACX,aAAa,GAAG,uCAAuC;AAAA,QACxD;AAAA,QACA,QAAQ,KAAK,WAAW,KAAK,eAAe;AAAA,QAC5C,cAAc;AAAA,MACf,CAAC;AACD,WAAK,eAAe,OAAO,GAAG,KAAK,aAAa;AAAA,QAC/C,IAAI;AAAA,UACH,OAAO,GAAG,gBAAgB;AAAA,UAC1B,WAAW;AAAA,UACX,SAAS;AAAA;AAAA;AAAA;AAAA,UACT,aAAa,GAAG,0BAA0B;AAAA,UAC1C,UAAU,WAAW;AACpB,gBAAI,GAAG,WAAW,GAAG,UAAU;AAAG,iBAAG,aAAa;AAAA,UACnD;AAAA,QACD;AAAA,QACA,QAAQ,KAAK,WAAW,KAAK,eAAe;AAAA,QAC5C,cAAc;AAAA,MACf,CAAC;AACD,WAAK,aAAa,aAAa,KAAK;AACpC,WAAK,aAAa,aAAa,KAAK;AACpC,WAAK,aAAa,UAAU,OAAO;AAAA,IACpC;AAAA,IAEA,eAAe;AACd,aAAO,IAAI,OAAO;AAClB,WAAK,OAAO,cAAc;AAC1B,YAAM,cAAc,KAAK,aAAa,UAAU;AAChD,YAAM,SAAS,KAAK,aAAa,UAAU;AAC3C,YAAM,cAAc,KAAK;AACzB,WAAK,oBAAoB,KAAK,EAAE;AAChC,UAAI,SAAS,EAAE,aAAa,OAAO;AACnC,UAAG,KAAK,qCAAoC;AAC3C,iBAAS,EAAE,aAAa,QAAQ,YAAY;AAAA,MAC7C;AAEA,aAAO,OAAO,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU,CAAC,aAAa;AACvB,iBAAO,IAAI,SAAS;AACpB,sBAAY,SAAS;AACrB,mBAAS,QAAQ,QAAQ,aAAW;AACnC,kBAAM,eAAe,KAAK,iBAAiB,OAAO;AAClD,iBAAK,oBAAoB,OAAO,YAAY;AAAA,UAC7C,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AAAA,IAEF;AAAA,IAEA,iBAAiB,SAAS;AACzB,YAAM,mBAAmB,OAAO,QAAQ,eAAa,MAAI,QAAQ,YAAY,EAAE,OAAO,gBAAgB;AACtG,aACC,mDAAmD,OAAO,QAAQ,IAAI;AAAA;AAAA,iCAExC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKjC,OAAO,SAAS,QAAQ,UAAU,EAAE;AAAA;AAAA;AAAA;AAAA,kCAIV,gBAAgB,QAAQ,aAAa,QAAQ,UAAU,CAAC,KAAK;AAAA,iCAC9D;AAAA;AAAA;AAAA;AAAA,IAKhC;AAAA,IAEA,iBAAiB,MAAM;AACtB,aAAO,aAAa;AAAA,QACnB,MAAM,OAAO,KAAK,WAAW,IAAI,WAAW,MAAM,KAAK,KAAK,aAAa,IAAI,KAAK,WAAW,IAAI,WAAW,MAAM;AAAA,QAClH,MAAM,KAAK,OAAO,kBAAkB,UAAU,GAAG,IAAI;AAAA,MACtD,CAAC;AAAA,IAIF;AAAA,EACD;;;ACnJA,SAAO,QAAQ,qBAAqB;AACpC,UAAQ,YAAY,mBAAmB,MAAM;AAAA,IAC5C,YAAY,EAAE,SAAS,aAAY,OAAO,GAAG;AAC5C,WAAK,UAAU;AACf,WAAK,cAAc;AACnB,WAAK,SAAS;AAEd,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,iBAAiB;AAChB,WAAK,YAAY;AACjB,WAAK,wBAAwB;AAC7B,WAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IACvB;AAAA,IAEA,cAAc;AACb,WAAK,QAAQ;AAAA,QACZ;AAAA;AAAA,OAEI,GAAG,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKvB,GAAG,OAAO;AAAA;AAAA,2BAEV,GAAG,QAAQ;AAAA;AAAA,2BAEX,GAAG,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMtC;AAEA,WAAK,aAAa,KAAK,QAAQ,KAAK,qBAAqB;AACzD,WAAK,mBAAmB,KAAK,WAAW,KAAK,0BAA0B;AACvE,WAAK,qBAAqB,KAAK,WAAW,KAAK,gBAAgB;AAC/D,WAAK,iBAAiB,KAAK,mBAAmB,KAAK,gBAAgB;AACnE,WAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB;AACvE,WAAK,oBAAoB,KAAK,mBAAmB,KAAK,mBAAmB;AACzE,WAAK,qBAAqB,KAAK,mBAAmB,KAAK,qBAAqB;AAC5E,WAAK,gBAAgB,KAAK,mBAAmB,KAAK,eAAe;AAAA,IAClE;AAAA,IAEA,0BAA0B;AACzB,YAAM,eAAe,IAAI,OAAO,GAAG,OAAO;AAAA,QACzC,OAAO;AAAA,QACP,QAAQ;AAAA,UACP,EAAC,WAAW,YAAY,WAAW,QAAQ,SAAS,SAAS,OAAO,YAAY,MAAM,EAAC;AAAA,UACvF,EAAC,WAAU,WAAW,WAAU,cAAc,OAAM,mBAAkB;AAAA,QACvE;AAAA,QACA,gBAAgB,MAAM;AACrB,eAAK,WAAW;AAAA,QACjB;AAAA,QACA,sBAAsB,GAAG,MAAM;AAAA,MAChC,CAAC;AACD,WAAK,eAAe;AAEpB,YAAM,eAAe,IAAI,OAAO,GAAG,OAAO;AAAA,QACzC,OAAO;AAAA,QACP,QAAQ;AAAA,UACP,EAAC,WAAW,SAAS,WAAW,QAAQ,OAAO,gBAAe;AAAA,QAC/D;AAAA,QACA,gBAAgB,MAAM;AACrB,eAAK,cAAc;AAAA,QACpB;AAAA,QACA,sBAAsB,GAAG,OAAO;AAAA,MACjC,CAAC;AACD,WAAK,eAAe;AAAA,IACrB;AAAA,IAEA,uBAAuB,KAAK;AAC3B,YAAM,EAAE,OAAO,IAAI;AACnB,UAAI,kBAAkB;AAEtB,cAAQ,CAAC,QAAQ,cAAc,GAAG,MAAM,MAAM,kBAAkB;AAChE,iBAAW,YAAY,kBAAkB;AACzC,iBAAW,aAAa,kBAAkB;AAE1C,aAAO;AAAA,kCACyB,IAAI;AAAA,mCACH,KAAK;AAAA,4BACZ,GAAG,SAAS,MAAM,IAAI;AAAA;AAAA;AAAA,gCAGlB,gBAAgB,IAAI,aAAa,IAAI,QAAQ;AAAA,iCAC5C,IAAI;AAAA,qDACgB,0BAA0B,IAAI;AAAA;AAAA,IAElF;AAAA,IAEA,cAAc,KAAK,WAAW;AAC7B,aAAO;AAAA,8BACqB,UAAU;AAAA,6BACX,UAAU,OAAO,KAAK,UAAU;AAAA,mCAC1B,uBAAuB;AAAA;AAGxD,eAAS,yBAAyB;AACjC,YAAI,UAAU,QAAQ,UAAU,mBAAmB,UAAU,SAAS,UAAU,iBAAiB;AAChG,iBAAO,4BAA4B,UAAU;AAAA,+BAClB,gBAAgB,UAAU,MAAM,IAAI,QAAQ;AAAA,QACxE,OAAO;AACN,iBAAO,0BAA0B,gBAAgB,UAAU,mBAAmB,UAAU,MAAM,IAAI,QAAQ;AAAA,QAC3G;AAAA,MACD;AAAA,IACD;AAAA,IAEA,kBAAkB,KAAK;AACtB,UAAI,IAAI,iBAAiB;AACxB,eAAO;AAAA,uBACa,IAAI;AAAA,aACd,gBAAgB,IAAI,iBAAiB,IAAI,QAAQ;AAAA;AAAA,MAE5D,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IAEA,mBAAmB,KAAK;AACvB,aAAO;AAAA,YACG,GAAG,WAAW;AAAA,YACd,gBAAgB,IAAI,WAAW,IAAI,QAAQ;AAAA;AAAA,IAEtD;AAAA,IAEA,eAAe,KAAK;AACnB,UAAI,CAAC,IAAI,MAAM;AAAQ,eAAO;AAE9B,UAAI,aAAa,IAAI,MAAM,IAAI,OAAK;AAEnC,cAAM,cAAc,SAAS,KAAK,EAAE,WAAW,IAAI,EAAE,cAAgB,EAAE,QAAQ,IAAK,GAAG,EAAE,iBAAiB,EAAE,UAAS,EAAE;AACvH,eAAO;AAAA;AAAA,8BAEoB;AAAA,8BACA,gBAAgB,EAAE,kCAAkC,IAAI,QAAQ;AAAA;AAAA;AAAA,MAG5F,CAAC,EAAE,KAAK,EAAE;AAEV,aAAO,8BAA8B;AAAA,IACtC;AAAA,IAEA,qBAAqB,KAAK;AACzB,aAAO;AAAA,YACG,GAAG,aAAa;AAAA,YAChB,gBAAgB,IAAI,aAAa,IAAI,QAAQ;AAAA;AAAA,IAExD;AAAA,IAEA,iBAAiB,KAAK,SAAS;AAC9B,aAAO;AAAA,YACG,GAAG,QAAQ,eAAe;AAAA,YAC1B,gBAAgB,QAAQ,QAAQ,IAAI,QAAQ;AAAA;AAAA,IAEvD;AAAA,IAEA,cAAc;AACb,WAAK,mBAAmB,GAAG,SAAS,eAAe,MAAM;AACxD,aAAK,OAAO,eAAe,KAAK,IAAI,IAAI;AACxC,aAAK,iBAAiB,KAAK;AAC3B,aAAK,WAAW,KAAK,yBAAyB,EAAE,IAAI,WAAW,MAAM;AACrE,aAAK,iBAAiB,IAAI,WAAW,MAAM;AAAA,MAC5C,CAAC;AAED,WAAK,mBAAmB,GAAG,SAAS,aAAa,MAAM;AACtD,aAAK,OAAO,WAAW,KAAK,IAAI,IAAI;AACpC,aAAK,iBAAiB,KAAK;AAC3B,aAAK,WAAW,KAAK,yBAAyB,EAAE,IAAI,WAAW,MAAM;AACrE,aAAK,iBAAiB,IAAI,WAAW,MAAM;AAAA,MAC5C,CAAC;AAED,WAAK,mBAAmB,GAAG,SAAS,eAAe,MAAM;AACxD,aAAK,OAAO,aAAa,KAAK,IAAI,IAAI;AACtC,aAAK,yBAAyB;AAAA,MAC/B,CAAC;AAED,WAAK,mBAAmB,GAAG,SAAS,aAAa,MAAM;AAGvD,gBAAQ,IAAI,KAAK,WAAW;AAC5B,YAAI,cAAc,KAAK,YAAY,4BAA4B,IAAI,OAAK,KAAK,IAAI,EAAE,YAAY,SAAS,EAAE;AACzG,gBAAQ,IAAI,WAAW;AACvB,gBAAQ,IAAI,YAAY,KAAK,GAAG,CAAC;AACjC,YAAI,UAAU,mBAAoB,KAAK,IAAI,WAAU;AACrD,mBAAW,aAAa,KAAK,YAAY,yBAAyB,WAAW;AAC7E,gBAAQ,IAAI,OAAO;AAEnB,eAAO,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,MAAM;AAAA,YACL,SAAS,KAAK,IAAI;AAAA,YAClB,SAAS,KAAK,IAAI;AAAA,YAClB,cAAc,KAAK,YAAY;AAAA,UAChC;AAAA,UACA,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,UAAU,SAAU,GAAG;AACtB,uBAAW,sCAAoC,OAAO,SAAO,EAAE,QAAQ;AACvE,mBAAO,KAAK,OAAO;AAAA,UACR;AAAA,QACb,CAAC;AAAA,MAIF,CAAC;AACD,eAAS,aAAa,KAAK,MAAM;AAChC,eAAO,IAAI,QAAQ,YAAY,SAAS,OAAO,QAAQ;AACtD,iBAAO,OAAO,KAAK,YAAY,cAC5B,KAAK,UACL;AAAA,QACJ,CAAC;AAAA,MACF;AAEA,WAAK,mBAAmB,GAAG,SAAS,YAAY,MAAM;AACrD,aAAK,OAAO,UAAU;AACtB,aAAK,iBAAiB,KAAK;AAC3B,aAAK,WAAW,KAAK,yBAAyB,EAAE,IAAI,WAAW,MAAM;AACrE,aAAK,iBAAiB,IAAI,WAAW,MAAM;AAAA,MAC5C,CAAC;AAED,WAAK,mBAAmB,GAAG,SAAS,cAAc,MAAM;AACvD,aAAK,aAAa,YAAY,SAAS,UAAU,KAAK,cAAc;AACpE,aAAK,aAAa,KAAK;AAAA,MACxB,CAAC;AAED,WAAK,mBAAmB,GAAG,SAAS,cAAc,MAAM;AACvD,aAAK,cAAc;AAAA,MACpB,CAAC;AAAA,IACF;AAAA,IAEA,gBAAgB;AACf,YAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,aAAO,MAAM;AAAA,QACZ,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,KAAK,IAAI;AAAA,QACT,KAAK,IAAI,YAAY,OAAO,KAAK;AAAA,MAClC;AAAA,IACD;AAAA,IAEA,mBAAmB;AAClB,YAAM,aAAa,OAAO,MAAM,OAAO,IAAI,WAAM;AACjD,WAAK,mBAAmB,KAAK,YAAY,EAAE,KAAK,SAAS,GAAG,cAAc;AAC1E,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,mBAAmB,KAAK,YAAY,EAAE,MAAM;AAAA,QAC/D,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU,KAAK,KAAK,mBAAmB,KAAK,YAAY,EAAE,GAAG,UAAU;AAAA,QAC3G,aAAa,GAAG,eAAe;AAAA,QAC/B,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AACD,WAAK,mBAAmB,KAAK,UAAU,EAAE,KAAK,SAAS,GAAG,kBAAkB;AAC5E,aAAO,GAAG,KAAK,GAAG,cAAc,MAAM;AACrC,cAAM,qBAAqB,KAAK,WAAW,GAAG,UAAU;AACxD,YAAI,sBAAsB,KAAK,mBAAmB,KAAK,UAAU,EAAE,GAAG,UAAU,GAAG;AAClF,eAAK,mBAAmB,KAAK,UAAU,EAAE,MAAM;AAAA,QAChD;AAAA,MACD,CAAC;AACD,WAAK,mBAAmB,KAAK,WAAW,EAAE,KAAK,SAAS,GAAG,cAAc;AACzE,aAAO,GAAG,KAAK,aAAa;AAAA,QAC3B,UAAU;AAAA,QACV,QAAQ,MAAM,KAAK,mBAAmB,KAAK,WAAW,EAAE,MAAM;AAAA,QAC9D,WAAW,MAAM,KAAK,WAAW,GAAG,UAAU,KAAK,KAAK,mBAAmB,KAAK,WAAW,EAAE,GAAG,UAAU;AAAA,QAC1G,aAAa,GAAG,cAAc;AAAA,QAC9B,MAAM,SAAS,KAAK;AAAA,MACrB,CAAC;AAAA,IACF;AAAA,IAEA,aAAa;AACZ,YAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,YAAM,aAAa,KAAK,aAAa,WAAW,EAAE;AAClD,YAAM,UAAU,KAAK,aAAa,WAAW,EAAE;AAC/C,YAAM,MAAM,KAAK,OAAO,IAAI;AAC5B,YAAM,eAAe,IAAI;AAEzB,aAAO,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,UACL;AAAA,UACA,SAAS,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,UACxC,SAAS,UAAU,UAAU,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,UAC5D,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV,YAAY;AAAA,UACZ;AAAA,UACA,kBAAkB,OAAO,KAAK,UAAU;AAAA,UACxC,OAAO,IAAI;AAAA,QACZ;AAAA,QACA,UAAU,OAAK;AACd,cAAI,CAAC,EAAE,KAAK;AACX,mBAAO,MAAM,WAAW,OAAO;AAC/B,gBAAI,EAAE,QAAQ,uBAAuB;AACpC,qBAAO,SAAS;AAAA,gBACf;AAAA,gBACA,CAAE,OAAO,MAAM,YAAY,EAAE,QAAQ,qBAAqB,CAAE;AAAA,cAC7D,CAAC;AAAA,YACF,OAAO;AACN,qBAAO,WAAW;AAAA,gBACjB,SAAS,GAAG,0BAA0B;AAAA,gBACtC,WAAW;AAAA,cACZ,CAAC;AAAA,YACF;AACA,iBAAK,aAAa,KAAK;AAAA,UACxB,OAAO;AACN,mBAAO,SAAS,GAAG,0DAA0D,CAAC;AAAA,UAC/E;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,iBAAiB,KAAK;AACrB,WAAK,cAAc,KAAK,EAAE;AAC1B,UAAI,QAAQ,OAAK;AAChB,YAAI,EAAE,WAAW;AAChB,YAAE,aAAa,QAAQ,OAAK;AAC3B,kBAAM,aAAa,EAAE,MAAM,GAAG,EAAE,GAAG,YAAY;AAC/C,kBAAM,MAAM,GAAG,CAAC;AAChB,iBAAK,cAAc;AAAA,cAClB,2CAA2C,mBAAmB;AAAA,YAC/D;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AACD,WAAK,cAAc,SAAS,EAAE,KAAK,EAAE,YAAY,MAAM;AAAA,IACxD;AAAA,IAEA,2BAA2B,MAAM;AAChC,UAAI,MAAM;AACT,aAAK,iBAAiB,IAAI,WAAW,MAAM;AAC3C,aAAK,WAAW,KAAK,yBAAyB,EAAE,IAAI,WAAW,MAAM;AAAA,MACtE,OAAO;AACN,aAAK,iBAAiB,IAAI,WAAW,MAAM;AAC3C,aAAK,WAAW,KAAK,yBAAyB,EAAE,IAAI,WAAW,MAAM;AAAA,MACtE;AAAA,IACD;AAAA,IAEA,sBAAsB,kBAAkB;AACvC,UAAI;AACH,eAAO,CAAC,EAAE,WAAW,MAAM,cAAc,CAAC,iBAAiB,iBAAgB,iBAAiB,WAAW,EAAE,CAAC;AAE3G,aAAO;AAAA,QACN,EAAE,WAAW,KAAK,IAAI,cAAc,GAAG,cAAc,CAAC,iBAAgB,cAAc,gBAAe,eAAe,EAAE;AAAA,QACpH,EAAE,WAAW,CAAC,KAAK,IAAI,aAAa,KAAK,IAAI,cAAc,GAAG,cAAc,CAAC,iBAAiB,iBAAiB,UAAS,eAAe,EAAC;AAAA,QACxI,EAAE,WAAW,KAAK,IAAI,aAAa,KAAK,IAAI,cAAc,GAAG,cAAc,CAAC,iBAAiB,iBAAgB,eAAe,EAAC;AAAA,MAC9H;AAAA,IACD;AAAA,IAEA,gBAAgB,KAAK,mBAAiB,OAAO;AAC5C,yBACC,KAAK,WAAW,IAAI,eAAe,mBAAmB,IACtD,KAAK,WAAW,IAAI,eAAe,iBAAiB;AAErD,WAAK,2BAA2B,KAAK;AAErC,WAAK,MAAM;AAEX,WAAK,qBAAqB,GAAG;AAE7B,WAAK,kBAAkB,GAAG;AAE1B,WAAK,mBAAmB,GAAG;AAE3B,WAAK,qBAAqB,GAAG;AAE7B,YAAM,qBAAqB,KAAK,sBAAsB,gBAAgB;AAEtE,WAAK,iBAAiB,kBAAkB;AACxC,WAAK,iBAAiB,IAAI,SAAQ,mBAAmB,QAAQ,KAAK;AAElE,UAAI,kBAAkB;AACrB,aAAK,gCAAgC;AAAA,MACtC;AAAA,IACD;AAAA,IAEA,qBAAqB,KAAK;AACzB,aAAO,GAAG,UAAU,YAAY,KAAK,IAAI,UAAU,UAAU,EAAE,KAAK,CAAC,EAAE,QAAQ,MAAM;AACpF,aAAK,iBAAiB,QAAQ,YAAY;AAC1C,cAAM,oBAAoB,KAAK,uBAAuB,GAAG;AACzD,aAAK,eAAe,KAAK,iBAAiB;AAAA,MAC3C,CAAC;AAAA,IACF;AAAA,IAEA,kBAAkB,KAAK;AACtB,WAAK,iBAAiB,KAAK,EAAE;AAC7B,UAAI,MAAM,QAAQ,UAAQ;AACzB,cAAM,WAAW,KAAK,cAAc,KAAK,IAAI;AAC7C,aAAK,iBAAiB,OAAO,QAAQ;AACrC,aAAK,8BAA8B;AAAA,MACpC,CAAC;AAAA,IACF;AAAA,IAEA,gCAAgC;AAC/B,YAAM,YAAY,MAAM,KAAK,KAAK,iBAAiB,KAAK,iBAAiB,CAAC;AAC1E,WAAK,iBAAiB,KAAK,iBAAiB,EAAE,IAAI,SAAS,EAAE;AAC7D,UAAI,YAAY,UAAU,OAAO,CAACC,YAAW,QAAQ;AACpD,YAAI,EAAE,GAAG,EAAE,MAAM,IAAIA;AACpB,UAAAA,aAAY,EAAE,GAAG,EAAE,MAAM;AAC1B,eAAOA;AAAA,MACR,GAAG,CAAC;AAEJ,mBAAa;AACb,UAAI,aAAa;AAAG,oBAAY;AAEhC,WAAK,iBAAiB,KAAK,iBAAiB,EAAE,IAAI,SAAS,SAAS;AAAA,IACrE;AAAA,IAEA,qBAAqB,KAAK;AACzB,WAAK,mBAAmB,KAAK,EAAE;AAC/B,UAAI,SAAS,QAAQ,OAAK;AACzB,YAAI,EAAE,QAAQ;AACb,gBAAM,cAAc,KAAK,iBAAiB,KAAK,CAAC;AAChD,eAAK,mBAAmB,OAAO,WAAW;AAAA,QAC3C;AAAA,MACD,CAAC;AACD,UAAI,IAAI,yBAAyB,IAAI,gBAAgB;AACpD,cAAM,cAAc,KAAK,iBAAiB,KAAK;AAAA,UAC9C,iBAAiB;AAAA,UACjB,QAAQ,IAAI;AAAA,QACb,CAAC;AACD,aAAK,mBAAmB,OAAO,WAAW;AAAA,MAC3C;AAAA,IACD;AAAA,IAEA,mBAAmB,KAAK;AACvB,WAAK,kBAAkB,KAAK,EAAE;AAE9B,YAAM,gBAAgB,KAAK,mBAAmB,GAAG;AACjD,YAAM,YAAY,KAAK,eAAe,GAAG;AACzC,YAAM,eAAe,KAAK,kBAAkB,GAAG;AAC/C,YAAM,kBAAkB,KAAK,qBAAqB,GAAG;AACrD,WAAK,kBAAkB,OAAO,aAAa;AAC3C,WAAK,kBAAkB,OAAO,SAAS;AACvC,WAAK,kBAAkB,OAAO,YAAY;AAC1C,WAAK,kBAAkB,OAAO,eAAe;AAAA,IAC9C;AAAA,IAEA,iBAAiB,MAAM;AACtB,aAAO,KAAK,WAAW,IAAI,WAAW,MAAM,IAAI,KAAK,WAAW,IAAI,WAAW,MAAM;AAAA,IAEtF;AAAA,IAEA,MAAM,kCAAkC;AA9bzC;AAgcQ,YAAM,iBAAe,UAAK,gBAAL,mBAAkB,SAAQ,KAAK;AAEpD,YAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,GAAG;AAAA,QAChC;AAAA,QACA;AAAA,QACA,CAAC,mCAAmC,cAAc;AAAA,MACtD;AAEA,UAAI,mCAAS,iCAAiC;AAC1C,mBAAW,MAAM,KAAK,cAAc,GAAG,GAAG;AAAA,MAC9C;AAAA,IAER;AAAA,EAGA;", + "names": ["i", "get_item_code_header", "max_width", "precision", "doc", "max_width", "frm", "item", "$btn", "paid_amount", "max_width"] +}