diff --git a/posnext/doc_events/item.py b/posnext/doc_events/item.py index 9fe58ad..92a9b15 100644 --- a/posnext/doc_events/item.py +++ b/posnext/doc_events/item.py @@ -75,6 +75,8 @@ def print_barcodes(item_codes): return { "url": file_doc.file_url, - "message": _(f"Generated barcodes for {len(items_with_barcodes)} items."), + "message": _("Generated barcodes for {0} items.").format( + len(items_with_barcodes) + ), "is_pdf": True, } diff --git a/posnext/fixtures/custom_field.json b/posnext/fixtures/custom_field.json index db4d695..517923f 100644 --- a/posnext/fixtures/custom_field.json +++ b/posnext/fixtures/custom_field.json @@ -284,6 +284,63 @@ "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": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "pos_profile", + "fieldtype": "Link", + "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": "delivery_date", + "is_system_generated": 0, + "is_virtual": 0, + "label": "POS Profile", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-18 21:01:56.657675", + "module": "Posnext", + "name": "Sales Order-custom_pos_profile", + "no_copy": 0, + "non_negative": 0, + "options": "POS Profile", + "permlevel": 0, + "placeholder": null, + "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, @@ -353,11 +410,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Order", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "pos_profile", - "fieldtype": "Link", + "fieldname": "custom_show_item_code", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -368,21 +425,20 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "delivery_date", + "insert_after": "custom_show_checkout_button", "is_system_generated": 0, "is_virtual": 0, - "label": "POS Profile", + "label": "Show Item Code", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-02-18 21:01:56.657675", + "modified": "2024-10-23 04:20:13.966560", "module": "Posnext", - "name": "Sales Order-custom_pos_profile", + "name": "POS Profile-custom_show_item_code", "no_copy": 0, "non_negative": 0, - "options": "POS Profile", + "options": null, "permlevel": 0, - "placeholder": null, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, @@ -405,7 +461,7 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": null, + "default": "List", "depends_on": null, "description": null, "docstatus": 0, @@ -413,7 +469,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_notification_message_whatsapp", + "fieldname": "custom_show_checkout_button", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -428,13 +484,13 @@ "insert_after": "custom_mobile_number_based_customer", "is_system_generated": 0, "is_virtual": 0, - "label": "Notification Message Whatsapp", + "label": "Show Checkout Button", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-04-08 09:29:23.094086", + "modified": "2024-08-16 07:44:20.242873", "module": "Posnext", - "name": "POS Profile-custom_notification_message_whatsapp", + "name": "POS Profile-custom_show_checkout_button", "no_copy": 0, "non_negative": 0, "options": null, @@ -470,7 +526,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_checkout_button", + "fieldname": "custom_notification_message_whatsapp", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -482,16 +538,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_notification_message_whatsapp", + "insert_after": "custom_mobile_number_based_customer", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Checkout Button", + "label": "Notification Message Whatsapp", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:20.242873", + "modified": "2025-04-08 09:29:23.094086", "module": "Posnext", - "name": "POS Profile-custom_show_checkout_button", + "name": "POS Profile-custom_notification_message_whatsapp", "no_copy": 0, "non_negative": 0, "options": null, @@ -695,10 +751,10 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Sales Invoice", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_last_incoming_rate", + "fieldname": "custom_credit_sales", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -710,16 +766,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_posting_date", + "insert_after": "pos_profile", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Last Incoming Rate", + "label": "Credit Sales", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:32.110447", + "modified": "2024-11-05 06:17:52.333733", "module": "Posnext", - "name": "POS Profile-custom_show_last_incoming_rate", + "name": "Sales Invoice-custom_credit_sales", "no_copy": 0, "non_negative": 0, "options": null, @@ -755,7 +811,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_oem_part_number", + "fieldname": "custom_show_last_incoming_rate", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -767,16 +823,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_last_incoming_rate", + "insert_after": "custom_show_posting_date", "is_system_generated": 0, "is_virtual": 0, - "label": "Show OEM Part Number", + "label": "Show Last Incoming Rate", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:32.017621", + "modified": "2024-11-01 05:25:32.110447", "module": "Posnext", - "name": "POS Profile-custom_show_oem_part_number", + "name": "POS Profile-custom_show_last_incoming_rate", "no_copy": 0, "non_negative": 0, "options": null, @@ -809,10 +865,10 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Invoice", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_credit_sales", + "fieldname": "custom_show_oem_part_number", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -824,16 +880,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "pos_profile", + "insert_after": "custom_show_last_incoming_rate", "is_system_generated": 0, "is_virtual": 0, - "label": "Credit Sales", + "label": "Show OEM Part Number", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-05 06:17:52.333733", + "modified": "2024-11-01 05:25:32.017621", "module": "Posnext", - "name": "Sales Invoice-custom_credit_sales", + "name": "POS Profile-custom_show_oem_part_number", "no_copy": 0, "non_negative": 0, "options": null, @@ -866,12 +922,12 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Sales Invoice", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_logical_rack", - "fieldtype": "Check", - "hidden": 0, + "fieldname": "custom_credit_sales_date", + "fieldtype": "Date", + "hidden": 1, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, @@ -881,16 +937,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_oem_part_number", + "insert_after": "custom_credit_sales", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Logical Rack", + "label": "Credit Sales Date", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-07 06:23:09.148261", + "modified": "2024-11-05 06:22:17.172216", "module": "Posnext", - "name": "POS Profile-custom_show_logical_rack", + "name": "Sales Invoice-custom_credit_sales_date", "no_copy": 0, "non_negative": 0, "options": null, @@ -923,12 +979,12 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Invoice", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_credit_sales_date", - "fieldtype": "Date", - "hidden": 1, + "fieldname": "custom_show_logical_rack", + "fieldtype": "Check", + "hidden": 0, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, @@ -938,16 +994,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_credit_sales", + "insert_after": "custom_show_oem_part_number", "is_system_generated": 0, "is_virtual": 0, - "label": "Credit Sales Date", + "label": "Show Logical Rack", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-05 06:22:17.172216", + "modified": "2024-11-07 06:23:09.148261", "module": "Posnext", - "name": "Sales Invoice-custom_credit_sales_date", + "name": "POS Profile-custom_show_logical_rack", "no_copy": 0, "non_negative": 0, "options": null, @@ -1040,7 +1096,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "show_batch_in_cart", + "fieldname": "custom_show_uom_in_cart", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1055,13 +1111,13 @@ "insert_after": "custom_edit_rate_and_uom", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Batch No", + "label": "Show UOM in Cart", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-03-28 12:03:58.035560", + "modified": "2024-12-08 22:09:04.484772", "module": "Posnext", - "name": "POS Profile-custom_show_batch_no", + "name": "POS Profile-custom_show_uom_in_cart", "no_copy": 0, "non_negative": 0, "options": null, @@ -1097,7 +1153,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_uom_in_cart", + "fieldname": "custom_show_incoming_rate", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1109,16 +1165,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "show_batch_in_cart", + "insert_after": "show_branch", "is_system_generated": 0, "is_virtual": 0, - "label": "Show UOM in Cart", + "label": "Show Incoming Rate", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-08 22:09:04.484772", + "modified": "2024-12-04 00:05:16.953710", "module": "Posnext", - "name": "POS Profile-custom_show_uom_in_cart", + "name": "POS Profile-custom_show_incoming_rate", "no_copy": 0, "non_negative": 0, "options": null, @@ -1147,15 +1203,15 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": null, + "depends_on": "eval: doc.custom_edit_rate_and_uom;", "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Item", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_alternative_items", - "fieldtype": "Section Break", + "fieldname": "show_batch_in_cart", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1166,16 +1222,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "image", + "insert_after": "custom_edit_rate_and_uom", "is_system_generated": 0, "is_virtual": 0, - "label": "Alternative Items", + "label": "Show Batch No", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 10:29:14.635688", + "modified": "2025-03-28 12:03:58.035560", "module": "Posnext", - "name": "Item-custom_alternative_items", + "name": "POS Profile-custom_show_batch_no", "no_copy": 0, "non_negative": 0, "options": null, @@ -1211,7 +1267,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_incoming_rate", + "fieldname": "custom_show_logical_rack_in_cart", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1223,16 +1279,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "show_branch", + "insert_after": "custom_show_incoming_rate", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Incoming Rate", + "label": "Show Logical Rack in Cart", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-04 00:05:16.953710", + "modified": "2024-12-07 00:03:43.974745", "module": "Posnext", - "name": "POS Profile-custom_show_incoming_rate", + "name": "POS Profile-custom_show_logical_rack_in_cart", "no_copy": 0, "non_negative": 0, "options": null, @@ -1261,15 +1317,15 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": null, + "depends_on": "eval: doc.custom_edit_rate_and_uom", "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Item", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_items", - "fieldtype": "Table", + "fieldname": "custom_use_discount_percentage", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1280,19 +1336,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_alternative_items", + "insert_after": "custom_show_logical_rack_in_cart", "is_system_generated": 0, "is_virtual": 0, - "label": "Items", + "label": "Use Discount Percentage", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 10:29:14.533231", + "modified": "2024-11-15 06:30:05.707381", "module": "Posnext", - "name": "Item-custom_items", + "name": "POS Profile-custom_use_discount_percentage", "no_copy": 0, "non_negative": 0, - "options": "Alternative Items", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", @@ -1318,14 +1374,14 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": null, + "depends_on": "eval: doc.custom_edit_rate_and_uom", "description": null, "docstatus": 0, "doctype": "Custom Field", "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_item_discription", + "fieldname": "custom_use_discount_amount", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1337,16 +1393,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_incoming_rate", + "insert_after": "custom_use_discount_percentage", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Item Discription", + "label": "Use Discount Amount", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-05-06 23:01:00.706600", + "modified": "2024-11-15 06:30:05.558116", "module": "Posnext", - "name": "POS Profile-custom_show_item_discription", + "name": "POS Profile-custom_use_discount_amount", "no_copy": 0, "non_negative": 0, "options": null, @@ -1382,7 +1438,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_item_barcode", + "fieldname": "custom_show_item_discription", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1394,16 +1450,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_item_discription", + "insert_after": "custom_show_incoming_rate", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Item Barcode", + "label": "Show Item Discription", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-05-12 19:26:03.816684", + "modified": "2025-05-06 23:01:00.706600", "module": "Posnext", - "name": "POS Profile-custom_show_item_barcode", + "name": "POS Profile-custom_show_item_discription", "no_copy": 0, "non_negative": 0, "options": null, @@ -1432,14 +1488,14 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": "eval: doc.custom_edit_rate_and_uom;", + "depends_on": null, "description": null, "docstatus": 0, "doctype": "Custom Field", "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_logical_rack_in_cart", + "fieldname": "custom_filter_order_list_by_profile", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1451,16 +1507,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_item_barcode", + "insert_after": "custom_use_discount_amount", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Logical Rack in Cart", + "label": "Filter Order List By Profile", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-07 00:03:43.974745", + "modified": "2024-12-04 23:51:18.578234", "module": "Posnext", - "name": "POS Profile-custom_show_logical_rack_in_cart", + "name": "POS Profile-custom_filter_order_list_by_profile", "no_copy": 0, "non_negative": 0, "options": null, @@ -1489,14 +1545,14 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": "eval: doc.custom_edit_rate_and_uom", + "depends_on": null, "description": null, "docstatus": 0, "doctype": "Custom Field", "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_use_discount_percentage", + "fieldname": "custom_show_item_barcode", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -1508,16 +1564,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_logical_rack_in_cart", + "insert_after": "custom_show_item_discription", "is_system_generated": 0, "is_virtual": 0, - "label": "Use Discount Percentage", + "label": "Show Item Barcode", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-15 06:30:05.707381", + "modified": "2025-05-12 19:26:03.816684", "module": "Posnext", - "name": "POS Profile-custom_use_discount_percentage", + "name": "POS Profile-custom_show_item_barcode", "no_copy": 0, "non_negative": 0, "options": null, @@ -1546,15 +1602,15 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": "eval: doc.custom_edit_rate_and_uom", + "depends_on": null, "description": null, "docstatus": 0, "doctype": "Custom Field", "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_use_discount_amount", - "fieldtype": "Check", + "fieldname": "custom_whatsapp_field_names", + "fieldtype": "Table", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1565,19 +1621,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_use_discount_percentage", + "insert_after": "custom_filter_order_list_by_profile", "is_system_generated": 0, "is_virtual": 0, - "label": "Use Discount Amount", + "label": "Whatsapp Field Names", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-15 06:30:05.558116", + "modified": "2024-08-16 07:44:19.627227", "module": "Posnext", - "name": "POS Profile-custom_use_discount_amount", + "name": "POS Profile-custom_whatsapp_field_names", "no_copy": 0, "non_negative": 0, - "options": null, + "options": "POS Profile Whatsapp Field Names", "permlevel": 0, "placeholder": null, "precision": "", @@ -1607,11 +1663,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Item", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_filter_order_list_by_profile", - "fieldtype": "Check", + "fieldname": "custom_alternative_items", + "fieldtype": "Section Break", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1622,16 +1678,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_use_discount_amount", + "insert_after": "image", "is_system_generated": 0, "is_virtual": 0, - "label": "Filter Order List By Profile", + "label": "Alternative Items", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-04 23:51:18.578234", + "modified": "2024-11-01 10:29:14.635688", "module": "Posnext", - "name": "POS Profile-custom_filter_order_list_by_profile", + "name": "Item-custom_alternative_items", "no_copy": 0, "non_negative": 0, "options": null, @@ -1667,8 +1723,8 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_whatsapp_field_names", - "fieldtype": "Table", + "fieldname": "custom_whatsapp_message", + "fieldtype": "Small Text", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1679,19 +1735,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_filter_order_list_by_profile", + "insert_after": "custom_whatsapp_field_names", "is_system_generated": 0, "is_virtual": 0, - "label": "Whatsapp Field Names", + "label": "Whatsapp Message", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:19.627227", + "modified": "2024-08-16 07:44:19.756372", "module": "Posnext", - "name": "POS Profile-custom_whatsapp_field_names", + "name": "POS Profile-custom_whatsapp_message", "no_copy": 0, "non_negative": 0, - "options": "POS Profile Whatsapp Field Names", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", @@ -1705,7 +1761,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 0, + "translatable": 1, "unique": 0, "width": null }, @@ -1721,11 +1777,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Item", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_whatsapp_message", - "fieldtype": "Small Text", + "fieldname": "custom_items", + "fieldtype": "Table", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -1736,19 +1792,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_whatsapp_field_names", + "insert_after": "custom_alternative_items", "is_system_generated": 0, "is_virtual": 0, - "label": "Whatsapp Message", + "label": "Items", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:19.756372", + "modified": "2024-11-01 10:29:14.533231", "module": "Posnext", - "name": "POS Profile-custom_whatsapp_message", + "name": "Item-custom_items", "no_copy": 0, "non_negative": 0, - "options": null, + "options": "Alternative Items", "permlevel": 0, "placeholder": null, "precision": "", @@ -1762,7 +1818,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 1, + "translatable": 0, "unique": 0, "width": null }, @@ -2006,11 +2062,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Invoice Item", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_valuation_rate", - "fieldtype": "Currency", + "fieldname": "custom_show_sales_man", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2021,16 +2077,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "item_tax_template", + "insert_after": "custom_show_close_the_pos", "is_system_generated": 0, "is_virtual": 0, - "label": "Valuation Rate", + "label": "Show Sales Man", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-04 23:51:32.067475", + "modified": "2024-11-01 05:25:31.790257", "module": "Posnext", - "name": "Sales Invoice Item-custom_valuation_rate", + "name": "POS Profile-custom_show_sales_man", "no_copy": 0, "non_negative": 0, "options": null, @@ -2040,7 +2096,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 1, + "read_only": 0, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -2066,7 +2122,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_sales_man", + "fieldname": "custom_show_additional_note", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -2078,16 +2134,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_close_the_pos", + "insert_after": "custom_show_sales_man", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Sales Man", + "label": "Show Additional Note", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:31.790257", + "modified": "2024-11-01 05:25:31.561160", "module": "Posnext", - "name": "POS Profile-custom_show_sales_man", + "name": "POS Profile-custom_show_additional_note", "no_copy": 0, "non_negative": 0, "options": null, @@ -2120,11 +2176,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Invoice Item", + "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_item_uoms", - "fieldtype": "Data", + "fieldname": "custom_show_credit_sales", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2135,16 +2191,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_valuation_rate", + "insert_after": "custom_show_additional_note", "is_system_generated": 0, "is_virtual": 0, - "label": "Item UOMs", + "label": "Show Credit Sales", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-05 21:30:02.846405", + "modified": "2024-11-01 05:25:31.674539", "module": "Posnext", - "name": "Sales Invoice Item-custom_item_uoms", + "name": "POS Profile-custom_show_credit_sales", "no_copy": 0, "non_negative": 0, "options": null, @@ -2154,7 +2210,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 1, + "read_only": 0, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -2180,7 +2236,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_additional_note", + "fieldname": "custom_show_alternative_item_for_pos_search", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -2192,16 +2248,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_sales_man", + "insert_after": "custom_show_credit_sales", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Additional Note", + "label": "Show Alternative Item for POS Search", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:31.561160", + "modified": "2024-11-01 05:25:31.924813", "module": "Posnext", - "name": "POS Profile-custom_show_additional_note", + "name": "POS Profile-custom_show_alternative_item_for_pos_search", "no_copy": 0, "non_negative": 0, "options": null, @@ -2237,8 +2293,8 @@ "dt": "Sales Invoice Item", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_logical_rack", - "fieldtype": "Data", + "fieldname": "custom_valuation_rate", + "fieldtype": "Currency", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2249,16 +2305,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_item_uoms", + "insert_after": "item_tax_template", "is_system_generated": 0, "is_virtual": 0, - "label": "Logical Rack", + "label": "Valuation Rate", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-12-07 00:03:31.531532", + "modified": "2024-12-04 23:51:32.067475", "module": "Posnext", - "name": "Sales Invoice Item-custom_logical_rack", + "name": "Sales Invoice Item-custom_valuation_rate", "no_copy": 0, "non_negative": 0, "options": null, @@ -2268,7 +2324,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 0, + "read_only": 1, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -2294,7 +2350,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_credit_sales", + "fieldname": "custom_show_save_as_draft", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -2306,16 +2362,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_additional_note", + "insert_after": "custom_show_alternative_item_for_pos_search", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Credit Sales", + "label": "Show Save as Draft", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:31.674539", + "modified": "2024-08-16 07:44:20.763682", "module": "Posnext", - "name": "POS Profile-custom_show_credit_sales", + "name": "POS Profile-custom_show_save_as_draft", "no_copy": 0, "non_negative": 0, "options": null, @@ -2348,11 +2404,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Sales Invoice Item", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_alternative_item_for_pos_search", - "fieldtype": "Check", + "fieldname": "custom_item_uoms", + "fieldtype": "Data", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2363,16 +2419,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_credit_sales", + "insert_after": "custom_valuation_rate", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Alternative Item for POS Search", + "label": "Item UOMs", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-01 05:25:31.924813", + "modified": "2024-12-05 21:30:02.846405", "module": "Posnext", - "name": "POS Profile-custom_show_alternative_item_for_pos_search", + "name": "Sales Invoice Item-custom_item_uoms", "no_copy": 0, "non_negative": 0, "options": null, @@ -2382,7 +2438,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 0, + "read_only": 1, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -2408,7 +2464,7 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_save_as_draft", + "fieldname": "custom_show_open_form_view", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -2420,16 +2476,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_alternative_item_for_pos_search", + "insert_after": "custom_show_save_as_draft", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Save as Draft", + "label": "Show Open Form View", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:20.763682", + "modified": "2024-08-16 07:44:20.593668", "module": "Posnext", - "name": "POS Profile-custom_show_save_as_draft", + "name": "POS Profile-custom_show_open_form_view", "no_copy": 0, "non_negative": 0, "options": null, @@ -2462,11 +2518,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "POS Profile", + "dt": "Sales Invoice Item", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_show_open_form_view", - "fieldtype": "Check", + "fieldname": "custom_logical_rack", + "fieldtype": "Data", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2477,16 +2533,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_show_save_as_draft", + "insert_after": "custom_item_uoms", "is_system_generated": 0, "is_virtual": 0, - "label": "Show Open Form View", + "label": "Logical Rack", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:20.593668", + "modified": "2024-12-07 00:03:31.531532", "module": "Posnext", - "name": "POS Profile-custom_show_open_form_view", + "name": "Sales Invoice Item-custom_logical_rack", "no_copy": 0, "non_negative": 0, "options": null, @@ -2807,8 +2863,8 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_auto_search_serial_number", - "fieldtype": "Check", + "fieldname": "custom_mobile_number_length", + "fieldtype": "Int", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2822,13 +2878,13 @@ "insert_after": "custom_add_reference_details", "is_system_generated": 0, "is_virtual": 0, - "label": "Auto search serial number", + "label": "Mobile Number Length", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-04-22 12:55:58.587952", + "modified": "2024-08-16 07:44:20.913321", "module": "Posnext", - "name": "POS Profile-custom_auto_search_serial_number", + "name": "POS Profile-custom_mobile_number_length", "no_copy": 0, "non_negative": 0, "options": null, @@ -2856,7 +2912,7 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": null, + "default": "List", "depends_on": null, "description": null, "docstatus": 0, @@ -2864,8 +2920,8 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_stock_update", - "fieldtype": "Check", + "fieldname": "custom_default_view", + "fieldtype": "Select", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2876,19 +2932,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_auto_search_serial_number", + "insert_after": "custom_mobile_number_length", "is_system_generated": 0, "is_virtual": 0, - "label": "Ignore Update Stock ", + "label": "Default View", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-04-30 14:09:49.176915", + "modified": "2024-08-16 07:44:20.160526", "module": "Posnext", - "name": "POS Profile-custom_stock_update", + "name": "POS Profile-custom_default_view", "no_copy": 0, "non_negative": 0, - "options": null, + "options": "\nList\nCard", "permlevel": 0, "placeholder": null, "precision": "", @@ -2902,7 +2958,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 0, + "translatable": 1, "unique": 0, "width": null }, @@ -2921,8 +2977,8 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_mobile_number_length", - "fieldtype": "Int", + "fieldname": "custom_auto_search_serial_number", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2933,16 +2989,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_stock_update", + "insert_after": "custom_add_reference_details", "is_system_generated": 0, "is_virtual": 0, - "label": "Mobile Number Length", + "label": "Auto search serial number", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:20.913321", + "modified": "2025-04-22 12:55:58.587952", "module": "Posnext", - "name": "POS Profile-custom_mobile_number_length", + "name": "POS Profile-custom_auto_search_serial_number", "no_copy": 0, "non_negative": 0, "options": null, @@ -2970,7 +3026,7 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": "List", + "default": null, "depends_on": null, "description": null, "docstatus": 0, @@ -2978,8 +3034,8 @@ "dt": "POS Profile", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_default_view", - "fieldtype": "Select", + "fieldname": "custom_stock_update", + "fieldtype": "Check", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -2990,19 +3046,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_mobile_number_length", + "insert_after": "custom_auto_search_serial_number", "is_system_generated": 0, "is_virtual": 0, - "label": "Default View", + "label": "Ignore Update Stock ", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-08-16 07:44:20.160526", + "modified": "2025-04-30 14:09:49.176915", "module": "Posnext", - "name": "POS Profile-custom_default_view", + "name": "POS Profile-custom_stock_update", "no_copy": 0, "non_negative": 0, - "options": "\nList\nCard", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", @@ -3016,7 +3072,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 1, + "translatable": 0, "unique": 0, "width": null }, diff --git a/posnext/overrides/pos_closing_entry.py b/posnext/overrides/pos_closing_entry.py index 0a91617..8b6070a 100644 --- a/posnext/overrides/pos_closing_entry.py +++ b/posnext/overrides/pos_closing_entry.py @@ -54,7 +54,7 @@ def validate_pos_invoices(self): d.pos_invoice, ["pos_profile", "docstatus", "owner"], as_dict=1, - )[0] + ) if not pos_invoice_data: invalid_row.setdefault("msg", []).append( @@ -64,9 +64,11 @@ def validate_pos_invoices(self): continue pos_invoice = pos_invoice_data[0] + + # Original validations if pos_invoice.pos_profile != self.pos_profile: invalid_row.setdefault("msg", []).append( - _("POS Profile doesn't matches {}").format( + _("POS Profile doesn't match {}").format( frappe.bold(self.pos_profile) ) ) @@ -77,7 +79,7 @@ def validate_pos_invoices(self): if pos_invoice.owner != self.user: invalid_row.setdefault("msg", []).append( _("POS Invoice isn't created by user {}").format( - frappe.bold(self.owner) + frappe.bold(self.user) ) ) diff --git a/posnext/overrides/pos_invoice_merge_log.py b/posnext/overrides/pos_invoice_merge_log.py index 8de5cf7..02bfbf8 100644 --- a/posnext/overrides/pos_invoice_merge_log.py +++ b/posnext/overrides/pos_invoice_merge_log.py @@ -13,7 +13,7 @@ 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) @@ -65,7 +65,6 @@ def validate_pos_invoice_status(self): "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 {}." @@ -93,18 +92,6 @@ 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 = [ @@ -186,7 +173,6 @@ def get_all_unconsolidated_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") @@ -261,6 +247,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", "") diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js deleted file mode 100644 index c5f13be..0000000 --- a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js +++ /dev/null @@ -1,4786 +0,0 @@ -(() => { - var __defProp = Object.defineProperty; - var __defProps = Object.defineProperties; - var __getOwnPropDescs = Object.getOwnPropertyDescriptors; - var __getOwnPropSymbols = Object.getOwnPropertySymbols; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __propIsEnum = Object.prototype.propertyIsEnumerable; - var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; - var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; - }; - var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - // ../posnext/posnext/public/js/pos_controller.js - frappe.provide("posnext.PointOfSale"); - var selected_item = null; - posnext.PointOfSale.Controller = class { - constructor(wrapper) { - console.log("CONTROLLLLLERE"); - this.wrapper = $(wrapper).find(".layout-main-section"); - this.page = wrapper.page; - frappe.run_serially([ - () => this.reload_status = false, - () => this.check_opening_entry(""), - () => this.reload_status = true - ]); - } - fetch_opening_entry(value) { - return frappe.call("posnext.posnext.page.posnext.point_of_sale.check_opening_entry", { "user": frappe.session.user, "value": value }); - } - check_opening_entry(value = "") { - this.fetch_opening_entry(value).then((r) => { - if (r.message.length) { - this.prepare_app_defaults(r.message[0]); - } else { - this.create_opening_voucher(); - } - }); - } - create_opening_voucher() { - const me = this; - const table_fields = [ - { - fieldname: "mode_of_payment", - fieldtype: "Link", - in_list_view: 1, - label: "Mode of Payment", - options: "Mode of Payment", - reqd: 1 - }, - { - fieldname: "opening_amount", - fieldtype: "Currency", - in_list_view: 1, - label: "Opening Amount", - options: "company:company_currency", - change: function() { - dialog.fields_dict.balance_details.df.data.some((d) => { - if (d.idx == this.doc.idx) { - d.opening_amount = this.value; - dialog.fields_dict.balance_details.grid.refresh(); - return true; - } - }); - } - } - ]; - const fetch_pos_payment_methods = () => { - const pos_profile = dialog.fields_dict.pos_profile.get_value(); - if (!pos_profile) - return; - frappe.db.get_doc("POS Profile", pos_profile).then(({ payments }) => { - dialog.fields_dict.balance_details.df.data = []; - payments.forEach((pay) => { - const { mode_of_payment } = pay; - dialog.fields_dict.balance_details.df.data.push({ mode_of_payment, opening_amount: "0" }); - }); - dialog.fields_dict.balance_details.grid.refresh(); - }); - }; - const dialog = new frappe.ui.Dialog({ - title: __("Create POS Opening Entry"), - static: true, - fields: [ - { - fieldtype: "Link", - label: __("Company"), - default: frappe.defaults.get_default("company"), - options: "Company", - fieldname: "company", - reqd: 1 - }, - { - fieldtype: "Link", - label: __("POS Profile"), - options: "POS Profile", - fieldname: "pos_profile", - reqd: 1, - get_query: () => pos_profile_query(), - onchange: () => fetch_pos_payment_methods() - }, - { - fieldname: "balance_details", - fieldtype: "Table", - label: "Opening Balance Details", - cannot_add_rows: false, - in_place_edit: true, - reqd: 1, - data: [], - fields: table_fields - } - ], - primary_action: async function({ company, pos_profile, balance_details }) { - if (!balance_details.length) { - frappe.show_alert({ - message: __("Please add Mode of payments and opening balance details."), - indicator: "red" - }); - return frappe.utils.play_sound("error"); - } - balance_details = balance_details.filter((d) => d.mode_of_payment); - const method = "posnext.posnext.page.posnext.point_of_sale.create_opening_voucher"; - const res = await frappe.call({ method, args: { pos_profile, company, balance_details }, freeze: true }); - !res.exc && me.prepare_app_defaults(res.message); - dialog.hide(); - }, - primary_action_label: __("Submit") - }); - dialog.show(); - const pos_profile_query = () => { - return { - query: "erpnext.accounts.doctype.pos_profile.pos_profile.pos_profile_query", - filters: { company: dialog.fields_dict.company.get_value() } - }; - }; - } - async prepare_app_defaults(data) { - this.pos_opening = data.name; - this.company = data.company; - this.pos_profile = data.pos_profile; - this.pos_opening_time = data.period_start_date; - this.item_stock_map = {}; - this.settings = {}; - window.current_pos_profile = this.pos_profile; - frappe.db.get_value("Stock Settings", void 0, "allow_negative_stock").then(({ message }) => { - this.allow_negative_stock = flt(message.allow_negative_stock) || false; - }); - frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.get_pos_profile_data", - args: { "pos_profile": this.pos_profile }, - callback: (res) => { - const profile = res.message; - Object.assign(this.settings, profile); - this.settings.customer_groups = profile.customer_groups.map((group) => group.name); - this.make_app(); - } - }); - } - set_opening_entry_status() { - this.page.set_title_sub( - ` - - Opened at ${moment(this.pos_opening_time).format("Do MMMM, h:mma")} - - ` - ); - } - make_app() { - this.prepare_dom(); - this.prepare_components(); - this.prepare_menu(); - this.make_new_invoice(); - } - prepare_dom() { - this.wrapper.append( - `
` - ); - this.$components_wrapper = this.wrapper.find(".point-of-sale-app"); - } - prepare_components() { - this.init_item_selector(); - this.init_item_details(); - this.init_item_cart(); - this.init_payments(); - this.init_recent_order_list(); - this.init_order_summary(); - } - prepare_menu() { - this.page.clear_menu(); - if (this.settings.custom_show_open_form_view) { - this.page.add_menu_item(__("Open Form View"), this.open_form_view.bind(this), false, "Ctrl+F"); - } - if (this.settings.custom_show_toggle_recent_orders) { - this.page.add_menu_item(__("Toggle Recent Orders"), this.toggle_recent_order.bind(this), false, "Ctrl+O"); - } - if (this.settings.custom_show_save_as_draft) { - this.page.add_menu_item(__("Save as Draft"), this.save_draft_invoice.bind(this), false, "Ctrl+S"); - } - if (this.settings.custom_show_close_the_pos) { - this.page.add_menu_item(__("Close the POS"), this.close_pos.bind(this), false, "Shift+Ctrl+C"); - } - } - open_form_view() { - frappe.model.sync(this.frm.doc); - frappe.set_route("Form", this.frm.doc.doctype, this.frm.doc.name); - } - toggle_recent_order() { - const show = this.recent_order_list.$component.is(":hidden"); - this.toggle_recent_order_list(show); - } - save_draft_invoice() { - if (!this.$components_wrapper.is(":visible")) - return; - console.log(this.frm.doc.items); - if (this.frm.doc.items.length == 0) { - frappe.show_alert({ - message: __("You must add atleast one item to save it as draft."), - indicator: "red" - }); - frappe.utils.play_sound("error"); - return; - } - this.frm.save(void 0, void 0, void 0, () => { - frappe.show_alert({ - message: __("There was an error saving the document."), - indicator: "red" - }); - frappe.utils.play_sound("error"); - }).then(() => { - frappe.run_serially([ - () => frappe.dom.freeze(), - () => this.make_new_invoice(false), - () => frappe.dom.unfreeze() - ]); - }); - } - close_pos() { - if (!this.$components_wrapper.is(":visible")) - return; - let voucher = frappe.model.get_new_doc("POS Closing Entry"); - voucher.pos_profile = this.frm.doc.pos_profile; - voucher.user = frappe.session.user; - voucher.company = this.frm.doc.company; - voucher.pos_opening_entry = this.pos_opening; - voucher.period_end_date = frappe.datetime.now_datetime(); - voucher.posting_date = frappe.datetime.now_date(); - voucher.posting_time = frappe.datetime.now_time(); - frappe.set_route("Form", "POS Closing Entry", voucher.name); - } - init_item_selector() { - if (this.frm) { - this.frm.doc.set_warehouse = this.settings.warehouse; - } - this.item_selector = new posnext.PointOfSale.ItemSelector({ - wrapper: this.$components_wrapper, - pos_profile: this.pos_profile, - settings: this.settings, - reload_status: this.reload_status, - currency: this.settings.currency, - events: { - check_opening_entry: () => this.check_opening_entry(), - item_selected: (args) => this.on_cart_update(args), - init_item_cart: () => this.init_item_cart(), - init_item_details: () => this.init_item_details(), - change_items: (args) => this.change_items(args), - get_frm: () => this.frm || {} - } - }); - } - change_items(items) { - var me = this; - this.frm = items; - this.cart.load_invoice(); - } - init_item_cart() { - this.cart = new posnext.PointOfSale.ItemCart({ - wrapper: this.$components_wrapper, - settings: this.settings, - events: { - get_frm: () => this.frm, - remove_item_from_cart: (item) => { - this.item_details.current_item = item; - this.item_details.name = item.name; - this.item_details.doctype = item.doctype; - }, - form_updated: (item, field, value) => { - this.item_details.current_item = item; - const item_row = frappe.model.get_doc(item.doctype, item.name); - if (field === "qty" && this.frm.doc.is_return && value >= 0) { - frappe.throw("Qty must be negative for return document"); - } - if (item_row && item_row[field] != value) { - const args = { - field, - value, - item: this.item_details.current_item - }; - return this.on_cart_update(args); - } - return Promise.resolve(); - }, - cart_item_clicked: (item) => { - const item_row = this.get_item_from_frm(item); - if (selected_item && selected_item["name"] == item["name"]) { - selected_item = null; - } else { - selected_item = item_row; - } - this.item_details.toggle_item_details_section(item_row); - }, - numpad_event: (value, action) => this.update_item_field(value, action), - checkout: () => this.save_and_checkout(), - edit_cart: () => this.payment.edit_cart(), - save_draft_invoice: () => this.save_draft_invoice(), - toggle_recent_order: () => this.toggle_recent_order(), - customer_details_updated: (details) => { - this.customer_details = details; - this.payment.render_loyalty_points_payment_mode(); - } - } - }); - } - init_item_details() { - this.item_details = new posnext.PointOfSale.ItemDetails({ - wrapper: this.$components_wrapper, - settings: this.settings, - events: { - get_frm: () => this.frm, - toggle_item_selector: (minimize) => { - this.item_selector.resize_selector(minimize); - this.cart.toggle_numpad(minimize); - }, - form_updated: (item, field, value) => { - const item_row = frappe.model.get_doc(item.doctype, item.name); - if (field === "qty" && this.frm.doc.is_return && value >= 0) { - frappe.throw("Qty must be negative for return document"); - } - if (item_row && item_row[field] != value) { - const args = { - field, - value, - item: this.item_details.current_item - }; - return this.on_cart_update(args); - } - return Promise.resolve(); - }, - highlight_cart_item: (item) => { - const cart_item = this.cart.get_cart_item(item); - this.cart.toggle_item_highlight(cart_item); - }, - item_field_focused: (fieldname) => { - this.cart.toggle_numpad_field_edit(fieldname); - }, - set_value_in_current_cart_item: (selector, value) => { - this.cart.update_selector_value_in_cart_item(selector, value, this.item_details.current_item); - }, - clone_new_batch_item_in_frm: (batch_serial_map, item) => { - Object.keys(batch_serial_map).forEach((batch) => { - const item_to_clone = this.frm.doc.items.find((i) => i.name == item.name); - const new_row = this.frm.add_child("items", __spreadValues({}, item_to_clone)); - new_row.batch_no = batch; - new_row.serial_no = batch_serial_map[batch].join(` -`); - new_row.qty = batch_serial_map[batch].length; - this.frm.doc.items.forEach((row) => { - if (item.item_code === row.item_code) { - this.update_cart_html(row); - } - }); - }); - }, - remove_item_from_cart: () => this.remove_item_from_cart(), - get_item_stock_map: () => this.item_stock_map, - close_item_details: () => { - selected_item = null; - this.item_details.toggle_item_details_section(null); - this.cart.prev_action = null; - this.cart.toggle_item_highlight(); - }, - get_available_stock: (item_code, warehouse) => this.get_available_stock(item_code, warehouse) - } - }); - if (selected_item) { - this.item_details.toggle_item_details_section(selected_item); - } - } - init_payments() { - this.payment = new posnext.PointOfSale.Payment({ - wrapper: this.$components_wrapper, - settings: this.settings, - events: { - get_frm: () => this.frm || {}, - get_customer_details: () => this.customer_details || {}, - toggle_other_sections: (show) => { - if (show) { - this.item_details.$component.is(":visible") ? this.item_details.$component.css("display", "none") : ""; - this.item_selector.toggle_component(false); - } else { - this.item_selector.toggle_component(true); - } - }, - submit_invoice: () => { - this.frm.savesubmit().then((r) => { - this.toggle_components(false); - this.order_summary.toggle_component(true); - this.order_summary.load_summary_of(this.frm.doc, true); - frappe.show_alert({ - indicator: "green", - message: __("POS invoice {0} created succesfully", [r.doc.name]) - }); - }); - } - } - }); - } - init_recent_order_list() { - this.recent_order_list = new posnext.PointOfSale.PastOrderList({ - wrapper: this.$components_wrapper, - events: { - open_invoice_data: (name) => { - frappe.db.get_doc("Sales Invoice", name).then((doc) => { - this.order_summary.load_summary_of(doc); - }); - }, - reset_summary: () => this.order_summary.toggle_summary_placeholder(true), - previous_screen: () => { - this.recent_order_list.toggle_component(false); - this.cart.load_invoice(); - this.item_selector.toggle_component(true); - this.wrapper.find(".past-order-summary").css("display", "none"); - } - }, - settings: this.settings - }); - } - init_order_summary() { - this.order_summary = new posnext.PointOfSale.PastOrderSummary({ - wrapper: this.$components_wrapper, - pos_profile: this.settings, - events: { - get_frm: () => this.frm, - process_return: (name) => { - this.recent_order_list.toggle_component(false); - frappe.db.get_doc("Sales Invoice", name).then((doc) => { - frappe.run_serially([ - () => this.make_return_invoice(doc), - () => this.cart.load_invoice(), - () => this.item_selector.toggle_component(true) - ]); - }); - }, - edit_order: (name) => { - console.log("Edit Order..."); - this.recent_order_list.toggle_component(false); - frappe.run_serially([ - () => this.frm.refresh(name), - () => this.frm.call("reset_mode_of_payments"), - () => this.cart.load_invoice(), - () => this.item_selector.toggle_component(true) - ]); - }, - delete_order: (name) => { - frappe.model.delete_doc(this.frm.doc.doctype, name, () => { - this.recent_order_list.refresh_list(); - }); - }, - new_order: () => { - frappe.run_serially([ - () => frappe.dom.freeze(), - () => this.make_new_invoice(), - () => this.item_selector.toggle_component(true), - () => frappe.dom.unfreeze() - ]); - } - } - }); - } - toggle_recent_order_list(show) { - this.toggle_components(!show); - this.recent_order_list.toggle_component(show); - this.order_summary.toggle_component(show); - } - toggle_components(show) { - this.cart.toggle_component(show); - this.item_selector.toggle_component(show); - !show ? this.item_details.toggle_component(false) || this.payment.toggle_component(false) : ""; - } - make_new_invoice(from_held = false) { - if (from_held) { - return frappe.run_serially([ - () => frappe.dom.freeze(), - () => this.make_sales_invoice_frm(), - () => this.set_pos_profile_data(), - () => this.set_pos_profile_status(), - () => this.cart.load_invoice(), - () => frappe.dom.unfreeze(), - () => this.toggle_recent_order() - ]); - } else { - return frappe.run_serially([ - () => frappe.dom.freeze(), - () => this.make_sales_invoice_frm(), - () => this.set_pos_profile_data(), - () => this.set_pos_profile_status(), - () => this.cart.load_invoice(), - () => frappe.dom.unfreeze() - ]); - } - } - make_sales_invoice_frm() { - const doctype = "Sales Invoice"; - return new Promise((resolve) => { - if (this.frm) { - this.frm = this.get_new_frm(this.frm); - this.frm.doc.items = []; - this.frm.doc.is_pos = 1; - this.frm.doc.set_warehouse = this.settings.warehouse; - resolve(); - } else { - frappe.model.with_doctype(doctype, () => { - this.frm = this.get_new_frm(); - this.frm.doc.items = []; - this.frm.doc.is_pos = 1; - this.frm.doc.set_warehouse = this.settings.warehouse; - resolve(); - }); - } - }); - } - get_new_frm(_frm) { - const doctype = "Sales Invoice"; - const page = $("
"); - const frm = _frm || new frappe.ui.form.Form(doctype, page, false); - const name = frappe.model.make_new_doc_and_get_name(doctype, true); - frm.refresh(name); - return frm; - } - async make_return_invoice(doc) { - frappe.dom.freeze(); - this.frm = this.get_new_frm(this.frm); - this.frm.doc.items = []; - return frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.make_sales_return", - args: { - "source_name": doc.name, - "target_doc": this.frm.doc - }, - callback: (r) => { - frappe.model.sync(r.message); - frappe.get_doc(r.message.doctype, r.message.name).__run_link_triggers = false; - this.set_pos_profile_data().then(() => { - frappe.dom.unfreeze(); - }); - } - }); - } - set_pos_profile_data() { - if (this.company && !this.frm.doc.company) - this.frm.doc.company = this.company; - if ((this.pos_profile && !this.frm.doc.pos_profile) | (this.frm.doc.is_return && this.pos_profile != this.frm.doc.pos_profile)) { - this.frm.doc.pos_profile = this.pos_profile; - } - if (!this.frm.doc.company) - return; - return this.frm.trigger("set_pos_data"); - } - set_pos_profile_status() { - this.page.set_indicator(this.pos_profile, "blue"); - } - async on_cart_update(args) { - console.log("Updating Cart"); - let item_row = void 0; - try { - let { field, value, item } = args; - item_row = this.get_item_from_frm(item); - const item_row_exists = !$.isEmptyObject(item_row); - const from_selector = field === "qty" && value === "+1"; - if (from_selector) - value = flt(item_row.stock_qty) + flt(value); - if (item_row_exists) { - if (field === "qty") - value = flt(value); - if (["qty", "conversion_factor"].includes(field) && value > 0 && !this.allow_negative_stock) { - const qty_needed = field === "qty" ? value * item_row.conversion_factor : item_row.qty * value; - } - if (this.is_current_item_being_edited(item_row) || from_selector) { - await frappe.model.set_value(item_row.doctype, item_row.name, field, value); - } - } else { - if (!this.frm.doc.customer && !this.settings.custom_mobile_number_based_customer) { - return this.raise_customer_selection_alert(); - } - frappe.flags.ignore_company_party_validation = true; - const { item_code, batch_no, serial_no, rate, uom, valuation_rate, custom_item_uoms, custom_logical_rack } = item; - if (!item_code) - return; - if (this.settings.custom_product_bundle) { - const product_bundle = await this.get_product_bundle(item_code); - if (product_bundle && Array.isArray(product_bundle.items)) { - const bundle_items = product_bundle.items.map((bundle_item) => ({ - item_code: bundle_item.item_code, - qty: bundle_item.qty * value, - rate: bundle_item.rate, - uom: bundle_item.uom - })); - for (const bundle_item of bundle_items) { - const bundle_item_row = this.frm.add_child("items", bundle_item); - await this.trigger_new_item_events(bundle_item_row); - } - this.update_cart_html(); - return; - } - } - const new_item = { item_code, batch_no, rate, uom, [field]: value }; - if (value) { - new_item["qty"] = value; - } - if (serial_no) { - await this.check_serial_no_availablilty(item_code, this.frm.doc.set_warehouse, serial_no); - new_item["serial_no"] = serial_no; - } - if (field === "serial_no") - new_item["qty"] = value.split(` -`).length || 0; - item_row = this.frm.add_child("items", new_item); - await this.trigger_new_item_events(item_row); - item_row["rate"] = rate; - item_row["valuation_rate"] = valuation_rate; - item_row["custom_valuation_rate"] = valuation_rate; - item_row["custom_item_uoms"] = custom_item_uoms; - item_row["custom_logical_rack"] = custom_logical_rack; - if (this.item_details.$component.is(":visible")) - this.edit_item_details_of(item_row); - if (this.check_serial_batch_selection_needed(item_row) && !this.item_details.$component.is(":visible")) - this.edit_item_details_of(item_row); - } - } catch (error) { - console.log(error); - } finally { - var total_incoming_rate = 0; - this.frm.doc.items.forEach((item) => { - total_incoming_rate += parseFloat(item.valuation_rate) * item.qty; - }); - this.item_selector.update_total_incoming_rate(total_incoming_rate); - return item_row; - } - } - raise_customer_selection_alert() { - frappe.dom.unfreeze(); - frappe.show_alert({ - message: __("You must select a customer before adding an item."), - indicator: "orange" - }); - frappe.utils.play_sound("error"); - } - async get_product_bundle(item_code) { - const response = await frappe.call({ - method: "posnext.doc_events.item.get_product_bundle_with_items", - args: { - item_code - } - }); - return response.message; - } - get_item_from_frm({ name, item_code, batch_no, uom, rate }) { - let item_row = null; - if (name) { - item_row = this.frm.doc.items.find((i2) => i2.name == name); - } else { - for (var i = 0; i < cur_frm.doc.items.length; i += 1) { - const has_batch_no = batch_no !== "null" && batch_no !== null; - const batch_no_check = this.settings.custom_allow_add_new_items_on_new_line ? has_batch_no && cur_frm.doc.items[i].batch_no === batch_no : true; - if (cur_frm.doc.items[i].item_code === item_code && cur_frm.doc.items[i].uom === uom && parseFloat(cur_frm.doc.items[i].rate) === parseFloat(rate) && batch_no_check) { - item_row = cur_frm.doc.items[i]; - break; - } - } - console.log(item_row); - } - return item_row || {}; - } - edit_item_details_of(item_row) { - this.item_details.toggle_item_details_section(item_row); - } - is_current_item_being_edited(item_row) { - return item_row.name == this.item_details.current_item.name; - } - update_cart_html(item_row, remove_item) { - this.cart.update_item_html(item_row, remove_item); - this.cart.update_totals_section(this.frm); - } - check_serial_batch_selection_needed(item_row) { - const serialized = item_row.has_serial_no; - const batched = item_row.has_batch_no; - const no_serial_selected = !item_row.serial_no; - const no_batch_selected = !item_row.batch_no; - if (serialized && no_serial_selected || batched && no_batch_selected || serialized && batched && (no_batch_selected || no_serial_selected)) { - return true; - } - return false; - } - async trigger_new_item_events(item_row) { - await this.frm.script_manager.trigger("item_code", item_row.doctype, item_row.name); - await this.frm.script_manager.trigger("qty", item_row.doctype, item_row.name); - await this.frm.script_manager.trigger("discount_percentage", item_row.doctype, item_row.name); - } - async check_stock_availability(item_row, qty_needed, warehouse) { - const resp = (await this.get_available_stock(item_row.item_code, warehouse)).message; - const available_qty = resp[0]; - const is_stock_item = resp[1]; - frappe.dom.unfreeze(); - const bold_uom = item_row.uom.bold(); - const bold_item_code = item_row.item_code.bold(); - const bold_warehouse = warehouse.bold(); - const bold_available_qty = available_qty.toString().bold(); - if (!(available_qty > 0)) { - if (is_stock_item) { - frappe.model.clear_doc(item_row.doctype, item_row.name); - frappe.throw({ - title: __("Not Available"), - message: __("Item Code: {0} is not available under warehouse {1}.", [bold_item_code, bold_warehouse]) - }); - } else { - return; - } - } else if (is_stock_item && available_qty < qty_needed) { - frappe.throw({ - message: __("Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}.", [bold_item_code, bold_warehouse, bold_available_qty, bold_uom]), - indicator: "orange" - }); - frappe.utils.play_sound("error"); - } - frappe.dom.freeze(); - } - async check_serial_no_availablilty(item_code, warehouse, serial_no) { - const method = "erpnext.stock.doctype.serial_no.serial_no.get_pos_reserved_serial_nos"; - const args = { filters: { item_code, warehouse } }; - const res = await frappe.call({ method, args }); - if (res.message.includes(serial_no)) { - frappe.throw({ - title: __("Not Available"), - message: __("Serial No: {0} has already been transacted into another Sales Invoice.", [serial_no.bold()]) - }); - } - } - get_available_stock(item_code, warehouse) { - const me = this; - return frappe.call({ - method: "erpnext.accounts.doctype.pos_invoice.pos_invoice.get_stock_availability", - args: { - "item_code": item_code, - "warehouse": warehouse - }, - callback(res) { - if (!me.item_stock_map[item_code]) - me.item_stock_map[item_code] = {}; - me.item_stock_map[item_code][warehouse] = res.message; - } - }); - } - update_item_field(value, field_or_action) { - if (field_or_action === "checkout") { - this.item_details.toggle_item_details_section(null); - } else if (field_or_action === "remove") { - this.remove_item_from_cart(); - } else { - const field_control = this.item_details[`${field_or_action}_control`]; - if (!field_control) - return; - field_control.set_focus(); - value != "" && field_control.set_value(value); - } - } - remove_item_from_cart() { - frappe.dom.freeze(); - const { doctype, name, current_item } = this.item_details; - return frappe.model.set_value(doctype, name, "qty", 0).then(() => { - frappe.model.clear_doc(doctype, name); - this.update_cart_html(current_item, true); - this.item_details.toggle_item_details_section(null); - frappe.dom.unfreeze(); - var total_incoming_rate = 0; - this.frm.doc.items.forEach((item) => { - total_incoming_rate += parseFloat(item.valuation_rate) * item.qty; - }); - this.item_selector.update_total_incoming_rate(total_incoming_rate); - }).catch((e) => console.log(e)); - } - async save_and_checkout() { - if (this.frm.is_dirty()) { - const div = document.getElementById("customer-cart-container2"); - div.style.gridColumn = ""; - let save_error = false; - await this.frm.save(null, null, null, () => save_error = true); - !save_error && this.payment.checkout(); - save_error && setTimeout(() => { - this.cart.toggle_checkout_btn(true); - }, 300); - } else { - this.payment.checkout(); - } - } - async save_and_checkout() { - if (!this.frm.doc.items || this.frm.doc.items.length === 0) { - frappe.show_alert({ - message: __("Please add items to cart before checkout."), - indicator: "red" - }); - frappe.utils.play_sound("error"); - return; - } - if (this.frm.is_dirty()) { - if (this.settings.custom_add_reference_details) { - const dialog = new frappe.ui.Dialog({ - title: __("Enter Reference Details"), - fields: [ - { - fieldtype: "Data", - label: __("Reference Number"), - fieldname: "reference_no" - }, - { - fieldtype: "Data", - label: __("Reference Name"), - fieldname: "reference_name" - } - ], - primary_action_label: __("Proceed to Payment"), - primary_action: async (values) => { - this.frm.doc.custom_reference_no = values.reference_no; - this.frm.doc.custom_reference_name = values.reference_name; - const div = document.getElementById("customer-cart-container2"); - div.style.gridColumn = ""; - let save_error = false; - await this.frm.save(null, null, null, () => save_error = true); - dialog.hide(); - if (!save_error) { - this.payment.checkout(); - } else { - setTimeout(() => { - this.cart.toggle_checkout_btn(true); - }, 300); - } - } - }); - dialog.show(); - } else { - const div = document.getElementById("customer-cart-container2"); - div.style.gridColumn = ""; - let save_error = false; - await this.frm.save(null, null, null, () => save_error = true); - !save_error && this.payment.checkout(); - save_error && setTimeout(() => { - this.cart.toggle_checkout_btn(true); - }, 300); - } - } else { - this.payment.checkout(); - } - } - }; - - // ../posnext/posnext/public/js/pos_item_selector.js - frappe.provide("posnext.PointOfSale"); - var view = "List"; - posnext.PointOfSale.ItemSelector = class { - constructor({ frm, wrapper, events, pos_profile, settings, currency, init_item_cart, reload_status }) { - this.wrapper = wrapper; - this.events = events; - this.currency = currency; - this.pos_profile = pos_profile; - this.hide_images = settings.hide_images; - this.reload_status = reload_status; - this.auto_add_item = settings.auto_add_item_to_cart; - if (settings.custom_default_view) { - view = settings.custom_default_view; - } - if (settings.custom_show_only_list_view) { - view = "List"; - } - if (settings.custom_show_only_card_view) { - view = "Card"; - } - this.custom_show_item_code = settings.custom_show_item_code; - this.custom_show_last_incoming_rate = settings.custom_show_last_incoming_rate; - this.custom_show_oem_part_number = settings.custom_show_oem_part_number; - this.custom_show_posting_date = settings.custom_show_posting_date; - this.custom_show_logical_rack = settings.custom_show_logical_rack; - this.show_only_list_view = settings.custom_show_only_list_view; - this.show_only_card_view = settings.custom_show_only_card_view; - this.custom_edit_rate = settings.custom_edit_rate_and_uom; - this.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom; - this.inti_component(); - } - inti_component() { - this.prepare_dom(); - this.make_search_bar(); - this.load_items_data(); - this.bind_events(); - this.attach_shortcuts(); - } - prepare_dom() { - var cardlist = ``; - if (!this.show_only_list_view && !this.show_only_card_view) { - cardlist = ` -
List
-
Card
- `; - } - if (view === "Card" && !this.show_only_list_view) { - var tir = ``; - if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { - tir = `
`; - } - this.wrapper.append( - `
-
` + cardlist + `
-
- -
-
` + tir + ` - -
-
-
- ` - ); - this.$component = this.wrapper.find(".items-selector"); - this.$items_container = this.$component.find(".items-container"); - } else if (view === "List" && !this.show_only_card_view) { - var section = `
`; - var tir = ``; - if (this.custom_edit_rate) { - section = `
`; - } - if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { - tir = `
`; - } - this.wrapper.append( - section + `
` + cardlist + `
-
- -
-
` + tir + ` - -
-
-
` - ); - this.$component = this.wrapper.find(".customer-cart-container"); - this.$items_container = this.$component.find(".cart-container"); - } - if (!this.show_only_list_view && !this.show_only_card_view) { - this.$list_view = this.$component.find(".list-view"); - this.$card_view = this.$component.find(".card-view"); - if (view === "List" && !this.show_only_list_view) { - this.$list_view.find(".list-span").css({ - "display": "inline-block", - "background-color": "#3498db", - "color": "white", - "padding": "3px 3px", - "border-radius": "20px", - "font-size": "12px", - "font-weight": "bold", - "text-transform": "uppercase", - "letter-spacing": "1px", - "cursor": "pointer", - "transition": "background-color 0.3s ease" - }); - this.$card_view.find(".card-span").css({ - "display": "", - "background-color": "", - "color": "", - "padding": "3px 3px", - "border-radius": "", - "font-size": "", - "font-weight": "", - "text-transform": "", - "letter-spacing": "", - "cursor": "", - "transition": "" - }); - } else if (view === "Card" && !this.show_only_card_view) { - this.$card_view.find(".card-span").css({ - "display": "inline-block", - "background-color": "#3498db", - "color": "white", - "padding": "3px 3px", - "border-radius": "20px", - "font-size": "12px", - "font-weight": "bold", - "text-transform": "uppercase", - "letter-spacing": "1px", - "cursor": "pointer", - "transition": "background-color 0.3s ease" - }); - this.$list_view.find(".list-span").css({ - "display": "", - "background-color": "", - "color": "", - "padding": "3px 3px", - "border-radius": "", - "font-size": "", - "font-weight": "", - "text-transform": "", - "letter-spacing": "", - "cursor": "", - "transition": "" - }); - } else { - this.$list_view.find(".list-span").css({ "display": "none" }); - this.$card_view.find(".card-span").css({ "display": "none" }); - } - if (!this.show_only_card_view && !this.show_only_list_view) { - this.click_functions(); - } - } - } - click_functions() { - this.$list_view.on("click", "a", () => { - this.$list_view.find(".list-span").css({ "display": "inline-block", "background-color": "#3498db", "color": "white", "padding": "5px 10px", "border-radius": "20px", "font-size": "14px", "font-weight": "bold", "text-transform": "uppercase", "letter-spacing": "1px", "cursor": "pointer", "transition": "background-color 0.3s ease" }); - this.$card_view.find(".card-span").css({ "display": "", "background-color": "", "color": "", "padding": "", "border-radius": "", "font-size": "", "font-weight": "", "text-transform": "", "letter-spacing": "", "cursor": "", "transition": "" }); - view = "List"; - if (document.getElementById("card-view-section")) - document.getElementById("card-view-section").remove(); - if (document.getElementById("list-view-section")) - document.getElementById("list-view-section").remove(); - if (document.getElementById("customer-cart-container2")) - document.getElementById("customer-cart-container2").remove(); - if (document.getElementById("item-details-container")) - document.getElementById("item-details-container").remove(); - this.inti_component(); - this.events.init_item_details(); - this.events.init_item_cart(); - this.events.change_items(this.events.get_frm()); - }); - this.$card_view.on("click", "a", () => { - this.$card_view.find(".card-span").css({ "display": "inline-block", "background-color": "#3498db", "color": "white", "padding": "5px 10px", "border-radius": "20px", "font-size": "14px", "font-weight": "bold", "text-transform": "uppercase", "letter-spacing": "1px", "cursor": "pointer", "transition": "background-color 0.3s ease" }); - this.$list_view.find(".list-span").css({ "display": "", "background-color": "", "color": "", "padding": "", "border-radius": "", "font-size": "", "font-weight": "", "text-transform": "", "letter-spacing": "", "cursor": "", "transition": "" }); - view = "Card"; - if (document.getElementById("card-view-section")) - document.getElementById("card-view-section").remove(); - if (document.getElementById("list-view-section")) - document.getElementById("list-view-section").remove(); - if (document.getElementById("customer-cart-container2")) - document.getElementById("customer-cart-container2").remove(); - if (document.getElementById("item-details-container")) - document.getElementById("item-details-container").remove(); - this.inti_component(); - this.events.init_item_details(); - this.events.init_item_cart(); - this.events.change_items(this.events.get_frm()); - }); - } - async load_items_data() { - if (!this.item_group) { - const res = await frappe.db.get_value("Item Group", { lft: 1, is_group: 1 }, "name"); - this.parent_item_group = res.message.name; - } - if (!this.price_list) { - const res = await frappe.db.get_value("POS Profile", this.pos_profile, "selling_price_list"); - this.price_list = res.message.selling_price_list; - } - this.get_items({}).then(({ message }) => { - this.render_item_list(message.items); - }); - } - get_items({ start = 0, page_length = 40, search_term = "" }) { - const doc = this.events.get_frm().doc; - const price_list = doc && doc.selling_price_list || this.price_list; - let { item_group, pos_profile } = this; - !item_group && (item_group = this.parent_item_group); - return frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.get_items", - freeze: true, - args: { start, page_length, price_list, item_group, search_term, pos_profile } - }); - } - render_item_list(items) { - this.$items_container.html(""); - var me = this; - if (view === "List") { - let get_item_code_header2 = function() { - var flex_value = 3; - if (!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack) { - flex_value = 2; - } - var html_header = ``; - if (me.custom_show_item_code) { - html_header += `
${__("Item Code")}
`; - } - if (me.custom_show_last_incoming_rate) { - html_header += `
${__("Inc.Rate")}
`; - } - if (me.custom_show_oem_part_number) { - html_header += `
${__("OEM")}
${__("Part No.")}
`; - } - if (me.custom_show_logical_rack) { - html_header += `
${__("Rack")}
`; - } - if (flex_value > 0) { - return `
${__("Item")}
` + html_header; - } else { - return `
${__("Item")}
` + html_header; - } - }; - var get_item_code_header = get_item_code_header2; - this.$items_container.append( - `
-
- ${get_item_code_header2()} -
${__("Rate")}
-
${__("Avail. Qty")}
- -
-
-
` - ); - this.make_cart_items_section(); - items.forEach((item) => { - this.render_cart_item(item); - }); - } else { - items.forEach((item) => { - var item_html = this.get_item_html(item); - this.$items_container.append(item_html); - }); - } - } - make_cart_items_section() { - this.$cart_header = this.$component.find(".cart-header"); - this.$cart_items_wrapper = this.$component.find(".cart-items-section"); - } - get_cart_item({ name }) { - const item_selector = `.cart-item-wrapper[data-row-name="${escape(name)}"]`; - return this.$cart_items_wrapper.find(item_selector); - } - get_cart_item1({ item_code }) { - const item_selector = `.cart-item-wrapper[data-row-name="${escape(item_code)}"]`; - return this.$cart_items_wrapper.find(item_selector); - } - render_cart_item(item_data) { - console.log("Rener cart item"); - console.log(item_data); - const me = this; - const currency = me.events.get_frm().currency || me.currency; - this.$cart_items_wrapper.append( - `
-
` - ); - var $item_to_update = this.get_cart_item1(item_data); - $item_to_update.html( - `${get_item_image_html()} - ${get_item_name()} - -
- ${item_data.item_name} -
- ${get_description_html()} -
- ${get_item_code()} - ${get_rate_discount_html()}` - ); - function get_item_name() { - var flex_value = 4; - if (me.custom_show_item_code && me.custom_show_last_incoming_rate && me.custom_show_oem_part_number) { - flex_value = 3; - } - if (!me.custom_show_item_code && !me.custom_show_last_incoming_rate && !me.custom_show_oem_part_number && !me.custom_show_logical_rack) { - flex_value = 2; - } - return `
`; - } - set_dynamic_rate_header_width(); - function set_dynamic_rate_header_width() { - const rate_cols = Array.from(me.$cart_items_wrapper.find(".item-rate-amount")); - me.$cart_header.find(".rate-amount-header").css("width", ""); - me.$cart_items_wrapper.find(".item-rate-amount").css("width", ""); - var max_width = rate_cols.reduce((max_width2, elm) => { - if ($(elm).width() > max_width2) - max_width2 = $(elm).width(); - return max_width2; - }, 0); - max_width += 1; - if (max_width == 1) - max_width = ""; - me.$cart_header.find(".rate-amount-header").css("width", max_width); - me.$cart_items_wrapper.find(".item-rate-amount").css("width", max_width); - } - function get_item_code() { - var html_code = ``; - if (me.custom_show_item_code) { - var item_code_flex_value = 1; - html_code += `
-
- ${item_data.item_code}
- ${item_data.uom} -
-
`; - } - if (me.custom_show_last_incoming_rate) { - html_code += `
-
- ${parseFloat(item_data.valuation_rate).toFixed(2)} -
-
`; - } - if (me.custom_show_oem_part_number) { - html_code += `
-
- ${item_data.custom_oem_part_number || ""} -
-
`; - } - if (me.custom_show_logical_rack) { - html_code += `
-
- ${item_data.rack || ""} -
-
`; - } - return html_code; - } - function get_rate_discount_html() { - if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { - return ` -
-
-
${format_currency(item_data.price_list_rate, currency)}
-
-
${item_data.actual_qty || 0}
-
${item_data.batch_no || 0}
- -
`; - } else { - return ` -
-
-
${format_currency(item_data.price_list_rate, currency)}
-
-
${item_data.actual_qty || 0}
-
${item_data.batch_no || 0}
- -
`; - } - } - function get_description_html() { - if (item_data.description) { - if (item_data.description.indexOf("
") != -1) { - try { - item_data.description = $(item_data.description).text(); - } catch (error) { - item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); - } - } - item_data.description = frappe.ellipsis(item_data.description, 45); - return `
${item_data.description}
`; - } - return ``; - } - function get_item_image_html() { - const { image, item_name } = item_data; - if (!me.hide_images && image) { - return ` -
- ${frappe.get_abbr(item_name)} -
`; - } else { - return `
${frappe.get_abbr(item_name)}
`; - } - } - } - get_item_html(item) { - const me = this; - item.currency = item.currency || me.currency; - const { item_image, serial_no, batch_no, barcode, actual_qty, uom, price_list_rate } = item; - const precision2 = flt(price_list_rate, 2) % 1 != 0 ? 2 : 0; - let indicator_color; - let qty_to_display = actual_qty; - if (item.is_stock_item) { - indicator_color = actual_qty > 10 ? "green" : actual_qty <= 0 ? "red" : "orange"; - if (Math.round(qty_to_display) > 999) { - qty_to_display = Math.round(qty_to_display) / 1e3; - qty_to_display = qty_to_display.toFixed(1) + "K"; - } - } else { - indicator_color = ""; - qty_to_display = ""; - } - function get_item_image_html() { - if (!me.hide_images && item_image) { - return `
- ${qty_to_display} -
-
- ${frappe.get_abbr(item.item_name)} -
`; - } else { - return `
- ${qty_to_display} -
-
${frappe.get_abbr(item.item_name)}
`; - } - } - return `
- - ${get_item_image_html()} - -
-
- ${frappe.ellipsis(item.item_name, 18)} -
-
${format_currency(price_list_rate, item.currency, precision2) || 0} / ${uom}
-
-
`; - } - handle_broken_image($img) { - const item_abbr = $($img).attr("alt"); - $($img).parent().replaceWith(`
${item_abbr}
`); - } - update_total_incoming_rate(total_rate) { - if (this.total_incoming_rate) { - this.total_incoming_rate.set_value(total_rate); - } - } - make_search_bar() { - const me = this; - const doc = me.events.get_frm().doc; - this.$component.find(".search-field").html(""); - this.$component.find(".pos-profile").html(""); - this.$component.find(".total-incoming-rate").html(""); - this.$component.find(".item-group-field").html(""); - this.$component.find(".invoice-posting-date").html(""); - frappe.db.get_single_value("POS Settings", "custom_profile_lock").then((doc2) => { - this.pos_profile_field = frappe.ui.form.make_control({ - df: { - label: __("POS Profile"), - fieldtype: "Link", - options: "POS Profile", - placeholder: __("POS Profile"), - read_only: doc2, - onchange: function() { - if (me.reload_status && me.pos_profile !== this.value) { - frappe.pages["posnext"].refresh(window.wrapper, window.onScan, this.value); - } - } - }, - parent: this.$component.find(".pos-profile"), - render_input: false - }); - this.pos_profile_field.set_value(me.pos_profile); - this.pos_profile_field.refresh(); - this.pos_profile_field.toggle_label(false); - }); - this.search_field = frappe.ui.form.make_control({ - df: { - label: __("Search"), - fieldtype: "Data", - placeholder: __("Search by serial number or barcode") - }, - parent: this.$component.find(".search-field"), - render_input: true - }); - this.item_group_field = frappe.ui.form.make_control({ - df: { - label: __("Item Group"), - fieldtype: "Link", - options: "Item Group", - placeholder: __("Select item group"), - onchange: function() { - me.item_group = this.value; - !me.item_group && (me.item_group = me.parent_item_group); - me.filter_items(); - }, - get_query: function() { - return { - query: "posnext.posnext.page.posnext.point_of_sale.item_group_query", - filters: { - pos_profile: doc ? doc.pos_profile : "" - } - }; - } - }, - parent: this.$component.find(".item-group-field"), - render_input: true - }); - if (this.custom_show_last_incoming_rate || this.custom_show_incoming_rate) { - this.total_incoming_rate = frappe.ui.form.make_control({ - df: { - label: __(""), - fieldtype: "Currency", - read_only: 1, - placeholder: __("Total Incoming Rate"), - default: 0 - }, - parent: this.$component.find(".total-incoming-rate"), - render_input: true - }); - } - if (me.custom_show_posting_date) { - this.invoice_posting_date = frappe.ui.form.make_control({ - df: { - label: __("Posting Date"), - fieldtype: "Date", - onchange: function() { - me.events.get_frm().doc.posting_date = this.value; - me.events.get_frm().doc.set_posting_time = 1; - } - }, - parent: this.$component.find(".invoice-posting-date"), - render_input: true - }); - } - this.search_field.toggle_label(false); - this.item_group_field.toggle_label(false); - if (this.custom_show_last_incoming_rate) { - this.total_incoming_rate.toggle_label(false); - } - if (me.custom_show_posting_date) { - this.invoice_posting_date.toggle_label(false); - this.invoice_posting_date.set_value(frappe.datetime.get_today()); - } - this.attach_clear_btn(); - } - attach_clear_btn() { - this.search_field.$wrapper.find(".control-input").append( - ` - - ${frappe.utils.icon("close", "sm")} - - ` - ); - this.$clear_search_btn = this.search_field.$wrapper.find(".link-btn"); - this.$clear_search_btn.on("click", "a", () => { - this.set_search_value(""); - this.search_field.set_focus(); - }); - } - set_search_value(value) { - $(this.search_field.$input[0]).val(value).trigger("input"); - } - bind_events() { - const me = this; - if (!window.onScan) { - frappe.require("https://cdn.jsdelivr.net/npm/onscan.js/onscan.min.js", function() { - window.onScan = onScan; - onScan.decodeKeyEvent = function(oEvent) { - var iCode = this._getNormalizedKeyNum(oEvent); - switch (true) { - case (iCode >= 48 && iCode <= 90): - case (iCode >= 106 && iCode <= 111): - case (iCode >= 160 && iCode <= 164 || iCode == 170): - case (iCode >= 186 && iCode <= 194): - case (iCode >= 219 && iCode <= 222): - case iCode == 32: - if (oEvent.key !== void 0 && oEvent.key !== "") { - return oEvent.key; - } - var sDecoded = String.fromCharCode(iCode); - switch (oEvent.shiftKey) { - case false: - sDecoded = sDecoded.toLowerCase(); - break; - case true: - sDecoded = sDecoded.toUpperCase(); - break; - } - return sDecoded; - case (iCode >= 96 && iCode <= 105): - return 0 + (iCode - 96); - } - return ""; - }; - onScan.attachTo(document, { - onScan: (sScancode) => { - if (this.search_field && this.$component.is(":visible")) { - this.search_field.set_focus(); - this.set_search_value(sScancode); - this.barcode_scanned = true; - } - } - }); - }); - } - this.$component.on("click", ".item-wrapper", function() { - console.log("Item Selected"); - const $item = $(this); - const item_code = unescape($item.attr("data-item-code")); - let batch_no = unescape($item.attr("data-batch-no")); - let serial_no = unescape($item.attr("data-serial-no")); - let uom = unescape($item.attr("data-uom")); - let rate = unescape($item.attr("data-rate")); - let valuation_rate = unescape($item.attr("data-valuation-rate")); - let custom_item_uoms = $item.attr("data-item-uoms"); - let custom_logical_rack = $item.attr("data-item-logical-rack"); - batch_no = batch_no === "undefined" ? void 0 : batch_no; - serial_no = serial_no === "undefined" ? void 0 : serial_no; - uom = uom === "undefined" ? void 0 : uom; - rate = rate === "undefined" ? void 0 : rate; - me.events.item_selected({ - field: "qty", - value: "+1", - item: { item_code, batch_no, serial_no, uom, rate, valuation_rate, custom_item_uoms, custom_logical_rack } - }); - }); - this.search_field.$input.on("input", (e) => { - clearTimeout(this.last_search); - this.last_search = setTimeout(() => { - const search_term = e.target.value; - this.filter_items({ search_term }); - }, 300); - }); - } - attach_shortcuts() { - const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; - this.search_field.parent.attr("title", `${ctrl_label}+I`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+i", - action: () => this.search_field.set_focus(), - condition: () => this.$component.is(":visible"), - description: __("Focus on search input"), - ignore_inputs: true, - page: cur_page.page.page - }); - this.item_group_field.parent.attr("title", `${ctrl_label}+G`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+g", - action: () => this.item_group_field.set_focus(), - condition: () => this.$component.is(":visible"), - description: __("Focus on Item Group filter"), - ignore_inputs: true, - page: cur_page.page.page - }); - frappe.ui.keys.on("enter", () => { - const selector_is_visible = this.$component.is(":visible"); - if (!selector_is_visible || this.search_field.get_value() === "") - return; - if (this.items.length == 1) { - this.$items_container.find(".item-wrapper").click(); - frappe.utils.play_sound("submit"); - this.set_search_value(""); - } else if (this.items.length == 0 && this.barcode_scanned) { - frappe.show_alert({ - message: __("No items found. Scan barcode again."), - indicator: "orange" - }); - frappe.utils.play_sound("error"); - this.barcode_scanned = false; - this.set_search_value(""); - } - }); - } - filter_items({ search_term = "" } = {}) { - if (search_term) { - search_term = search_term.toLowerCase(); - this.search_index = this.search_index || {}; - if (this.search_index[search_term]) { - const items = this.search_index[search_term]; - this.items = items; - this.render_item_list(items); - this.auto_add_item && this.items.length == 1; - return; - } - } - this.get_items({ search_term }).then(({ message }) => { - const { items, serial_no, batch_no, barcode } = message; - if (search_term && !barcode) { - this.search_index[search_term] = items; - } - this.items = items; - this.render_item_list(items); - this.auto_add_item && this.items.length == 1; - }); - } - add_filtered_item_to_cart() { - this.$items_container.find(".item-wrapper").click(); - this.set_search_value(""); - } - resize_selector(minimize) { - minimize ? this.$component.find(".filter-section").css("grid-template-columns", "repeat(1, minmax(0, 1fr))") : this.$component.find(".filter-section").css("grid-template-columns", "repeat(12, minmax(0, 1fr))"); - minimize ? this.$component.find(".search-field").css("margin", "var(--margin-sm) 0px") : this.$component.find(".search-field").css("margin", "0px var(--margin-sm)"); - minimize ? this.$component.css("grid-column", "span 2 / span 2") : this.$component.css("grid-column", "span 6 / span 6"); - minimize ? this.$items_container.css("grid-template-columns", "repeat(1, minmax(0, 1fr))") : this.$items_container.css("grid-template-columns", "repeat(4, minmax(0, 1fr))"); - } - toggle_component(show) { - this.set_search_value(""); - this.$component.css("display", show ? "flex" : "none"); - } - }; - - // ../posnext/posnext/public/js/pos_item_cart.js - frappe.provide("posnext.PointOfSale"); - posnext.PointOfSale.ItemCart = class { - constructor({ wrapper, events, settings }) { - this.wrapper = wrapper; - this.events = events; - this.customer_info = void 0; - this.hide_images = settings.hide_images; - this.allowed_customer_groups = settings.customer_groups; - this.allow_rate_change = settings.allow_rate_change; - this.allow_discount_change = settings.allow_discount_change; - this.show_held_button = settings.custom_show_held_button; - this.show_order_list_button = settings.custom_show_order_list_button; - this.mobile_number_based_customer = settings.custom_mobile_number_based_customer; - this.show_checkout_button = settings.custom_show_checkout_button; - this.custom_edit_rate = settings.custom_edit_rate_and_uom; - this.custom_use_discount_percentage = settings.custom_use_discount_percentage; - this.custom_use_discount_amount = settings.custom_use_discount_amount; - this.custom_use_additional_discount_amount = settings.custom_use_additional_discount_amount; - this.custom_show_incoming_rate = settings.custom_show_incoming_rate && settings.custom_edit_rate_and_uom; - this.custom_show_last_customer_rate = settings.custom_show_last_customer_rate; - this.custom_show_logical_rack_in_cart = settings.custom_show_logical_rack_in_cart && settings.custom_edit_rate_and_uom; - this.custom_show_uom_in_cart = settings.custom_show_uom_in_cart && settings.custom_edit_rate_and_uom; - this.show_branch = settings.show_branch; - this.show_batch_in_cart = settings.show_batch_in_cart; - this.settings = settings; - this.warehouse = settings.warehouse; - this.init_component(); - } - init_component() { - this.prepare_dom(); - this.init_child_components(); - this.bind_events(); - this.attach_shortcuts(); - } - prepare_dom() { - if (this.custom_edit_rate) { - this.wrapper.append( - `
` - ); - } else { - this.wrapper.append( - `
` - ); - } - this.$component = this.wrapper.find(".customer-cart-container1"); - } - init_child_components() { - this.init_customer_selector(); - this.init_cart_components(); - } - init_customer_selector() { - this.$component.append( - `
` - ); - this.$customer_section = this.$component.find(".customer-section"); - this.make_customer_selector(); - } - reset_customer_selector() { - const frm = this.events.get_frm(); - frm.set_value("customer", ""); - this.make_customer_selector(); - this.customer_field.set_focus(); - } - init_cart_components() { - var html = `
-
-
${__("Item Cart")}
-
-
${__("Item")}
-
${__("Qty")}
- `; - if (this.custom_show_uom_in_cart) { - html += `
${__("UOM")}
`; - } - if (this.show_batch_in_cart) { - html += `
${__("Batch")}
`; - } - if (this.custom_edit_rate) { - html += `
${__("Rate")}
`; - } - if (this.custom_use_discount_percentage) { - html += `
${__("Disc%")}
`; - } - if (this.custom_use_discount_amount) { - html += `
${__("Disc")}
`; - } - if (this.custom_show_incoming_rate) { - html += `
${__("Inc.Rate")}
`; - } - if (this.custom_show_logical_rack_in_cart) { - html += `
${__("Rack")}
`; - } - if (this.custom_show_last_customer_rate) { - html += `
${__("LC Rate")}
`; - } - html += `
${__("Amount")}
-
-
-
-
-
-
-
`; - this.$component.append(html); - this.$cart_container = this.$component.find(".cart-container"); - this.make_branch_section(); - this.make_cart_totals_section(); - this.make_cart_items_section(); - this.make_cart_numpad(); - } - make_cart_items_section() { - this.$cart_header = this.$component.find(".cart-header"); - this.$cart_items_wrapper = this.$component.find(".cart-items-section"); - this.make_no_items_placeholder(); - } - make_no_items_placeholder() { - this.$cart_header.css("display", "none"); - this.$cart_items_wrapper.html( - `
${__("No items in cart")}
` - ); - } - get_discount_icon() { - return ` - - - - - `; - } - get_branch_icon() { - return ` - - - - `; - } - make_branch_section() { - if (this.show_branch) { - this.$branch_section = this.$component.find(".cart-branch-section"); - if (this.$branch_section.length) { - this.$branch_section.append(` -
-
- ${this.get_branch_icon()} ${__("Add Branch")} -
- `); - this.$branch_section.find(".add-branch-wrapper").css({ - "display": "flex", - "align-items": "center", - "gap": "8px", - "border": "2px dashed #ccc", - "padding": "10px", - "border-radius": "6px", - "cursor": "pointer", - "font-weight": "bold" - }); - this.$branch_section.find(".add-branch-wrapper").hover( - function() { - $(this).css("background-color", "#f9f9f9"); - }, - function() { - $(this).css("background-color", "transparent"); - } - ); - } - } - } - make_cart_totals_section() { - this.$totals_section = this.$component.find(".cart-totals-section"); - this.$totals_section.append( - `
- ${this.get_discount_icon()} ${__("Add Discount")} -
-
-
${__("Total Items")}
-
0.00
-
-
-
${__("Net Total")}
-
0.00
-
-
-
-
${__("Grand Total")}
-
0.00
-
-
-
${__("Checkout")}
-
${__("Held")}
-
${__("Order List")}
-
-
${__("Edit Cart")}
` - ); - this.$add_discount_elem = this.$component.find(".add-discount-wrapper"); - this.highlight_checkout_btn(true); - } - make_cart_numpad() { - this.$numpad_section = this.$component.find(".numpad-section"); - this.number_pad = new posnext.PointOfSale.NumberPad({ - wrapper: this.$numpad_section, - events: { - numpad_event: this.on_numpad_event.bind(this) - }, - cols: 5, - keys: [ - [1, 2, 3, "Quantity"], - [4, 5, 6, "Discount"], - [7, 8, 9, "Rate"], - [".", 0, "Delete", "Remove"] - ], - css_classes: [ - ["", "", "", "col-span-2"], - ["", "", "", "col-span-2"], - ["", "", "", "col-span-2"], - ["", "", "", "col-span-2 remove-btn"] - ], - fieldnames_map: { "Quantity": "qty", "Discount": "discount_percentage" } - }); - this.$numpad_section.prepend( - `
- - - -
` - ); - this.$numpad_section.append( - `
${__("Checkout")}
` - ); - } - bind_events() { - const me = this; - this.$customer_section.on("click", ".reset-customer-btn", function() { - me.reset_customer_selector(); - }); - this.$customer_section.on("click", ".close-details-btn", function() { - me.toggle_customer_info(false); - }); - this.$customer_section.on("click", ".customer-display", function(e) { - if ($(e.target).closest(".reset-customer-btn").length) - return; - const show = me.$cart_container.is(":visible"); - me.toggle_customer_info(show); - }); - if (!me.custom_edit_rate) { - this.$cart_items_wrapper.on("click", ".cart-item-wrapper", function() { - const $cart_item = $(this); - me.toggle_item_highlight(this); - const payment_section_hidden = !me.$totals_section.find(".edit-cart-btn").is(":visible"); - if (!payment_section_hidden) { - me.$totals_section.find(".edit-cart-btn").click(); - } - const item_row_name = unescape($cart_item.attr("data-row-name")); - me.events.cart_item_clicked({ name: item_row_name }); - this.numpad_value = ""; - }); - } - this.$component.on("click", ".checkout-btn", async function() { - if ($(this).attr("style").indexOf("--blue-500") == -1) - return; - if ($(this).attr("class").indexOf("checkout-btn-held") !== -1) - return; - if ($(this).attr("class").indexOf("checkout-btn-order") !== -1) - return; - if (!cur_frm.doc.customer && me.mobile_number_based_customer) { - let d = new frappe.ui.Dialog({ - title: "Enter Mobile Number", - fields: [ - { - label: "Mobile Number", - fieldname: "mobile_number", - fieldtype: "Data", - reqd: 1 - }, - { - label: "", - fieldname: "mobile_number_numpad", - fieldtype: "HTML", - options: '
' - } - ], - size: "small", - primary_action_label: "Continue", - primary_action: function(values) { - if (values["mobile_number"].length !== me.settings.custom_mobile_number_length) { - frappe.throw("Mobile Number Length is " + me.settings.custom_mobile_number_length.toString()); - } - frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.create_customer", - args: { - customer: values["mobile_number"] - }, - freeze: true, - freeze_message: "Creating Customer....", - callback: async function() { - const frm = me.events.get_frm(); - frappe.dom.freeze(); - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", values["mobile_number"]); - frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name).then(() => { - frappe.run_serially([ - () => me.fetch_customer_details(values["mobile_number"]), - () => me.events.customer_details_updated(me.customer_info), - () => me.update_customer_section(), - () => frappe.dom.unfreeze() - ]); - }); - await me.events.checkout(); - me.toggle_checkout_btn(false); - me.allow_discount_change && me.$add_discount_elem.removeClass("d-none"); - d.hide(); - } - }); - } - }); - var mobile_number_numpad_div = d.wrapper.find(".mobile_number_numpad"); - mobile_number_numpad_div.append(` -
- - - - - - - - - - - - - -
`); - d.show(); - var numpad_num = d.wrapper.find(".custom-numpad"); - var numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero", "plus"]; - for (var xx = 0; xx < numbers.length; xx += 1) { - numpad_num.on("click", "." + numbers[xx], function() { - var current_value = d.get_value("mobile_number"); - d.set_value("mobile_number", current_value + $(this)[0].innerHTML.toString()); - }); - } - numpad_num.on("click", ".clear", function() { - d.set_value("mobile_number", ""); - }); - numpad_num.on("click", ".delete", function() { - var current_value = d.get_value("mobile_number"); - d.set_value("mobile_number", current_value.slice(0, -1)); - }); - } else { - if (!cur_frm.doc.customer && !me.mobile_number_based_customer) { - frappe.throw("Please Select a customer and add items first"); - } - await me.events.checkout(); - me.toggle_checkout_btn(false); - me.allow_discount_change && me.$add_discount_elem.removeClass("d-none"); - } - }); - this.$component.on("click", ".checkout-btn-held", function() { - if ($(this).attr("style").indexOf("--blue-500") == -1) - return; - if (!cur_frm.doc.items || cur_frm.doc.items.length === 0) { - frappe.show_alert({ - message: __("Please add items to cart before holding."), - indicator: "red" - }); - frappe.utils.play_sound("error"); - return; - } - if (!cur_frm.doc.customer && me.mobile_number_based_customer) { - let d = new frappe.ui.Dialog({ - title: "Enter Mobile Number", - fields: [ - { - label: "Mobile Number", - fieldname: "mobile_number", - fieldtype: "Data", - reqd: 1 - }, - { - label: "", - fieldname: "mobile_number_numpad", - fieldtype: "HTML", - options: '
' - } - ], - size: "small", - primary_action_label: "Continue", - primary_action: function(values) { - if (values["mobile_number"].length !== me.settings.custom_mobile_number_length) { - frappe.throw("Mobile Number Length is " + me.settings.custom_mobile_number_length.toString()); - } - if (me.settings.custom_add_reference_details) { - me.show_reference_dialog(values["mobile_number"]); - } else { - me.hold_invoice(values["mobile_number"]); - } - d.hide(); - } - }); - me.setup_mobile_numpad(d); - d.show(); - } else { - if (me.settings.custom_add_reference_details) { - me.show_reference_dialog(); - } else { - me.hold_invoice(); - } - } - }); - this.$component.on("click", ".checkout-btn-order", () => { - this.events.toggle_recent_order(); - }); - this.$totals_section.on("click", ".edit-cart-btn", () => { - this.events.edit_cart(); - this.toggle_checkout_btn(true); - }); - this.$component.on("click", ".add-discount-wrapper", () => { - const can_edit_discount = this.$add_discount_elem.find(".edit-discount-btn").length; - if (!this.discount_field || can_edit_discount) - this.show_discount_control(); - }); - this.$component.on("click", ".add-branch-wrapper", function() { - const $wrapper = $(this); - const branchFieldWrapper = $('
'); - $wrapper.replaceWith(branchFieldWrapper); - let branchField = new frappe.ui.form.ControlLink({ - df: { - fieldtype: "Link", - options: "Branch", - fieldname: "branch", - label: "Branch", - placeholder: "Select Branch" - }, - parent: branchFieldWrapper, - value: "", - change: function(value) { - console.log("Selected Branch:", value); - } - }); - branchField.refresh(); - }); - frappe.ui.form.on("Sales Invoice", "paid_amount", (frm) => { - this.update_totals_section(frm); - }); - } - attach_shortcuts() { - for (let row of this.number_pad.keys) { - for (let btn of row) { - if (typeof btn !== "string") - continue; - let shortcut_key = `ctrl+${frappe.scrub(String(btn))[0]}`; - if (btn === "Delete") - shortcut_key = "ctrl+backspace"; - if (btn === "Remove") - shortcut_key = "shift+ctrl+backspace"; - if (btn === ".") - shortcut_key = "ctrl+>"; - const fieldname = this.number_pad.fieldnames[btn] ? this.number_pad.fieldnames[btn] : typeof btn === "string" ? frappe.scrub(btn) : btn; - let shortcut_label = shortcut_key.split("+").map(frappe.utils.to_title_case).join("+"); - shortcut_label = frappe.utils.is_mac() ? shortcut_label.replace("Ctrl", "\u2318") : shortcut_label; - this.$numpad_section.find(`.numpad-btn[data-button-value="${fieldname}"]`).attr("title", shortcut_label); - frappe.ui.keys.on(`${shortcut_key}`, () => { - const cart_is_visible = this.$component.is(":visible"); - if (cart_is_visible && this.item_is_selected && this.$numpad_section.is(":visible")) { - this.$numpad_section.find(`.numpad-btn[data-button-value="${fieldname}"]`).click(); - } - }); - } - } - const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; - this.$component.find(".checkout-btn").attr("title", `${ctrl_label}+Enter`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+enter", - action: () => this.$component.find(".checkout-btn").click(), - condition: () => this.$component.is(":visible") && !this.$totals_section.find(".edit-cart-btn").is(":visible"), - description: __("Checkout Order / Submit Order / New Order"), - ignore_inputs: true, - page: cur_page.page.page - }); - this.$component.find(".edit-cart-btn").attr("title", `${ctrl_label}+E`); - frappe.ui.keys.on("ctrl+e", () => { - const item_cart_visible = this.$component.is(":visible"); - const checkout_btn_invisible = !this.$totals_section.find(".checkout-btn").is("visible"); - if (item_cart_visible && checkout_btn_invisible) { - this.$component.find(".edit-cart-btn").click(); - } - }); - this.$component.find(".add-discount-wrapper").attr("title", `${ctrl_label}+D`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+d", - action: () => this.$component.find(".add-discount-wrapper").click(), - condition: () => this.$add_discount_elem.is(":visible"), - description: __("Add Order Discount"), - ignore_inputs: true, - page: cur_page.page.page - }); - frappe.ui.keys.on("escape", () => { - const item_cart_visible = this.$component.is(":visible"); - if (item_cart_visible && this.discount_field && this.discount_field.parent.is(":visible")) { - this.discount_field.set_value(0); - } - }); - } - toggle_item_highlight(item) { - const $cart_item = $(item); - const item_is_highlighted = $cart_item.attr("style") == "background-color:var(--gray-50);"; - if (!item || item_is_highlighted) { - this.item_is_selected = false; - this.$cart_container.find(".cart-item-wrapper").css("background-color", ""); - } else { - $cart_item.css("background-color", "var(--control-bg)"); - this.item_is_selected = true; - this.$cart_container.find(".cart-item-wrapper").not(item).css("background-color", ""); - } - } - make_customer_selector() { - this.$customer_section.html(` -
- `); - const me = this; - const query = { query: "posnext.controllers.queries.customer_query" }; - const allowed_customer_group = this.allowed_customer_groups || []; - if (allowed_customer_group.length) { - query.filters = { - customer_group: ["in", allowed_customer_group] - }; - } - this.customer_field = frappe.ui.form.make_control({ - df: { - label: __("Customer"), - fieldtype: "Link", - options: "Customer", - placeholder: __("Search by customer name, phone, email."), - read_only: this.mobile_number_based_customer, - get_query: () => query, - onchange: function() { - if (this.value) { - const frm = me.events.get_frm(); - frappe.dom.freeze(); - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", this.value); - frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name).then(() => { - frappe.run_serially([ - () => me.fetch_customer_details(this.value), - () => me.events.customer_details_updated(me.customer_info), - () => me.update_customer_section(), - () => me.update_totals_section(), - () => frappe.dom.unfreeze() - ]); - }); - } - } - }, - parent: this.$customer_section.find(".customer-field"), - render_input: true - }); - this.customer_field.toggle_label(false); - } - fetch_customer_details(customer) { - if (customer) { - return new Promise((resolve) => { - frappe.db.get_value("Customer", customer, ["email_id", "mobile_no", "image", "loyalty_program"]).then(({ message }) => { - const { loyalty_program } = message; - if (loyalty_program) { - frappe.call({ - method: "erpnext.accounts.doctype.loyalty_program.loyalty_program.get_loyalty_program_details_with_points", - args: { customer, loyalty_program, "silent": true }, - callback: (r) => { - const { loyalty_points, conversion_factor } = r.message; - if (!r.exc) { - this.customer_info = __spreadProps(__spreadValues({}, message), { customer, loyalty_points, conversion_factor }); - resolve(); - } - } - }); - } else { - this.customer_info = __spreadProps(__spreadValues({}, message), { customer }); - resolve(); - } - }); - }); - } else { - return new Promise((resolve) => { - this.customer_info = {}; - resolve(); - }); - } - } - show_discount_control() { - this.$add_discount_elem.css({ "padding": "0px", "border": "none" }); - this.$add_discount_elem.html( - `
` - ); - const me = this; - const frm = me.events.get_frm(); - let discount = frm.doc.additional_discount_percentage; - this.discount_field = null; - if (me.custom_use_additional_discount_amount) { - this.discount_field = frappe.ui.form.make_control({ - df: { - label: __("Discount"), - fieldtype: "Data", - placeholder: discount ? discount : __("Enter discount amount."), - input_class: "input-xs", - onchange: function() { - setTimeout(() => { - if (flt(this.value) != 0) { - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "discount_amount", flt(this.value)); - me.hide_discount_control(this.value); - } else { - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "discount_amount", 0); - me.$add_discount_elem.css({ - "border": "1px dashed var(--gray-500)", - "padding": "var(--padding-sm) var(--padding-md)" - }); - me.$add_discount_elem.html(`${me.get_discount_icon()} ${__("Add Discount")}`); - me.discount_field = void 0; - } - }, 3e3); - } - }, - parent: this.$add_discount_elem.find(".add-discount-field"), - render_input: true - }); - } else { - this.discount_field = frappe.ui.form.make_control({ - df: { - label: __("Discount"), - fieldtype: "Data", - placeholder: discount ? discount + "%" : __("Enter discount percentage."), - input_class: "input-xs", - onchange: function() { - setTimeout(() => { - if (flt(this.value) != 0) { - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "additional_discount_percentage", flt(this.value)); - me.hide_discount_control(this.value); - } else { - frappe.model.set_value(frm.doc.doctype, frm.doc.name, "additional_discount_percentage", 0); - me.$add_discount_elem.css({ - "border": "1px dashed var(--gray-500)", - "padding": "var(--padding-sm) var(--padding-md)" - }); - me.$add_discount_elem.html(`${me.get_discount_icon()} ${__("Add Discount")}`); - me.discount_field = void 0; - } - }, 3e3); - } - }, - parent: this.$add_discount_elem.find(".add-discount-field"), - render_input: true - }); - } - this.discount_field.toggle_label(false); - this.discount_field.set_focus(); - } - hide_discount_control(discount) { - if (!discount) { - this.$add_discount_elem.css({ "padding": "0px", "border": "none" }); - this.$add_discount_elem.html( - `
` - ); - } else { - this.$add_discount_elem.css({ - "border": "1px dashed var(--dark-green-500)", - "padding": "var(--padding-sm) var(--padding-md)" - }); - if (this.custom_use_additional_discount_amount) { - this.$add_discount_elem.html( - `
- ${this.get_discount_icon()} ${__("Additional")} ${String(discount).bold()} ${this.events.get_frm().doc.currency} ${__("discount applied")} -
` - ); - } else { - this.$add_discount_elem.html( - `
- ${this.get_discount_icon()} ${__("Additional")} ${String(discount).bold()}% ${__("discount applied")} -
` - ); - } - } - } - update_customer_section() { - const me = this; - const { customer, email_id = "", mobile_no = "", image } = this.customer_info || {}; - if (customer) { - this.$customer_section.html( - `
-
- ${this.get_customer_image()} -
-
${customer}
- ${get_customer_description()} -
-
- - - -
-
-
` - ); - if (this.mobile_number_based_customer) { - this.$customer_section.find(".reset-customer-btn").css("display", "none"); - } else { - this.$customer_section.find(".reset-customer-btn").css("display", "flex"); - } - } else { - this.reset_customer_selector(); - } - function get_customer_description() { - if (!email_id && !mobile_no) { - return `
${__("Click to add email / phone")}
`; - } else if (email_id && !mobile_no) { - return `
${email_id}
`; - } else if (mobile_no && !email_id) { - return `
${mobile_no}
`; - } else { - return `
${email_id} - ${mobile_no}
`; - } - } - } - get_customer_image() { - const { customer, image } = this.customer_info || {}; - if (image) { - return `
${image}
`; - } else { - return `
${frappe.get_abbr(customer)}
`; - } - } - update_totals_section(frm) { - if (!frm) - frm = this.events.get_frm(); - this.render_net_total(frm.doc.net_total); - this.render_total_item_qty(frm.doc.items); - const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? frm.doc.grand_total : frm.doc.rounded_total; - this.render_grand_total(grand_total); - this.render_taxes(frm.doc.taxes); - } - render_net_total(value) { - const currency = this.events.get_frm().doc.currency; - this.$totals_section.find(".net-total-container").html( - `
${__("Net Total")}
${format_currency(value, currency)}
` - ); - this.$numpad_section.find(".numpad-net-total").html( - `
${__("Net Total")}: ${format_currency(value, currency)}
` - ); - } - render_total_item_qty(items) { - var total_item_qty = 0; - items.map((item) => { - total_item_qty = total_item_qty + item.qty; - }); - this.$totals_section.find(".item-qty-total-container").html( - `
${__("Total Quantity")}
${total_item_qty}
` - ); - this.$numpad_section.find(".numpad-item-qty-total").html( - `
${__("Total Quantity")}: ${total_item_qty}
` - ); - } - render_grand_total(value) { - const currency = this.events.get_frm().doc.currency; - this.$totals_section.find(".grand-total-container").html( - `
${__("Grand Total")}
${format_currency(value, currency)}
` - ); - this.$numpad_section.find(".numpad-grand-total").html( - `
${__("Grand Total")}: ${format_currency(value, currency)}
` - ); - } - render_taxes(taxes) { - if (taxes && taxes.length) { - const currency = this.events.get_frm().doc.currency; - const taxes_html = taxes.map((t) => { - if (t.tax_amount_after_discount_amount == 0) - return; - const description = /[0-9]+/.test(t.description) ? t.description : t.rate != 0 ? `${t.description} @ ${t.rate}%` : t.description; - return `
-
${description}
-
${format_currency(t.tax_amount_after_discount_amount, currency)}
-
`; - }).join(""); - this.$totals_section.find(".taxes-container").css("display", "flex").html(taxes_html); - } else { - this.$totals_section.find(".taxes-container").css("display", "none").html(""); - } - } - get_cart_item({ name }) { - const item_selector = `.cart-item-wrapper[data-row-name="${escape(name)}"]`; - return this.$cart_items_wrapper.find(item_selector); - } - get_item_from_frm(item) { - const doc = this.events.get_frm().doc; - return doc.items.find((i) => i.name == item.name); - } - update_item_html(item, remove_item) { - const $item = this.get_cart_item(item); - if (remove_item) { - $item && $item.next().remove() && $item.remove(); - } else { - const item_row = this.get_item_from_frm(item); - this.render_cart_item(item_row, $item); - } - const no_of_cart_items = this.$cart_items_wrapper.find(".cart-item-wrapper").length; - this.highlight_checkout_btn(true); - this.update_empty_cart_section(no_of_cart_items); - } - render_cart_item(item_data, $item_to_update) { - const currency = this.events.get_frm().doc.currency; - const me = this; - if (!$item_to_update.length) { - this.$cart_items_wrapper.prepend( - `
-
` - ); - $item_to_update = this.get_cart_item(item_data); - } - var item_html = `${get_item_image_html()}`; - if (me.custom_use_discount_percentage && !me.custom_use_discount_amount) { - item_html += `
`; - } - if (me.custom_use_discount_amount && !me.custom_use_discount_percentage) { - item_html += `
`; - } - if (me.custom_use_discount_amount && me.custom_use_discount_percentage) { - item_html += `
`; - } - if (!me.custom_use_discount_amount && !me.custom_use_discount_percentage) { - item_html += `
`; - } - item_html += `
- ${item_data.item_name} -
- ${get_description_html()} -
- ${get_rate_discount_html()}`; - $item_to_update.html(item_html); - if (me.custom_edit_rate) { - this[item_data.item_code + "_qty"] = frappe.ui.form.make_control({ - df: { - fieldname: "qty", - fieldtype: "Float", - onchange: function() { - me.events.form_updated(item_data, "qty", this.value); - } - }, - parent: $item_to_update.find(`.item-qty`), - render_input: true - }); - var uoms = []; - if (item_data.custom_item_uoms) { - uoms = item_data.custom_item_uoms.split(","); - } else if (item_data.uom) { - uoms = [item_data.uom]; - } - if (me.custom_show_uom_in_cart) { - this[item_data.item_code + "_uom"] = frappe.ui.form.make_control({ - df: { - fieldname: "uom", - fieldtype: "Select", - onchange: function() { - me.events.form_updated(item_data, "uom", this.value); - } - }, - parent: $item_to_update.find(`.item-uom`), - render_input: true - }); - } - if (me.show_batch_in_cart) { - this[item_data.item_code + "_batch"] = frappe.ui.form.make_control({ - df: { - fieldname: "batch", - fieldtype: "Link", - options: "Batch", - get_query: function() { - return { - filters: { - item: item_data.item_code - } - }; - }, - onchange: function() { - me.events.form_updated(item_data, "batch_no", this.value); - } - }, - parent: $item_to_update.find(`.item-batch`), - render_input: true - }); - } - this[item_data.item_code + "_rate"] = frappe.ui.form.make_control({ - df: { - fieldname: "rate", - fieldtype: "Float", - read_only: !me.allow_rate_change, - onchange: function() { - me.events.form_updated(item_data, "rate", this.value); - } - }, - parent: $item_to_update.find(`.item-rate`), - render_input: true - }); - if (me.custom_use_discount_percentage) { - this[item_data.item_code + "_discount"] = frappe.ui.form.make_control({ - df: { - fieldname: "discount", - fieldtype: "Float", - onchange: function() { - me.events.form_updated(item_data, "discount_percentage", this.value); - } - }, - parent: $item_to_update.find(`.item-rate-discount`), - render_input: true - }); - } - if (me.custom_use_discount_amount) { - this[item_data.item_code + "_discount_amount"] = frappe.ui.form.make_control({ - df: { - fieldname: "discount_amount", - fieldtype: "Currency", - onchange: function() { - me.events.form_updated(item_data, "discount_amount", this.value); - } - }, - parent: $item_to_update.find(`.item-rate-discount-amount`), - render_input: true - }); - } - if (this.custom_show_incoming_rate) { - this[item_data.item_code + "_incoming_rate"] = frappe.ui.form.make_control({ - df: { - fieldname: "incoming_rate", - fieldtype: "Float", - read_only: 1 - }, - parent: $item_to_update.find(`.item-incoming-rate`), - render_input: true - }); - } - if (this.custom_show_logical_rack_in_cart) { - this[item_data.item_code + "_logical_rack"] = frappe.ui.form.make_control({ - df: { - fieldname: "logical_rack", - fieldtype: "Data", - read_only: 1 - }, - parent: $item_to_update.find(`.item-logical-rack`), - render_input: true - }); - } - if (this.custom_show_last_customer_rate) { - this[item_data.item_code + "_last_customer_rate"] = frappe.ui.form.make_control({ - df: { - fieldname: "last_customer_rate", - fieldtype: "Float", - read_only: 1 - }, - parent: $item_to_update.find(`.item-last-customer-rate`), - render_input: true - }); - } - this[item_data.item_code + "_amount"] = frappe.ui.form.make_control({ - df: { - fieldname: "amount", - fieldtype: "Float", - read_only: 1 - }, - parent: $item_to_update.find(`.item-rate-amount`), - render_input: true - }); - var delete_button = ` `; - var remove_button = frappe.ui.form.make_control({ - df: { - fieldname: "remove", - fieldtype: "Button", - label: delete_button - }, - parent: $item_to_update.find(`.remove-button`), - render_input: true - }); - remove_button.refresh(); - $(remove_button.$input).on("click", function() { - me.events.remove_item_from_cart(item_data); - me.prev_action = void 0; - me.toggle_item_highlight(); - me.events.numpad_event(void 0, "remove"); - }); - this[item_data.item_code + "_qty"].set_value(item_data.qty); - if (me.custom_show_uom_in_cart) { - this[item_data.item_code + "_uom"].df.options = uoms; - this[item_data.item_code + "_uom"].set_value(item_data.uom); - this[item_data.item_code + "_uom"].refresh(); - } - if (me.show_batch_in_cart) { - this[item_data.item_code + "_batch"].set_value(item_data.batch_no); - } - this[item_data.item_code + "_amount"].set_value(item_data.amount); - this[item_data.item_code + "_rate"].set_value(item_data.rate); - if (me.custom_use_discount_percentage) { - this[item_data.item_code + "_discount"].set_value(item_data.discount_percentage); - } - if (me.custom_use_discount_amount) { - this[item_data.item_code + "_discount_amount"].set_value(item_data.discount_amount); - } - if (me.custom_show_incoming_rate) { - this[item_data.item_code + "_incoming_rate"].set_value(item_data.custom_valuation_rate); - } - if (me.custom_show_logical_rack_in_cart) { - this[item_data.item_code + "_logical_rack"].set_value(item_data.custom_logical_rack); - } - if (me.custom_show_last_customer_rate) { - if (me.customer_info.customer) { - frappe.xcall("posnext.posnext.page.posnext.point_of_sale.get_lcr", { - "customer": me.customer_info.customer, - "item_code": item_data.item_code - }).then((d) => { - this[item_data.item_code + "_last_customer_rate"].set_value(d); - }); - } - } - if (me.custom_show_uom_in_cart) { - frappe.xcall("posnext.posnext.page.posnext.point_of_sale.get_uoms", { - "item_code": item_data.item_code - }).then((d) => { - this[item_data.item_code + "_uom"].df.options = d; - this[item_data.item_code + "_uom"].refresh(); - }); - } - } - set_dynamic_rate_header_width(); - function set_dynamic_rate_header_width() { - const rate_cols = Array.from(me.$cart_items_wrapper.find(".item-rate-amount")); - me.$cart_header.find(".rate-amount-header").css("width", ""); - me.$cart_items_wrapper.find(".item-rate-amount").css("width", ""); - let max_width = rate_cols.reduce((max_width2, elm) => { - if ($(elm).width() > max_width2) - max_width2 = $(elm).width(); - return max_width2; - }, 0); - max_width += 1; - if (max_width == 1) - max_width = ""; - me.$cart_header.find(".rate-amount-header").css("width", max_width); - me.$cart_items_wrapper.find(".item-rate-amount").css("width", max_width); - } - function get_rate_discount_html() { - if (me.custom_edit_rate) { - if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { - var html = ` -
-
`; - if (me.custom_show_uom_in_cart) { - html += `
`; - } - if (me.show_batch_in_cart) { - html += `
`; - } - html += `
`; - if (me.custom_use_discount_percentage) { - html += `
`; - } - if (me.custom_use_discount_amount) { - html += `
`; - } - if (me.custom_show_incoming_rate) { - html += `
`; - } - if (me.custom_show_logical_rack_in_cart) { - html += `
`; - } - if (me.custom_show_last_customer_rate) { - html += `
`; - } - html += `
-
-
`; - return html; - } else { - var html = ` -
-
`; - if (me.custom_show_uom_in_cart) { - html += `
`; - } - if (me.show_batch_in_cart) { - html += `
`; - } - html += `
`; - if (me.custom_use_discount_percentage) { - html += `
`; - } - if (me.custom_use_discount_amount) { - html += `
`; - } - if (me.custom_show_incoming_rate) { - html += `
`; - } - if (me.custom_show_logical_rack_in_cart) { - html += `
`; - } - if (me.custom_show_last_customer_rate) { - html += `
`; - } - html += `
-
-
`; - return html; - } - } else { - if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { - return ` -
-
${item_data.qty || 0}
-
${item_data.uom}
-
${item_data.batch}
-
-
${parseFloat(item_data.amount).toFixed(2)}
-
${parseFloat(item_data.rate).toFixed(2)}
-
-
`; - } else { - return ` -
-
${item_data.qty || 0}
-
${item_data.uom}
-
${item_data.batch}
-
-
${parseFloat(item_data.rate).toFixed(2)}
-
-
`; - } - } - } - function get_description_html() { - if (item_data.description) { - if (item_data.description.indexOf("
") != -1) { - try { - item_data.description = $(item_data.description).text(); - } catch (error) { - item_data.description = item_data.description.replace(/
/g, " ").replace(/<\/div>/g, " ").replace(/ +/g, " "); - } - } - item_data.description = frappe.ellipsis(item_data.description, 45); - return `
${item_data.description}
`; - } - return ``; - } - function get_item_image_html() { - const { image, item_name } = item_data; - if (!me.hide_images && image) { - return ` -
- ${frappe.get_abbr(item_name)} -
`; - } else { - return `
${frappe.get_abbr(item_name)}
`; - } - } - } - handle_broken_image($img) { - const item_abbr = $($img).attr("alt"); - $($img).parent().replaceWith(`
${item_abbr}
`); - } - update_selector_value_in_cart_item(selector, value, item) { - const $item_to_update = this.get_cart_item(item); - $item_to_update.attr(`data-${selector}`, escape(value)); - } - toggle_checkout_btn(show_checkout) { - if (show_checkout) { - if (this.show_checkout_button) { - this.$totals_section.find(".checkout-btn").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn").css("display", "none"); - } - if (this.show_held_button) { - this.$totals_section.find(".checkout-btn-held").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn-held").css("display", "none"); - } - if (this.show_order_list_button) { - this.$totals_section.find(".checkout-btn-order").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn-order").css("display", "none"); - } - this.$totals_section.find(".edit-cart-btn").css("display", "none"); - } else { - this.$totals_section.find(".checkout-btn").css("display", "none"); - this.$totals_section.find(".checkout-btn-held").css("display", "none"); - this.$totals_section.find(".checkout-btn-held").css("display", "none"); - this.$totals_section.find(".checkout-btn-order").css("display", "none"); - this.$totals_section.find(".edit-cart-btn").css("display", "flex"); - } - } - highlight_checkout_btn(toggle) { - if (toggle) { - this.$add_discount_elem.css("display", "flex"); - this.$cart_container.find(".checkout-btn").css({ - "background-color": "var(--blue-500)" - }); - if (this.show_held_button) { - this.$cart_container.find(".checkout-btn-held").css({ - "background-color": "var(--blue-500)" - }); - } else { - this.$cart_container.find(".checkout-btn-held").css({ - "background-color": "var(--blue-200)" - }); - } - if (this.show_order_list_button) { - this.$cart_container.find(".checkout-btn-order").css({ - "background-color": "var(--blue-500)" - }); - } else { - this.$cart_container.find(".checkout-btn-order").css({ - "background-color": "var(--blue-500)" - }); - } - } else { - this.$add_discount_elem.css("display", "none"); - this.$cart_container.find(".checkout-btn").css({ - "background-color": "var(--blue-200)" - }); - this.$cart_container.find(".checkout-btn-held").css({ - "background-color": "var(--blue-200)" - }); - this.$cart_container.find(".checkout-btn-order").css({ - "background-color": "var(--blue-500)" - }); - } - } - update_empty_cart_section(no_of_cart_items) { - const $no_item_element = this.$cart_items_wrapper.find(".no-item-wrapper"); - no_of_cart_items > 0 && $no_item_element && $no_item_element.remove() && this.$cart_header.css("display", "flex"); - no_of_cart_items === 0 && !$no_item_element.length && this.make_no_items_placeholder(); - } - on_numpad_event($btn) { - const current_action = $btn.attr("data-button-value"); - const action_is_field_edit = ["qty", "discount_percentage", "rate"].includes(current_action); - const action_is_allowed = action_is_field_edit ? current_action == "rate" && this.allow_rate_change || current_action == "discount_percentage" && this.allow_discount_change || current_action == "qty" : true; - const action_is_pressed_twice = this.prev_action === current_action; - const first_click_event = !this.prev_action; - const field_to_edit_changed = this.prev_action && this.prev_action != current_action; - if (action_is_field_edit) { - if (!action_is_allowed) { - const label = current_action == "rate" ? "Rate".bold() : "Discount".bold(); - const message = __("Editing {0} is not allowed as per POS Profile settings", [label]); - frappe.show_alert({ - indicator: "red", - message - }); - frappe.utils.play_sound("error"); - return; - } - if (first_click_event || field_to_edit_changed) { - this.prev_action = current_action; - } else if (action_is_pressed_twice) { - this.prev_action = void 0; - } - this.numpad_value = ""; - } else if (current_action === "checkout") { - this.prev_action = void 0; - this.toggle_item_highlight(); - this.events.numpad_event(void 0, current_action); - return; - } else if (current_action === "remove") { - this.prev_action = void 0; - this.toggle_item_highlight(); - this.events.numpad_event(void 0, current_action); - return; - } else { - this.numpad_value = current_action === "delete" ? this.numpad_value.slice(0, -1) : this.numpad_value + current_action; - this.numpad_value = this.numpad_value || 0; - } - const first_click_event_is_not_field_edit = !action_is_field_edit && first_click_event; - if (first_click_event_is_not_field_edit) { - frappe.show_alert({ - indicator: "red", - message: __("Please select a field to edit from numpad") - }); - frappe.utils.play_sound("error"); - return; - } - if (flt(this.numpad_value) > 100 && this.prev_action === "discount_percentage") { - frappe.show_alert({ - message: __("Discount cannot be greater than 100%"), - indicator: "orange" - }); - frappe.utils.play_sound("error"); - this.numpad_value = current_action; - } - this.highlight_numpad_btn($btn, current_action); - this.events.numpad_event(this.numpad_value, this.prev_action); - } - highlight_numpad_btn($btn, curr_action) { - const curr_action_is_highlighted = $btn.hasClass("highlighted-numpad-btn"); - const curr_action_is_action = ["qty", "discount_percentage", "rate", "done"].includes(curr_action); - if (!curr_action_is_highlighted) { - $btn.addClass("highlighted-numpad-btn"); - } - if (this.prev_action === curr_action && curr_action_is_highlighted) { - $btn.removeClass("highlighted-numpad-btn"); - } - if (this.prev_action && this.prev_action !== curr_action && curr_action_is_action) { - const prev_btn = $(`[data-button-value='${this.prev_action}']`); - prev_btn.removeClass("highlighted-numpad-btn"); - } - if (!curr_action_is_action || curr_action === "done") { - setTimeout(() => { - $btn.removeClass("highlighted-numpad-btn"); - }, 200); - } - } - toggle_numpad(show) { - if (show) { - this.$totals_section.css("display", "none"); - this.$numpad_section.css("display", "flex"); - } else { - this.$totals_section.css("display", "flex"); - this.$numpad_section.css("display", "none"); - } - this.reset_numpad(); - } - reset_numpad() { - this.numpad_value = ""; - this.prev_action = void 0; - this.$numpad_section.find(".highlighted-numpad-btn").removeClass("highlighted-numpad-btn"); - } - toggle_numpad_field_edit(fieldname) { - if (["qty", "discount_percentage", "rate"].includes(fieldname)) { - this.$numpad_section.find(`[data-button-value="${fieldname}"]`).click(); - } - } - toggle_customer_info(show) { - if (show) { - const { customer } = this.customer_info || {}; - this.$cart_container.css("display", "none"); - this.$customer_section.css({ - "height": "100%", - "padding-top": "0px" - }); - this.$customer_section.find(".customer-details").html( - `
- -
Contact Details
-
- - - -
-
-
- ${this.get_customer_image()} -
-
${customer}
-
-
-
-
- -
-
-
-
-
Recent Transactions
` - ); - this.$customer_section.append(`
`); - if (this.mobile_number_based_customer) { - this.$customer_section.find(".mobile_no-field").css("display", "none"); - this.$customer_section.find(".close-details-btn").css("display", "none"); - } else { - this.$customer_section.find(".mobile_no-field").css("display", "flex"); - this.$customer_section.find(".close-details-btn").css("display", "flex"); - } - this.render_customer_fields(); - this.fetch_customer_transactions(); - } else { - this.$cart_container.css("display", "flex"); - this.$customer_section.css({ - "height": "", - "padding-top": "" - }); - this.update_customer_section(); - } - } - render_customer_fields() { - const $customer_form = this.$customer_section.find(".customer-fields-container"); - const dfs = [{ - fieldname: "email_id", - label: __("Email"), - fieldtype: "Data", - options: "email", - placeholder: __("Enter customer's email") - }, { - fieldname: "mobile_no", - label: __("Phone Number"), - fieldtype: "Data", - placeholder: __("Enter customer's phone number") - }, { - fieldname: "loyalty_program", - label: __("Loyalty Program"), - fieldtype: "Link", - options: "Loyalty Program", - placeholder: __("Select Loyalty Program") - }, { - fieldname: "loyalty_points", - label: __("Loyalty Points"), - fieldtype: "Data", - read_only: 1 - }]; - const me = this; - dfs.forEach((df) => { - this[`customer_${df.fieldname}_field`] = frappe.ui.form.make_control({ - df: __spreadProps(__spreadValues({}, df), { - onchange: handle_customer_field_change - }), - parent: $customer_form.find(`.${df.fieldname}-field`), - render_input: true - }); - this[`customer_${df.fieldname}_field`].set_value(this.customer_info[df.fieldname]); - }); - function handle_customer_field_change() { - const current_value = me.customer_info[this.df.fieldname]; - const current_customer = me.customer_info.customer; - if (this.value && current_value != this.value && this.df.fieldname != "loyalty_points") { - frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.set_customer_info", - args: { - fieldname: this.df.fieldname, - customer: current_customer, - value: this.value - }, - callback: (r) => { - if (!r.exc) { - me.customer_info[this.df.fieldname] = this.value; - frappe.show_alert({ - message: __("Customer contact updated successfully."), - indicator: "green" - }); - frappe.utils.play_sound("submit"); - } - } - }); - } - } - } - fetch_customer_transactions() { - frappe.db.get_list("Sales Invoice", { - filters: { customer: this.customer_info.customer, docstatus: 1 }, - fields: ["name", "grand_total", "status", "posting_date", "posting_time", "currency"], - limit: 20 - }).then((res) => { - const transaction_container = this.$customer_section.find(".customer-transactions"); - if (!res.length) { - transaction_container.html( - `
No recent transactions found
` - ); - return; - } - const elapsed_time = moment(res[0].posting_date + " " + res[0].posting_time).fromNow(); - this.$customer_section.find(".customer-desc").html(`Last transacted ${elapsed_time}`); - res.forEach((invoice) => { - const posting_datetime = moment(invoice.posting_date + " " + invoice.posting_time).format("Do MMMM, h:mma"); - let indicator_color = { - "Paid": "green", - "Draft": "red", - "Return": "gray", - "Consolidated": "blue" - }; - transaction_container.append( - `
-
-
${invoice.name}
-
${posting_datetime}
-
-
-
- ${format_currency(invoice.grand_total, invoice.currency, 0) || 0} -
-
- - ${invoice.status} - -
-
-
-
` - ); - }); - }); - } - attach_refresh_field_event(frm) { - $(frm.wrapper).off("refresh-fields"); - $(frm.wrapper).on("refresh-fields", () => { - if (frm.doc.items.length) { - this.$cart_items_wrapper.html(""); - frm.doc.items.forEach((item) => { - this.update_item_html(item); - }); - } - this.update_totals_section(frm); - }); - } - load_invoice() { - console.log("Load invoice"); - const frm = this.events.get_frm(); - this.attach_refresh_field_event(frm); - this.fetch_customer_details(frm.doc.customer).then(() => { - this.events.customer_details_updated(this.customer_info); - this.update_customer_section(); - this.$cart_items_wrapper.html(""); - if (frm.doc.items.length) { - frm.doc.items.forEach((item) => { - this.update_item_html(item); - }); - } else { - this.make_no_items_placeholder(); - this.highlight_checkout_btn(true); - } - this.update_totals_section(frm); - if (frm.doc.docstatus === 1) { - this.$totals_section.find(".checkout-btn").css("display", "none"); - this.$totals_section.find(".checkout-btn-held").css("display", "none"); - if (this.show_order_list_button) { - this.$totals_section.find(".checkout-btn-order").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn-order").css("display", "none"); - } - this.$totals_section.find(".edit-cart-btn").css("display", "none"); - } else { - if (this.show_checkout_button) { - this.$totals_section.find(".checkout-btn").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn").css("display", "none"); - } - if (this.show_held_button) { - this.$totals_section.find(".checkout-btn-held").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn-held").css("display", "none"); - } - if (this.show_order_list_button) { - this.$totals_section.find(".checkout-btn-order").css("display", "flex"); - } else { - this.$totals_section.find(".checkout-btn-order").css("display", "none"); - } - this.$totals_section.find(".edit-cart-btn").css("display", "none"); - } - this.toggle_component(true); - }); - } - toggle_component(show) { - show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); - } - show_reference_dialog(mobile_number = null) { - const me = this; - const dialog = new frappe.ui.Dialog({ - title: __("Enter Reference Details"), - fields: [ - { - fieldtype: "Data", - label: __("Reference Number"), - fieldname: "reference_no", - reqd: 1 - }, - { - fieldtype: "Data", - label: __("Reference Name"), - fieldname: "reference_name", - reqd: 1 - } - ], - primary_action_label: __("Hold Invoice"), - primary_action: async (values) => { - if (mobile_number) { - await frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.create_customer", - args: { customer: mobile_number }, - freeze: true, - freeze_message: "Creating Customer...." - }); - const frm2 = me.events.get_frm(); - await frappe.model.set_value(frm2.doc.doctype, frm2.doc.name, "customer", mobile_number); - await frm2.script_manager.trigger("customer", frm2.doc.doctype, frm2.doc.name); - } - const frm = me.events.get_frm(); - frm.doc.custom_reference_no = values.reference_no; - frm.doc.custom_reference_name = values.reference_name; - dialog.hide(); - await me.events.save_draft_invoice(); - } - }); - dialog.show(); - } - async hold_invoice(mobile_number = null) { - if (mobile_number) { - await frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.create_customer", - args: { customer: mobile_number }, - freeze: true, - freeze_message: "Creating Customer...." - }); - const frm = this.events.get_frm(); - await frappe.model.set_value(frm.doc.doctype, frm.doc.name, "customer", mobile_number); - await frm.script_manager.trigger("customer", frm.doc.doctype, frm.doc.name); - } - await this.events.save_draft_invoice(); - } - }; - - // ../posnext/posnext/public/js/pos_item_details.js - frappe.provide("posnext.PointOfSale"); - posnext.PointOfSale.ItemDetails = class { - constructor({ wrapper, events, settings }) { - this.wrapper = wrapper; - this.events = events; - this.hide_images = settings.hide_images; - this.allow_rate_change = settings.allow_rate_change; - this.allow_discount_change = settings.allow_discount_change; - this.custom_edit_rate_and_uom = settings.custom_edit_rate_and_uom; - this.current_item = {}; - this.init_component(); - } - init_component() { - this.prepare_dom(); - this.init_child_components(); - this.bind_events(); - this.attach_shortcuts(); - } - prepare_dom() { - this.wrapper.append( - `
` - ); - this.$component = this.wrapper.find(".item-details-container"); - } - init_child_components() { - this.$component.html( - `
-
${__("Item Detailss")}
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
-
` - ); - this.$item_name = this.$component.find(".item-name"); - this.$item_description = this.$component.find(".item-desc"); - this.$item_price = this.$component.find(".item-price"); - this.$item_image = this.$component.find(".item-image"); - this.$form_container = this.$component.find(".form-container"); - this.$dicount_section = this.$component.find(".discount-section"); - this.$serial_batch_container = this.$component.find(".serial-batch-container"); - } - compare_with_current_item(item) { - return item && item.name == this.current_item.name; - } - async toggle_item_details_section(item) { - const current_item_changed = !this.compare_with_current_item(item); - const hide_item_details = !Boolean(item) || !current_item_changed; - if (!hide_item_details && current_item_changed || hide_item_details) { - await this.validate_serial_batch_item(); - } - if (!this.custom_edit_rate_and_uom) { - this.events.toggle_item_selector(!hide_item_details); - this.toggle_component(!hide_item_details); - } - if (item && current_item_changed) { - this.doctype = item.doctype; - this.item_meta = frappe.get_meta(this.doctype); - this.name = item.name; - this.item_row = item; - this.currency = this.events.get_frm().doc.currency; - this.current_item = item; - this.render_dom(item); - this.render_discount_dom(item); - this.render_form(item); - this.events.highlight_cart_item(item); - } else { - this.current_item = {}; - } - } - validate_serial_batch_item() { - const doc = this.events.get_frm().doc; - const item_row = doc.items.find((item) => item.name === this.name); - if (!item_row) - return; - const serialized = item_row.has_serial_no; - const batched = item_row.has_batch_no; - const no_bundle_selected = !item_row.serial_and_batch_bundle; - if (serialized && no_bundle_selected || batched && no_bundle_selected) { - frappe.show_alert({ - message: __("Item is removed since no serial / batch no selected."), - indicator: "orange" - }); - frappe.utils.play_sound("cancel"); - return this.events.remove_item_from_cart(); - } - } - render_dom(item) { - let { item_name, description, image, price_list_rate } = item; - function get_description_html() { - if (description) { - description = description.indexOf("...") === -1 && description.length > 140 ? description.substr(0, 139) + "..." : description; - return description; - } - return ``; - } - this.$item_name.html(item_name); - this.$item_description.html(get_description_html()); - this.$item_price.html(format_currency(price_list_rate, this.currency)); - if (!this.hide_images && image) { - this.$item_image.html( - `${frappe.get_abbr(item_name)}` - ); - } else { - this.$item_image.html(`
${frappe.get_abbr(item_name)}
`); - } - } - handle_broken_image($img) { - const item_abbr = $($img).attr("alt"); - $($img).replaceWith(`
${item_abbr}
`); - } - render_discount_dom(item) { - if (item.discount_percentage) { - this.$dicount_section.html( - `
${format_currency(item.price_list_rate, this.currency)}
-
${item.discount_percentage}% off
` - ); - this.$item_price.html(format_currency(item.rate, this.currency)); - } else { - this.$dicount_section.html(``); - } - } - render_form(item) { - const fields_to_display = this.get_form_fields(item); - this.$form_container.html(""); - fields_to_display.forEach((fieldname, idx) => { - this.$form_container.append( - `
` - ); - const field_meta = this.item_meta.fields.find((df) => df.fieldname === fieldname); - fieldname === "discount_percentage" ? field_meta.label = __("Discount (%)") : ""; - const me = this; - var uoms = []; - frappe.db.get_doc("Item", me.current_item.item_code).then((doc) => { - uoms = doc.uoms.map((item2) => item2.uom); - }); - this[`${fieldname}_control`] = frappe.ui.form.make_control({ - df: __spreadProps(__spreadValues({}, field_meta), { - onchange: function() { - me.events.form_updated(me.current_item, fieldname, this.value); - }, - get_query: function() { - if (fieldname === "uom") { - return { - filters: { - name: ["in", uoms] - } - }; - } - return; - } - }), - parent: this.$form_container.find(`.${fieldname}-control`), - render_input: true - }); - this[`${fieldname}_control`].set_value(item[fieldname]); - }); - this.make_auto_serial_selection_btn(item); - this.bind_custom_control_change_event(); - } - get_form_fields(item) { - const fields = ["qty", "uom", "rate", "conversion_factor", "discount_percentage", "warehouse", "actual_qty", "price_list_rate"]; - if (item.has_serial_no) - fields.push("serial_no"); - if (item.has_batch_no) - fields.push("batch_no"); - return fields; - } - make_auto_serial_selection_btn(item) { - if (item.has_serial_no || item.has_batch_no) { - const label = item.has_serial_no ? __("Select Serial No") : __("Select Batch No"); - this.$form_container.append( - `
${label}
` - ); - this.$form_container.find(".serial_no-control").find("textarea").css("height", "6rem"); - } - } - bind_custom_control_change_event() { - const me = this; - if (this.rate_control) { - this.rate_control.df.onchange = function() { - if (this.value || flt(this.value) === 0) { - me.events.form_updated(me.current_item, "rate", this.value).then(() => { - const item_row = frappe.get_doc(me.doctype, me.name); - const doc = me.events.get_frm().doc; - me.$item_price.html(format_currency(item_row.rate, doc.currency)); - me.render_discount_dom(item_row); - }); - } - }; - this.rate_control.df.read_only = !this.allow_rate_change; - this.rate_control.refresh(); - } - if (this.discount_percentage_control && !this.allow_discount_change) { - this.discount_percentage_control.df.read_only = 1; - this.discount_percentage_control.refresh(); - } - if (this.warehouse_control) { - this.warehouse_control.df.reqd = 1; - this.warehouse_control.df.onchange = function() { - if (this.value) { - me.events.form_updated(me.current_item, "warehouse", this.value).then(() => { - me.item_stock_map = me.events.get_item_stock_map(); - const available_qty = me.item_stock_map[me.item_row.item_code][this.value][0]; - const is_stock_item = Boolean(me.item_stock_map[me.item_row.item_code][this.value][1]); - if (available_qty === void 0) { - me.events.get_available_stock(me.item_row.item_code, this.value).then(() => { - me.warehouse_control.set_value(this.value); - }); - } else if (available_qty === 0 && is_stock_item) { - me.warehouse_control.set_value(""); - const bold_item_code = me.item_row.item_code.bold(); - const bold_warehouse = this.value.bold(); - frappe.throw( - __("Item Code: {0} is not available under warehouse {1}.", [bold_item_code, bold_warehouse]) - ); - } - me.actual_qty_control.set_value(available_qty); - }); - } - }; - this.warehouse_control.df.get_query = () => { - return { - filters: { company: this.events.get_frm().doc.company } - }; - }; - this.warehouse_control.refresh(); - } - if (this.serial_no_control) { - this.serial_no_control.df.reqd = 1; - this.serial_no_control.df.onchange = async function() { - !me.current_item.batch_no && await me.auto_update_batch_no(); - me.events.form_updated(me.current_item, "serial_no", this.value); - }; - this.serial_no_control.refresh(); - } - if (this.batch_no_control) { - this.batch_no_control.df.reqd = 1; - this.batch_no_control.df.get_query = () => { - return { - query: "erpnext.controllers.queries.get_batch_no", - filters: { - item_code: me.item_row.item_code, - warehouse: me.item_row.warehouse, - posting_date: me.events.get_frm().doc.posting_date - } - }; - }; - this.batch_no_control.refresh(); - } - if (this.uom_control) { - this.uom_control.df.onchange = function() { - me.events.form_updated(me.current_item, "uom", this.value); - const item_row = frappe.get_doc(me.doctype, me.name); - me.conversion_factor_control.df.read_only = item_row.stock_uom == this.value; - me.conversion_factor_control.refresh(); - }; - } - frappe.model.on("POS Invoice Item", "*", (fieldname, value, item_row) => { - const field_control = this[`${fieldname}_control`]; - const item_row_is_being_edited = this.compare_with_current_item(item_row); - if (item_row_is_being_edited && field_control && field_control.get_value() !== value) { - field_control.set_value(value); - cur_pos.update_cart_html(item_row); - } - }); - } - async auto_update_batch_no() { - if (this.serial_no_control && this.batch_no_control) { - const selected_serial_nos = this.serial_no_control.get_value().split(` -`).filter((s) => s); - if (!selected_serial_nos.length) - return; - const serials_with_batch_no = await frappe.db.get_list("Serial No", { - filters: { "name": ["in", selected_serial_nos] }, - fields: ["batch_no", "name"] - }); - const batch_serial_map = serials_with_batch_no.reduce((acc, r) => { - if (!acc[r.batch_no]) { - acc[r.batch_no] = []; - } - acc[r.batch_no] = [...acc[r.batch_no], r.name]; - return acc; - }, {}); - const batch_no = Object.keys(batch_serial_map)[0]; - const batch_serial_nos = batch_serial_map[batch_no].join(` -`); - const serial_nos_belongs_to_other_batch = selected_serial_nos.length !== batch_serial_map[batch_no].length; - const current_batch_no = this.batch_no_control.get_value(); - current_batch_no != batch_no && await this.batch_no_control.set_value(batch_no); - if (serial_nos_belongs_to_other_batch) { - this.serial_no_control.set_value(batch_serial_nos); - this.qty_control.set_value(batch_serial_map[batch_no].length); - delete batch_serial_map[batch_no]; - this.events.clone_new_batch_item_in_frm(batch_serial_map, this.current_item); - } - } - } - bind_events() { - this.bind_auto_serial_fetch_event(); - this.bind_fields_to_numpad_fields(); - this.$component.on("click", ".close-btn", () => { - this.events.close_item_details(); - }); - } - attach_shortcuts() { - this.wrapper.find(".close-btn").attr("title", "Esc"); - frappe.ui.keys.on("escape", () => { - const item_details_visible = this.$component.is(":visible"); - if (item_details_visible) { - this.events.close_item_details(); - } - }); - } - bind_fields_to_numpad_fields() { - const me = this; - this.$form_container.on("click", ".input-with-feedback", function() { - const fieldname = $(this).attr("data-fieldname"); - if (this.last_field_focused != fieldname) { - me.events.item_field_focused(fieldname); - this.last_field_focused = fieldname; - } - }); - } - bind_auto_serial_fetch_event() { - this.$form_container.on("click", ".auto-fetch-btn", () => { - frappe.require("assets/erpnext/js/utils/serial_no_batch_selector.js", () => { - let frm = this.events.get_frm(); - let item_row = this.item_row; - item_row.type_of_transaction = "Outward"; - new erpnext.SerialBatchPackageSelector(frm, item_row, (r) => { - if (r) { - frappe.model.set_value(item_row.doctype, item_row.name, { - "serial_and_batch_bundle": r.name, - "qty": Math.abs(r.total_qty) - }); - } - }); - }); - }); - } - toggle_component(show) { - show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); - } - }; - - // ../posnext/posnext/public/js/pos_number_pad.js - frappe.provide("posnext.PointOfSale"); - posnext.PointOfSale.NumberPad = class { - constructor({ wrapper, events, cols, keys, css_classes, fieldnames_map }) { - this.wrapper = wrapper; - this.events = events; - this.cols = cols; - this.keys = keys; - this.css_classes = css_classes || []; - this.fieldnames = fieldnames_map || {}; - this.init_component(); - } - init_component() { - this.prepare_dom(); - this.bind_events(); - } - prepare_dom() { - const { cols, keys, css_classes, fieldnames } = this; - function get_keys() { - return keys.reduce((a, row, i) => { - return a + row.reduce((a2, number, j) => { - const class_to_append = css_classes && css_classes[i] ? css_classes[i][j] : ""; - const fieldname = fieldnames && fieldnames[number] ? fieldnames[number] : typeof number === "string" ? frappe.scrub(number) : number; - return a2 + `
${__(number)}
`; - }, ""); - }, ""); - } - this.wrapper.html( - `
- ${get_keys()} -
` - ); - } - bind_events() { - const me = this; - this.wrapper.on("click", ".numpad-btn", function() { - const $btn = $(this); - me.events.numpad_event($btn); - }); - } - }; - - // ../posnext/posnext/public/js/pos_payment.js - frappe.provide("posnext.PointOfSale"); - posnext.PointOfSale.Payment = class { - constructor({ events, wrapper, settings }) { - this.wrapper = wrapper; - this.events = events; - this.custom_show_sales_man = settings.custom_show_sales_man; - this.custom_show_additional_note = settings.custom_show_additional_note; - this.custom_edit_rate = settings.custom_edit_rate_and_uom; - this.custom_show_credit_sales = settings.custom_show_credit_sales; - this.default_payment = settings.default_payment; - this.current_payments = []; - this.enable_coupon_code = settings.enable_coupon_code; - this.init_component(); - if (this.enable_coupon_code) { - this.render_coupon_code_field(); - } - } - init_component() { - this.prepare_dom(); - this.initialize_numpad(); - this.bind_events(); - this.attach_shortcuts(); - } - prepare_dom() { - this.wrapper.append( - `
- -
-
-
- -
-
-
-
-
-
-
-
-
${__("Complete Order")}
-
` - ); - this.$component = this.wrapper.find(".payment-container"); - this.$payment_modes = this.$component.find(".payment-modes"); - this.$totals_section = this.$component.find(".totals-section"); - this.$totals = this.$component.find(".totals"); - this.$numpad = this.$component.find(".number-pad"); - this.$coupon_code = this.$component.find(".coupon-code"); - this.$invoice_fields_section = this.$component.find(".fields-section"); - } - render_coupon_code_field() { - frappe.ui.form.make_control({ - df: { - label: __("Coupon Code"), - fieldtype: "Link", - options: "Coupon Code", - fieldname: "coupon_code", - placeholder: __("Select a coupon") - }, - parent: this.$component.find(".coupon-code"), - render_input: true - }); - } - make_invoice_fields_control() { - var me = this; - const fields = []; - if (this.custom_show_credit_sales) { - fields.push({ - fieldname: "custom_credit_sales", - label: "Credit Sales", - fieldtype: "Check" - }); - } - if (this.custom_show_sales_man) { - fields.push({ - fieldname: "sales_person", - label: "Sales Man", - fieldtype: "Link", - options: "Sales Person" - }); - } - if (this.custom_show_additional_note) { - fields.push({ - fieldname: "remarks", - label: "Additional Note", - fieldtype: "Small Text" - }); - } - if (!fields.length) - return; - this.$invoice_fields = this.$invoice_fields_section.find(".invoice-fields"); - this.$invoice_fields.html(""); - const frm = this.events.get_frm(); - me.current_payments = frm.doc.payments; - fields.forEach((df) => { - this.$invoice_fields.append( - `
` - ); - let df_events = { - onchange: function() { - if (this.df.fieldname === "sales_person") { - frm.clear_table("sales_team"); - cur_frm.add_child("sales_team", { - sales_person: this.get_value(), - allocated_percentage: 100 - }); - } else { - if (this.df.fieldname === "custom_credit_sales") { - if (this.get_value()) { - frm.doc.payments.forEach((p) => { - const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - me[`${mode}_control`].set_value(0); - }); - } else { - console.log(me.current_payments); - me.current_payments.forEach((p) => { - if (p.mode_of_payment === me.default_payment) { - const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - me[`${mode}_control`].set_value(frm.doc.grand_total); - } - }); - } - } - frm.set_value(this.df.fieldname, this.get_value()); - } - } - }; - if (df.fieldtype == "Button") { - df_events = { - click: function() { - if (frm.script_manager.has_handlers(df.fieldname, frm.doc.doctype)) { - frm.script_manager.trigger(df.fieldname, frm.doc.doctype, frm.doc.docname); - } - } - }; - } - this[`${df.fieldname}_field`] = frappe.ui.form.make_control({ - df: __spreadValues(__spreadValues({}, df), df_events), - parent: this.$invoice_fields.find(`.${df.fieldname}-field`), - render_input: true - }); - if (df.fieldname !== "remarks") { - this[`${df.fieldname}_field`].set_value(frm.doc[df.fieldname]); - } - }); - } - initialize_numpad() { - const me = this; - this.number_pad = new posnext.PointOfSale.NumberPad({ - wrapper: this.$numpad, - events: { - numpad_event: function($btn) { - me.on_numpad_clicked($btn); - } - }, - cols: 3, - keys: [ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9], - [".", 0, "Delete"] - ] - }); - this.numpad_value = ""; - } - on_numpad_clicked($btn) { - const button_value = $btn.attr("data-button-value"); - highlight_numpad_btn($btn); - this.numpad_value = button_value === "delete" ? this.numpad_value.slice(0, -1) : this.numpad_value + button_value; - this.selected_mode.$input.get(0).focus(); - this.selected_mode.set_value(this.numpad_value); - function highlight_numpad_btn($btn2) { - $btn2.addClass("shadow-base-inner bg-selected"); - setTimeout(() => { - $btn2.removeClass("shadow-base-inner bg-selected"); - }, 100); - } - } - bind_events() { - const me = this; - this.$payment_modes.on("click", ".mode-of-payment", function(e) { - const mode_clicked = $(this); - if (!$(e.target).is(mode_clicked)) - return; - const scrollLeft = mode_clicked.offset().left - me.$payment_modes.offset().left + me.$payment_modes.scrollLeft(); - me.$payment_modes.animate({ scrollLeft }); - const mode = mode_clicked.attr("data-mode"); - $(`.mode-of-payment-control`).css("display", "none"); - $(`.cash-shortcuts`).css("display", "none"); - me.$payment_modes.find(`.pay-amount`).css("display", "inline"); - me.$payment_modes.find(`.loyalty-amount-name`).css("display", "none"); - $(".mode-of-payment").removeClass("border-primary"); - if (mode_clicked.hasClass("border-primary")) { - mode_clicked.removeClass("border-primary"); - me.selected_mode = ""; - } else { - mode_clicked.addClass("border-primary"); - mode_clicked.find(".mode-of-payment-control").css("display", "flex"); - mode_clicked.find(".cash-shortcuts").css("display", "grid"); - me.$payment_modes.find(`.${mode}-amount`).css("display", "none"); - me.$payment_modes.find(`.${mode}-name`).css("display", "inline"); - me.selected_mode = me[`${mode}_control`]; - me.selected_mode && me.selected_mode.$input.get(0).focus(); - me.auto_set_remaining_amount(); - } - }); - frappe.ui.form.on("POS Invoice", "contact_mobile", (frm) => { - var _a; - const contact = frm.doc.contact_mobile; - const request_button = $((_a = this.request_for_payment_field) == null ? void 0 : _a.$input[0]); - if (contact) { - request_button.removeClass("btn-default").addClass("btn-primary"); - } else { - request_button.removeClass("btn-primary").addClass("btn-default"); - } - }); - frappe.ui.form.on("POS Invoice", "coupon_code", (frm) => { - if (frm.doc.coupon_code && !frm.applying_pos_coupon_code) { - if (!frm.doc.ignore_pricing_rule) { - frm.applying_pos_coupon_code = true; - frappe.run_serially([ - () => frm.doc.ignore_pricing_rule = 1, - () => frm.trigger("ignore_pricing_rule"), - () => frm.doc.ignore_pricing_rule = 0, - () => frm.trigger("apply_pricing_rule"), - () => frm.save(), - () => this.update_totals_section(frm.doc), - () => frm.applying_pos_coupon_code = false - ]); - } else if (frm.doc.ignore_pricing_rule) { - frappe.show_alert({ - message: __("Ignore Pricing Rule is enabled. Cannot apply coupon code."), - indicator: "orange" - }); - } - } - }); - this.setup_listener_for_payments(); - this.$payment_modes.on("click", ".shortcut", function() { - const value = $(this).attr("data-value"); - me.selected_mode.set_value(value); - }); - this.$component.on("click", ".submit-order-btn", () => { - const doc = this.events.get_frm().doc; - let paid_amount = doc.paid_amount; - if (cur_frm.doc.custom_credit_sales && this.custom_show_credit_sales) { - cur_frm.clear_table("payments"); - paid_amount = 0; - } - const items = doc.items; - if ((paid_amount == 0 || !items.length) && !this.custom_show_credit_sales) { - const message = items.length ? __("You cannot submit the order without payment.") : __("You cannot submit empty order."); - frappe.show_alert({ message, indicator: "orange" }); - frappe.utils.play_sound("error"); - return; - } - this.events.submit_invoice(); - }); - frappe.ui.form.on("POS Invoice", "paid_amount", (frm) => { - this.update_totals_section(frm.doc); - const is_cash_shortcuts_invisible = !this.$payment_modes.find(".cash-shortcuts").is(":visible"); - this.attach_cash_shortcuts(frm.doc); - !is_cash_shortcuts_invisible && this.$payment_modes.find(".cash-shortcuts").css("display", "grid"); - this.render_payment_mode_dom(); - }); - frappe.ui.form.on("POS Invoice", "loyalty_amount", (frm) => { - const formatted_currency = format_currency(frm.doc.loyalty_amount, frm.doc.currency); - this.$payment_modes.find(`.loyalty-amount-amount`).html(formatted_currency); - }); - frappe.ui.form.on("Sales Invoice Payment", "amount", (frm, cdt, cdn) => { - const default_mop = locals[cdt][cdn]; - const mode = default_mop.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - if (this[`${mode}_control`] && this[`${mode}_control`].get_value() != default_mop.amount) { - this[`${mode}_control`].set_value(default_mop.amount); - } - }); - } - setup_listener_for_payments() { - frappe.realtime.on("process_phone_payment", (data) => { - const doc = this.events.get_frm().doc; - const { response, amount, success, failure_message } = data; - let message, title; - if (success) { - title = __("Payment Received"); - const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; - if (amount >= grand_total) { - frappe.dom.unfreeze(); - message = __("Payment of {0} received successfully.", [format_currency(amount, doc.currency, 0)]); - this.events.submit_invoice(); - cur_frm.reload_doc(); - } else { - message = __("Payment of {0} received successfully. Waiting for other requests to complete...", [format_currency(amount, doc.currency, 0)]); - } - } else if (failure_message) { - message = failure_message; - title = __("Payment Failed"); - } - frappe.msgprint({ "message": message, "title": title }); - }); - } - auto_set_remaining_amount() { - const doc = this.events.get_frm().doc; - const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; - const remaining_amount = grand_total - doc.paid_amount; - const current_value = this.selected_mode ? this.selected_mode.get_value() : void 0; - if (!current_value && remaining_amount > 0 && this.selected_mode) { - this.selected_mode.set_value(remaining_amount); - } - } - attach_shortcuts() { - const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; - this.$component.find(".submit-order-btn").attr("title", `${ctrl_label}+Enter`); - frappe.ui.keys.on("ctrl+enter", () => { - const payment_is_visible = this.$component.is(":visible"); - const active_mode = this.$payment_modes.find(".border-primary"); - if (payment_is_visible && active_mode.length) { - this.$component.find(".submit-order-btn").click(); - } - }); - frappe.ui.keys.add_shortcut({ - shortcut: "tab", - action: () => { - const payment_is_visible = this.$component.is(":visible"); - let active_mode = this.$payment_modes.find(".border-primary"); - active_mode = active_mode.length ? active_mode.attr("data-mode") : void 0; - if (!active_mode) - return; - const mode_of_payments = Array.from(this.$payment_modes.find(".mode-of-payment")).map((m) => $(m).attr("data-mode")); - const mode_index = mode_of_payments.indexOf(active_mode); - const next_mode_index = (mode_index + 1) % mode_of_payments.length; - const next_mode_to_be_clicked = this.$payment_modes.find(`.mode-of-payment[data-mode="${mode_of_payments[next_mode_index]}"]`); - if (payment_is_visible && mode_index != next_mode_index) { - next_mode_to_be_clicked.click(); - } - }, - condition: () => this.$component.is(":visible") && this.$payment_modes.find(".border-primary").length, - description: __("Switch Between Payment Modes"), - ignore_inputs: true, - page: cur_page.page.page - }); - } - toggle_numpad() { - } - render_payment_section() { - this.render_payment_mode_dom(); - this.make_invoice_fields_control(); - this.update_totals_section(); - this.focus_on_default_mop(); - } - after_render() { - const frm = this.events.get_frm(); - frm.script_manager.trigger("after_payment_render", frm.doc.doctype, frm.doc.docname); - } - edit_cart() { - if (this.custom_edit_rate) { - const div = document.getElementById("customer-cart-container2"); - div.style.gridColumn = "span 5 / span 5"; - } - this.events.toggle_other_sections(false); - this.toggle_component(false); - } - checkout() { - this.events.toggle_other_sections(true); - this.toggle_component(true); - this.render_payment_section(); - this.after_render(); - } - toggle_remarks_control() { - if (this.$remarks.find(".frappe-control").length) { - this.$remarks.html("+ Add Remark"); - } else { - this.$remarks.html(""); - this[`remark_control`] = frappe.ui.form.make_control({ - df: { - label: __("Remark"), - fieldtype: "Data", - onchange: function() { - } - }, - parent: this.$totals_section.find(`.remarks`), - render_input: true - }); - this[`remark_control`].set_value(""); - } - } - render_payment_mode_dom() { - const doc = this.events.get_frm().doc; - const payments = doc.payments; - const currency = doc.currency; - this.$payment_modes.html(`${payments.map((p, i) => { - const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - const payment_type = p.type; - const margin = i % 2 === 0 ? "pr-2" : "pl-2"; - const amount = p.amount > 0 ? format_currency(p.amount, currency) : ""; - return ` -
-
- ${p.mode_of_payment} -
${amount}
-
-
-
- `; - }).join("")}`); - this.current_payments = payments; - payments.forEach((p) => { - const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - const me = this; - this[`${mode}_control`] = frappe.ui.form.make_control({ - df: { - label: p.mode_of_payment, - fieldtype: "Currency", - placeholder: __("Enter {0} amount.", [p.mode_of_payment]), - onchange: function() { - console.log(p.doctype); - console.log(p.name); - const current_value = frappe.model.get_value(p.doctype, p.name, "amount"); - if (current_value != this.value) { - frappe.model.set_value(p.doctype, p.name, "amount", flt(this.value)).then(() => me.update_totals_section()); - const formatted_currency = format_currency(this.value, currency); - me.$payment_modes.find(`.${mode}-amount`).html(formatted_currency); - } - } - }, - parent: this.$payment_modes.find(`.${mode}.mode-of-payment-control`), - render_input: true - }); - this[`${mode}_control`].toggle_label(false); - this[`${mode}_control`].set_value(p.amount); - }); - this.render_loyalty_points_payment_mode(); - this.attach_cash_shortcuts(doc); - } - focus_on_default_mop() { - const doc = this.events.get_frm().doc; - const payments = doc.payments; - payments.forEach((p) => { - const mode = p.mode_of_payment.replace(/ +/g, "_").toLowerCase(); - if (p.default) { - setTimeout(() => { - this.$payment_modes.find(`.${mode}.mode-of-payment-control`).parent().click(); - }, 500); - } - }); - } - attach_cash_shortcuts(doc) { - const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; - const currency = doc.currency; - const shortcuts = this.get_cash_shortcuts(flt(grand_total)); - this.$payment_modes.find(".cash-shortcuts").remove(); - let shortcuts_html = shortcuts.map((s) => { - return `
${format_currency(s, currency, 0)}
`; - }).join(""); - this.$payment_modes.find('[data-payment-type="Cash"]').find(".mode-of-payment-control").after(`
${shortcuts_html}
`); - } - get_cash_shortcuts(grand_total) { - let steps = [1, 5, 10]; - const digits = String(Math.round(grand_total)).length; - steps = steps.map((x) => x * 10 ** (digits - 2)); - const get_nearest = (amount, x) => { - let nearest_x = Math.ceil(amount / x) * x; - return nearest_x === amount ? nearest_x + x : nearest_x; - }; - return steps.reduce((finalArr, x) => { - let nearest_x = get_nearest(grand_total, x); - nearest_x = finalArr.indexOf(nearest_x) != -1 ? nearest_x + x : nearest_x; - return [...finalArr, nearest_x]; - }, []); - } - render_loyalty_points_payment_mode() { - const me = this; - const doc = this.events.get_frm().doc; - const { loyalty_program, loyalty_points, conversion_factor } = this.events.get_customer_details(); - this.$payment_modes.find(`.mode-of-payment[data-mode="loyalty-amount"]`).parent().remove(); - if (!loyalty_program) - return; - let description, read_only, max_redeemable_amount; - if (!loyalty_points) { - description = __("You don't have enough points to redeem."); - read_only = true; - } else { - max_redeemable_amount = flt(flt(loyalty_points) * flt(conversion_factor), precision("loyalty_amount", doc)); - description = __("You can redeem upto {0}.", [format_currency(max_redeemable_amount)]); - read_only = false; - } - const margin = this.$payment_modes.children().length % 2 === 0 ? "pr-2" : "pl-2"; - const amount = doc.loyalty_amount > 0 ? format_currency(doc.loyalty_amount, doc.currency) : ""; - this.$payment_modes.append( - `
-
- Redeem Loyalty Points -
${amount}
-
${loyalty_program}
-
-
-
` - ); - this["loyalty-amount_control"] = frappe.ui.form.make_control({ - df: { - label: __("Redeem Loyalty Points"), - fieldtype: "Currency", - placeholder: __("Enter amount to be redeemed."), - options: "company:currency", - read_only, - onchange: async function() { - if (!loyalty_points) - return; - if (this.value > max_redeemable_amount) { - frappe.show_alert({ - message: __("You cannot redeem more than {0}.", [format_currency(max_redeemable_amount)]), - indicator: "red" - }); - frappe.utils.play_sound("submit"); - me["loyalty-amount_control"].set_value(0); - return; - } - const redeem_loyalty_points = this.value > 0 ? 1 : 0; - await frappe.model.set_value(doc.doctype, doc.name, "redeem_loyalty_points", redeem_loyalty_points); - frappe.model.set_value(doc.doctype, doc.name, "loyalty_points", parseInt(this.value / conversion_factor)); - }, - description - }, - parent: this.$payment_modes.find(`.loyalty-amount.mode-of-payment-control`), - render_input: true - }); - this["loyalty-amount_control"].toggle_label(false); - } - render_add_payment_method_dom() { - const docstatus = this.events.get_frm().doc.docstatus; - if (docstatus === 0) - this.$payment_modes.append( - `
-
+ Add Payment Method
-
` - ); - } - update_totals_section(doc) { - if (!doc) - doc = this.events.get_frm().doc; - let branch_value = $('.input-with-feedback[data-fieldname="branch"]').val(); - frappe.model.set_value(cur_frm.doctype, cur_frm.docname, "branch", branch_value); - cur_frm.save(); - const paid_amount = doc.paid_amount; - if (cur_frm.doc.custom_credit_sales) { - const paid_amount2 = 0; - } - const grand_total = cint(frappe.sys_defaults.disable_rounded_total) ? doc.grand_total : doc.rounded_total; - const remaining = grand_total - doc.paid_amount; - const change = doc.change_amount || remaining <= 0 ? -1 * remaining : void 0; - const currency = doc.currency; - const label = change ? __("Change") : __("To Be Paid"); - this.$totals.html( - `
-
${__("Grand Total")}
-
${format_currency(grand_total, currency)}
-
-
-
-
${__("Paid Amount")}
-
${format_currency(paid_amount, currency)}
-
-
-
-
${label}
-
${format_currency(change || remaining, currency)}
-
` - ); - } - toggle_component(show) { - show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); - } - }; - - // ../posnext/posnext/public/js/pos_past_order_list.js - frappe.provide("posnext.PointOfSale"); - var invoicess = []; - posnext.PointOfSale.PastOrderList = class { - constructor({ wrapper, events, settings }) { - this.wrapper = wrapper; - this.events = events; - this.pos_profile = settings.name; - this.custom_filter_order_list_by_profile = settings.custom_filter_order_list_by_profile; - this.init_component(); - } - init_component() { - this.prepare_dom(); - this.make_filter_section(); - this.bind_events(); - } - prepare_dom() { - this.wrapper.append( - `
-
- -
-
${__("Recent Orders")}
-
-
-
-
-
` - ); - this.$component = this.wrapper.find(".past-order-list"); - this.$invoices_container = this.$component.find(".invoices-container"); - } - bind_events() { - this.search_field.$input.on("input", (e) => { - clearTimeout(this.last_search); - this.last_search = setTimeout(() => { - const search_term = e.target.value; - this.refresh_list(search_term, this.status_field.get_value()); - }, 300); - }); - const me = this; - this.$invoices_container.on("click", ".invoice-wrapper", function() { - const invoice_name = unescape($(this).attr("data-invoice-name")); - me.events.open_invoice_data(invoice_name); - }); - this.$component.on("click", ".back", function() { - me.events.previous_screen(); - }); - } - make_filter_section() { - const me = this; - this.search_field = frappe.ui.form.make_control({ - df: { - label: __("Search"), - fieldtype: "Data", - placeholder: __("Search by invoice id or customer name") - }, - parent: this.$component.find(".search-field"), - render_input: true - }); - this.status_field = frappe.ui.form.make_control({ - df: { - label: __("Invoice Status"), - fieldtype: "Select", - options: `Draft -Paid -Unpaid -Return`, - placeholder: __("Filter by invoice status"), - onchange: function() { - if (me.$component.is(":visible")) - me.refresh_list(); - } - }, - parent: this.$component.find(".status-field"), - render_input: true - }); - this.search_field.toggle_label(false); - this.status_field.toggle_label(false); - this.status_field.set_value("Draft"); - } - refresh_list() { - frappe.dom.freeze(); - this.events.reset_summary(); - const search_term = this.search_field.get_value(); - const status = this.status_field.get_value(); - const pos_profile = this.pos_profile; - this.$invoices_container.html(""); - let filter = { search_term, status }; - if (this.custom_filter_order_list_by_profile) { - filter = { search_term, status, pos_profile }; - } - return frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.get_past_order_list", - freeze: true, - args: filter, - callback: (response) => { - frappe.dom.unfreeze(); - invoicess = response.message; - response.message.forEach((invoice) => { - const invoice_html = this.get_invoice_html(invoice); - this.$invoices_container.append(invoice_html); - }); - } - }); - } - get_invoice_html(invoice) { - const posting_datetime = moment(invoice.posting_date + " " + invoice.posting_time).format("Do MMMM, h:mma"); - return `
-
-
${invoice.name}
-
- - - - ${frappe.ellipsis(invoice.customer, 20)} -
-
-
-
${format_currency(invoice.grand_total, invoice.currency, 0) || 0}
-
${posting_datetime}
-
-
-
`; - } - toggle_component(show) { - frappe.run_serially([ - () => show ? this.$component.css("display", "flex") && this.refresh_list() : this.$component.css("display", "none"), - () => this.events.open_invoice_data(invoicess[0].name) - ]); - } - }; - - // ../posnext/posnext/public/js/pos_past_order_summary.js - frappe.provide("posnext.PointOfSale"); - posnext.PointOfSale.PastOrderSummary = class { - constructor({ wrapper, pos_profile, events }) { - this.wrapper = wrapper; - this.pos_profile = pos_profile; - this.events = events; - this.init_component(); - } - init_component() { - this.prepare_dom(); - this.init_email_print_dialog(); - this.bind_events(); - this.attach_shortcuts(); - } - prepare_dom() { - this.wrapper.append( - `
-
- ${__("Select an invoice to load summary data")} -
-
-
-
-
${__("Items")}
-
-
${__("Totals")}
-
-
${__("Payments")}
-
-
-
-
-
` - ); - this.$component = this.wrapper.find(".past-order-summary"); - this.$summary_wrapper = this.$component.find(".invoice-summary-wrapper"); - this.$summary_container = this.$component.find(".abs-container"); - this.$upper_section = this.$summary_container.find(".upper-section"); - this.$items_container = this.$summary_container.find(".items-container"); - this.$totals_container = this.$summary_container.find(".totals-container"); - this.$payment_container = this.$summary_container.find(".payments-container"); - this.$summary_btns = this.$summary_container.find(".summary-btns"); - } - init_email_print_dialog() { - const email_dialog = new frappe.ui.Dialog({ - title: "Email Receipt", - fields: [ - { fieldname: "email_id", fieldtype: "Data", options: "Email", label: "Email ID", reqd: 1 }, - { fieldname: "content", fieldtype: "Small Text", label: "Message (if any)" } - ], - primary_action: () => { - this.send_email(); - }, - primary_action_label: __("Send") - }); - this.email_dialog = email_dialog; - const print_dialog = new frappe.ui.Dialog({ - title: "Print Receipt", - fields: [ - { fieldname: "print", fieldtype: "Data", label: "Print Preview" } - ], - primary_action: () => { - this.print_receipt(); - }, - primary_action_label: __("Print") - }); - this.print_dialog = print_dialog; - } - get_upper_section_html(doc) { - const { status } = doc; - let indicator_color = ""; - in_list(["Paid", "Consolidated"], status) && (indicator_color = "green"); - status === "Draft" && (indicator_color = "red"); - status === "Return" && (indicator_color = "grey"); - return `
-
${doc.customer}
-
${this.customer_email}
-
${__("Sold by")}: ${doc.owner}
-
-
- -
${doc.name}
- ${doc.status} -
`; - } - get_item_html(doc, item_data) { - return `
-
${item_data.item_name}
-
${item_data.qty || 0} ${item_data.uom}
-
${get_rate_discount_html()}
-
`; - function get_rate_discount_html() { - if (item_data.rate && item_data.price_list_rate && item_data.rate !== item_data.price_list_rate) { - return `(${item_data.discount_percentage}% off) -
${format_currency(item_data.rate, doc.currency)}
`; - } else { - return `
${format_currency(item_data.price_list_rate || item_data.rate, doc.currency)}
`; - } - } - } - get_discount_html(doc) { - if (doc.discount_amount) { - return `
-
Discount (${doc.additional_discount_percentage} %)
-
${format_currency(doc.discount_amount, doc.currency)}
-
`; - } else { - return ``; - } - } - get_net_total_html(doc) { - return `
-
${__("Net Total")}
-
${format_currency(doc.net_total, doc.currency)}
-
`; - } - get_taxes_html(doc) { - if (!doc.taxes.length) - return ""; - let taxes_html = doc.taxes.map((t) => { - const description = /[0-9]+/.test(t.description) ? t.description : t.rate != 0 ? `${t.description} @ ${t.rate}%` : t.description; - return ` -
-
${description}
-
${format_currency(t.tax_amount_after_discount_amount, doc.currency)}
-
- `; - }).join(""); - return `
${taxes_html}
`; - } - get_grand_total_html(doc) { - return `
-
${__("Grand Total")}
-
${format_currency(doc.grand_total, doc.currency)}
-
`; - } - get_payment_html(doc, payment) { - return `
-
${__(payment.mode_of_payment)}
-
${format_currency(payment.amount, doc.currency)}
-
`; - } - bind_events() { - this.$summary_container.on("click", ".return-btn", () => { - this.events.process_return(this.doc.name); - this.toggle_component(false); - this.$component.find(".no-summary-placeholder").css("display", "flex"); - this.$summary_wrapper.css("display", "none"); - }); - this.$summary_container.on("click", ".edit-btn", () => { - this.events.edit_order(this.doc.name); - this.toggle_component(false); - this.$component.find(".no-summary-placeholder").css("display", "flex"); - this.$summary_wrapper.css("display", "none"); - }); - this.$summary_container.on("click", ".delete-btn", () => { - this.events.delete_order(this.doc.name); - this.show_summary_placeholder(); - }); - this.$summary_container.on("click", ".send-btn", () => { - console.log(this.pos_profile); - var field_names = this.pos_profile.custom_whatsapp_field_names.map((x) => this.doc[x.field_names.toString()]); - console.log(field_names); - console.log(field_names.join(",")); - var message = "https://wa.me/" + this.doc.customer + "?text="; - message += formatString(this.pos_profile.custom_whatsapp_message, field_names); - console.log(message); - frappe.call({ - method: "posnext.posnext.page.posnext.point_of_sale.generate_pdf_and_save", - args: { - docname: this.doc.name, - doctype: this.doc.doctype, - print_format: this.pos_profile.print_format - }, - freeze: true, - freeze_message: "Creating file then send to whatsapp thru link....", - callback: function(r) { - message += "Please Find your invoice here \n " + window.origin + r.message.file_url; - window.open(message); - } - }); - }); - function formatString(str, args) { - return str.replace(/{(\d+)}/g, function(match, number) { - return typeof args[number] !== "undefined" ? args[number] : match; - }); - } - this.$summary_container.on("click", ".new-btn", () => { - this.events.new_order(); - this.toggle_component(false); - this.$component.find(".no-summary-placeholder").css("display", "flex"); - this.$summary_wrapper.css("display", "none"); - }); - this.$summary_container.on("click", ".email-btn", () => { - this.email_dialog.fields_dict.email_id.set_value(this.customer_email); - this.email_dialog.show(); - }); - this.$summary_container.on("click", ".print-btn", () => { - this.print_receipt(); - }); - } - print_receipt() { - const frm = this.events.get_frm(); - frappe.utils.print( - this.doc.doctype, - this.doc.name, - frm.pos_print_format, - this.doc.letter_head, - this.doc.language || frappe.boot.lang - ); - } - attach_shortcuts() { - const ctrl_label = frappe.utils.is_mac() ? "\u2318" : "Ctrl"; - this.$summary_container.find(".print-btn").attr("title", `${ctrl_label}+P`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+p", - action: () => this.$summary_container.find(".print-btn").click(), - condition: () => this.$component.is(":visible") && this.$summary_container.find(".print-btn").is(":visible"), - description: __("Print Receipt"), - page: cur_page.page.page - }); - this.$summary_container.find(".new-btn").attr("title", `${ctrl_label}+Enter`); - frappe.ui.keys.on("ctrl+enter", () => { - const summary_is_visible = this.$component.is(":visible"); - if (summary_is_visible && this.$summary_container.find(".new-btn").is(":visible")) { - this.$summary_container.find(".new-btn").click(); - } - }); - this.$summary_container.find(".edit-btn").attr("title", `${ctrl_label}+E`); - frappe.ui.keys.add_shortcut({ - shortcut: "ctrl+e", - action: () => this.$summary_container.find(".edit-btn").click(), - condition: () => this.$component.is(":visible") && this.$summary_container.find(".edit-btn").is(":visible"), - description: __("Edit Receipt"), - page: cur_page.page.page - }); - } - send_email() { - const frm = this.events.get_frm(); - const recipients = this.email_dialog.get_values().email_id; - const content = this.email_dialog.get_values().content; - const doc = this.doc || frm.doc; - const print_format = frm.pos_print_format; - frappe.call({ - method: "frappe.core.doctype.communication.email.make", - args: { - recipients, - subject: __(frm.meta.name) + ": " + doc.name, - content: content ? content : __(frm.meta.name) + ": " + doc.name, - doctype: doc.doctype, - name: doc.name, - send_email: 1, - print_format, - sender_full_name: frappe.user.full_name(), - _lang: doc.language - }, - callback: (r) => { - if (!r.exc) { - frappe.utils.play_sound("email"); - if (r.message["emails_not_sent_to"]) { - frappe.msgprint(__( - "Email not sent to {0} (unsubscribed / disabled)", - [frappe.utils.escape_html(r.message["emails_not_sent_to"])] - )); - } else { - frappe.show_alert({ - message: __("Email sent successfully."), - indicator: "green" - }); - } - this.email_dialog.hide(); - } else { - frappe.msgprint(__("There were errors while sending email. Please try again.")); - } - } - }); - } - add_summary_btns(map) { - this.$summary_btns.html(""); - map.forEach((m) => { - if (m.condition) { - m.visible_btns.forEach((b) => { - const class_name = b.split(" ")[0].toLowerCase(); - const btn = __(b); - this.$summary_btns.append( - `
${btn}
` - ); - }); - } - }); - this.$summary_btns.children().last().removeClass("mr-4"); - } - toggle_summary_placeholder(show) { - if (show) { - this.$summary_wrapper.css("display", "none"); - this.$component.find(".no-summary-placeholder").css("display", "flex"); - } else { - this.$summary_wrapper.css("display", "flex"); - this.$component.find(".no-summary-placeholder").css("display", "none"); - } - } - get_condition_btn_map(after_submission) { - if (after_submission) - return [{ condition: true, visible_btns: ["Print Receipt", "Email Receipt", "Send Whatsapp", "New Order"] }]; - return [ - { condition: this.doc.docstatus === 0, visible_btns: ["Print Receipt", "Edit Order", "Delete Order", "Send Whatsapp"] }, - { condition: !this.doc.is_return && this.doc.docstatus === 1, visible_btns: ["Print Receipt", "Email Receipt", "Return", "Send Whatsapp"] }, - { condition: this.doc.is_return && this.doc.docstatus === 1, visible_btns: ["Print Receipt", "Email Receipt", "Send Whatsapp"] } - ]; - } - load_summary_of(doc, after_submission = false) { - after_submission ? this.$component.css("grid-column", "span 10 / span 10") : this.$component.css("grid-column", "span 6 / span 6"); - this.toggle_summary_placeholder(false); - this.doc = doc; - this.attach_document_info(doc); - this.attach_items_info(doc); - this.attach_totals_info(doc); - this.attach_payments_info(doc); - const condition_btns_map = this.get_condition_btn_map(after_submission); - this.add_summary_btns(condition_btns_map); - this.$summary_wrapper.css("width", after_submission ? "35%" : "60%"); - if (after_submission) { - this.print_receipt_on_order_complete(); - } - } - attach_document_info(doc) { - frappe.db.get_value("Customer", this.doc.customer, "email_id").then(({ message }) => { - this.customer_email = message.email_id || ""; - const upper_section_dom = this.get_upper_section_html(doc); - this.$upper_section.html(upper_section_dom); - }); - } - attach_items_info(doc) { - this.$items_container.html(""); - doc.items.forEach((item) => { - const item_dom = this.get_item_html(doc, item); - this.$items_container.append(item_dom); - this.set_dynamic_rate_header_width(); - }); - } - set_dynamic_rate_header_width() { - const rate_cols = Array.from(this.$items_container.find(".item-rate-disc")); - this.$items_container.find(".item-rate-disc").css("width", ""); - let max_width = rate_cols.reduce((max_width2, elm) => { - if ($(elm).width() > max_width2) - max_width2 = $(elm).width(); - return max_width2; - }, 0); - max_width += 1; - if (max_width == 1) - max_width = ""; - this.$items_container.find(".item-rate-disc").css("width", max_width); - } - attach_payments_info(doc) { - this.$payment_container.html(""); - doc.payments.forEach((p) => { - if (p.amount) { - const payment_dom = this.get_payment_html(doc, p); - this.$payment_container.append(payment_dom); - } - }); - if (doc.redeem_loyalty_points && doc.loyalty_amount) { - const payment_dom = this.get_payment_html(doc, { - mode_of_payment: "Loyalty Points", - amount: doc.loyalty_amount - }); - this.$payment_container.append(payment_dom); - } - } - attach_totals_info(doc) { - this.$totals_container.html(""); - const net_total_dom = this.get_net_total_html(doc); - const taxes_dom = this.get_taxes_html(doc); - const discount_dom = this.get_discount_html(doc); - const grand_total_dom = this.get_grand_total_html(doc); - this.$totals_container.append(net_total_dom); - this.$totals_container.append(taxes_dom); - this.$totals_container.append(discount_dom); - this.$totals_container.append(grand_total_dom); - } - toggle_component(show) { - show ? this.$component.css("display", "flex") : this.$component.css("display", "none"); - } - async print_receipt_on_order_complete() { - var _a; - const profile_name = ((_a = this.pos_profile) == null ? void 0 : _a.name) || this.pos_profile; - const { message } = await frappe.db.get_value( - "POS Profile", - profile_name, - ["print_receipt_on_order_complete", "print_format"] - ); - if (message == null ? void 0 : message.print_receipt_on_order_complete) { - setTimeout(() => this.print_receipt(), 300); - } - } - }; -})(); -//# sourceMappingURL=posnext.bundle.TN4KQRHJ.js.map diff --git a/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map b/posnext/public/dist/js/posnext.bundle.TN4KQRHJ.js.map 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"] -}