diff --git a/posnext/public/js/pos_controller.js b/posnext/public/js/pos_controller.js index b057780..656326a 100644 --- a/posnext/public/js/pos_controller.js +++ b/posnext/public/js/pos_controller.js @@ -902,6 +902,14 @@ posnext.PointOfSale.Controller = class { } } 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({ @@ -911,13 +919,11 @@ posnext.PointOfSale.Controller = class { fieldtype: 'Data', label: __('Reference Number'), fieldname: 'reference_no', - reqd: 1 }, { fieldtype: 'Data', label: __('Reference Name'), fieldname: 'reference_name', - reqd: 1 } ], primary_action_label: __('Proceed to Payment'), diff --git a/posnext/public/js/pos_item_cart.js b/posnext/public/js/pos_item_cart.js index 9a45b33..6331626 100644 --- a/posnext/public/js/pos_item_cart.js +++ b/posnext/public/js/pos_item_cart.js @@ -399,7 +399,18 @@ this.highlight_checkout_btn(true); this.$component.on('click', '.checkout-btn-held', function() { if ($(this).attr('style').indexOf('--blue-500') == -1) return; - if(!cur_frm.doc.customer && me.mobile_number_based_customer){ + + // Check for empty cart + 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: [ @@ -420,94 +431,29 @@ this.highlight_checkout_btn(true); 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.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() - ]); - }) - me.events.save_draft_invoice() - - d.hide(); - } - }) + if (me.settings.custom_add_reference_details) { + me.show_reference_dialog(values['mobile_number']); + } else { + me.hold_invoice(values['mobile_number']); + } + d.hide(); } }); - var mobile_number_numpad_div = d.wrapper.find(".mobile_number_numpad") - mobile_number_numpad_div.append(` -
- - - - - - - - - - - - - -
`) - + + me.setup_mobile_numpad(d); 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 { this.events.toggle_recent_order(); }); @@ -1717,4 +1663,66 @@ this.highlight_checkout_btn(true); 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) { + // Create customer if mobile number provided + 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 = me.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); + } + + // Update reference details + 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(); + } }