From 778b4926bf7852bb04cc9843a1d08bbec271ae31 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 24 Jul 2019 11:27:32 +0530 Subject: [PATCH] fix: Fetch warehouse location from Bin --- .../doctype/sales_order/sales_order.js | 8 ++ .../doctype/sales_order/sales_order.py | 77 +++++++++++++++++++ .../pick_ticket_item/pick_ticket_item.json | 37 ++++++++- 3 files changed, 120 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 39dda92e3e..89739cc633 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -102,6 +102,7 @@ frappe.ui.form.on("Sales Order Item", { erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend({ onload: function(doc, dt, dn) { this._super(); + this.frm.add_custom_button(__('Pick Ticket'), () => this.make_pick_ticket(), __('Create')); }, refresh: function(doc, dt, dn) { @@ -233,6 +234,13 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( this.order_type(doc); }, + make_pick_ticket() { + frappe.model.open_mapped_doc({ + method: "erpnext.selling.doctype.sales_order.sales_order.make_pick_ticket", + frm: this.frm + }) + }, + make_work_order() { var me = this; this.frm.call({ diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 09dc9a9932..181ac33782 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -996,3 +996,80 @@ def make_raw_material_request(items, company, sales_order, project=None): def make_inter_company_purchase_order(source_name, target_doc=None): from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction return make_inter_company_transaction("Sales Order", source_name, target_doc) + +@frappe.whitelist() +def make_pick_ticket(source_name, target_doc=None, offset=None): + + doc = get_mapped_doc("Sales Order", source_name, { + "Sales Order": { + "doctype": "Pick Ticket", + "validation": { + "docstatus": ["=", 1] + }, + "field_map": { + "name": "reference_name", + }, + }, + "Sales Order Item": { + "doctype": 'Pick Ticket Item', + "field_map": { + 'item_code': 'item' + }, + } + }, target_doc, postprocess) + + return doc + +def get_available_items(item): + # gets all items available in different warehouses + # FIFO + available_items = frappe.get_all('Bin', filters={ + 'item_code': item, + 'actual_qty': ['>', 0] + }, fields=['warehouse', 'actual_qty as qty'], order_by='creation') + + return available_items + +def get_items_with_warehouse_and_quantity(item_doc): + items = [] + item_locations = get_available_items(item_doc.item) + if not item_locations: return + + remaining_qty = item_doc.qty + + while remaining_qty > 0 and item_locations: + item_location = item_locations.pop(0) + qty = item_doc.qty if item_location.qty >= item_doc.qty else item_location.qty + items.append({ + 'qty': qty, + 'warehouse': item_location.warehouse + }) + remaining_qty -= qty + + return items + +def postprocess(source, doc): + for item in doc.items: + data = get_items_with_warehouse_and_quantity(item) + item.delete() + + for item_info in data: + print(item_info) + pick_item = frappe.new_doc('Pick Ticket Item', doc, 'items') + pick_item.update(item_info) + print(pick_item.qty) + + for item in doc.items: + if item.has_serial_no: + serial_nos = frappe.get_all('Serial No', { + 'item_code': item.item, + 'warehouse': item.warehouse + }, limit=item.qty, order_by='purchase_date') + item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos]) + + if item.has_batch_no: + serial_nos = frappe.get_all('Serial No', { + 'item_code': item.item, + 'warehouse': item.warehouse + }, limit=item.qty, order_by='purchase_date') + item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos]) \ No newline at end of file diff --git a/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json b/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json index 705172553e..cba0743c8a 100644 --- a/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json +++ b/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json @@ -10,7 +10,11 @@ "reference_document_item", "warehouse", "qty", - "picked_qty" + "picked_qty", + "has_serial_no", + "has_batch_no", + "serial_no", + "batch_no" ], "fields": [ { @@ -56,10 +60,39 @@ "fieldtype": "Data", "hidden": 1, "label": "Reference Document Item" + }, + { + "depends_on": "has_serial_no", + "fieldname": "serial_no", + "fieldtype": "Small Text", + "label": "Serial No" + }, + { + "depends_on": "has_batch_no", + "fieldname": "batch_no", + "fieldtype": "Link", + "label": "Batch No", + "options": "Batch" + }, + { + "default": "0", + "fetch_from": "item.has_serial_no", + "fieldname": "has_serial_no", + "fieldtype": "Check", + "label": "Has Serial No", + "read_only": 1 + }, + { + "default": "0", + "fetch_from": "item.has_batch_no", + "fieldname": "has_batch_no", + "fieldtype": "Check", + "label": "Has Batch No", + "read_only": 1 } ], "istable": 1, - "modified": "2019-07-11 16:34:52.853146", + "modified": "2019-07-24 11:05:27.407791", "modified_by": "Administrator", "module": "Stock", "name": "Pick Ticket Item",