Merge pull request #1844 from anandpdoshi/anand-wip
Serial No Validation in Stock Entry, Warehouse query fix
This commit is contained in:
commit
7ca3be57df
@ -424,8 +424,7 @@ class AccountsController(TransactionBase):
|
|||||||
|
|
||||||
def get_stock_items(self):
|
def get_stock_items(self):
|
||||||
stock_items = []
|
stock_items = []
|
||||||
item_codes = list(set(item.item_code for item in
|
item_codes = list(set(item.item_code for item in self.get(self.fname)))
|
||||||
self.get(self.fname)))
|
|
||||||
if item_codes:
|
if item_codes:
|
||||||
stock_items = [r[0] for r in frappe.db.sql("""select name
|
stock_items = [r[0] for r in frappe.db.sql("""select name
|
||||||
from `tabItem` where name in (%s) and is_stock_item='Yes'""" % \
|
from `tabItem` where name in (%s) and is_stock_item='Yes'""" % \
|
||||||
|
@ -275,6 +275,16 @@ class StockController(AccountsController):
|
|||||||
and voucher_no=%s""", (self.doctype, self.name)):
|
and voucher_no=%s""", (self.doctype, self.name)):
|
||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
|
|
||||||
|
def get_serialized_items(self):
|
||||||
|
serialized_items = []
|
||||||
|
item_codes = list(set([d.item_code for d in self.get(self.fname)]))
|
||||||
|
if item_codes:
|
||||||
|
serialized_items = frappe.db.sql_list("""select name from `tabItem`
|
||||||
|
where has_serial_no='Yes' and name in ({})""".format(", ".join(["%s"]*len(item_codes))),
|
||||||
|
tuple(item_codes))
|
||||||
|
|
||||||
|
return serialized_items
|
||||||
|
|
||||||
def update_gl_entries_after(posting_date, posting_time, warehouse_account=None, for_items=None):
|
def update_gl_entries_after(posting_date, posting_time, warehouse_account=None, for_items=None):
|
||||||
def _delete_gl_entries(voucher_type, voucher_no):
|
def _delete_gl_entries(voucher_type, voucher_no):
|
||||||
frappe.db.sql("""delete from `tabGL Entry`
|
frappe.db.sql("""delete from `tabGL Entry`
|
||||||
|
@ -13,14 +13,19 @@ erpnext.stock.StockController = frappe.ui.form.Controller.extend({
|
|||||||
|
|
||||||
setup_warehouse_query: function() {
|
setup_warehouse_query: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
var warehouse_query_method = function() {
|
||||||
|
return erpnext.queries.warehouse(me.frm.doc);
|
||||||
|
};
|
||||||
|
|
||||||
var _set_warehouse_query = function(doctype, parentfield) {
|
var _set_warehouse_query = function(doctype, parentfield) {
|
||||||
var warehouse_link_fields = frappe.meta.get_docfields(doctype, me.frm.doc.name,
|
var warehouse_link_fields = frappe.meta.get_docfields(doctype, me.frm.doc.name,
|
||||||
{"fieldtype": "Link", "options": "Warehouse"});
|
{"fieldtype": "Link", "options": "Warehouse"});
|
||||||
$.each(warehouse_link_fields, function(i, df) {
|
$.each(warehouse_link_fields, function(i, df) {
|
||||||
me.frm.set_query(df.fieldname, parentfield, function() {
|
if(parentfield) {
|
||||||
return erpnext.queries.warehouse(me.frm.doc);
|
me.frm.set_query(df.fieldname, parentfield, warehouse_query_method);
|
||||||
})
|
} else {
|
||||||
|
me.frm.set_query(df.fieldname, warehouse_query_method);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ cur_frm.cscript.sales_team_fname = "sales_team";
|
|||||||
{% include 'accounts/doctype/sales_invoice/pos.js' %}
|
{% include 'accounts/doctype/sales_invoice/pos.js' %}
|
||||||
|
|
||||||
frappe.provide("erpnext.stock");
|
frappe.provide("erpnext.stock");
|
||||||
|
frappe.provide("erpnext.stock.delivery_note");
|
||||||
erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend({
|
erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend({
|
||||||
refresh: function(doc, dt, dn) {
|
refresh: function(doc, dt, dn) {
|
||||||
this._super();
|
this._super();
|
||||||
@ -40,7 +41,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
|
|||||||
cur_frm.add_custom_button(__('Make Packing Slip'), cur_frm.cscript['Make Packing Slip']);
|
cur_frm.add_custom_button(__('Make Packing Slip'), cur_frm.cscript['Make Packing Slip']);
|
||||||
}
|
}
|
||||||
|
|
||||||
set_print_hide(doc, dt, dn);
|
erpnext.stock.delivery_note.set_print_hide(doc, dt, dn);
|
||||||
|
|
||||||
// unhide expense_account and cost_center is auto_accounting_for_stock enabled
|
// unhide expense_account and cost_center is auto_accounting_for_stock enabled
|
||||||
var aii_enabled = cint(sys_defaults.auto_accounting_for_stock)
|
var aii_enabled = cint(sys_defaults.auto_accounting_for_stock)
|
||||||
@ -124,7 +125,7 @@ cur_frm.cscript['Make Packing Slip'] = function() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
var set_print_hide= function(doc, cdt, cdn){
|
erpnext.stock.delivery_note.set_print_hide = function(doc, cdt, cdn){
|
||||||
var dn_fields = frappe.meta.docfield_map['Delivery Note'];
|
var dn_fields = frappe.meta.docfield_map['Delivery Note'];
|
||||||
var dn_item_fields = frappe.meta.docfield_map['Delivery Note Item'];
|
var dn_item_fields = frappe.meta.docfield_map['Delivery Note Item'];
|
||||||
var dn_fields_copy = dn_fields;
|
var dn_fields_copy = dn_fields;
|
||||||
@ -147,7 +148,7 @@ var set_print_hide= function(doc, cdt, cdn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.print_without_amount = function(doc, cdt, cdn) {
|
cur_frm.cscript.print_without_amount = function(doc, cdt, cdn) {
|
||||||
set_print_hide(doc, cdt, cdn);
|
erpnext.stock.delivery_note.set_print_hide(doc, cdt, cdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ class StockEntry(StockController):
|
|||||||
|
|
||||||
def validate_item(self):
|
def validate_item(self):
|
||||||
stock_items = self.get_stock_items()
|
stock_items = self.get_stock_items()
|
||||||
|
serialized_items = self.get_serialized_items()
|
||||||
for item in self.get("mtn_details"):
|
for item in self.get("mtn_details"):
|
||||||
if item.item_code not in stock_items:
|
if item.item_code not in stock_items:
|
||||||
frappe.throw(_("{0} is not a stock Item").format(item.item_code))
|
frappe.throw(_("{0} is not a stock Item").format(item.item_code))
|
||||||
@ -88,6 +89,12 @@ class StockEntry(StockController):
|
|||||||
item.conversion_factor = 1
|
item.conversion_factor = 1
|
||||||
if not item.transfer_qty:
|
if not item.transfer_qty:
|
||||||
item.transfer_qty = item.qty * item.conversion_factor
|
item.transfer_qty = item.qty * item.conversion_factor
|
||||||
|
if (self.purpose in ("Material Transfer", "Sales Return", "Purchase Return")
|
||||||
|
and not item.serial_no
|
||||||
|
and item.item_code in serialized_items):
|
||||||
|
frappe.throw(_("Row #{0}: Please specify Serial No for Item {1}").format(item.idx, item.item_code),
|
||||||
|
frappe.MandatoryError)
|
||||||
|
|
||||||
|
|
||||||
def validate_warehouse(self, pro_obj):
|
def validate_warehouse(self, pro_obj):
|
||||||
"""perform various (sometimes conditional) validations on warehouse"""
|
"""perform various (sometimes conditional) validations on warehouse"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user