Batch Stock Items, having serial number can't be moved without inserting Serial Number (#11792) (#11813)
* if doctype is batch, add extra information to args * automatically fetch serial numbers if possible * take advantage of changes in make_stock_entry * code clean up * PEP 8 compliance * fix bug that clears serial number
This commit is contained in:
parent
1fb285c165
commit
3061fc92fd
@ -65,12 +65,17 @@ frappe.ui.form.on('Batch', {
|
|||||||
// move - ask for target warehouse and make stock entry
|
// move - ask for target warehouse and make stock entry
|
||||||
rows.find('.btn-move').on('click', function() {
|
rows.find('.btn-move').on('click', function() {
|
||||||
var $btn = $(this);
|
var $btn = $(this);
|
||||||
frappe.prompt({
|
const fields = [
|
||||||
|
{
|
||||||
fieldname: 'to_warehouse',
|
fieldname: 'to_warehouse',
|
||||||
label: __('To Warehouse'),
|
label: __('To Warehouse'),
|
||||||
fieldtype: 'Link',
|
fieldtype: 'Link',
|
||||||
options: 'Warehouse'
|
options: 'Warehouse'
|
||||||
},
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
frappe.prompt(
|
||||||
|
fields,
|
||||||
(data) => {
|
(data) => {
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry',
|
method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry',
|
||||||
@ -79,7 +84,9 @@ frappe.ui.form.on('Batch', {
|
|||||||
batch_no: frm.doc.name,
|
batch_no: frm.doc.name,
|
||||||
qty: $btn.attr('data-qty'),
|
qty: $btn.attr('data-qty'),
|
||||||
from_warehouse: $btn.attr('data-warehouse'),
|
from_warehouse: $btn.attr('data-warehouse'),
|
||||||
to_warehouse: data.to_warehouse
|
to_warehouse: data.to_warehouse,
|
||||||
|
source_document: frm.doc.reference_name,
|
||||||
|
reference_doctype: frm.doc.reference_doctype
|
||||||
},
|
},
|
||||||
callback: (r) => {
|
callback: (r) => {
|
||||||
frappe.show_alert(__('Stock Entry {0} created',
|
frappe.show_alert(__('Stock Entry {0} created',
|
||||||
|
|||||||
@ -12,6 +12,7 @@ from erpnext import set_perpetual_inventory
|
|||||||
from erpnext.stock.doctype.serial_no.serial_no import SerialNoDuplicateError
|
from erpnext.stock.doctype.serial_no.serial_no import SerialNoDuplicateError
|
||||||
from erpnext.accounts.doctype.account.test_account import get_inventory_account
|
from erpnext.accounts.doctype.account.test_account import get_inventory_account
|
||||||
|
|
||||||
|
|
||||||
class TestPurchaseReceipt(unittest.TestCase):
|
class TestPurchaseReceipt(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
||||||
@ -273,11 +274,13 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
serial_no=serial_no, basic_rate=100, do_not_submit=True)
|
serial_no=serial_no, basic_rate=100, do_not_submit=True)
|
||||||
self.assertRaises(SerialNoDuplicateError, se.submit)
|
self.assertRaises(SerialNoDuplicateError, se.submit)
|
||||||
|
|
||||||
|
|
||||||
def get_gl_entries(voucher_type, voucher_no):
|
def get_gl_entries(voucher_type, voucher_no):
|
||||||
return frappe.db.sql("""select account, debit, credit
|
return frappe.db.sql("""select account, debit, credit
|
||||||
from `tabGL Entry` where voucher_type=%s and voucher_no=%s
|
from `tabGL Entry` where voucher_type=%s and voucher_no=%s
|
||||||
order by account desc""", (voucher_type, voucher_no), as_dict=1)
|
order by account desc""", (voucher_type, voucher_no), as_dict=1)
|
||||||
|
|
||||||
|
|
||||||
def make_purchase_receipt(**args):
|
def make_purchase_receipt(**args):
|
||||||
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
||||||
pr = frappe.new_doc("Purchase Receipt")
|
pr = frappe.new_doc("Purchase Receipt")
|
||||||
|
|||||||
@ -20,6 +20,16 @@ def make_stock_entry(**args):
|
|||||||
:do_not_save: Optional flag
|
:do_not_save: Optional flag
|
||||||
:do_not_submit: Optional flag
|
:do_not_submit: Optional flag
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
def process_serial_numbers(serial_nos_list):
|
||||||
|
serial_nos_list = [
|
||||||
|
'\n'.join(serial_num['serial_no'] for serial_num in serial_nos_list)
|
||||||
|
]
|
||||||
|
|
||||||
|
uniques = list(set(serial_nos_list[0].split('\n')))
|
||||||
|
|
||||||
|
return '\n'.join(uniques)
|
||||||
|
|
||||||
s = frappe.new_doc("Stock Entry")
|
s = frappe.new_doc("Stock Entry")
|
||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
|
||||||
@ -77,6 +87,25 @@ def make_stock_entry(**args):
|
|||||||
if not args.cost_center:
|
if not args.cost_center:
|
||||||
args.cost_center = frappe.get_value('Company', s.company, 'cost_center')
|
args.cost_center = frappe.get_value('Company', s.company, 'cost_center')
|
||||||
|
|
||||||
|
if not args.expense_account:
|
||||||
|
args.expense_account = frappe.get_value('Company', s.company, 'stock_adjustment_account')
|
||||||
|
|
||||||
|
# We can find out the serial number using the batch source document
|
||||||
|
serial_number = args.serial_no
|
||||||
|
|
||||||
|
if not args.serial_no and args.qty and args.batch_no:
|
||||||
|
serial_number_list = frappe.get_list(
|
||||||
|
doctype='Stock Ledger Entry',
|
||||||
|
fields=['serial_no'],
|
||||||
|
filters={
|
||||||
|
'batch_no': args.batch_no,
|
||||||
|
'warehouse': args.from_warehouse
|
||||||
|
}
|
||||||
|
)
|
||||||
|
serial_number = process_serial_numbers(serial_number_list)
|
||||||
|
|
||||||
|
args.serial_no = serial_number
|
||||||
|
|
||||||
s.append("items", {
|
s.append("items", {
|
||||||
"item_code": args.item,
|
"item_code": args.item,
|
||||||
"s_warehouse": args.source,
|
"s_warehouse": args.source,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user