Merge branch 'master' of github.com:webnotes/erpnext
This commit is contained in:
commit
8f90e1c8f4
@ -641,8 +641,8 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
return new_si
|
return new_si
|
||||||
|
|
||||||
# if yearly, test 3 repetitions, else test 13 repetitions
|
# if yearly, test 3 repetitions, else test 5 repetitions
|
||||||
count = 3 if no_of_months == 12 else 13
|
count = 1 if (no_of_months == 12) else 5
|
||||||
for i in xrange(count):
|
for i in xrange(count):
|
||||||
base_si = _test(i)
|
base_si = _test(i)
|
||||||
|
|
||||||
@ -653,7 +653,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
def test_serialized(self):
|
def test_serialized(self):
|
||||||
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
|
from stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
|
|
||||||
se = make_serialized_item()
|
se = make_serialized_item()
|
||||||
serial_nos = get_serial_nos(se.doclist[1].serial_no)
|
serial_nos = get_serial_nos(se.doclist[1].serial_no)
|
||||||
@ -674,7 +674,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
return si
|
return si
|
||||||
|
|
||||||
def test_serialized_cancel(self):
|
def test_serialized_cancel(self):
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
|
from stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
si = self.test_serialized()
|
si = self.test_serialized()
|
||||||
si.cancel()
|
si.cancel()
|
||||||
|
|
||||||
@ -686,7 +686,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
"delivery_document_no"))
|
"delivery_document_no"))
|
||||||
|
|
||||||
def test_serialize_status(self):
|
def test_serialize_status(self):
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import SerialNoStatusError, get_serial_nos
|
from stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos
|
||||||
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
||||||
|
|
||||||
se = make_serialized_item()
|
se = make_serialized_item()
|
||||||
|
@ -98,11 +98,11 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
self.assertEquals(len(po.doclist.get({"parentfield": "po_raw_material_details"})), 2)
|
self.assertEquals(len(po.doclist.get({"parentfield": "po_raw_material_details"})), 2)
|
||||||
|
|
||||||
def test_warehouse_company_validation(self):
|
def test_warehouse_company_validation(self):
|
||||||
from controllers.buying_controller import WrongWarehouseCompany
|
from stock.utils import InvalidWarehouseCompany
|
||||||
po = webnotes.bean(copy=test_records[0])
|
po = webnotes.bean(copy=test_records[0])
|
||||||
po.doc.company = "_Test Company 1"
|
po.doc.company = "_Test Company 1"
|
||||||
po.doc.conversion_rate = 0.0167
|
po.doc.conversion_rate = 0.0167
|
||||||
self.assertRaises(WrongWarehouseCompany, po.insert)
|
self.assertRaises(InvalidWarehouseCompany, po.insert)
|
||||||
|
|
||||||
def test_uom_integer_validation(self):
|
def test_uom_integer_validation(self):
|
||||||
from utilities.transaction_base import UOMMustBeIntegerError
|
from utilities.transaction_base import UOMMustBeIntegerError
|
||||||
|
@ -11,8 +11,6 @@ from setup.utils import get_company_currency
|
|||||||
|
|
||||||
from controllers.stock_controller import StockController
|
from controllers.stock_controller import StockController
|
||||||
|
|
||||||
class WrongWarehouseCompany(Exception): pass
|
|
||||||
|
|
||||||
class BuyingController(StockController):
|
class BuyingController(StockController):
|
||||||
def onload_post_render(self):
|
def onload_post_render(self):
|
||||||
# contact, address, item details
|
# contact, address, item details
|
||||||
|
@ -160,7 +160,7 @@ class TestDeliveryNote(unittest.TestCase):
|
|||||||
|
|
||||||
def test_serialized(self):
|
def test_serialized(self):
|
||||||
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
|
from stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
|
|
||||||
se = make_serialized_item()
|
se = make_serialized_item()
|
||||||
serial_nos = get_serial_nos(se.doclist[1].serial_no)
|
serial_nos = get_serial_nos(se.doclist[1].serial_no)
|
||||||
@ -180,7 +180,7 @@ class TestDeliveryNote(unittest.TestCase):
|
|||||||
return dn
|
return dn
|
||||||
|
|
||||||
def test_serialized_cancel(self):
|
def test_serialized_cancel(self):
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
|
from stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
dn = self.test_serialized()
|
dn = self.test_serialized()
|
||||||
dn.cancel()
|
dn.cancel()
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ class TestDeliveryNote(unittest.TestCase):
|
|||||||
"delivery_document_no"))
|
"delivery_document_no"))
|
||||||
|
|
||||||
def test_serialize_status(self):
|
def test_serialize_status(self):
|
||||||
from stock.doctype.stock_ledger_entry.stock_ledger_entry import SerialNoStatusError, get_serial_nos
|
from stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos
|
||||||
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
||||||
|
|
||||||
se = make_serialized_item()
|
se = make_serialized_item()
|
||||||
|
@ -315,10 +315,10 @@ class TestMaterialRequest(unittest.TestCase):
|
|||||||
self.assertRaises(webnotes.MappingMismatchError, se.insert)
|
self.assertRaises(webnotes.MappingMismatchError, se.insert)
|
||||||
|
|
||||||
def test_warehouse_company_validation(self):
|
def test_warehouse_company_validation(self):
|
||||||
from controllers.buying_controller import WrongWarehouseCompany
|
from stock.utils import InvalidWarehouseCompany
|
||||||
mr = webnotes.bean(copy=test_records[0])
|
mr = webnotes.bean(copy=test_records[0])
|
||||||
mr.doc.company = "_Test Company 1"
|
mr.doc.company = "_Test Company 1"
|
||||||
self.assertRaises(WrongWarehouseCompany, mr.insert)
|
self.assertRaises(InvalidWarehouseCompany, mr.insert)
|
||||||
|
|
||||||
test_dependencies = ["Currency Exchange"]
|
test_dependencies = ["Currency Exchange"]
|
||||||
test_records = [
|
test_records = [
|
||||||
|
@ -7,7 +7,7 @@ import webnotes
|
|||||||
from webnotes.utils import cstr, flt, cint
|
from webnotes.utils import cstr, flt, cint
|
||||||
from webnotes.model.bean import getlist
|
from webnotes.model.bean import getlist
|
||||||
from webnotes.model.code import get_obj
|
from webnotes.model.code import get_obj
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, _
|
||||||
import webnotes.defaults
|
import webnotes.defaults
|
||||||
from stock.utils import update_bin
|
from stock.utils import update_bin
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ class DocType(BuyingController):
|
|||||||
self.update_stock()
|
self.update_stock()
|
||||||
|
|
||||||
from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
|
from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
|
||||||
update_serial_nos_after_submit(self, "Purchase Receipt", "purchase_receipt_details")
|
update_serial_nos_after_submit(self, "purchase_receipt_details")
|
||||||
|
|
||||||
purchase_controller.update_last_purchase_rate(self, 1)
|
purchase_controller.update_last_purchase_rate(self, 1)
|
||||||
|
|
||||||
|
@ -37,10 +37,7 @@ class DocType(StockController):
|
|||||||
self.validate_warehouse()
|
self.validate_warehouse()
|
||||||
self.validate_item()
|
self.validate_item()
|
||||||
|
|
||||||
if self.via_stock_ledger:
|
self.on_stock_ledger_entry()
|
||||||
self.set_status()
|
|
||||||
self.set_purchase_details()
|
|
||||||
self.set_sales_details()
|
|
||||||
|
|
||||||
def validate_amc_status(self):
|
def validate_amc_status(self):
|
||||||
"""
|
"""
|
||||||
@ -182,6 +179,12 @@ class DocType(StockController):
|
|||||||
where name=%s""" % (dt[0], '%s', '%s'),
|
where name=%s""" % (dt[0], '%s', '%s'),
|
||||||
('\n'.join(serial_nos), item[0]))
|
('\n'.join(serial_nos), item[0]))
|
||||||
|
|
||||||
|
def on_stock_ledger_entry(self):
|
||||||
|
if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
|
||||||
|
self.set_status()
|
||||||
|
self.set_purchase_details()
|
||||||
|
self.set_sales_details()
|
||||||
|
|
||||||
def process_serial_no(sle):
|
def process_serial_no(sle):
|
||||||
item_det = get_item_details(sle.item_code)
|
item_det = get_item_details(sle.item_code)
|
||||||
validate_serial_no(sle, item_det)
|
validate_serial_no(sle, item_det)
|
||||||
@ -233,6 +236,14 @@ def validate_serial_no(sle, item_det):
|
|||||||
+ sle.item_code), SerialNoRequiredError)
|
+ sle.item_code), SerialNoRequiredError)
|
||||||
|
|
||||||
def update_serial_nos(sle, item_det):
|
def update_serial_nos(sle, item_det):
|
||||||
|
if not sle.serial_no and sle.actual_qty > 0 and item_det.serial_no_series:
|
||||||
|
from webnotes.model.doc import make_autoname
|
||||||
|
serial_nos = []
|
||||||
|
for i in xrange(cint(sle.actual_qty)):
|
||||||
|
serial_nos.append(make_autoname(item_det.serial_no_series))
|
||||||
|
|
||||||
|
webnotes.conn.set(sle, "serial_no", "\n".join(serial_nos))
|
||||||
|
|
||||||
if sle.serial_no:
|
if sle.serial_no:
|
||||||
serial_nos = get_serial_nos(sle.serial_no)
|
serial_nos = get_serial_nos(sle.serial_no)
|
||||||
for serial_no in serial_nos:
|
for serial_no in serial_nos:
|
||||||
@ -243,12 +254,6 @@ def update_serial_nos(sle, item_det):
|
|||||||
sr.save()
|
sr.save()
|
||||||
elif sle.actual_qty > 0:
|
elif sle.actual_qty > 0:
|
||||||
make_serial_no(serial_no, sle)
|
make_serial_no(serial_no, sle)
|
||||||
elif sle.actual_qty > 0 and item_det.serial_no_series:
|
|
||||||
from webnotes.model.doc import make_autoname
|
|
||||||
serial_nos = []
|
|
||||||
for i in xrange(cint(sle.actual_qty)):
|
|
||||||
serial_nos.append(make_serial_no(make_autoname(item_det.serial_no_series), sle))
|
|
||||||
sle.serial_no = "\n".join(serial_nos)
|
|
||||||
|
|
||||||
def get_item_details(item_code):
|
def get_item_details(item_code):
|
||||||
return webnotes.conn.sql("""select name, has_batch_no, docstatus,
|
return webnotes.conn.sql("""select name, has_batch_no, docstatus,
|
||||||
@ -270,13 +275,16 @@ def make_serial_no(serial_no, sle):
|
|||||||
webnotes.msgprint(_("Serial No created") + ": " + sr.doc.name)
|
webnotes.msgprint(_("Serial No created") + ": " + sr.doc.name)
|
||||||
return sr.doc.name
|
return sr.doc.name
|
||||||
|
|
||||||
def update_serial_nos_after_submit(controller, parenttype, parentfield):
|
def update_serial_nos_after_submit(controller, parentfield):
|
||||||
if not hasattr(webnotes, "new_stock_ledger_entries"):
|
stock_ledger_entries = webnotes.conn.sql("""select voucher_detail_no, serial_no
|
||||||
return
|
from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
|
||||||
|
(controller.doc.doctype, controller.doc.name), as_dict=True)
|
||||||
|
|
||||||
|
if not stock_ledger_entries: return
|
||||||
|
|
||||||
for d in controller.doclist.get({"parentfield": parentfield}):
|
for d in controller.doclist.get({"parentfield": parentfield}):
|
||||||
serial_no = None
|
serial_no = None
|
||||||
for sle in webnotes.new_stock_ledger_entries:
|
for sle in stock_ledger_entries:
|
||||||
if sle.voucher_detail_no==d.name:
|
if sle.voucher_detail_no==d.name:
|
||||||
serial_no = sle.serial_no
|
serial_no = sle.serial_no
|
||||||
break
|
break
|
||||||
|
@ -55,7 +55,7 @@ class DocType(StockController):
|
|||||||
self.update_stock_ledger()
|
self.update_stock_ledger()
|
||||||
|
|
||||||
from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
|
from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
|
||||||
update_serial_nos_after_submit(self, "Stock Entry", "mtn_details")
|
update_serial_nos_after_submit(self, "mtn_details")
|
||||||
|
|
||||||
self.update_production_order()
|
self.update_production_order()
|
||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
|
@ -43,11 +43,13 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
webnotes.conn.set_default("company", self.old_default_company)
|
webnotes.conn.set_default("company", self.old_default_company)
|
||||||
|
|
||||||
def test_warehouse_company_validation(self):
|
def test_warehouse_company_validation(self):
|
||||||
|
set_perpetual_inventory(0)
|
||||||
self._clear_stock_account_balance()
|
self._clear_stock_account_balance()
|
||||||
webnotes.session.user = "test2@example.com"
|
|
||||||
webnotes.bean("Profile", "test2@example.com").get_controller()\
|
webnotes.bean("Profile", "test2@example.com").get_controller()\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
|
webnotes.session.user = "test2@example.com"
|
||||||
|
|
||||||
from stock.utils import InvalidWarehouseCompany
|
from stock.utils import InvalidWarehouseCompany
|
||||||
st1 = webnotes.bean(copy=test_records[0])
|
st1 = webnotes.bean(copy=test_records[0])
|
||||||
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
||||||
@ -57,15 +59,16 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
webnotes.session.user = "Administrator"
|
webnotes.session.user = "Administrator"
|
||||||
|
|
||||||
def test_warehouse_user(self):
|
def test_warehouse_user(self):
|
||||||
|
set_perpetual_inventory(0)
|
||||||
from stock.utils import UserNotAllowedForWarehouse
|
from stock.utils import UserNotAllowedForWarehouse
|
||||||
|
|
||||||
webnotes.session.user = "test@example.com"
|
|
||||||
webnotes.bean("Profile", "test@example.com").get_controller()\
|
webnotes.bean("Profile", "test@example.com").get_controller()\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
webnotes.bean("Profile", "test2@example.com").get_controller()\
|
webnotes.bean("Profile", "test2@example.com").get_controller()\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
|
webnotes.session.user = "test@example.com"
|
||||||
st1 = webnotes.bean(copy=test_records[0])
|
st1 = webnotes.bean(copy=test_records[0])
|
||||||
st1.doc.company = "_Test Company 1"
|
st1.doc.company = "_Test Company 1"
|
||||||
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
||||||
|
@ -14,10 +14,7 @@ class DocType(DocListController):
|
|||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
from stock.utils import validate_warehouse_user, validate_warehouse_company
|
from stock.utils import validate_warehouse_user, validate_warehouse_company
|
||||||
if not hasattr(webnotes, "new_stock_ledger_entries"):
|
|
||||||
webnotes.new_stock_ledger_entries = []
|
|
||||||
|
|
||||||
webnotes.new_stock_ledger_entries.append(self.doc)
|
|
||||||
self.validate_mandatory()
|
self.validate_mandatory()
|
||||||
self.validate_item()
|
self.validate_item()
|
||||||
validate_warehouse_user(self.doc.warehouse)
|
validate_warehouse_user(self.doc.warehouse)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user