From 6a90ef726c013ef7aded684283fa8b35eb5ae0ef Mon Sep 17 00:00:00 2001 From: jiloysss Date: Thu, 29 Aug 2024 07:02:54 +0800 Subject: [PATCH 1/5] Update --- posnext/public/js/pos_controller.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/posnext/public/js/pos_controller.js b/posnext/public/js/pos_controller.js index 19e7100..9fe4d99 100644 --- a/posnext/public/js/pos_controller.js +++ b/posnext/public/js/pos_controller.js @@ -436,7 +436,7 @@ posnext.PointOfSale.Controller = class { wrapper: this.$components_wrapper, events: { open_invoice_data: (name) => { - frappe.db.get_doc('Sales Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { this.order_summary.load_summary_of(doc); }); }, @@ -461,7 +461,7 @@ posnext.PointOfSale.Controller = class { process_return: (name) => { this.recent_order_list.toggle_component(false); - frappe.db.get_doc('Sales Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { frappe.run_serially([ () => this.make_return_invoice(doc), () => this.cart.load_invoice(), @@ -534,7 +534,7 @@ posnext.PointOfSale.Controller = class { } make_sales_invoice_frm() { - const doctype = 'Sales Invoice'; + const doctype = 'POS Invoice'; return new Promise(resolve => { if (this.frm) { this.frm = this.get_new_frm(this.frm); @@ -557,7 +557,7 @@ posnext.PointOfSale.Controller = class { } get_new_frm(_frm) { - const doctype = 'Sales Invoice'; + const doctype = 'POS 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); @@ -775,7 +775,7 @@ posnext.PointOfSale.Controller = class { 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()]) + message: __('Serial No: {0} has already been transacted into another POS Invoice.', [serial_no.bold()]) }); } } From f4c12f63c46946f9e351770bf28bd305dec96870 Mon Sep 17 00:00:00 2001 From: sammish Date: Thu, 5 Sep 2024 16:13:59 +0530 Subject: [PATCH 2/5] POS Spelling Update --- posnext/public/js/pos_controller.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/posnext/public/js/pos_controller.js b/posnext/public/js/pos_controller.js index 9fe4d99..e6b46cb 100644 --- a/posnext/public/js/pos_controller.js +++ b/posnext/public/js/pos_controller.js @@ -461,7 +461,7 @@ posnext.PointOfSale.Controller = class { process_return: (name) => { this.recent_order_list.toggle_component(false); - frappe.db.get_doc('POS Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { frappe.run_serially([ () => this.make_return_invoice(doc), () => this.cart.load_invoice(), @@ -534,7 +534,7 @@ posnext.PointOfSale.Controller = class { } make_sales_invoice_frm() { - const doctype = 'POS Invoice'; + const doctype = 'POS Invoice'; return new Promise(resolve => { if (this.frm) { this.frm = this.get_new_frm(this.frm); @@ -557,7 +557,7 @@ posnext.PointOfSale.Controller = class { } get_new_frm(_frm) { - const doctype = 'POS Invoice'; + const doctype = 'POS 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); From 699a6eae8d1d2bb05e8666dbfd6c8961384fa97f Mon Sep 17 00:00:00 2001 From: jiloysss Date: Fri, 4 Oct 2024 18:48:38 +0800 Subject: [PATCH 3/5] Update --- posnext/public/js/pos_controller.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/posnext/public/js/pos_controller.js b/posnext/public/js/pos_controller.js index 9fe4d99..09dd08a 100644 --- a/posnext/public/js/pos_controller.js +++ b/posnext/public/js/pos_controller.js @@ -461,7 +461,7 @@ posnext.PointOfSale.Controller = class { process_return: (name) => { this.recent_order_list.toggle_component(false); - frappe.db.get_doc('POS Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { frappe.run_serially([ () => this.make_return_invoice(doc), () => this.cart.load_invoice(), @@ -534,7 +534,7 @@ posnext.PointOfSale.Controller = class { } make_sales_invoice_frm() { - const doctype = 'POS Invoice'; + const doctype = 'POS Invoice'; return new Promise(resolve => { if (this.frm) { this.frm = this.get_new_frm(this.frm); @@ -557,7 +557,7 @@ posnext.PointOfSale.Controller = class { } get_new_frm(_frm) { - const doctype = 'POS Invoice'; + const doctype = 'POS 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); @@ -743,7 +743,8 @@ posnext.PointOfSale.Controller = class { const is_stock_item = resp[1]; frappe.dom.unfreeze(); - const bold_uom = item_row.stock_uom.bold(); + console.log(item_row) + 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() From 0dd50e23f7f161ba5eb723b0c1130a253186d51f Mon Sep 17 00:00:00 2001 From: jiloysss Date: Wed, 23 Oct 2024 09:59:40 +0800 Subject: [PATCH 4/5] Update --- posnext/fixtures/custom_field.json | 58 +++++++++++++++++++++++++- posnext/public/js/pos_item_selector.js | 43 +++++++++++++++---- 2 files changed, 93 insertions(+), 8 deletions(-) diff --git a/posnext/fixtures/custom_field.json b/posnext/fixtures/custom_field.json index 1847a21..2ffb0aa 100644 --- a/posnext/fixtures/custom_field.json +++ b/posnext/fixtures/custom_field.json @@ -279,6 +279,62 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_show_item_code", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_show_checkout_button", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Show Item Code", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-10-23 04:20:13.966560", + "module": "Posnext", + "name": "POS Profile-custom_show_item_code", + "no_copy": 0, + "non_negative": 0, + "options": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -306,7 +362,7 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_checkout_button", + "insert_after": "custom_show_item_code", "is_system_generated": 0, "is_virtual": 0, "label": "Default View", diff --git a/posnext/public/js/pos_item_selector.js b/posnext/public/js/pos_item_selector.js index c3fafec..806a02b 100644 --- a/posnext/public/js/pos_item_selector.js +++ b/posnext/public/js/pos_item_selector.js @@ -20,6 +20,7 @@ posnext.PointOfSale.ItemSelector = class { if(settings.custom_show_only_card_view){ view = "Card" } + this.custom_show_item_code = settings.custom_show_item_code this.show_only_list_view = settings.custom_show_only_list_view this.show_only_card_view = settings.custom_show_only_card_view this.inti_component(); @@ -155,19 +156,29 @@ posnext.PointOfSale.ItemSelector = class { render_item_list(items) { - this.$items_container.html(''); + var me = this if(view === "List"){ + this.$items_container.html(''); this.$items_container.append( - `
+ `
-
${__('Item')}
+ ${get_item_code_header()}
${__('Rate')}
${__('Available Qty')}
${__('UOM')}
-
` - ); +
`) + + function get_item_code_header() { + + if(me.custom_show_item_code){ + return `
${__('Item')}
+
${__('Item Code')}
` + } else { + return `
${__('Item')}
` + } + } this.make_cart_items_section(); items.forEach(item => { @@ -218,15 +229,33 @@ posnext.PointOfSale.ItemSelector = class { $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() { + if(me.custom_show_item_code){ + return `
` + } else { + return `
` + } + } + function get_item_code() { + if(me.custom_show_item_code){ + return `
+
+ ${item_data.item_code} +
+
` + } else { + return `` + } + } set_dynamic_rate_header_width(); function set_dynamic_rate_header_width() { From cd104f24a893e34cb9c8619c2a6cf54bfa99c58b Mon Sep 17 00:00:00 2001 From: Christo Date: Thu, 16 Oct 2025 19:38:39 +0000 Subject: [PATCH 5/5] bug: fixed a few bugs --- posnext/overrides/pos_closing_entry.py | 56 +-- posnext/overrides/pos_invoice_merge_log.py | 86 ++--- posnext/posnext/page/posnext/point_of_sale.py | 21 +- .../dist/js/posnext.bundle.TN4KQRHJ.js.map | 7 - ...TN4KQRHJ.js => posnext.bundle.YW64UZIB.js} | 355 ++++++++++++------ .../dist/js/posnext.bundle.YW64UZIB.js.map | 7 + posnext/public/js/pos_controller.js | 17 +- posnext/public/js/pos_item_cart.js | 143 ++++--- 8 files changed, 423 insertions(+), 269 deletions(-) delete mode 100644 posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map rename posnext/public/dist/js/{posnext.bundle.TN4KQRHJ.js => posnext.bundle.YW64UZIB.js} (94%) create mode 100644 posnext/public/dist/js/posnext.bundle.YW64UZIB.js.map diff --git a/posnext/overrides/pos_closing_entry.py b/posnext/overrides/pos_closing_entry.py index c8b5ba0..222b01a 100644 --- a/posnext/overrides/pos_closing_entry.py +++ b/posnext/overrides/pos_closing_entry.py @@ -1,32 +1,35 @@ import frappe from frappe.utils import flt, get_datetime +from frappe import _ + @frappe.whitelist() def get_pos_invoices(start, end, pos_profile, user): print("HEEEEEEEEEEEEEEEEERE") data = frappe.db.sql( """ - select - name, timestamp(posting_date, posting_time) as "timestamp" - from - `tabSales Invoice` - where - owner = %s and docstatus = 1 and pos_profile = %s - """, + SELECT + name, timestamp(posting_date, posting_time) as "timestamp" + FROM + `tabPOS Invoice` + WHERE + owner = %s AND docstatus = 1 AND pos_profile = %s + """, (user, pos_profile), as_dict=1, ) data = list(filter(lambda d: get_datetime(start) <= get_datetime(d.timestamp) <= get_datetime(end), data)) # need to get taxes and payments so can't avoid get_doc - data = [frappe.get_doc("Sales Invoice", d.name).as_dict() for d in data] + data = [frappe.get_doc("POS Invoice", d.name).as_dict() for d in data] return data from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import POSClosingEntry from posnext.overrides.pos_invoice_merge_log import ( - consolidate_pos_invoices, - unconsolidate_pos_invoices, + consolidate_pos_invoices, + unconsolidate_pos_invoices, ) + class PosnextPOSClosingEntry(POSClosingEntry): def on_submit(self): consolidate_pos_invoices(closing_entry=self) @@ -42,29 +45,36 @@ def validate_pos_invoices(self): invalid_rows = [] for d in self.pos_transactions: invalid_row = {"idx": d.idx} - pos_invoice = frappe.db.get_values( - "Sales Invoice", + + # FIXED: Changed from "Sales Invoice" to "POS Invoice" + pos_invoice_data = frappe.db.get_values( + "POS Invoice", d.pos_invoice, ["pos_profile", "docstatus", "owner"], as_dict=1, - )[0] - # if pos_invoice.consolidated_invoice: - # invalid_row.setdefault("msg", []).append( - # _("Sales Invoice is {}").format(frappe.bold("already consolidated")) - # ) - # invalid_rows.append(invalid_row) - # continue + ) + + if not pos_invoice_data: + invalid_row.setdefault("msg", []).append( + _("POS Invoice {} not found").format(frappe.bold(d.pos_invoice)) + ) + invalid_rows.append(invalid_row) + continue + + pos_invoice = pos_invoice_data[0] + + # Original validations if pos_invoice.pos_profile != self.pos_profile: invalid_row.setdefault("msg", []).append( - _("Sales Profile doesn't matches {}").format(frappe.bold(self.pos_profile)) + _("POS Profile doesn't match {}").format(frappe.bold(self.pos_profile)) ) if pos_invoice.docstatus != 1: invalid_row.setdefault("msg", []).append( - _("Sales Invoice is not {}").format(frappe.bold("submitted")) + _("POS Invoice is not {}").format(frappe.bold("submitted")) ) if pos_invoice.owner != self.user: invalid_row.setdefault("msg", []).append( - _("Sales Invoice isn't created by user {}").format(frappe.bold(self.owner)) + _("POS Invoice isn't created by user {}").format(frappe.bold(self.user)) ) if invalid_row.get("msg"): @@ -78,4 +88,4 @@ def validate_pos_invoices(self): for msg in row.get("msg"): error_list.append(_("Row #{}: {}").format(row.get("idx"), msg)) - frappe.throw(error_list, title=_("Invalid Sales Invoices"), as_list=True) \ No newline at end of file + frappe.throw(error_list, title=_("Invalid POS Invoices"), as_list=True) \ No newline at end of file diff --git a/posnext/overrides/pos_invoice_merge_log.py b/posnext/overrides/pos_invoice_merge_log.py index ce80e4b..52610c9 100644 --- a/posnext/overrides/pos_invoice_merge_log.py +++ b/posnext/overrides/pos_invoice_merge_log.py @@ -1,4 +1,5 @@ import frappe +import json from frappe.utils.scheduler import is_scheduler_inactive from frappe.utils.background_jobs import enqueue, is_job_enqueued from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import POSInvoiceMergeLog @@ -8,69 +9,53 @@ class PosnextPOSInvoiceMergeLog(POSInvoiceMergeLog): def serial_and_batch_bundle_reference_for_pos_invoice(self): for d in self.pos_invoices: - pos_invoice = frappe.get_doc("Sales Invoice", d.pos_invoice) + pos_invoice = frappe.get_doc("POS Invoice", d.pos_invoice) for table_name in ["items", "packed_items"]: pos_invoice.set_serial_and_batch_bundle(table_name) + def on_cancel(self): - pos_invoice_docs = [frappe.get_cached_doc("Sales Invoice", d.pos_invoice) for d in self.pos_invoices] - + pos_invoice_docs = [frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices] self.update_pos_invoices(pos_invoice_docs) self.serial_and_batch_bundle_reference_for_pos_invoice() self.cancel_linked_invoices() + def on_submit(self): - pos_invoice_docs = [frappe.get_cached_doc("Sales Invoice", d.pos_invoice) for d in self.pos_invoices] - - returns = [d for d in pos_invoice_docs if d.get("is_return") == 1] - sales = [d for d in pos_invoice_docs if d.get("is_return") == 0] - - sales_invoice, credit_note = "", "" - if returns: - credit_note = self.process_merging_into_credit_note(returns) - - if sales: - sales_invoice = self.process_merging_into_sales_invoice(sales) - - self.save() # save consolidated_sales_invoice & consolidated_credit_note ref in merge log - self.update_pos_invoices(pos_invoice_docs, sales_invoice, credit_note) + # Set serial and batch bundle references first + self.serial_and_batch_bundle_reference_for_pos_invoice() + # Then call parent's on_submit which has all the consolidation logic + super().on_submit() + def validate_pos_invoice_status(self): for d in self.pos_invoices: status, docstatus, is_return, return_against = frappe.db.get_value( - "Sales Invoice", d.pos_invoice, ["status", "docstatus", "is_return", "return_against"] + "POS Invoice", d.pos_invoice, ["status", "docstatus", "is_return", "return_against"] ) bold_pos_invoice = frappe.bold(d.pos_invoice) bold_status = frappe.bold(status) if docstatus != 1: frappe.throw( - _("Row #{}: Sales Invoice {} is not submitted yet").format(d.idx, bold_pos_invoice) + _("Row #{}: POS Invoice {} is not submitted yet").format(d.idx, bold_pos_invoice) ) if status == "Consolidated": frappe.throw( - _("Row #{}: Sales Invoice {} has been {}").format(d.idx, bold_pos_invoice, bold_status) + _("Row #{}: POS Invoice {} has been {}").format(d.idx, bold_pos_invoice, bold_status) ) - if ( - is_return - and return_against - and return_against not in [d.pos_invoice for d in self.pos_invoices] - ): + if (is_return and return_against and return_against not in [d.pos_invoice for d in self.pos_invoices]): bold_return_against = frappe.bold(return_against) - return_against_status = frappe.db.get_value("Sales Invoice", return_against, "status") + return_against_status = frappe.db.get_value("POS Invoice", return_against, "status") if return_against_status != "Consolidated": - # if return entry is not getting merged in the current pos closing and if it is not consolidated bold_unconsolidated = frappe.bold("not Consolidated") msg = _("Row #{}: Original Invoice {} of return invoice {} is {}.").format( d.idx, bold_return_against, bold_pos_invoice, bold_unconsolidated ) msg += " " - msg += _( - "Original invoice should be consolidated before or along with the return invoice." - ) + msg += _("Original invoice should be consolidated before or along with the return invoice.") msg += "

" - msg += _("You can add original invoice {} manually to proceed.").format( - bold_return_against - ) + msg += _("You can add original invoice {} manually to proceed.").format(bold_return_against) frappe.throw(msg) + def split_invoices(invoices): """ Splits invoices into multiple groups @@ -78,22 +63,10 @@ def split_invoices(invoices): If a serial no is sold and later it is returned then split the invoices such that the selling entry is merged first and then the return entry """ - # Input - # invoices = [ - # {'pos_invoice': 'Invoice with SR#1 & SR#2', 'is_return': 0}, - # {'pos_invoice': 'Invoice with SR#1', 'is_return': 1}, - # {'pos_invoice': 'Invoice with SR#2', 'is_return': 0} - # ] - # Output - # _invoices = [ - # [{'pos_invoice': 'Invoice with SR#1 & SR#2', 'is_return': 0}], - # [{'pos_invoice': 'Invoice with SR#1', 'is_return': 1}, {'pos_invoice': 'Invoice with SR#2', 'is_return': 0}], - # ] - _invoices = [] special_invoices = [] pos_return_docs = [ - frappe.get_cached_doc("Sales Invoice", d.pos_invoice) + frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in invoices if d.is_return and d.return_against ] @@ -123,6 +96,7 @@ def split_invoices(invoices): return _invoices + def consolidate_pos_invoices(pos_invoices=None, closing_entry=None): invoices = pos_invoices or (closing_entry and closing_entry.get("pos_transactions")) if frappe.flags.in_test and not invoices: @@ -136,6 +110,7 @@ def consolidate_pos_invoices(pos_invoices=None, closing_entry=None): else: create_merge_logs(invoice_by_customer, closing_entry) + def get_all_unconsolidated_invoices(): filters = { "consolidated_invoice": ["in", ["", None]], @@ -143,7 +118,7 @@ def get_all_unconsolidated_invoices(): "docstatus": 1, } pos_invoices = frappe.db.get_all( - "Sales Invoice", + "POS Invoice", filters=filters, fields=[ "name as pos_invoice", @@ -157,8 +132,8 @@ def get_all_unconsolidated_invoices(): return pos_invoices + def get_invoice_customer_map(pos_invoices): - # pos_invoice_customer_map = { 'Customer 1': [{}, {}, {}], 'Customer 2' : [{}] } pos_invoice_customer_map = {} for invoice in pos_invoices: customer = invoice.get("customer") @@ -178,6 +153,8 @@ def unconsolidate_pos_invoices(closing_entry): enqueue_job(cancel_merge_logs, merge_logs=merge_logs, closing_entry=closing_entry) else: cancel_merge_logs(merge_logs, closing_entry) + + def cancel_merge_logs(merge_logs, closing_entry=None): try: for log in merge_logs: @@ -204,6 +181,7 @@ def cancel_merge_logs(merge_logs, closing_entry=None): frappe.db.commit() frappe.publish_realtime("closing_process_complete", user=frappe.session.user) + def create_merge_logs(invoice_by_customer, closing_entry=None): try: for customer, invoices in invoice_by_customer.items(): @@ -220,6 +198,7 @@ def create_merge_logs(invoice_by_customer, closing_entry=None): merge_log.set("pos_invoices", _invoices) merge_log.save(ignore_permissions=True) merge_log.submit() + if closing_entry: closing_entry.set_status(update=True, status="Submitted") closing_entry.db_set("error_message", "") @@ -240,6 +219,8 @@ def create_merge_logs(invoice_by_customer, closing_entry=None): finally: frappe.db.commit() frappe.publish_realtime("closing_process_complete", user=frappe.session.user) + + def enqueue_job(job, **kwargs): check_scheduler_status() @@ -264,13 +245,14 @@ def enqueue_job(job, **kwargs): frappe.msgprint(msg, alert=1) + def check_scheduler_status(): if is_scheduler_inactive() and not frappe.flags.in_test: frappe.throw(_("Scheduler is inactive. Cannot enqueue job."), title=_("Scheduler Inactive")) def get_error_message(message) -> str: - try: - return message["message"] - except Exception: - return str(message) \ No newline at end of file + try: + return message["message"] + except Exception: + return str(message) \ No newline at end of file diff --git a/posnext/posnext/page/posnext/point_of_sale.py b/posnext/posnext/page/posnext/point_of_sale.py index 45b8478..47b67d6 100644 --- a/posnext/posnext/page/posnext/point_of_sale.py +++ b/posnext/posnext/page/posnext/point_of_sale.py @@ -330,13 +330,15 @@ def get_past_order_list(search_term, status, pos_profile=None, limit=20): invoice_list = [] if status == "Unpaid": status = ["in", ["Unpaid", "Partly Paid", "Overdue"]] + elif status == "Paid": + status = ["in", ["Paid", "Consolidated"]] # Include consolidated invoices in "Paid" status if search_term and status: fltr1 = {"customer": ["like", "%{}%".format(search_term)], "status": status} if pos_profile: fltr1 = {"customer": ["like", "%{}%".format(search_term)], "status": status, "pos_profile": pos_profile} invoices_by_customer = frappe.db.get_all( - "Sales Invoice", + "POS Invoice", # CHANGED from "Sales Invoice" filters=fltr1, fields=fields, page_length=limit, @@ -345,7 +347,7 @@ def get_past_order_list(search_term, status, pos_profile=None, limit=20): if pos_profile: fltr2 = {"name": ["like", "%{}%".format(search_term)], "status": status, "pos_profile": pos_profile} invoices_by_name = frappe.db.get_all( - "Sales Invoice", + "POS Invoice", # CHANGED from "Sales Invoice" filters=fltr2, fields=fields, page_length=limit, @@ -357,7 +359,10 @@ def get_past_order_list(search_term, status, pos_profile=None, limit=20): if pos_profile: fltr = {"status": status, "pos_profile": pos_profile} invoice_list = frappe.db.get_all( - "Sales Invoice", filters=fltr, fields=fields, page_length=limit + "POS Invoice", # CHANGED from "Sales Invoice" + filters=fltr, + fields=fields, + page_length=limit ) return invoice_list @@ -458,7 +463,7 @@ def generate_pdf_and_save(docname, doctype, print_format=None): def make_sales_return(source_name, target_doc=None): from erpnext.controllers.sales_and_purchase_return import make_return_doc - return make_return_doc("Sales Invoice", source_name, target_doc) + return make_return_doc("POS Invoice", source_name, target_doc) # CHANGED from "Sales Invoice" @frappe.whitelist() @@ -466,9 +471,11 @@ def get_lcr(customer=None, item_code=None): d = None if customer and item_code: d = frappe.db.sql(f""" - SELECT item.rate FROM `tabSales Invoice Item` item INNER JOIN `tabSales Invoice` SI ON SI.name=item.parent - WHERE SI.customer='{customer}' AND item.item_code='{item_code}' - ORDER BY SI.creation desc + SELECT item.rate FROM `tabPOS Invoice Item` item + INNER JOIN `tabPOS Invoice` PI ON PI.name=item.parent + WHERE PI.customer='{customer}' AND item.item_code='{item_code}' + AND PI.docstatus = 1 + ORDER BY PI.creation desc LIMIT 1 """, as_dict=True) if d: diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map deleted file mode 100644 index fd8823c..0000000 --- a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "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": "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", - "names": ["i", "get_item_code_header", "max_width", "precision", "doc", "max_width", "frm", "item", "$btn", "paid_amount", "max_width"] -} diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js b/posnext/public/dist/js/posnext.bundle.YW64UZIB.js similarity index 94% rename from posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js rename to posnext/public/dist/js/posnext.bundle.YW64UZIB.js index 623e630..d76895e 100644 --- a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js +++ b/posnext/public/dist/js/posnext.bundle.YW64UZIB.js @@ -32,6 +32,20 @@ () => this.check_opening_entry(""), () => this.reload_status = true ]); + this.setup_form_events(); + } + setup_form_events() { + frappe.ui.form.on("POS Invoice", { + after_save: function(frm) { + if (!frm.doc.pos_profile) + return; + frappe.db.get_doc("POS Profile", frm.doc.pos_profile).then((pos_profile) => { + if (pos_profile.custom_stock_update) { + frm.set_value("update_stock", 0); + } + }); + } + }); } fetch_opening_entry(value) { return frappe.call("posnext.posnext.page.posnext.point_of_sale.check_opening_entry", { "user": frappe.session.user, "value": value }); @@ -427,7 +441,7 @@ wrapper: this.$components_wrapper, events: { open_invoice_data: (name) => { - frappe.db.get_doc("Sales Invoice", name).then((doc) => { + frappe.db.get_doc("POS Invoice", name).then((doc) => { this.order_summary.load_summary_of(doc); }); }, @@ -450,7 +464,7 @@ get_frm: () => this.frm, process_return: (name) => { this.recent_order_list.toggle_component(false); - frappe.db.get_doc("Sales Invoice", name).then((doc) => { + frappe.db.get_doc("POS Invoice", name).then((doc) => { frappe.run_serially([ () => this.make_return_invoice(doc), () => this.cart.load_invoice(), @@ -517,7 +531,7 @@ } } make_sales_invoice_frm() { - const doctype = "Sales Invoice"; + const doctype = "POS Invoice"; return new Promise((resolve) => { if (this.frm) { this.frm = this.get_new_frm(this.frm); @@ -537,7 +551,7 @@ }); } get_new_frm(_frm) { - const doctype = "Sales Invoice"; + const doctype = "POS 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); @@ -610,7 +624,8 @@ item_code: bundle_item.item_code, qty: bundle_item.qty * value, rate: bundle_item.rate, - uom: bundle_item.uom + uom: bundle_item.uom, + custom_bundle_id: product_bundle.name })); for (const bundle_item of bundle_items) { const bundle_item_row = this.frm.add_child("items", bundle_item); @@ -633,9 +648,6 @@ `).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")) @@ -651,6 +663,10 @@ total_incoming_rate += parseFloat(item.valuation_rate) * item.qty; }); this.item_selector.update_total_incoming_rate(total_incoming_rate); + if (item_row) { + this.cart.update_totals_section(this.frm); + this.cart.update_item_html(item_row); + } return item_row; } } @@ -881,6 +897,7 @@ this.hide_images = settings.hide_images; this.reload_status = reload_status; this.auto_add_item = settings.auto_add_item_to_cart; + this.auto_search_serial = settings.custom_auto_search_serial_number; if (settings.custom_default_view) { view = settings.custom_default_view; } @@ -899,6 +916,7 @@ 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.custom_show_item_discription = settings.custom_show_item_discription; this.inti_component(); } inti_component() { @@ -1149,8 +1167,6 @@ 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( @@ -1175,7 +1191,7 @@
${item_data.item_name}
- ${get_description_html()} + ${get_description_html(item_data)}
${get_item_code()} ${get_rate_discount_html()}` @@ -1248,7 +1264,7 @@
${format_currency(item_data.price_list_rate, currency)}
${item_data.actual_qty || 0}
-
${item_data.batch_no || 0}
+
`; } else { @@ -1258,22 +1274,22 @@
${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) { + function get_description_html(item_data2) { + if (me.custom_show_item_discription) { + if (item_data2.description.indexOf("
") != -1) { try { - item_data.description = $(item_data.description).text(); + item_data2.description = $(item_data2.description).text(); } catch (error) { - item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); + item_data2.description = item_data2.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); } } - item_data.description = frappe.ellipsis(item_data.description, 45); - return `
${item_data.description}
`; + item_data2.description = frappe.ellipsis(item_data2.description, 45); + return `
${item_data2.description}
`; } return ``; } @@ -1512,7 +1528,6 @@ }); } 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")); @@ -1587,7 +1602,9 @@ const items = this.search_index[search_term]; this.items = items; this.render_item_list(items); - this.auto_add_item && this.items.length == 1; + if (this.auto_search_serial && this.items.length === 1) { + this.add_filtered_item_to_cart(); + } return; } } @@ -1598,7 +1615,9 @@ } this.items = items; this.render_item_list(items); - this.auto_add_item && this.items.length == 1; + if (this.auto_search_serial && this.items.length === 1) { + this.add_filtered_item_to_cart(); + } }); } add_filtered_item_to_cart() { @@ -1642,6 +1661,8 @@ 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.custom_show_item_discription = settings.custom_show_item_discription; + this.custom_show_item_barcode = settings.custom_show_item_barcode; this.settings = settings; this.warehouse = settings.warehouse; this.init_component(); @@ -1685,10 +1706,21 @@ var html = `
${__("Item Cart")}
-
-
${__("Item")}
-
${__("Qty")}
- `; +
`; + let item_name_flex = 3.5; + if (this.custom_use_discount_percentage && !this.custom_use_discount_amount) { + item_name_flex = 2.8; + } + if (this.custom_use_discount_amount && !this.custom_use_discount_percentage) { + item_name_flex = 2.8; + } + if (this.custom_use_discount_amount && this.custom_use_discount_percentage) { + item_name_flex = 2.5; + } + html += `
${__("Item")}
`; + const header_container_flex = this.custom_edit_rate ? 6 : 4; + html += `
`; + html += `
${__("Qty")}
`; if (this.custom_show_uom_in_cart) { html += `
${__("UOM")}
`; } @@ -1708,13 +1740,14 @@ html += `
${__("Inc.Rate")}
`; } if (this.custom_show_logical_rack_in_cart) { - html += `
${__("Rack")}
`; + html += `
${__("Rack")}
`; } if (this.custom_show_last_customer_rate) { html += `
${__("LC Rate")}
`; } - html += `
${__("Amount")}
-
+ html += `
${__("Amount")}
`; + html += `
`; + html += `
@@ -1764,16 +1797,6 @@ ${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"); @@ -1813,7 +1836,7 @@ border: none; border-radius: 5px; cursor: pointer; - flex: 1; ">${__("Checkout")}
+ flex: 1; ">${__("Checkout (F1)")}
${__("Held")}
+ flex: 1;">${__("Held (F2)")}
${__("Order List")}
+ flex: 1;">${__("Order List (F3)")}
${__("Edit Cart")}
` ); @@ -2083,25 +2106,34 @@ 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(); + const $wrapper = $(".add-branch-wrapper"); + const posProfileName = me.settings.name; + const branchFieldWrapper = $('
'); + $wrapper.replaceWith(branchFieldWrapper); + frappe.call({ + method: "posnext.doc_events.pos_profile.get_pos_profile_branch", + args: { + pos_profile_name: posProfileName + }, + callback: function(r) { + const branch_name = r.message && r.message.branch; + console.log(branch_name); + let branchField = new frappe.ui.form.ControlLink({ + df: { + fieldtype: "Link", + options: "Branch", + fieldname: "branch", + label: "Branch", + placeholder: "Select Branch", + default: branch_name, + reqd: 1 + }, + parent: branchFieldWrapper + }); + branchField.make(); + branchField.set_value(branch_name); + branchField.refresh(); + } }); frappe.ui.form.on("Sales Invoice", "paid_amount", (frm) => { this.update_totals_section(frm); @@ -2393,19 +2425,29 @@ update_totals_section(frm) { if (!frm) frm = this.events.get_frm(); - this.render_net_total(frm.doc.net_total); + frm.cscript.calculate_taxes_and_totals(); + this.render_net_total(frm.doc.items); 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; + let grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? frm.doc.grand_total : frm.doc.rounded_total; + if (!frm.doc.items || frm.doc.items.length === 0) { + if (Math.abs(grand_total) != 5e-3) { + grand_total = 0; + } + } this.render_grand_total(grand_total); this.render_taxes(frm.doc.taxes); } - render_net_total(value) { + render_net_total(items) { const currency = this.events.get_frm().doc.currency; + var total_net_amount = 0; + items.map((item) => { + total_net_amount = total_net_amount + item.net_amount; + }); this.$totals_section.find(".net-total-container").html( - `
${__("Net Total")}
${format_currency(value, currency)}
` + `
${__("Net Total")}
${format_currency(total_net_amount, currency)}
` ); this.$numpad_section.find(".numpad-net-total").html( - `
${__("Net Total")}: ${format_currency(value, currency)}
` + `
${__("Net Total")}: ${format_currency(total_net_amount, currency)}
` ); } render_total_item_qty(items) { @@ -2489,10 +2531,14 @@ if (!me.custom_use_discount_amount && !me.custom_use_discount_percentage) { item_html += `
`; } - item_html += `
+ item_html += `
+ ${item_data.item_code} +
+
${item_data.item_name}
- ${get_description_html()} + ${get_description_html(item_data)} + ${get_item_barcode(item_data)}
${get_rate_discount_html()}`; $item_to_update.html(item_html); @@ -2767,44 +2813,67 @@ return html; } } else { + let html2 = `
+
${item_data.qty || 0}
`; + if (me.custom_show_uom_in_cart) { + html2 += `
${item_data.uom || ""}
`; + } + if (me.show_batch_in_cart) { + html2 += `
${item_data.batch_no || ""}
`; + } 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)}
-
-
`; + html2 += `
+
${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)}
-
-
`; + html2 += `
+
${parseFloat(item_data.rate).toFixed(2)}
+
`; } + html2 += `
`; + return html2; } } - function get_description_html() { - if (item_data.description) { - if (item_data.description.indexOf("
") != -1) { + function get_description_html(item_data2) { + const hide_description = me.custom_show_item_discription; + if (hide_description) { + if (item_data2.description.indexOf("
") != -1) { try { - item_data.description = $(item_data.description).text(); + item_data2.description = $(item_data2.description).text(); } catch (error) { - item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); + item_data2.description = item_data2.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); } } - item_data.description = frappe.ellipsis(item_data.description, 45); - return `
${item_data.description}
`; + item_data2.description = frappe.ellipsis(item_data2.description, 45); + return `
${item_data2.description}
`; } return ``; } + function get_item_barcode(item_data2) { + const show_barcode = me.custom_show_item_barcode; + if (!show_barcode) { + return ""; + } + const barcode_placeholder_id = `barcode-${item_data2.item_code.replace(/[^a-zA-Z0-9]/g, "-")}`; + frappe.call({ + method: "posnext.posnext.page.posnext.point_of_sale.get_barcodes", + args: { + item_code: item_data2.item_code + }, + callback: function(response) { + if (response.message && response.message.length > 0) { + const html = response.message.map((b) => ` +
+ ${b.barcode} +
+ `).join(""); + $(`#${barcode_placeholder_id}`).html(html); + } + } + }); + return `
`; + } function get_item_image_html() { const { image, item_name } = item_data; if (!me.hide_images && image) { @@ -3159,7 +3228,6 @@ this.update_item_html(item); }); } - this.update_totals_section(frm); }); } load_invoice() { @@ -3267,6 +3335,46 @@ await this.events.save_draft_invoice(); } }; + document.addEventListener("keydown", function(event) { + const activeElement = document.activeElement; + const isInputActive = activeElement.tagName === "INPUT" || activeElement.tagName === "TEXTAREA" || activeElement.isContentEditable; + if (event.key === "F1" && !isInputActive) { + event.preventDefault(); + const checkoutButton = document.querySelector(".checkout-btn"); + if (checkoutButton) { + checkoutButton.click(); + } else { + console.warn("Checkout button not found!"); + } + } + if (event.key === "F2" && !isInputActive) { + event.preventDefault(); + const heldCheckoutButton = document.querySelector(".checkout-btn-held"); + if (heldCheckoutButton) { + heldCheckoutButton.click(); + } else { + console.warn("Held Checkout button not found!"); + } + } + if (event.key === "F3" && !isInputActive) { + event.preventDefault(); + const orderCheckoutButton = document.querySelector(".checkout-btn-order"); + if (orderCheckoutButton) { + orderCheckoutButton.click(); + } else { + console.warn("Order Checkout button not found!"); + } + } + if (event.key === "F4" && !isInputActive) { + event.preventDefault(); + const searchFieldButton = document.querySelector(".search-field button"); + if (searchFieldButton) { + searchFieldButton.click(); + } else { + console.warn("Search field button not found!"); + } + } + }); // ../posnext/posnext/public/js/pos_item_details.js frappe.provide("posnext.PointOfSale"); @@ -3699,7 +3807,7 @@ } prepare_dom() { this.wrapper.append( - `
+ `
@@ -4215,7 +4323,6 @@ 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; @@ -4546,25 +4653,37 @@ Return`, 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); + if (!this.pos_profile.custom_notification_message_whatsapp) { + frappe.show_alert({ + message: __("WhatsApp notification is not enabled in POS Profile"), + indicator: "orange" + }); + return; + } + if (!this.doc.customer) { + frappe.throw(__("Please select a customer first")); + return; + } + frappe.db.get_value("Customer", this.doc.customer, "mobile_no").then(({ message }) => { + if (message.mobile_no) { + const mobile_no = message.mobile_no.replace(/[^0-9]/g, ""); + const whatsapp_message = "https://wa.me/" + mobile_no + "?text="; + const print_url = frappe.urllib.get_full_url( + "/printview?doctype=" + encodeURIComponent(this.doc.doctype) + "&name=" + encodeURIComponent(this.doc.name) + "&format=" + encodeURIComponent(this.pos_profile.print_format) + "&no_letterhead=0&_lang=" + encodeURIComponent(frappe.boot.lang) + "&trigger_print=1" + ); + const final_message = whatsapp_message + encodeURIComponent("Please find your invoice here \n" + print_url); + window.open(final_message); + } else { + var field_values = this.pos_profile.custom_whatsapp_field_names.map((x) => this.doc[x.field_name]); + var message_body = formatString(this.pos_profile.custom_whatsapp_message, field_values); + const print_url = frappe.urllib.get_full_url( + "/printview?doctype=" + encodeURIComponent(this.doc.doctype) + "&name=" + encodeURIComponent(this.doc.name) + "&format=" + encodeURIComponent(this.pos_profile.print_format) + "&no_letterhead=0&_lang=" + encodeURIComponent(frappe.boot.lang) + "&trigger_print=1" + ); + message_body += "\n\nPlease find your invoice here:\n" + print_url; + var encoded_message = encodeURIComponent(message_body); + var phone_number = this.doc.customer; + var whatsapp_url = "https://wa.me/" + phone_number + "?text=" + encoded_message; + window.open(whatsapp_url, "_blank"); } }); }); @@ -4783,4 +4902,4 @@ Return`, } }; })(); -//# sourceMappingURL=posnext.bundle.TN4KQRHJ.js.map +//# sourceMappingURL=posnext.bundle.YW64UZIB.js.map diff --git a/posnext/public/dist/js/posnext.bundle.YW64UZIB.js.map b/posnext/public/dist/js/posnext.bundle.YW64UZIB.js.map new file mode 100644 index 0000000..3cf0587 --- /dev/null +++ b/posnext/public/dist/js/posnext.bundle.YW64UZIB.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\t\tthis.setup_form_events();\n\n\t}\n\tsetup_form_events() {\n\t\tfrappe.ui.form.on('POS Invoice', {\n\t\t\tafter_save: function(frm) {\n\t\t\t\tif (!frm.doc.pos_profile) return;\n\t\n\t\t\t\tfrappe.db.get_doc('POS Profile', frm.doc.pos_profile)\n\t\t\t\t\t.then(pos_profile => {\n\t\t\t\t\t\tif (pos_profile.custom_stock_update) {\n\t\t\t\t\t\t\tfrm.set_value('update_stock', 0);\n\t\t\t\t\t\t\t// frm.save();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\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('POS 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\t\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('POS Invoice', name).then((doc) => { // CHANGED from 'Sales Invoice'\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 = 'POS 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 = 'POS 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\tcustom_bundle_id: product_bundle.name\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\t// item_row['rate'] = rate\n\t\t\t\t// item_row['valuation_rate'] = valuation_rate;\n\t\t\t\t// item_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\n\t\t\t if (item_row) {\n\t\t\t\tthis.cart.update_totals_section(this.frm);\n\t\t\t\tthis.cart.update_item_html(item_row);\n\t\t\t}\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\tthis.auto_search_serial = settings.custom_auto_search_serial_number;\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\tthis.custom_show_item_discription = settings.custom_show_item_discription;\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\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\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(item_data)}\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\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\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(item_data) {\n\t\t\t\n\t\t\tif (me.custom_show_item_discription) {\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}\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\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\tif (this.auto_search_serial && this.items.length === 1) {\n\t\t\t\t\tthis.add_filtered_item_to_cart();\n\t\t\t\t}\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\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\tif (this.auto_search_serial && this.items.length === 1) {\n\t\t\t\t\tthis.add_filtered_item_to_cart();\n\t\t\t\t}\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\tthis.custom_show_item_discription = settings.custom_show_item_discription;\n\t\tthis.custom_show_item_barcode = settings.custom_show_item_barcode;\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\n\t\t// Calculate flex for item name based on discount settings\n\t\tlet item_name_flex = 3.5;\n\t\tif(this.custom_use_discount_percentage && !this.custom_use_discount_amount){\n\t\t\titem_name_flex = 2.8;\n\t\t}\n\t\tif(this.custom_use_discount_amount && !this.custom_use_discount_percentage){\n\t\t\titem_name_flex = 2.8;\n\t\t}\n\t\tif(this.custom_use_discount_amount && this.custom_use_discount_percentage){\n\t\t\titem_name_flex = 2.5;\n\t\t}\n\t\t\n\t\t// Item name header\n\t\thtml += `
${__('Item')}
`;\n\t\t\n\t\t// Wrap remaining headers in container matching item-qty-rate flex\n\t\tconst header_container_flex = this.custom_edit_rate ? 6 : 4;\n\t\thtml += `
`;\n\t\t\n\t\t// All other headers inside wrapper\n\t\thtml += `
${__('Qty')}
`;\n\t\t\n\t\t\n\t\tif(this.custom_show_uom_in_cart){\n\t\t\thtml += `
${__('UOM')}
`;\n\t\t}\n\t\tif(this.show_batch_in_cart){\n\t\t\thtml += `
${__('Batch')}
`;\n\t\t}\n\t\tif(this.custom_edit_rate){\n\t\t\thtml += `
${__('Rate')}
`;\n\t\t}\n\t\tif(this.custom_use_discount_percentage){\n\t\t\thtml += `
${__('Disc%')}
`;\n\t\t}\n\t\tif(this.custom_use_discount_amount){\n\t\t\thtml += `
${__('Disc')}
`;\n\t\t}\n\t\tif(this.custom_show_incoming_rate){\n\t\t\thtml += `
${__('Inc.Rate')}
`;\n\t\t}\n\t\tif(this.custom_show_logical_rack_in_cart){\n\t\t\thtml += `
${__('Rack')}
`;\n\t\t}\n\t\tif(this.custom_show_last_customer_rate){\n\t\t\thtml += `
${__('LC Rate')}
`;\n\t\t}\n\t\t\n\t\thtml += `
${__('Amount')}
`;\n\t\thtml += `
`; // Close wrapper div\n\t\t\n\t\thtml += `
\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\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 (F1)')}
\n\t\t\t\t
${__('Held (F2)')}
\n\t\t\t\t
${__('Order List (F3)')}
\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\t\n\t\tconst $wrapper = $('.add-branch-wrapper'); \n\t\tconst posProfileName = me.settings.name;\n\t\tconst branchFieldWrapper = $('
');\n\t\t$wrapper.replaceWith(branchFieldWrapper); \n\n\t\tfrappe.call({\n\t\t\tmethod: \"posnext.doc_events.pos_profile.get_pos_profile_branch\",\n\t\t\targs: {\n\t\t\t\tpos_profile_name: posProfileName\n\t\t\t},\n\t\t\tcallback: function (r) {\n\t\t\t\tconst branch_name = r.message && r.message.branch;\n\t\t\t\tconsole.log(branch_name);\n\t\t\t\t\n\t\t\t\tlet branchField = new frappe.ui.form.ControlLink({\n\t\t\t\t\tdf: {\n\t\t\t\t\t\tfieldtype: 'Link',\n\t\t\t\t\t\toptions: 'Branch',\n\t\t\t\t\t\tfieldname: 'branch',\n\t\t\t\t\t\tlabel: 'Branch',\n\t\t\t\t\t\tplaceholder: 'Select Branch',\n\t\t\t\t\t\tdefault: branch_name,\n\t\t\t\t\t\treqd: 1,\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\tparent: branchFieldWrapper\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tbranchField.make();\n\t\t\t\tbranchField.set_value(branch_name);\n\t\t\t\tbranchField.refresh();\n\t\t\t},\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\tfrm.cscript.calculate_taxes_and_totals();\n\t\n\t\tthis.render_net_total(frm.doc.items);\n\t\tthis.render_total_item_qty(frm.doc.items);\n\t\n\t\tlet grand_total = cint(frappe.sys_defaults.disable_rounded_total)\n\t\t\t? frm.doc.grand_total\n\t\t\t: frm.doc.rounded_total;\n\t\n\t\tif (!frm.doc.items || frm.doc.items.length === 0) {\n\t\t\tif (Math.abs(grand_total) != 0.005) {\n\t\t\t\tgrand_total = 0.000;\n\t\t\t}\n\t\t}\n\t\n\t\tthis.render_grand_total(grand_total);\n\t\tthis.render_taxes(frm.doc.taxes);\n\t}\n\n\trender_net_total(items) {\n\t\tconst currency = this.events.get_frm().doc.currency;\n\t\tvar total_net_amount = 0;\n\t\titems.map((item) => {\n\t\t\ttotal_net_amount = total_net_amount + item.net_amount;\n\t\t});\n\n\t\tthis.$totals_section.find('.net-total-container').html(\n\t\t\t`
${__('Net Total')}
${format_currency(total_net_amount, currency)}
`\n\t\t)\n\n\t\tthis.$numpad_section.find('.numpad-net-total').html(\n\t\t\t`
${__('Net Total')}: ${format_currency(total_net_amount, 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_code}\n\t\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(item_data) }\n\t\t\t\t${get_item_barcode(item_data)}\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\t\t} else {\n\t\t\t// When custom_edit_rate is FALSE - show read-only view\n\t\t\tlet html = `
\n\t\t\t\t
${item_data.qty || 0}
`;\n\t\t\t\n\t\t\t// Conditionally show UOM\n\t\t\tif (me.custom_show_uom_in_cart) {\n\t\t\t\thtml += `
${item_data.uom || ''}
`;\n\t\t\t}\n\t\t\t\n\t\t\t// Conditionally show Batch\n\t\t\tif (me.show_batch_in_cart) {\n\t\t\t\thtml += `
${item_data.batch_no || ''}
`;\n\t\t\t}\n\t\t\t\n\t\t\t// Always show rate/amount\n\t\t\tif (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) {\n\t\t\t\thtml += `
\n\t\t\t\t\t
${parseFloat(item_data.amount).toFixed(2)}
\n\t\t\t\t\t
${parseFloat(item_data.rate).toFixed(2)}
\n\t\t\t\t
`;\n\t\t\t} else {\n\t\t\t\thtml += `
\n\t\t\t\t\t
${parseFloat(item_data.rate).toFixed(2)}
\n\t\t\t\t
`;\n\t\t\t}\n\t\t\t\n\t\t\thtml += `
`;\n\t\t\treturn html;\n\t\t}\n\n\t\t}\n\n\t\tfunction get_description_html(item_data) {\n\t\t\tconst hide_description = me.custom_show_item_discription;\n\t\t\tif (hide_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\n\t\t\t\t\t\t\t.replace(/
/g, ' ')\n\t\t\t\t\t\t\t.replace(/<\\/div>/g, ' ')\n\t\t\t\t\t\t\t.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\t// FIXED FUNCTION: Properly handle barcode display without requiring a callback\n\t\tfunction get_item_barcode(item_data) {\n\t\t\tconst show_barcode = me.custom_show_item_barcode;\n\t\t\n\t\t\tif (!show_barcode) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t\n\t\t\t// Create a unique placeholder ID for this item's barcodes\n\t\t\tconst barcode_placeholder_id = `barcode-${item_data.item_code.replace(/[^a-zA-Z0-9]/g, '-')}`;\n\t\t\t\n\t\t\t// Fetch barcodes asynchronously and update the placeholder\n\t\t\tfrappe.call({\n\t\t\t\tmethod: \"posnext.posnext.page.posnext.point_of_sale.get_barcodes\",\n\t\t\t\targs: {\n\t\t\t\t\titem_code: item_data.item_code\n\t\t\t\t},\n\t\t\t\tcallback: function(response) {\n\t\t\t\t\tif (response.message && response.message.length > 0) {\n\t\t\t\t\t\tconst html = response.message.map(b => `\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t${b.barcode}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t`).join('');\n\t\t\t\t\t\t$(`#${barcode_placeholder_id}`).html(html);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Return a placeholder div that will be filled when the data is available\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});\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\ndocument.addEventListener('keydown', function (event) {\n const activeElement = document.activeElement;\n const isInputActive = activeElement.tagName === 'INPUT' || \n activeElement.tagName === 'TEXTAREA' || \n activeElement.isContentEditable;\n\n if (event.key === 'F1' && !isInputActive) {\n event.preventDefault(); // Prevent browser help window\n const checkoutButton = document.querySelector('.checkout-btn');\n if (checkoutButton) {\n checkoutButton.click();\n } else {\n console.warn(\"Checkout button not found!\");\n }\n }\n\n // New shortcut for the held checkout button\n if (event.key === 'F2' && !isInputActive) {\n event.preventDefault(); // Prevent default action\n const heldCheckoutButton = document.querySelector('.checkout-btn-held');\n if (heldCheckoutButton) {\n heldCheckoutButton.click();\n } else {\n console.warn(\"Held Checkout button not found!\");\n }\n }\n\n\t// ... existing code ...\n // New shortcut for the checkout button order\n if (event.key === 'F3' && !isInputActive) {\n event.preventDefault(); // Prevent default action\n const orderCheckoutButton = document.querySelector('.checkout-btn-order');\n if (orderCheckoutButton) {\n orderCheckoutButton.click();\n } else {\n console.warn(\"Order Checkout button not found!\");\n }\n }\n// ... existing code ...\n // New shortcut for the search field button\n if (event.key === 'F4' && !isInputActive) {\n event.preventDefault(); // Prevent default action\n const searchFieldButton = document.querySelector('.search-field button'); // Adjust selector as needed\n if (searchFieldButton) {\n searchFieldButton.click();\n } else {\n console.warn(\"Search field button not found!\");\n }\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\t// cur_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 this.$summary_container.on('click', '.return-btn', () => {\n this.events.process_return(this.doc.name);\n this.toggle_component(false);\n this.$component.find('.no-summary-placeholder').css('display', 'flex');\n this.$summary_wrapper.css('display', 'none');\n });\n\n this.$summary_container.on('click', '.edit-btn', () => {\n this.events.edit_order(this.doc.name);\n this.toggle_component(false);\n this.$component.find('.no-summary-placeholder').css('display', 'flex');\n this.$summary_wrapper.css('display', 'none');\n });\n\n this.$summary_container.on('click', '.delete-btn', () => {\n this.events.delete_order(this.doc.name);\n this.show_summary_placeholder();\n });\n\n this.$summary_container.on('click', '.send-btn', () => {\n if (!this.pos_profile.custom_notification_message_whatsapp) {\n frappe.show_alert({\n message: __('WhatsApp notification is not enabled in POS Profile'),\n indicator: 'orange'\n });\n return;\n }\n\n if (!this.doc.customer) {\n frappe.throw(__('Please select a customer first'));\n return;\n }\n\n frappe.db.get_value('Customer', this.doc.customer, 'mobile_no')\n .then(({ message }) => {\n if (message.mobile_no) {\n const mobile_no = message.mobile_no.replace(/[^0-9]/g, '');\n const whatsapp_message = \"https://wa.me/\" + mobile_no + \"?text=\";\n \n // Get the print URL directly\n const print_url = frappe.urllib.get_full_url(\n '/printview?doctype=' + encodeURIComponent(this.doc.doctype) +\n '&name=' + encodeURIComponent(this.doc.name) +\n '&format=' + encodeURIComponent(this.pos_profile.print_format) +\n '&no_letterhead=0' +\n '&_lang=' + encodeURIComponent(frappe.boot.lang) +\n '&trigger_print=1'\n );\n\n const final_message = whatsapp_message + \n encodeURIComponent(\"Please find your invoice here \\n\" + print_url);\n window.open(final_message);\n } else {\n var field_values = this.pos_profile.custom_whatsapp_field_names.map(x => this.doc[x.field_name]);\n\n var message_body = formatString(this.pos_profile.custom_whatsapp_message, field_values);\n\n const print_url = frappe.urllib.get_full_url(\n '/printview?doctype=' + encodeURIComponent(this.doc.doctype) +\n '&name=' + encodeURIComponent(this.doc.name) +\n '&format=' + encodeURIComponent(this.pos_profile.print_format) +\n '&no_letterhead=0' +\n '&_lang=' + encodeURIComponent(frappe.boot.lang) +\n '&trigger_print=1'\n );\n\n message_body += \"\\n\\nPlease find your invoice here:\\n\" + print_url;\n\n var encoded_message = encodeURIComponent(message_body);\n\n var phone_number = this.doc.customer;\n\n var whatsapp_url = \"https://wa.me/\" + phone_number + \"?text=\" + encoded_message;\n\n window.open(whatsapp_url, '_blank');\n }\n });\n });\n\n function formatString(str, args) {\n return str.replace(/{(\\d+)}/g, function(match, number) {\n return typeof args[number] !== 'undefined'\n ? args[number]\n : match;\n });\n }\n\n this.$summary_container.on('click', '.new-btn', () => {\n this.events.new_order();\n this.toggle_component(false);\n this.$component.find('.no-summary-placeholder').css('display', 'flex');\n this.$summary_wrapper.css('display', 'none');\n });\n\n this.$summary_container.on('click', '.email-btn', () => {\n this.email_dialog.fields_dict.email_id.set_value(this.customer_email);\n this.email_dialog.show();\n });\n\n this.$summary_container.on('click', '.print-btn', () => {\n this.print_receipt();\n });\n }\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": "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", + "names": ["i", "get_item_code_header", "max_width", "item_data", "precision", "doc", "max_width", "html", "item_data", "frm", "item", "$btn", "paid_amount", "max_width"] +} diff --git a/posnext/public/js/pos_controller.js b/posnext/public/js/pos_controller.js index c818d89..dfc81c7 100644 --- a/posnext/public/js/pos_controller.js +++ b/posnext/public/js/pos_controller.js @@ -16,7 +16,7 @@ posnext.PointOfSale.Controller = class { } setup_form_events() { - frappe.ui.form.on('Sales Invoice', { + frappe.ui.form.on('POS Invoice', { after_save: function(frm) { if (!frm.doc.pos_profile) return; @@ -461,7 +461,7 @@ posnext.PointOfSale.Controller = class { wrapper: this.$components_wrapper, events: { open_invoice_data: (name) => { - frappe.db.get_doc('Sales Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { this.order_summary.load_summary_of(doc); }); }, @@ -478,7 +478,7 @@ posnext.PointOfSale.Controller = class { }) } - init_order_summary() { + init_order_summary() { this.order_summary = new posnext.PointOfSale.PastOrderSummary({ wrapper: this.$components_wrapper, pos_profile: this.settings, @@ -487,7 +487,7 @@ posnext.PointOfSale.Controller = class { process_return: (name) => { this.recent_order_list.toggle_component(false); - frappe.db.get_doc('Sales Invoice', name).then((doc) => { + frappe.db.get_doc('POS Invoice', name).then((doc) => { // CHANGED from 'Sales Invoice' frappe.run_serially([ () => this.make_return_invoice(doc), () => this.cart.load_invoice(), @@ -561,7 +561,7 @@ posnext.PointOfSale.Controller = class { } make_sales_invoice_frm() { - const doctype = 'Sales Invoice'; + const doctype = 'POS Invoice'; return new Promise(resolve => { if (this.frm) { this.frm = this.get_new_frm(this.frm); @@ -582,7 +582,7 @@ posnext.PointOfSale.Controller = class { } get_new_frm(_frm) { - const doctype = 'Sales Invoice'; + const doctype = 'POS 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); @@ -721,6 +721,11 @@ posnext.PointOfSale.Controller = class { total_incoming_rate += (parseFloat(item.valuation_rate) * item.qty) }); this.item_selector.update_total_incoming_rate(total_incoming_rate) + + if (item_row) { + this.cart.update_totals_section(this.frm); + this.cart.update_item_html(item_row); + } return item_row; // eslint-disable-line no-unsafe-finally } diff --git a/posnext/public/js/pos_item_cart.js b/posnext/public/js/pos_item_cart.js index d0aabe1..928a491 100644 --- a/posnext/public/js/pos_item_cart.js +++ b/posnext/public/js/pos_item_cart.js @@ -75,44 +75,66 @@ posnext.PointOfSale.ItemCart = class { 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')}
-
+
`; + + // Calculate flex for item name based on discount settings + let item_name_flex = 3.5; + if(this.custom_use_discount_percentage && !this.custom_use_discount_amount){ + item_name_flex = 2.8; + } + if(this.custom_use_discount_amount && !this.custom_use_discount_percentage){ + item_name_flex = 2.8; + } + if(this.custom_use_discount_amount && this.custom_use_discount_percentage){ + item_name_flex = 2.5; + } + + // Item name header + html += `
${__('Item')}
`; + + // Wrap remaining headers in container matching item-qty-rate flex + const header_container_flex = this.custom_edit_rate ? 6 : 4; + html += `
`; + + // All other headers inside wrapper + html += `
${__('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')}
`; + html += `
`; // Close wrapper div + + html += `
-
` +
`; this.$component.append(html); this.$cart_container = this.$component.find('.cart-container'); this.make_branch_section(); @@ -988,7 +1010,10 @@ this.highlight_checkout_btn(true); item_html += `
` } - item_html += `
+ item_html += `
+ ${item_data.item_code} +
+
${item_data.item_name}
${ get_description_html(item_data) } @@ -1281,30 +1306,36 @@ this.highlight_checkout_btn(true);
` return html } + } else { + // When custom_edit_rate is FALSE - show read-only view + let html = `
+
${item_data.qty || 0}
`; + + // Conditionally show UOM + if (me.custom_show_uom_in_cart) { + html += `
${item_data.uom || ''}
`; + } + + // Conditionally show Batch + if (me.show_batch_in_cart) { + html += `
${item_data.batch_no || ''}
`; + } + + // Always show rate/amount + if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { + html += `
+
${parseFloat(item_data.amount).toFixed(2)}
+
${parseFloat(item_data.rate).toFixed(2)}
+
`; } 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)}
-
-
` - } + html += `
+
${parseFloat(item_data.rate).toFixed(2)}
+
`; } + + html += `
`; + return html; + } }