mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 16:34:46 +00:00
fix: Add logic to set batch no [WIP]
- Add pick ticket reference item
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user