fix: Add logic to set batch no [WIP]

- Add pick ticket reference item
This commit is contained in:
Suraj Shetty
2019-07-25 11:22:45 +05:30
parent 0576ad5ef9
commit 3b31800533
6 changed files with 107 additions and 29 deletions

View File

@@ -8,6 +8,8 @@
"company", "company",
"column_break_4", "column_break_4",
"group_warehouse", "group_warehouse",
"section_break_4",
"reference_document_items",
"section_break_6", "section_break_6",
"items" "items"
], ],
@@ -15,8 +17,9 @@
{ {
"fieldname": "items", "fieldname": "items",
"fieldtype": "Table", "fieldtype": "Table",
"label": "Items", "label": "Items Locations",
"options": "Pick Ticket Item" "options": "Pick Ticket Item",
"read_only": 1
}, },
{ {
"description": "Items under this warehouse will be suggested", "description": "Items under this warehouse will be suggested",
@@ -38,9 +41,21 @@
{ {
"fieldname": "section_break_6", "fieldname": "section_break_6",
"fieldtype": "Section Break" "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", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Pick Ticket", "name": "Pick Ticket",

View File

@@ -14,11 +14,8 @@ def get_pick_list(reference_doctype, reference_name, items_field):
reference_doc = frappe.get_doc(reference_doctype, reference_name) reference_doc = frappe.get_doc(reference_doctype, reference_name)
doc.company = reference_doc.company doc.company = reference_doc.company
items = reference_doc.get(items_field) items = reference_doc.get(items_field)
add_picklist_items(items, doc, reference_doc) add_picklist_items(items, doc, reference_doc)
doc.save()
doc.insert()
return doc return doc
def get_available_items(item): def get_available_items(item):
@@ -34,10 +31,12 @@ def get_available_items(item):
def get_items_with_warehouse_and_quantity(item_doc, reference_doc): def get_items_with_warehouse_and_quantity(item_doc, reference_doc):
items = [] items = []
item_locations = get_available_items(item_doc.item_code) item_locations = get_available_items(item_doc.item_code)
if not item_locations: return items
remaining_qty = item_doc.qty 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: while remaining_qty > 0 and item_locations:
item_location = item_locations.pop(0) item_location = item_locations.pop(0)
qty = remaining_qty if item_location.qty >= remaining_qty else item_location.qty qty = remaining_qty if item_location.qty >= remaining_qty else item_location.qty
@@ -59,17 +58,30 @@ def add_picklist_items(reference_items, doc, reference_doc):
for item_info in data: for item_info in data:
doc.append('items', item_info) doc.append('items', item_info)
doc.insert()
for item in doc.get('items'): for item in doc.get('items'):
if item.has_serial_no: if item.has_serial_no:
serial_nos = frappe.get_all('Serial No', { set_serial_nos(item)
'item_code': item.item, elif item.has_batch_no:
'warehouse': item.warehouse set_batch_no(item, doc)
}, 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: def set_serial_nos(item):
# serial_nos = frappe.get_all('Batch', { serial_nos = frappe.get_all('Serial No', {
# 'item_code': item.item, 'item_code': item.item,
# 'warehouse': item.warehouse 'warehouse': item.warehouse
# }, limit=item.qty, order_by='purchase_date') }, limit=item.qty, order_by='purchase_date')
# item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos]) 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

View File

@@ -33,7 +33,8 @@
"fieldname": "qty", "fieldname": "qty",
"fieldtype": "Float", "fieldtype": "Float",
"in_list_view": 1, "in_list_view": 1,
"label": "Qty" "label": "Qty",
"read_only": 1
}, },
{ {
"fieldname": "picked_qty", "fieldname": "picked_qty",
@@ -46,7 +47,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"in_list_view": 1, "in_list_view": 1,
"label": "Warehouse", "label": "Warehouse",
"options": "Warehouse" "options": "Warehouse",
"read_only": 1
}, },
{ {
"fetch_from": "item.item_name", "fetch_from": "item.item_name",
@@ -66,20 +68,22 @@
"fieldname": "reference_document_item", "fieldname": "reference_document_item",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 1, "hidden": 1,
"label": "Reference Document Item" "label": "Reference Document Item",
"read_only": 1
}, },
{ {
"depends_on": "has_serial_no", "depends_on": "has_serial_no",
"fieldname": "serial_no", "fieldname": "serial_no",
"fieldtype": "Small Text", "fieldtype": "Small Text",
"label": "Serial No" "label": "Serial No",
"read_only": 1
}, },
{ {
"depends_on": "has_batch_no",
"fieldname": "batch_no", "fieldname": "batch_no",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Batch No", "label": "Batch No",
"options": "Batch" "options": "Batch",
"read_only": 1
}, },
{ {
"default": "0", "default": "0",
@@ -106,13 +110,15 @@
"fieldname": "reference_doctype", "fieldname": "reference_doctype",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Reference Document Type", "label": "Reference Document Type",
"options": "Sales Order\nWork Order" "options": "Sales Order\nWork Order",
"read_only": 1
}, },
{ {
"fieldname": "reference_name", "fieldname": "reference_name",
"fieldtype": "Dynamic Link", "fieldtype": "Dynamic Link",
"label": "Reference Document", "label": "Reference Document",
"options": "reference_doctype" "options": "reference_doctype",
"read_only": 1
}, },
{ {
"fieldname": "column_break_2", "fieldname": "column_break_2",
@@ -124,7 +130,7 @@
} }
], ],
"istable": 1, "istable": 1,
"modified": "2019-07-24 15:09:35.712289", "modified": "2019-07-25 11:18:58.478250",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Pick Ticket Item", "name": "Pick Ticket Item",

View File

@@ -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) {
// }
});

View File

@@ -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"
}

View File

@@ -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