Test case added for MTN
diff --git a/erpnext/sandbox/test_stock_entry.py b/erpnext/sandbox/test_stock_entry.py
index 273c442..44e1405 100644
--- a/erpnext/sandbox/test_stock_entry.py
+++ b/erpnext/sandbox/test_stock_entry.py
@@ -8,90 +8,182 @@
from webnotes.model.doc import Document
from webnotes.model.code import get_obj
from webnotes.utils import cstr, flt
+from webnotes.model.doclist import getlist
sql = webnotes.conn.sql
from sandbox.testdata.masters import *
from sandbox.testdata import stock_entry
#----------------------------------------------------------
+
class TestStockEntry(unittest.TestCase):
+ #===========================================================================
+ def assertDoc(self, lst):
+ """assert all values"""
+ for d in lst:
+ cl, vl = [], []
+ for k in d.keys():
+ if k!='doctype':
+ cl.append('%s=%s' % (k, '%s'))
+ vl.append(d[k])
+
+ self.assertTrue(sql("select name from `tab%s` where %s limit 1" % (d['doctype'], ' and '.join(cl)), vl))
+
+ #===========================================================================
+ def assertCount(self, lst):
+ """assert all values"""
+ for d in lst:
+ cl, vl = [], []
+ for k in d[0].keys():
+ if k!='doctype':
+ cl.append('%s=%s' % (k, '%s'))
+ vl.append(d[0][k])
+
+ self.assertTrue(sql("select count(name) from `tab%s` where %s limit 1" % (d[0]['doctype'], ' and '.join(cl)), vl)[0][0] == d[1])
+
+ #===========================================================================
def setUp(self):
print "====================================="
- webnotes.conn.begin()
-
+ webnotes.conn.begin()
create_master_records()
print 'Master Data Created'
- for each in stock_entry.mr:
+ #===========================================================================
+ # Purpose: Material Receipt
+ #===========================================================================
+ def test_mr_onsubmit(self):
+ print "Test Case: Stock Entry submission"
+ self.save_stock_entry('Material Receipt')
+
+ mr = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
+ self.submit_stock_entry(mr)
+
+ # stock ledger entry
+ print "Checking stock ledger entry........."
+ self.assertDoc(self.get_expected_sle('mr_submit'))
+
+ # bin qty
+ print "Checking Bin qty........."
+ self.assertDoc([{'doctype':'Bin', 'actual_qty':10, 'item_code':'it', 'warehouse':'wh1'}])
+
+ # serial no
+ self.assertCount([[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh1', 'status': 'In Store', 'docstatus': 0}, 10]])
+
+
+ #===========================================================================
+ def test_mr_oncancel(self):
+ print "Test Case: Stock Entry Cancellation"
+ self.save_stock_entry('Material Receipt')
+
+ mr = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
+ self.cancel_stock_entry(mr)
+
+ # stock ledger entry
+ print "Checking stock ledger entry........."
+ self.assertDoc(self.get_expected_sle('mr_cancel'))
+
+ # bin qty
+ print "Checking Bin qty........."
+ self.assertDoc([{'doctype':'Bin', 'actual_qty':0, 'item_code':'it', 'warehouse':'wh1'}])
+
+ # serial no
+ self.assertCount([[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': '', 'status': 'Not in Use', 'docstatus': 2}, 10]])
+
+ #===========================================================================
+ # Purpose: Material Transafer
+ #===========================================================================
+ def test_mtn_onsubmit(self):
+ print "Test Case: Stock Entry submission"
+
+ self.save_stock_entry('Material Receipt')
+ mr = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
+ mr = self.submit_stock_entry(mr)
+
+ self.save_stock_entry('Material Transfer')
+ mtn = get_obj('Stock Entry', stock_entry.mtn[0].name, with_children=1)
+ tn = self.submit_stock_entry(mtn)
+
+ # stock ledger entry
+ print "Checking stock ledger entry........."
+ self.assertDoc(self.get_expected_sle('mtn_submit'))
+
+ # bin qty
+ print "Checking Bin qty........."
+ self.assertDoc([
+ {'doctype':'Bin', 'actual_qty':5, 'item_code':'it', 'warehouse':'wh1'},
+ {'doctype':'Bin', 'actual_qty':5, 'item_code':'it', 'warehouse':'wh2'}
+ ])
+
+ # serial no
+ self.assertCount([
+ [{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh1', 'status': 'In Store', 'docstatus': 0}, 5],
+ [{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh2', 'status': 'In Store', 'docstatus': 0}, 5]
+ ])
+
+ #===========================================================================
+ def test_mtn_oncancel(self):
+ print "Test Case: Stock Entry Cancellation"
+
+ self.save_stock_entry('Material Receipt')
+ mr = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
+ mr = self.submit_stock_entry(mr)
+
+ self.save_stock_entry('Material Transfer')
+ mtn = get_obj('Stock Entry', stock_entry.mtn[0].name, with_children=1)
+ self.cancel_stock_entry(mtn)
+
+ # stock ledger entry
+ print "Checking stock ledger entry........."
+ self.assertDoc(self.get_expected_sle('mtn_cancel'))
+
+ # bin qty
+ print "Checking Bin qty........."
+ self.assertDoc([
+ {'doctype':'Bin', 'actual_qty':10, 'item_code':'it', 'warehouse':'wh1'},
+ {'doctype':'Bin', 'actual_qty':0, 'item_code':'it', 'warehouse':'wh2'}
+ ])
+
+ # serial no
+ self.assertCount([[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh1', 'status': 'In Store', 'docstatus': 0}, 10]])
+
+ #===========================================================================
+ def save_stock_entry(self, t):
+ if t == 'Material Receipt':
+ data = stock_entry.mr
+ elif t == 'Material Transfer':
+ data = stock_entry.mtn
+
+ for each in data:
each.save(1)
- for t in stock_entry.mr[1:]:
- sql("update `tabStock Entry Detail` set parent = '%s' where name = '%s'" % (stock_entry.mr[0].name, t.name))
+ for t in data[1:]:
+ sql("update `tabStock Entry Detail` set parent = '%s' where name = '%s'" % (data[0].name, t.name))
print "Stock Entry Created"
-
- #===========================================================================
- def test_stock_entry_onsubmit(self):
- print "Test Case: Stock Entry submission"
- self.submit_stock_entry()
-
- expected_sle = (('Stock Entry', stock_entry.mr[0].name, 10, 10, 100, 'No'),)
- self.check_sle(expected_sle)
-
- self.check_bin_qty(10)
- self.check_serial_no('submit', 10)
#===========================================================================
- def test_stock_entry_oncancel(self):
- print "Test Case: Stock Entry Cancellation"
- self.cancel_stock_entry()
+ def submit_stock_entry(self, ste):
+ ste.validate()
+ ste.on_submit()
- expected_sle = (
- ('Stock Entry', stock_entry.mr[0].name, 10, 10, 100, 'Yes'),
- ('Stock Entry', stock_entry.mr[0].name, -10, None, None, 'Yes'),
- )
- self.check_sle(expected_sle)
-
- self.check_bin_qty(0)
- self.check_serial_no('cancel', 10)
-
-
- #===========================================================================
- def submit_stock_entry(self):
- ste1 = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
- ste1.validate()
- ste1.on_submit()
-
- ste1.doc.docstatus = 1
- ste1.doc.save()
-
+ ste.doc.docstatus = 1
+ ste.doc.save()
+
print "Stock Entry Submitted"
-
+ return ste
#===========================================================================
- def cancel_stock_entry(self):
- self.submit_stock_entry()
+ def cancel_stock_entry(self, ste):
+ ste = self.submit_stock_entry(ste)
- ste1 = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
- ste1.on_cancel()
+ ste.on_cancel()
- ste1.doc.cancel_reason = "testing"
- ste1.doc.docstatus = 2
- ste1.doc.save()
+ ste.doc.cancel_reason = "testing"
+ ste.doc.docstatus = 2
+ ste.doc.save()
print "Stock Entry Cancelled"
-
- #===========================================================================
- def check_sle(self, expected):
- print "Checking stock ledger entry........."
- sle = sql("select voucher_type, voucher_no, actual_qty, bin_aqat, valuation_rate, is_cancelled from `tabStock Ledger Entry` where item_code = 'it' and warehouse = 'wh1'")
- self.assertTrue(sle == expected)
-
- #===========================================================================
- def check_bin_qty(self, expected_qty):
- print "Checking Bin qty........."
- bin_qty = sql("select actual_qty from tabBin where item_code = 'it' and warehouse = 'wh1'")
- self.assertTrue(bin_qty[0][0] == expected_qty)
+ return ste
#===========================================================================
def check_serial_no(self, action, cnt):
@@ -104,7 +196,110 @@
ser = sql("select count(name) from `tabSerial No` where item_code = 'it' and warehouse = '%s' and status = '%s' and docstatus = %s" % (wh, status, docstatus))
self.assertTrue(ser[0][0] == cnt)
-
+
#===========================================================================
def tearDown(self):
webnotes.conn.rollback()
+
+
+ # Expected Result Set
+ #===================================================================================================
+ def get_expected_sle(self, action):
+ expected_sle = {
+ 'mr_submit': [{
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mr[0].name,
+ 'actual_qty': 10,
+ 'bin_aqat': 10,
+ 'valuation_rate': 100,
+ 'is_cancelled': 'No'
+ }],
+ 'mr_cancel': [{
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mr[0].name,
+ 'actual_qty': 10,
+ 'bin_aqat': 10,
+ 'valuation_rate': 100,
+ 'is_cancelled': 'Yes'
+ },{
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mr[0].name,
+ 'actual_qty': -10,
+ 'ifnull(bin_aqat, 0)': 0,
+ 'ifnull(valuation_rate, 0)': 0,
+ "ifnull(is_cancelled, 'No')": 'Yes'
+ }],
+ 'mtn_submit': [{
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': -5,
+ 'bin_aqat': 5,
+ 'valuation_rate': 100,
+ 'is_cancelled': 'No'
+ }, {
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh2',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': 5,
+ 'bin_aqat': 5,
+ 'valuation_rate': 100,
+ 'is_cancelled': 'No'
+ }],
+ 'mtn_cancel': [{
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': -5,
+ 'bin_aqat': 5,
+ #'valuation_rate': 100,
+ 'is_cancelled': 'Yes'
+ }, {
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh2',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': 5,
+ 'bin_aqat': 5,
+ 'valuation_rate': 100,
+ 'is_cancelled': 'Yes'
+ }, {
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh1',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': 5,
+ #'bin_aqat': 10,
+ #'valuation_rate': 100,
+ 'is_cancelled': 'Yes'
+ }, {
+ 'doctype': 'Stock Ledger Entry',
+ 'item_code':'it',
+ 'warehouse':'wh2',
+ 'voucher_type': 'Stock Entry',
+ 'voucher_no': stock_entry.mtn[0].name,
+ 'actual_qty': -5,
+ #'bin_aqat': 0,
+ #'valuation_rate': 100,
+ 'is_cancelled': 'Yes'
+ }]
+ }
+
+ return expected_sle[action]
diff --git a/erpnext/sandbox/testdata/stock_entry.py b/erpnext/sandbox/testdata/stock_entry.py
index e2d1d71..b224774 100644
--- a/erpnext/sandbox/testdata/stock_entry.py
+++ b/erpnext/sandbox/testdata/stock_entry.py
@@ -10,7 +10,7 @@
'company': 'comp',
'fiscal_year' : '2011-2012',
'purpose': 'Material Receipt',
- 'name': 'ste'
+ 'name': 'mr'
}
),
Document(
@@ -18,7 +18,7 @@
'doctype': 'Stock Entry Detail',
'parenttype': 'Stock Entry',
'parentfield' : 'mtn_details',
- 'parent' : 'ste',
+ 'parent' : 'mr',
'item_code' : 'it',
't_warehouse' : 'wh1',
'qty' : 10,
@@ -30,3 +30,36 @@
}
)
]
+
+
+mtn = [
+ Document(
+ fielddata = {
+ 'doctype': 'Stock Entry',
+ 'posting_date': '2011-09-01',
+ 'transfer_date': '2011-09-01',
+ 'posting_time': '13:00',
+ 'company': 'comp',
+ 'fiscal_year' : '2011-2012',
+ 'purpose': 'Material Transfer',
+ 'name': 'mtn'
+ }
+ ),
+ Document(
+ fielddata ={
+ 'doctype': 'Stock Entry Detail',
+ 'parenttype': 'Stock Entry',
+ 'parentfield' : 'mtn_details',
+ 'parent' : 'mtn',
+ 'item_code' : 'it',
+ 's_warehouse' : 'wh1',
+ 't_warehouse' : 'wh2',
+ 'qty' : 5,
+ 'transfer_qty' : 5,
+ 'incoming_rate': 100,
+ 'stock_uom': 'Nos',
+ 'conversion_factor': 1,
+ 'serial_no': 'srno1, srno2, srno3, srno4, srno5'
+ }
+ )
+]
diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
index c1bfa96..5165cc9 100644
--- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
@@ -185,7 +185,7 @@
self.check_serial_no_exists(serial_no, d.item_code)
self.set_delivery_serial_no_values(obj, serial_no)
else:
- sql("update `tabSerial No` set docstatus = 0, status = 'In Store', delivery_document_type = '', delivery_document_no = '', delivery_date = '', customer = null, customer_name = '', delivery_address = '', territory = null where name = '%s'" % (serial_no))
+ sql("update `tabSerial No` set docstatus = 0, status = 'In Store', delivery_document_type = '', delivery_document_no = '', delivery_date = null, customer = null, customer_name = '', delivery_address = '', territory = null where name = '%s'" % (serial_no))
# ---------------------