* add new fields: check: use naming series data: series prefix * refactor autoname: use new function - get_name_from_hash * add new function - get_name_from_naming_series * refactor autoname to generate name from naming series * PEP 8 compliance
This commit is contained in:
parent
df023bff7f
commit
e1e38a4bb9
@ -5,23 +5,43 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe.model.naming import make_autoname
|
||||||
from frappe.utils import flt, cint
|
from frappe.utils import flt, cint
|
||||||
|
|
||||||
|
|
||||||
class UnableToSelectBatchError(frappe.ValidationError): pass
|
class UnableToSelectBatchError(frappe.ValidationError): pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_name_from_naming_series():
|
||||||
|
naming_series_prefix = frappe.db.get_single_value('Stock Settings', 'naming_series_prefix')
|
||||||
|
if not naming_series_prefix:
|
||||||
|
naming_series_prefix = 'BATCH-'
|
||||||
|
|
||||||
|
name = make_autoname(naming_series_prefix + '.#####')
|
||||||
|
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def get_name_from_hash():
|
||||||
|
temp = None
|
||||||
|
while not temp:
|
||||||
|
temp = frappe.generate_hash()[:7].upper()
|
||||||
|
if frappe.db.exists('Batch', temp):
|
||||||
|
temp = None
|
||||||
|
|
||||||
|
return temp
|
||||||
|
|
||||||
|
|
||||||
class Batch(Document):
|
class Batch(Document):
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
'''Generate random ID for batch if not specified'''
|
"""Generate random ID for batch if not specified"""
|
||||||
if not self.batch_id:
|
if not self.batch_id:
|
||||||
if frappe.db.get_value('Item', self.item, 'create_new_batch'):
|
if frappe.db.get_value('Item', self.item, 'create_new_batch'):
|
||||||
temp = None
|
use_naming_series = frappe.db.get_single_value('Stock Settings', 'use_naming_series')
|
||||||
while not temp:
|
if use_naming_series:
|
||||||
temp = frappe.generate_hash()[:7].upper()
|
self.batch_id = get_name_from_naming_series()
|
||||||
if frappe.db.exists('Batch', temp):
|
else:
|
||||||
temp = None
|
self.batch_id = get_name_from_hash()
|
||||||
|
|
||||||
self.batch_id = temp
|
|
||||||
else:
|
else:
|
||||||
frappe.throw(_('Batch ID is mandatory'), frappe.MandatoryError)
|
frappe.throw(_('Batch ID is mandatory'), frappe.MandatoryError)
|
||||||
|
|
||||||
@ -39,14 +59,14 @@ class Batch(Document):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_batch_qty(batch_no=None, warehouse=None, item_code=None):
|
def get_batch_qty(batch_no=None, warehouse=None, item_code=None):
|
||||||
'''Returns batch actual qty if warehouse is passed,
|
"""Returns batch actual qty if warehouse is passed,
|
||||||
or returns dict of qty by warehouse if warehouse is None
|
or returns dict of qty by warehouse if warehouse is None
|
||||||
|
|
||||||
The user must pass either batch_no or batch_no + warehouse or item_code + warehouse
|
The user must pass either batch_no or batch_no + warehouse or item_code + warehouse
|
||||||
|
|
||||||
:param batch_no: Optional - give qty for this batch no
|
:param batch_no: Optional - give qty for this batch no
|
||||||
:param warehouse: Optional - give qty for this warehouse
|
:param warehouse: Optional - give qty for this warehouse
|
||||||
:param item_code: Optional - give qty for this item'''
|
:param item_code: Optional - give qty for this item"""
|
||||||
frappe.has_permission('Batch', throw=True)
|
frappe.has_permission('Batch', throw=True)
|
||||||
out = 0
|
out = 0
|
||||||
if batch_no and warehouse:
|
if batch_no and warehouse:
|
||||||
@ -71,7 +91,7 @@ def get_batch_qty(batch_no=None, warehouse=None, item_code=None):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_batches_by_oldest(item_code, warehouse):
|
def get_batches_by_oldest(item_code, warehouse):
|
||||||
'''Returns the oldest batch and qty for the given item_code and warehouse'''
|
"""Returns the oldest batch and qty for the given item_code and warehouse"""
|
||||||
batches = get_batch_qty(item_code = item_code, warehouse = warehouse)
|
batches = get_batch_qty(item_code = item_code, warehouse = warehouse)
|
||||||
batches_dates = [[batch, frappe.get_value('Batch', batch.batch_no, 'expiry_date')] for batch in batches]
|
batches_dates = [[batch, frappe.get_value('Batch', batch.batch_no, 'expiry_date')] for batch in batches]
|
||||||
batches_dates.sort(key=lambda tup: tup[1])
|
batches_dates.sort(key=lambda tup: tup[1])
|
||||||
@ -79,7 +99,7 @@ def get_batches_by_oldest(item_code, warehouse):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def split_batch(batch_no, item_code, warehouse, qty, new_batch_id = None):
|
def split_batch(batch_no, item_code, warehouse, qty, new_batch_id = None):
|
||||||
'''Split the batch into a new batch'''
|
"""Split the batch into a new batch"""
|
||||||
batch = frappe.get_doc(dict(doctype='Batch', item=item_code, batch_id=new_batch_id)).insert()
|
batch = frappe.get_doc(dict(doctype='Batch', item=item_code, batch_id=new_batch_id)).insert()
|
||||||
stock_entry = frappe.get_doc(dict(
|
stock_entry = frappe.get_doc(dict(
|
||||||
doctype='Stock Entry',
|
doctype='Stock Entry',
|
||||||
@ -105,7 +125,7 @@ def split_batch(batch_no, item_code, warehouse, qty, new_batch_id = None):
|
|||||||
return batch.name
|
return batch.name
|
||||||
|
|
||||||
def set_batch_nos(doc, warehouse_field, throw = False):
|
def set_batch_nos(doc, warehouse_field, throw = False):
|
||||||
'''Automatically select `batch_no` for outgoing items in item table'''
|
"""Automatically select `batch_no` for outgoing items in item table"""
|
||||||
for d in doc.items:
|
for d in doc.items:
|
||||||
qty = d.get('stock_qty') or d.get('transfer_qty') or d.get('qty') or 0
|
qty = d.get('stock_qty') or d.get('transfer_qty') or d.get('qty') or 0
|
||||||
has_batch_no = frappe.db.get_value('Item', d.item_code, 'has_batch_no')
|
has_batch_no = frappe.db.get_value('Item', d.item_code, 'has_batch_no')
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
|
"autoname": "",
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
"creation": "2013-06-24 16:37:54",
|
"creation": "2013-06-24 16:37:54",
|
||||||
"custom": 0,
|
"custom": 0,
|
||||||
@ -666,6 +667,99 @@
|
|||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "batch_id_sb",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Batch Identification",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "use_naming_series",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Use Naming Series",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "BATCH-",
|
||||||
|
"depends_on": "eval:doc.use_naming_series==1",
|
||||||
|
"fieldname": "naming_series_prefix",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Naming Series Prefix",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"has_web_view": 0,
|
||||||
@ -679,7 +773,7 @@
|
|||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-11-17 01:35:49.562613",
|
"modified": "2018-01-12 09:38:58.200950",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Stock Settings",
|
"name": "Stock Settings",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user