def make_serial_item_with_serial(item_code): serial_item_doc = create_item(item_code, is_stock_item=1) if not serial_item_doc.has_serial_no or not serial_item_doc.serial_no_series: serial_item_doc.has_serial_no = 1 serial_item_doc.serial_no_series = "TEST.###" serial_item_doc.save(ignore_permissions=True) active_serials = frappe.db.get_all("Serial No", { "status": "Active", "item_code": item_code }) if len(active_serials) < 2: make_serialized_item(item_code=item_code)
def test_serialized_item_transaction(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) pos = create_pos_invoice(item=se.get("items")[0].item_code, rate=1000, do_not_save=1) pos.get("items")[0].serial_no = serial_nos[0] pos.append( "payments", { 'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000 }) pos.insert() pos.submit() pos2 = create_pos_invoice(item=se.get("items")[0].item_code, rate=1000, do_not_save=1) pos2.get("items")[0].serial_no = serial_nos[0] pos2.append( "payments", { 'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000 }) self.assertRaises(frappe.ValidationError, pos2.insert)
def test_serialized_item_transaction(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item(company='_Test Company', target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC') serial_nos = get_serial_nos(se.get("items")[0].serial_no) pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC', account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC', expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC', item=se.get("items")[0].item_code, rate=1000, do_not_save=1) pos.get("items")[0].serial_no = serial_nos[0] pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000}) pos.insert() pos.submit() pos2 = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC', account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC', expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC', item=se.get("items")[0].item_code, rate=1000, do_not_save=1) pos2.get("items")[0].serial_no = serial_nos[0] pos2.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000}) self.assertRaises(frappe.ValidationError, pos2.insert)
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import ( SerialNoStatusError, get_serial_nos, SerialNoDuplicateError, ) from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) sr = frappe.get_doc("Serial No", serial_nos[0]) sr.status = "Not Available" sr.save() si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() self.assertRaises(SerialNoStatusError, si.submit) # hack! because stock ledger entires are already inserted and are not rolled back! self.assertRaises(SerialNoDuplicateError, si.cancel)
def test_return_for_serialized_items(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", rate=500, serial_no=serial_no) self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name}) # return entry dn1 = create_delivery_note( item_code="_Test Serialized Item With Series", is_return=1, return_against=dn.name, qty=-1, rate=500, serial_no=serial_no, ) self.check_serial_no_values(serial_no, {"warehouse": "_Test Warehouse - _TC", "delivery_document_no": ""}) dn1.cancel() self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name}) dn.cancel() self.check_serial_no_values( serial_no, {"warehouse": "_Test Warehouse - _TC", "delivery_document_no": "", "purchase_document_no": se.name}, )
def test_serialized(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() si.submit() self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "warehouse")) self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), si.name) self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "sales_invoice"), si.name) # check if the serial number is already linked with any other Sales Invoice _si = frappe.copy_doc(si.as_dict()) self.assertRaises(frappe.ValidationError, _si.insert) return si
def test_inter_company_transfer(self): se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) dn = create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) serial_no = frappe.get_doc("Serial No", serial_nos[0]) # check Serial No details after delivery self.assertEqual(serial_no.status, "Delivered") self.assertEqual(serial_no.warehouse, None) self.assertEqual(serial_no.company, "_Test Company") self.assertEqual(serial_no.delivery_document_type, "Delivery Note") self.assertEqual(serial_no.delivery_document_no, dn.name) wh = create_warehouse("_Test Warehouse", company="_Test Company 1") pr = make_purchase_receipt( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) serial_no.reload() # check Serial No details after purchase in second company self.assertEqual(serial_no.status, "Active") self.assertEqual(serial_no.warehouse, wh) self.assertEqual(serial_no.company, "_Test Company 1") self.assertEqual(serial_no.purchase_document_type, "Purchase Receipt") self.assertEqual(serial_no.purchase_document_no, pr.name)
def test_return_for_serialized_items(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", rate=500, serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) # return entry dn1 = create_delivery_note(item_code="_Test Serialized Item With Series", is_return=1, return_against=dn.name, qty=-1, rate=500, serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "" }) dn1.cancel() self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) dn.cancel() self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "", "purchase_document_no": se.name })
def test_delivered_serial_no_case(self): from erpnext.accounts.doctype.pos_invoice_merge_log.test_pos_invoice_merge_log import ( init_user_and_profile, ) from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item frappe.db.savepoint("before_test_delivered_serial_no_case") try: se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no) delivery_document_no = frappe.db.get_value("Serial No", serial_no, "delivery_document_no") self.assertEquals(delivery_document_no, dn.name) init_user_and_profile() pos_inv = create_pos_invoice( item_code="_Test Serialized Item With Series", serial_no=serial_no, qty=1, rate=100, do_not_submit=True, ) self.assertRaises(frappe.ValidationError, pos_inv.submit) finally: frappe.db.rollback(save_point="before_test_delivered_serial_no_case") frappe.set_user("Administrator")
def test_returned_serial_no_case(self): from erpnext.accounts.doctype.pos_invoice_merge_log.test_pos_invoice_merge_log import ( init_user_and_profile, ) from erpnext.stock.doctype.serial_no.serial_no import get_pos_reserved_serial_nos from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item frappe.db.savepoint("before_test_returned_serial_no_case") try: se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] init_user_and_profile() pos_inv = create_pos_invoice( item_code="_Test Serialized Item With Series", serial_no=serial_no, qty=1, rate=100, ) pos_return = make_sales_return(pos_inv.name) pos_return.flags.ignore_validate = True pos_return.insert() pos_return.submit() pos_reserved_serial_nos = get_pos_reserved_serial_nos( {"item_code": "_Test Serialized Item With Series", "warehouse": "_Test Warehouse - _TC"} ) self.assertTrue(serial_no not in pos_reserved_serial_nos) finally: frappe.db.rollback(save_point="before_test_returned_serial_no_case") frappe.set_user("Administrator")
def test_serialized(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() si.submit() self.assertEquals( frappe.db.get_value("Serial No", serial_nos[0], "status"), "Delivered") self.assertFalse( frappe.db.get_value("Serial No", serial_nos[0], "warehouse")) self.assertEquals( frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), si.name) return si
def test_invalid_serial_no_validation(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item( company="_Test Company", target_warehouse="Stores - _TC", cost_center="Main - _TC", expense_account="Cost of Goods Sold - _TC", ) serial_nos = se.get("items")[0].serial_no + "wrong" pos = create_pos_invoice( company="_Test Company", debit_to="Debtors - _TC", account_for_change_amount="Cash - _TC", warehouse="Stores - _TC", income_account="Sales - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC", item=se.get("items")[0].item_code, rate=1000, qty=2, do_not_save=1, ) pos.get("items")[0].has_serial_no = 1 pos.get("items")[0].serial_no = serial_nos pos.insert() self.assertRaises(frappe.ValidationError, pos.submit)
def test_serialized_item_consumption(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoRequiredError from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item stock_entry = make_serialized_item() serial_nos = stock_entry.get("items")[0].serial_no serial_no = serial_nos.split("\n")[0] # should not raise any error create_asset_repair( stock_consumption=1, item_code=stock_entry.get("items")[0].item_code, warehouse="_Test Warehouse - _TC", serial_no=serial_no, submit=1, ) # should raise error asset_repair = create_asset_repair( stock_consumption=1, warehouse="_Test Warehouse - _TC", item_code=stock_entry.get("items")[0].item_code, ) asset_repair.repair_status = "Completed" self.assertRaises(SerialNoRequiredError, asset_repair.submit)
def test_partial_pos_returns(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item(company='_Test Company', target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC') serial_nos = get_serial_nos(se.get("items")[0].serial_no) pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC', account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC', expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC', item=se.get("items")[0].item_code, qty=2, rate=1000, do_not_save=1) pos.get("items")[0].serial_no = serial_nos[0] + "\n" + serial_nos[1] pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 1000, 'default': 1}) pos.insert() pos.submit() pos_return1 = make_sales_return(pos.name) # partial return 1 pos_return1.get('items')[0].qty = -1 pos_return1.get('items')[0].serial_no = serial_nos[0] pos_return1.insert() pos_return1.submit() # partial return 2 pos_return2 = make_sales_return(pos.name) self.assertEqual(pos_return2.get('items')[0].qty, -1) self.assertEqual(pos_return2.get('items')[0].serial_no, serial_nos[1])
def test_serialize_status(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] frappe.db.set_value("Serial No", serial_no, "status", "Not Available") dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no, do_not_submit=True) self.assertRaises(SerialNoStatusError, dn.submit)
def test_serialized_item_transaction(self): from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item( company="_Test Company", target_warehouse="Stores - _TC", cost_center="Main - _TC", expense_account="Cost of Goods Sold - _TC", ) serial_nos = get_serial_nos(se.get("items")[0].serial_no) pos = create_pos_invoice( company="_Test Company", debit_to="Debtors - _TC", account_for_change_amount="Cash - _TC", warehouse="Stores - _TC", income_account="Sales - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC", item=se.get("items")[0].item_code, rate=1000, do_not_save=1, ) pos.get("items")[0].serial_no = serial_nos[0] pos.append( "payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 1000} ) pos.insert() pos.submit() pos2 = create_pos_invoice( company="_Test Company", debit_to="Debtors - _TC", account_for_change_amount="Cash - _TC", warehouse="Stores - _TC", income_account="Sales - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC", item=se.get("items")[0].item_code, rate=1000, do_not_save=1, ) pos2.get("items")[0].serial_no = serial_nos[0] pos2.append( "payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 1000} ) pos2.insert() self.assertRaises(frappe.ValidationError, pos2.submit)
def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no) self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name}) dn.cancel() self.check_serial_no_values(serial_no, {"warehouse": "_Test Warehouse - _TC", "delivery_document_no": ""})
def test_serialize_status(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] frappe.db.set_value("Serial No", serial_no, "status", "Not Available") dn = create_delivery_note( item_code="_Test Serialized Item With Series", serial_no=serial_no, do_not_submit=True) self.assertRaises(SerialNoStatusError, dn.submit)
def test_inter_company_transfer(self): se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) create_delivery_note(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) wh = create_warehouse("_Test Warehouse", company="_Test Company 1") make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) serial_no = frappe.db.get_value("Serial No", serial_nos[0], ["warehouse", "company"], as_dict=1) self.assertEqual(serial_no.warehouse, wh) self.assertEqual(serial_no.company, "_Test Company 1")
def test_serialized_partial_sales_invoice(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no) serial_no = '\n'.join(serial_no) dn = create_delivery_note(item_code="_Test Serialized Item With Series", qty=2, serial_no=serial_no) si = make_sales_invoice(dn.name) si.items[0].qty = 1 si.submit() self.assertEqual(si.items[0].qty, 1) si = make_sales_invoice(dn.name) si.submit() self.assertEqual(si.items[0].qty, len(get_serial_nos(si.items[0].serial_no)))
def test_inter_company_transfer(self): se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) wh = create_warehouse("_Test Warehouse", company="_Test Company 1") make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) serial_no = frappe.db.get_value("Serial No", serial_nos[0], [ "warehouse", "company"], as_dict=1) self.assertEqual(serial_no.warehouse, wh) self.assertEqual(serial_no.company, "_Test Company 1")
def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) dn.cancel() self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "" })
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.get("mtn_details")[0].serial_no) sr = frappe.get_doc("Serial No", serial_nos[0]) sr.status = "Not Available" sr.save() dn = frappe.copy_doc(test_records[0]) dn.get("delivery_note_details")[0].item_code = "_Test Serialized Item With Series" dn.get("delivery_note_details")[0].qty = 1 dn.get("delivery_note_details")[0].serial_no = serial_nos[0] dn.insert() self.assertRaises(SerialNoStatusError, dn.submit)
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.doclist[1].serial_no) sr = frappe.bean("Serial No", serial_nos[0]) sr.doc.status = "Not Available" sr.save() dn = frappe.bean(copy=test_records[0]) dn.doclist[1].item_code = "_Test Serialized Item With Series" dn.doclist[1].qty = 1 dn.doclist[1].serial_no = serial_nos[0] dn.insert() self.assertRaises(SerialNoStatusError, dn.submit)
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.get("mtn_details")[0].serial_no) sr = frappe.get_doc("Serial No", serial_nos[0]) sr.status = "Not Available" sr.save() si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("entries")[0].item_code = "_Test Serialized Item With Series" si.get("entries")[0].qty = 1 si.get("entries")[0].serial_no = serial_nos[0] si.insert() self.assertRaises(SerialNoStatusError, si.submit)
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) sr = frappe.get_doc("Serial No", serial_nos[0]) sr.status = "Not Available" sr.save() si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() self.assertRaises(SerialNoStatusError, si.submit)
def test_serialized(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() si.submit() self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "warehouse")) self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), si.name) return si
def test_serial_numbers_against_delivery_note(self): """ check if the sales invoice item serial numbers and the delivery note items serial numbers are same """ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) dn = create_delivery_note(item=se.get("items")[0].item_code, serial_no=serial_nos[0]) dn.submit() si = make_sales_invoice(dn.name) si.save() self.assertEquals(si.get("items")[0].serial_no, dn.get("items")[0].serial_no)
def test_serialized(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("mtn_details")[0].serial_no) dn = frappe.copy_doc(test_records[0]) dn.get("delivery_note_details")[0].item_code = "_Test Serialized Item With Series" dn.get("delivery_note_details")[0].qty = 1 dn.get("delivery_note_details")[0].serial_no = serial_nos[0] dn.insert() dn.submit() self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "status"), "Delivered") self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "warehouse")) self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), dn.name) return dn
def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) si = make_sales_invoice(dn.name) si.insert(ignore_permissions=True) self.assertEqual(dn.items[0].serial_no, si.items[0].serial_no) dn.cancel() self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "" })
def test_serialize_status(self): from erpnext.stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos, SerialNoDuplicateError from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) sr = frappe.get_doc("Serial No", serial_nos[0]) sr.status = "Not Available" sr.save() si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 si.get("items")[0].serial_no = serial_nos[0] si.insert() self.assertRaises(SerialNoStatusError, si.submit) # hack! because stock ledger entires are already inserted and are not rolled back! self.assertRaises(SerialNoDuplicateError, si.cancel)
def test_pos_return_for_serialized_item(self): from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item( company="_Test Company", target_warehouse="Stores - _TC", cost_center="Main - _TC", expense_account="Cost of Goods Sold - _TC", ) serial_nos = get_serial_nos(se.get("items")[0].serial_no) pos = create_pos_invoice( company="_Test Company", debit_to="Debtors - _TC", account_for_change_amount="Cash - _TC", warehouse="Stores - _TC", income_account="Sales - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC", item=se.get("items")[0].item_code, rate=1000, do_not_save=1, ) pos.get("items")[0].serial_no = serial_nos[0] pos.append( "payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 1000, "default": 1} ) pos.insert() pos.submit() pos_return = make_sales_return(pos.name) pos_return.insert() pos_return.submit() self.assertEqual(pos_return.get("items")[0].serial_no, serial_nos[0])
def test_serialized(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.doclist[1].serial_no) dn = frappe.bean(copy=test_records[0]) dn.doclist[1].item_code = "_Test Serialized Item With Series" dn.doclist[1].qty = 1 dn.doclist[1].serial_no = serial_nos[0] dn.insert() dn.submit() self.assertEquals( frappe.db.get_value("Serial No", serial_nos[0], "status"), "Delivered") self.assertFalse( frappe.db.get_value("Serial No", serial_nos[0], "warehouse")) self.assertEquals( frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), dn.doc.name) return dn
def test_inter_company_transfer_intermediate_cancellation(self): """ Receive into and Deliver Serial No from one company. Then Receive into and Deliver from second company. Try to cancel intermediate receipts/deliveries to test if it is blocked. """ se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) sn_doc = frappe.get_doc("Serial No", serial_nos[0]) # check Serial No details after purchase in first company self.assertEqual(sn_doc.status, "Active") self.assertEqual(sn_doc.company, "_Test Company") self.assertEqual(sn_doc.warehouse, "_Test Warehouse - _TC") self.assertEqual(sn_doc.purchase_document_no, se.name) dn = create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) sn_doc.reload() # check Serial No details after delivery from **first** company self.assertEqual(sn_doc.status, "Delivered") self.assertEqual(sn_doc.company, "_Test Company") self.assertEqual(sn_doc.warehouse, None) self.assertEqual(sn_doc.delivery_document_no, dn.name) # try cancelling the first Serial No Receipt, even though it is delivered # block cancellation is Serial No is out of the warehouse self.assertRaises(frappe.ValidationError, se.cancel) # receive serial no in second company wh = create_warehouse("_Test Warehouse", company="_Test Company 1") pr = make_purchase_receipt( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) sn_doc.reload() self.assertEqual(sn_doc.warehouse, wh) # try cancelling the delivery from the first company # block cancellation as Serial No belongs to different company self.assertRaises(frappe.ValidationError, dn.cancel) # deliver from second company dn_2 = create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) sn_doc.reload() # check Serial No details after delivery from **second** company self.assertEqual(sn_doc.status, "Delivered") self.assertEqual(sn_doc.company, "_Test Company 1") self.assertEqual(sn_doc.warehouse, None) self.assertEqual(sn_doc.delivery_document_no, dn_2.name) # cannot cancel any intermediate document before last Delivery Note self.assertRaises(frappe.ValidationError, se.cancel) self.assertRaises(frappe.ValidationError, dn.cancel) self.assertRaises(frappe.ValidationError, pr.cancel)
def test_inter_company_transfer_fallback_on_cancel(self): """ Test Serial No state changes on cancellation. If Delivery cancelled, it should fall back on last Receipt in the same company. If Receipt is cancelled, it should be Inactive in the same company. """ # Receipt in **first** company se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) sn_doc = frappe.get_doc("Serial No", serial_nos[0]) # Delivery from first company dn = create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) # Receipt in **second** company wh = create_warehouse("_Test Warehouse", company="_Test Company 1") pr = make_purchase_receipt( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) # Delivery from second company dn_2 = create_delivery_note( item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh) sn_doc.reload() self.assertEqual(sn_doc.status, "Delivered") self.assertEqual(sn_doc.company, "_Test Company 1") self.assertEqual(sn_doc.delivery_document_no, dn_2.name) dn_2.cancel() sn_doc.reload() # Fallback on Purchase Receipt if Delivery is cancelled self.assertEqual(sn_doc.status, "Active") self.assertEqual(sn_doc.company, "_Test Company 1") self.assertEqual(sn_doc.warehouse, wh) self.assertEqual(sn_doc.purchase_document_no, pr.name) pr.cancel() sn_doc.reload() # Inactive in same company if Receipt cancelled self.assertEqual(sn_doc.status, "Inactive") self.assertEqual(sn_doc.company, "_Test Company 1") self.assertEqual(sn_doc.warehouse, None) dn.cancel() sn_doc.reload() # Fallback on Purchase Receipt in FIRST company if # Delivery from FIRST company is cancelled self.assertEqual(sn_doc.status, "Active") self.assertEqual(sn_doc.company, "_Test Company") self.assertEqual(sn_doc.warehouse, "_Test Warehouse - _TC") self.assertEqual(sn_doc.purchase_document_no, se.name)
def test_serial_no_case_1(self): """ Create a POS Invoice with serial no Create a Return Invoice with serial no Create a POS Invoice with serial no again Consolidate the invoices The first POS Invoice should be consolidated with a separate single Merge Log The second and third POS Invoice should be consolidated with a single Merge Log """ from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item frappe.db.sql("delete from `tabPOS Invoice`") try: se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] init_user_and_profile() pos_inv = create_pos_invoice( item_code="_Test Serialized Item With Series", serial_no=serial_no, qty=1, rate=100, do_not_submit=1, ) pos_inv.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 100 }) pos_inv.submit() pos_inv_cn = make_sales_return(pos_inv.name) pos_inv_cn.paid_amount = -100 pos_inv_cn.submit() pos_inv2 = create_pos_invoice( item_code="_Test Serialized Item With Series", serial_no=serial_no, qty=1, rate=100, do_not_submit=1, ) pos_inv2.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 100 }) pos_inv2.submit() consolidate_pos_invoices() pos_inv.load_from_db() pos_inv2.load_from_db() self.assertNotEqual(pos_inv.consolidated_invoice, pos_inv2.consolidated_invoice) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")