refactor: POS workflow (#20789)
* refactor: add pos invoice doctype replacing sales invoice in POS * refactor: move pos.py to pos invoice * feat: add pos invoice merge log doctype * feat: ability to merge pos invoices into a sales invoice * feat: [wip] new ui for point of sale * fix: pos.py moved to pos_invoice * feat: loyalty points for POS Invoice * fix: loyalty points on merging * feat: return against pos invoices * Merge 'fork/serial-no-selector' into refactor-pos-invoice * chore: status fix and set warehouse from pos profile * fix: naming series * feat: merge pos returns into credit notes * feat: add pos list action for merging into sales invoices * feat[UX]: add shortcuts & focus on search after customer selection * feat: stock validation from previous pos transactions * Merge 'fork/serial-no-selector' into refactor-pos-invoice * chore: fix df not found for base_amount precision * feat: serial no validation from previous pos transactions * chore: move pos.py into pos page * feat: pos opening voucher * feat: link pos closing voucher with opening voucher * chore: use map_doc instead of get_mapped_doc for better perf * feat: enforce opening voucher on pos page * feat: [ui] [wip] point of sale beta ui refactor * fix: auto fetching serial nos with batch no * feat: [ui] item details section for new pos ui * feat: remove item from cart * refactor: [ui] [wip] split point_of_sale into components * new payment component * new numberpad * fix pos opening status * move from flex to grids * fix: search from item selector * feat: loyalty points as payment method * feat: pos invoice status * fix a bug with invalid JSON * fix: loyalty program ui fixes * feat: past order list and past order summary * feat: (minor) setting discount from item details * fix: adding item before customer selection * feat: post order submission summary * save and open draft orders * fix: item group filter * fix: item_det not defined while submitting sle * fix: minor bugs * fix: minor ux fixes * feat: show opening time in pos ui * feat: item and customer images * feat: emailing and printing an invoice * fix: item details field edit shows empty alert * fix: (minor) ux fixes * chore: rename pos opening voucher to pos opening entry * chore: (minor) rename pos closing voucher and sub doctypes * chore: add patch for renaming pos closing doctypes * fix: negative stock not allowed in pos invoices* default is_pos in pos invoices* fix: transalation * fix: invoices not getting fetched on pos closing * fix: indentation * feat: view / edit customer info * fix: minor bugs * fix: minor bug * fix: patch * fix: minor ux issues * fix: remove uppercase status * refactor: pos closing payment reconciliation * fix: move pos invoice print formats to pos invoice doctype * fix: ui issues * feat: new child doctype to store pos payment mode details * fix: add to patches.txt * feat: search by serial no * chore: [wip] code cleanup * fix: item not selectable from cart * chore: [wip] code cleanup * fix: minor issues * loyalty points transactions * default payment mode * fix: minor fixes * set correct mop amount with loaylty points * editing draft invoices from UI * chore: pos invoice merge log tests * fix: batch / serial validation in pos ui and on submission * feat: use onscan js for barcode scan events * fix: cart header with amount column * fix: validate batch no and qty in pos transactions * chore: do not fetch closing balances as opening balance * feat: show available qty in item selector * feat: shortcuts * fix: onscan.js not found * fix: onscan.js not found * fix: cannot return partial items * fix: neagtive stock indicator * feat: invoice discount * fix: change available stock on warehouse change * chore: cleanup code * fix: pos profile payment method table * feat: adding same item with different uom * fix: loyalty points deleted after consolidation * fix: enter loyalty amount instead of loyalty points * chore: return print format * feat: custom fields in pos view * chore: pos invoice test * chore: remove offline pos * fix: cyclic dependency * fix: cyclic dependency * patch: remove pos page and order fixes * chore: little fixes * fix: patch perf and plural naming * chore: tidy up pos invoice validation * chore: move pos closing to accounts * fix: move pos doctypes to accounts * fix: move pos doctypes to accounts * fix: item description in cart * fix: item description in cart * chore: loyalty tests * minor fixes * chore: rename point of sale beta to point of sale * chore: reset past order summary on filter change * chore: add point of sale to accounting desk * fix: payment reconciliation table in pos closing * fix: travis * Update accounting.json * fix: test cases * fix: tests * patch loyalty point entries * fix: remove test * default mode of payment is mandatory for pos transaction * chore: remove unused checks from pos profile * fix: loyalty point entry patch * fix: numpad reset and patches * fix: minor bugs * fix: travis * fix: travis * fix: travis * fix: travis Co-authored-by: Nabin Hait <nabinhait@gmail.com>
This commit is contained in:
@@ -43,6 +43,7 @@ erpnext.SerialNoBatchSelector = Class.extend({
|
||||
label: __(me.warehouse_details.type),
|
||||
default: typeof me.warehouse_details.name == "string" ? me.warehouse_details.name : '',
|
||||
onchange: function(e) {
|
||||
me.warehouse_details.name = this.get_value();
|
||||
|
||||
if(me.has_batch && !me.has_serial_no) {
|
||||
fields = fields.concat(me.get_batch_fields());
|
||||
@@ -50,7 +51,6 @@ erpnext.SerialNoBatchSelector = Class.extend({
|
||||
fields = fields.concat(me.get_serial_no_fields());
|
||||
}
|
||||
|
||||
me.warehouse_details.name = this.get_value();
|
||||
var batches = this.layout.fields_dict.batches;
|
||||
if(batches) {
|
||||
batches.grid.df.data = [];
|
||||
@@ -98,8 +98,13 @@ erpnext.SerialNoBatchSelector = Class.extend({
|
||||
numbers.then((data) => {
|
||||
let auto_fetched_serial_numbers = data.message;
|
||||
let records_length = auto_fetched_serial_numbers.length;
|
||||
if (!records_length) {
|
||||
const warehouse = me.dialog.fields_dict.warehouse.get_value().bold();
|
||||
frappe.msgprint(__(`Serial numbers unavailable for Item ${me.item.item_code.bold()}
|
||||
under warehouse ${warehouse}. Please try changing warehouse.`));
|
||||
}
|
||||
if (records_length < qty) {
|
||||
frappe.msgprint(`Fetched only ${records_length} serial numbers.`);
|
||||
frappe.msgprint(__(`Fetched only ${records_length} available serial numbers.`));
|
||||
}
|
||||
let serial_no_list_field = this.dialog.fields_dict.serial_no;
|
||||
numbers = auto_fetched_serial_numbers.join('\n');
|
||||
@@ -445,6 +450,28 @@ erpnext.SerialNoBatchSelector = Class.extend({
|
||||
serial_no_filters['warehouse'] = me.warehouse_details.name;
|
||||
}
|
||||
|
||||
if (me.frm.doc.doctype === 'POS Invoice' && !this.showing_reserved_serial_nos_error) {
|
||||
frappe.call({
|
||||
method: "erpnext.stock.doctype.serial_no.serial_no.get_pos_reserved_serial_nos",
|
||||
args: {
|
||||
item_code: me.item_code,
|
||||
warehouse: typeof me.warehouse_details.name == "string" ? me.warehouse_details.name : ''
|
||||
}
|
||||
}).then((data) => {
|
||||
if (!data.message[1].length) {
|
||||
this.showing_reserved_serial_nos_error = true;
|
||||
const warehouse = me.dialog.fields_dict.warehouse.get_value().bold();
|
||||
const d = frappe.msgprint(__(`Serial numbers unavailable for Item ${me.item.item_code.bold()}
|
||||
under warehouse ${warehouse}. Please try changing warehouse.`));
|
||||
d.get_close_btn().on('click', () => {
|
||||
this.showing_reserved_serial_nos_error = false;
|
||||
d.hide();
|
||||
});
|
||||
}
|
||||
serial_no_filters['name'] = ["not in", data.message[0]]
|
||||
})
|
||||
}
|
||||
|
||||
return [
|
||||
{fieldtype: 'Section Break', label: __('Serial Numbers')},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user