fix: Add logic to set batch no [WIP]
- Add pick ticket reference item
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.json b/erpnext/stock/doctype/pick_ticket/pick_ticket.json
index 392786f..fe331ac 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.json
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.json
@@ -8,6 +8,8 @@
"company",
"column_break_4",
"group_warehouse",
+ "section_break_4",
+ "reference_document_items",
"section_break_6",
"items"
],
@@ -15,8 +17,9 @@
{
"fieldname": "items",
"fieldtype": "Table",
- "label": "Items",
- "options": "Pick Ticket Item"
+ "label": "Items Locations",
+ "options": "Pick Ticket Item",
+ "read_only": 1
},
{
"description": "Items under this warehouse will be suggested",
@@ -38,9 +41,21 @@
{
"fieldname": "section_break_6",
"fieldtype": "Section Break"
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "section_break_4",
+ "fieldtype": "Section Break",
+ "label": "Reference Items"
+ },
+ {
+ "fieldname": "reference_document_items",
+ "fieldtype": "Table",
+ "label": "Reference Document Items",
+ "options": "Pick Ticket Reference Item"
}
],
- "modified": "2019-07-24 14:59:44.542987",
+ "modified": "2019-07-24 16:13:51.668880",
"modified_by": "Administrator",
"module": "Stock",
"name": "Pick Ticket",
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.py b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
index 8982688..4c5fdb8 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.py
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
@@ -14,11 +14,8 @@
reference_doc = frappe.get_doc(reference_doctype, reference_name)
doc.company = reference_doc.company
items = reference_doc.get(items_field)
-
add_picklist_items(items, doc, reference_doc)
-
- doc.insert()
-
+ doc.save()
return doc
def get_available_items(item):
@@ -34,10 +31,12 @@
def get_items_with_warehouse_and_quantity(item_doc, reference_doc):
items = []
item_locations = get_available_items(item_doc.item_code)
- if not item_locations: return items
-
remaining_qty = item_doc.qty
+ if not item_locations:
+ print('{} qty of {} is out of stock. Skipping...'.format(remaining_qty, item_doc.item))
+ return items
+
while remaining_qty > 0 and item_locations:
item_location = item_locations.pop(0)
qty = remaining_qty if item_location.qty >= remaining_qty else item_location.qty
@@ -59,17 +58,30 @@
for item_info in data:
doc.append('items', item_info)
+ doc.insert()
+
for item in doc.get('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])
+ set_serial_nos(item)
+ elif item.has_batch_no:
+ set_batch_no(item, doc)
- # if item.has_batch_no:
- # serial_nos = frappe.get_all('Batch', {
- # '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
+def set_serial_nos(item):
+ 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])
+
+def set_batch_no(item, doc):
+ batches = frappe.get_all('Stock Ledger Entry',
+ fields=['batch_no', 'sum(actual_qty) as qty'],
+ filters={
+ 'item_code': item.item,
+ 'warehouse': item.warehouse
+ },
+ group_by='warehouse, batch_no, item_code')
+
+ if batches:
+ # TODO: check expiry and split item if batch is more than 1
+ item.batch_no = batches[0].batch_no
\ 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 33a4273..6db3284 100644
--- a/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json
+++ b/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json
@@ -33,7 +33,8 @@
"fieldname": "qty",
"fieldtype": "Float",
"in_list_view": 1,
- "label": "Qty"
+ "label": "Qty",
+ "read_only": 1
},
{
"fieldname": "picked_qty",
@@ -46,7 +47,8 @@
"fieldtype": "Link",
"in_list_view": 1,
"label": "Warehouse",
- "options": "Warehouse"
+ "options": "Warehouse",
+ "read_only": 1
},
{
"fetch_from": "item.item_name",
@@ -66,20 +68,22 @@
"fieldname": "reference_document_item",
"fieldtype": "Data",
"hidden": 1,
- "label": "Reference Document Item"
+ "label": "Reference Document Item",
+ "read_only": 1
},
{
"depends_on": "has_serial_no",
"fieldname": "serial_no",
"fieldtype": "Small Text",
- "label": "Serial No"
+ "label": "Serial No",
+ "read_only": 1
},
{
- "depends_on": "has_batch_no",
"fieldname": "batch_no",
"fieldtype": "Link",
"label": "Batch No",
- "options": "Batch"
+ "options": "Batch",
+ "read_only": 1
},
{
"default": "0",
@@ -106,13 +110,15 @@
"fieldname": "reference_doctype",
"fieldtype": "Select",
"label": "Reference Document Type",
- "options": "Sales Order\nWork Order"
+ "options": "Sales Order\nWork Order",
+ "read_only": 1
},
{
"fieldname": "reference_name",
"fieldtype": "Dynamic Link",
"label": "Reference Document",
- "options": "reference_doctype"
+ "options": "reference_doctype",
+ "read_only": 1
},
{
"fieldname": "column_break_2",
@@ -124,7 +130,7 @@
}
],
"istable": 1,
- "modified": "2019-07-24 15:09:35.712289",
+ "modified": "2019-07-25 11:18:58.478250",
"modified_by": "Administrator",
"module": "Stock",
"name": "Pick Ticket Item",
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js
new file mode 100644
index 0000000..a3f9096
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Pick Ticket Reference Item', {
+ // refresh: function(frm) {
+
+ // }
+});
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json
new file mode 100644
index 0000000..446e075
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json
@@ -0,0 +1,27 @@
+{
+ "creation": "2019-07-24 16:11:07.415562",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "item"
+ ],
+ "fields": [
+ {
+ "fieldname": "item",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Item",
+ "options": "Item"
+ }
+ ],
+ "istable": 1,
+ "modified": "2019-07-24 16:12:58.000378",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Pick Ticket Reference Item",
+ "owner": "Administrator",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py
new file mode 100644
index 0000000..412be75
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class PickTicketReferenceItem(Document):
+ pass