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_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_merging_into_sales_invoice_with_discount(self): from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import init_user_and_profile from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import consolidate_pos_invoices frappe.db.sql("delete from `tabPOS Invoice`") test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(rate=300, additional_discount_percentage=10, do_not_submit=1) pos_inv.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 270 }) pos_inv.submit() pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) pos_inv2.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200 }) pos_inv2.submit() consolidate_pos_invoices() pos_inv.load_from_db() rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") self.assertEqual(rounded_total, 3470)
def test_merging_with_validate_selling_price(self): from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( init_user_and_profile, ) from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( consolidate_pos_invoices, ) if not frappe.db.get_single_value("Selling Settings", "validate_selling_price"): frappe.db.set_value("Selling Settings", "Selling Settings", "validate_selling_price", 1) item = "Test Selling Price Validation" make_item(item, {"is_stock_item": 1}) make_purchase_receipt(item_code=item, warehouse="_Test Warehouse - _TC", qty=1, rate=300) frappe.db.sql("delete from `tabPOS Invoice`") test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(item=item, rate=300, do_not_submit=1) pos_inv.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300 }) pos_inv.append( 'taxes', { "charge_type": "On Net Total", "account_head": "_Test Account Service Tax - _TC", "cost_center": "_Test Cost Center - _TC", "description": "Service Tax", "rate": 14, 'included_in_print_rate': 1 }) self.assertRaises(frappe.ValidationError, pos_inv.submit) pos_inv2 = create_pos_invoice(item=item, rate=400, do_not_submit=1) pos_inv2.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 400 }) pos_inv2.append( 'taxes', { "charge_type": "On Net Total", "account_head": "_Test Account Service Tax - _TC", "cost_center": "_Test Cost Center - _TC", "description": "Service Tax", "rate": 14, 'included_in_print_rate': 1 }) pos_inv2.submit() consolidate_pos_invoices() pos_inv2.load_from_db() rounded_total = frappe.db.get_value("Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total") self.assertEqual(rounded_total, 400)
def test_consolidation_rounding_adjustment(self): """ Test if the rounding adjustment is calculated correctly """ frappe.db.sql("delete from `tabPOS Invoice`") try: make_stock_entry( to_warehouse="_Test Warehouse - _TC", item_code="_Test Item", rate=8000, qty=10, ) init_user_and_profile() inv = create_pos_invoice(qty=1, rate=69.5, do_not_save=True) inv.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 70 }) inv.insert() inv.submit() inv2 = create_pos_invoice(qty=1, rate=59.5, do_not_save=True) inv2.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60 }) inv2.insert() inv2.submit() consolidate_pos_invoices() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) self.assertEqual(consolidated_invoice.rounding_adjustment, 1) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")
def test_consolidated_invoice_creation(self): frappe.db.sql("delete from `tabPOS Invoice`") try: test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300 }) pos_inv.submit() pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) pos_inv2.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200 }) pos_inv2.submit() pos_inv3 = create_pos_invoice(customer="_Test Customer 2", rate=2300, do_not_submit=1) pos_inv3.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 2300 }) pos_inv3.submit() consolidate_pos_invoices() pos_inv.load_from_db() self.assertTrue( frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) pos_inv3.load_from_db() self.assertTrue( frappe.db.exists("Sales Invoice", pos_inv3.consolidated_invoice)) self.assertFalse( pos_inv.consolidated_invoice == pos_inv3.consolidated_invoice) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")
def test_merging_into_sales_invoice_with_discount_and_inclusive_tax(self): from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( init_user_and_profile, ) from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( consolidate_pos_invoices, ) frappe.db.sql("delete from `tabPOS Invoice`") test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300 }) pos_inv.append( 'taxes', { "charge_type": "On Net Total", "account_head": "_Test Account Service Tax - _TC", "cost_center": "_Test Cost Center - _TC", "description": "Service Tax", "rate": 14, 'included_in_print_rate': 1 }) pos_inv.submit() pos_inv2 = create_pos_invoice(rate=300, qty=2, do_not_submit=1) pos_inv2.additional_discount_percentage = 10 pos_inv2.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 540 }) pos_inv2.append( 'taxes', { "charge_type": "On Net Total", "account_head": "_Test Account Service Tax - _TC", "cost_center": "_Test Cost Center - _TC", "description": "Service Tax", "rate": 14, 'included_in_print_rate': 1 }) pos_inv2.submit() consolidate_pos_invoices() pos_inv.load_from_db() rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") self.assertEqual(rounded_total, 840)
def test_consolidated_credit_note_creation(self): frappe.db.sql("delete from `tabPOS Invoice`") try: test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300 }) pos_inv.submit() pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) pos_inv2.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200 }) pos_inv2.submit() pos_inv3 = create_pos_invoice(customer="_Test Customer 2", rate=2300, do_not_submit=1) pos_inv3.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 2300 }) pos_inv3.submit() pos_inv_cn = make_sales_return(pos_inv.name) pos_inv_cn.set("payments", []) pos_inv_cn.append('payments', { 'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': -300 }) pos_inv_cn.paid_amount = -300 pos_inv_cn.submit() consolidate_pos_invoices() pos_inv.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) pos_inv3.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv3.consolidated_invoice)) pos_inv_cn.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv_cn.consolidated_invoice)) self.assertTrue(frappe.db.get_value("Sales Invoice", pos_inv_cn.consolidated_invoice, "is_return")) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")
def test_consolidated_credit_note_creation(self): frappe.db.sql("delete from `tabPOS Invoice`") try: test_user, pos_profile = init_user_and_profile() pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300 }) pos_inv.submit() pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) pos_inv2.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200 }) pos_inv2.submit() pos_inv3 = create_pos_invoice(customer="_Test Customer 2", rate=2300, do_not_submit=1) pos_inv3.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 2300 }) pos_inv3.submit() pos_inv_cn = make_sales_return(pos_inv.name) pos_inv_cn.set("payments", []) pos_inv_cn.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": -100 }) pos_inv_cn.append( "payments", { "mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": -200 }) pos_inv_cn.paid_amount = -300 pos_inv_cn.submit() consolidate_pos_invoices() pos_inv.load_from_db() self.assertTrue( frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) pos_inv3.load_from_db() self.assertTrue( frappe.db.exists("Sales Invoice", pos_inv3.consolidated_invoice)) pos_inv_cn.load_from_db() self.assertTrue( frappe.db.exists("Sales Invoice", pos_inv_cn.consolidated_invoice)) consolidated_credit_note = frappe.get_doc( "Sales Invoice", pos_inv_cn.consolidated_invoice) self.assertEqual(consolidated_credit_note.is_return, 1) self.assertEqual( consolidated_credit_note.payments[0].mode_of_payment, "Cash") self.assertEqual(consolidated_credit_note.payments[0].amount, -100) self.assertEqual( consolidated_credit_note.payments[1].mode_of_payment, "Bank Draft") self.assertEqual(consolidated_credit_note.payments[1].amount, -200) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")
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`")
def test_consolidation_round_off_error_3(self): frappe.db.sql("delete from `tabPOS Invoice`") try: make_stock_entry( to_warehouse="_Test Warehouse - _TC", item_code="_Test Item", rate=8000, qty=10, ) init_user_and_profile() item_rates = [69, 59, 29] for i in [1, 2]: inv = create_pos_invoice(is_return=1, do_not_save=1) inv.items = [] for rate in item_rates: inv.append( "items", { "item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC", "qty": -1, "rate": rate, "income_account": "Sales - _TC", "expense_account": "Cost of Goods Sold - _TC", "cost_center": "_Test Cost Center - _TC", }, ) inv.append( "taxes", { "account_head": "_Test Account VAT - _TC", "charge_type": "On Net Total", "cost_center": "_Test Cost Center - _TC", "description": "VAT", "doctype": "Sales Taxes and Charges", "rate": 15, "included_in_print_rate": 1, }, ) inv.payments = [] inv.append( "payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": -157 }) inv.paid_amount = -157 inv.save() inv.submit() consolidate_pos_invoices() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) self.assertEqual(consolidated_invoice.status, "Return") self.assertEqual(consolidated_invoice.rounding_adjustment, -0.001) finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")
def test_consolidation_round_off_error_2(self): """ Test the same case as above but with an Unpaid POS Invoice """ frappe.db.sql("delete from `tabPOS Invoice`") try: make_stock_entry( to_warehouse="_Test Warehouse - _TC", item_code="_Test Item", rate=8000, qty=10, ) init_user_and_profile() inv = create_pos_invoice(qty=6, rate=10000, do_not_save=True) inv.append( "taxes", { "account_head": "_Test Account VAT - _TC", "charge_type": "On Net Total", "cost_center": "_Test Cost Center - _TC", "description": "VAT", "doctype": "Sales Taxes and Charges", "rate": 7.5, "included_in_print_rate": 1, }, ) inv.append( "payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60000 }) inv.insert() inv.submit() inv2 = create_pos_invoice(qty=6, rate=10000, do_not_save=True) inv2.append( "taxes", { "account_head": "_Test Account VAT - _TC", "charge_type": "On Net Total", "cost_center": "_Test Cost Center - _TC", "description": "VAT", "doctype": "Sales Taxes and Charges", "rate": 7.5, "included_in_print_rate": 1, }, ) inv2.append( "payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60000 }) inv2.insert() inv2.submit() inv3 = create_pos_invoice(qty=3, rate=600, do_not_save=True) inv3.append("payments", { "mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 1000 }) inv3.insert() inv3.submit() consolidate_pos_invoices() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) self.assertEqual(consolidated_invoice.outstanding_amount, 800) self.assertNotEqual(consolidated_invoice.status, "Paid") finally: frappe.set_user("Administrator") frappe.db.sql("delete from `tabPOS Profile`") frappe.db.sql("delete from `tabPOS Invoice`")