get oldest batch in modal, insert batch items
diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py
index 6428835..992d8fc 100644
--- a/erpnext/stock/doctype/batch/batch.py
+++ b/erpnext/stock/doctype/batch/batch.py
@@ -66,6 +66,15 @@
return out
@frappe.whitelist()
+def get_oldest_batch_qty(item_code, warehouse):
+ '''Returns the oldest batch and qty for the given item_code and warehouse'''
+ batches = get_batch_qty(item_code = item_code, warehouse = warehouse)
+ oldest_date = min([frappe.get_value('Batch', batch.batch_no, 'expiry_date') for batch in batches])
+ for batch in batches:
+ if (frappe.get_value('Batch', batch.batch_no, 'expiry_date') == oldest_date):
+ return batch
+
+@frappe.whitelist()
def split_batch(batch_no, item_code, warehouse, qty, new_batch_id = None):
'''Split the batch into a new batch'''
batch = frappe.get_doc(dict(doctype='Batch', item=item_code, batch_id=new_batch_id)).insert()
@@ -129,4 +138,4 @@
# if batch.expiry_date == oldest_expiry_date:
# batch_no = batch.batch_no
- return batch_no
\ No newline at end of file
+ return batch_no
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 26c793e..53fac4d 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -43,7 +43,6 @@
});
},
refresh: function(frm) {
- erpnext.select_batch_and_serial_no(frm);
if(!frm.doc.docstatus) {
frm.add_custom_button(__('Make Material Request'), function() {
frappe.model.with_doctype('Material Request', function() {
@@ -77,8 +76,7 @@
frm.fields_dict.items.grid.refresh();
frm.cscript.toggle_related_fields(frm.doc);
},
- before_save: function(frm) {
- console.log("before_save");
+ validate: function(frm) {
erpnext.select_batch_and_serial_no(frm);
},
company: function(frm) {
@@ -576,8 +574,8 @@
// get_warehouse();
- let show_modal = (item_code, qty, warehouse, has_batch, has_serial) => {
- // get_warehouse(i);
+ let show_modal = (item, item_code, qty, warehouse, has_batch, has_serial, oldest = undefined) => {
+ let data = oldest ? [oldest] : []
let fields = [
{fieldname: 'item_code', read_only: 1, fieldtype:'Link', options: 'Item',
label: __('Item Code'), 'default': item_code},
@@ -598,8 +596,7 @@
{fieldtype:'Float', fieldname:'selected_qty',
label: __('Qty'), in_list_view:1},
],
- data: [],
- // data_length: 3,
+ data: data,
get_data: function() {
return this.data;
},
@@ -621,33 +618,108 @@
{fieldname: 'serial_no', fieldtype: 'Small Text', label: __('Serial No')}
)
}
- let d = new frappe.ui.Dialog({
+ let dialog = new frappe.ui.Dialog({
+ title: __("Select Batches"),
fields: fields
});
- d.set_primary_action(__('Get Items'), function() {
- var values = d.get_values();
- d.hide();
+ item_temp = {};
+ Object.assign(item_temp, item);
+
+ let validate_dialog_values = () => {
+ var values = dialog.get_values();
+
+ values.batches.map((batch) => {
+ if (batch.batch_no && batch.selected_qty) {
+ if (parseInt(batch.selected_qty) > parseInt(batch.available_qty)) {
+ frappe.throw(__("Cannot select more than the available qty"));
+ return false;
+ }
+ } else {
+ if (!batch.batch_no) {
+ frappe.throw(__("Please select batch_no"));
+ return false;
+ } else {
+ frappe.throw(__("Please select qty"));
+ return false;
+ }
+ }
+ });
+
+ // validate total_qty
+ return true;
+ }
+
+ dialog.set_primary_action(__('Get Items'), function() {
+
+ if (!validate_dialog_values()) {
+ return;
+ }
+
+ var values = dialog.get_values();
+
+ values.batches.map((batch, i) => {
+ if (i === 0) {
+ item.batch_no = batch.batch_no;
+ item.qty = batch.selected_qty;
+ console.log("item", item, frm.doc.items);
+ } else {
+ var row = frappe.model.add_child(frm.doc, "Stock Entry Detail", "items");
+ Object.assign(row, item_temp);
+ row.idx = i+1;
+ row.batch_no = batch.batch_no;
+ row.qty = batch.selected_qty;
+ console.log("row", row, frm.doc.items);
+ }
+ refresh_field("items");
+ });
+
+
+ refresh_field("items");
+ dialog.hide();
})
- d.show();
+ dialog.show();
}
- show_modal("_Test FG Item", 10, 'Stores - A', 1, 0);
+ // show_modal("_Test FG Item", 10, 'Stores - A', 1, 0);
+
+ let show_modal_with_oldest_batch = (item, item_code, qty, warehouse, has_batch, has_serial_no) => {
+ frappe.call({
+ method: 'erpnext.stock.doctype.batch.batch.get_oldest_batch_qty',
+ args: {
+ warehouse: warehouse,
+ item_code: item_code
+ },
+ callback: (r) => {
+ if (r.message) {
+ oldest = {name: 'batch 1'};
+ oldest.batch_no = r.message.batch_no;
+ oldest.available_qty = r.message.qty;
+ // if required overall qty is less than available qty in oldest batch, preselect
+ if (parseInt(qty) < parseInt(r.message.qty)) {
+ oldest.selected_qty = qty;
+ }
+ show_modal(item, item_code, qty, warehouse, has_batch, has_serial_no, oldest);
+ }
+ }
+ });
+ }
frm.doc.items.forEach(function(d){
if(d.has_batch_no && !d.batch_no) {
console.log("item code, ");
-
}
});
frm.doc.items.forEach(function(d) {
if(d.has_batch_no && !d.batch_no) {
- show_modal(d.item_code, d.qty, get_warehouse(d), 1, 0);
+ // console.log(d.item_code, get_warehouse(d));
+ show_modal_with_oldest_batch(d, d.item_code, d.qty, get_warehouse(d), 1, 0);
+ // show_modal(d, d.item_code, d.qty, get_warehouse(d), 1, 0 , oldest);
}
if(d.has_serial_no && !d.serial_no) {
- show_modal(d.item_code, d.qty, get_warehouse(d), 0, 1);
+ show_modal(d, d.item_code, d.qty, get_warehouse(d), 0, 1);
}
});