mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-16 11:39:18 +00:00
refactor(test): make pos invoice deterministic
This commit is contained in:
@@ -24,7 +24,7 @@ from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
|
|||||||
from erpnext.tests.utils import ERPNextTestSuite
|
from erpnext.tests.utils import ERPNextTestSuite
|
||||||
|
|
||||||
|
|
||||||
class TestPOSInvoice(ERPNextTestSuite):
|
class POSInvoiceTestMixin(ERPNextTestSuite):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super().setUpClass()
|
super().setUpClass()
|
||||||
@@ -43,15 +43,20 @@ class TestPOSInvoice(ERPNextTestSuite):
|
|||||||
make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item", qty=800, basic_rate=100)
|
make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item", qty=800, basic_rate=100)
|
||||||
frappe.db.sql("delete from `tabTax Rule`")
|
frappe.db.sql("delete from `tabTax Rule`")
|
||||||
|
|
||||||
from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry
|
|
||||||
|
|
||||||
self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name)
|
|
||||||
mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft")
|
mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft")
|
||||||
set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC")
|
set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC")
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
|
|
||||||
|
|
||||||
|
class TestPOSInvoice(POSInvoiceTestMixin):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry
|
||||||
|
|
||||||
|
self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name)
|
||||||
|
|
||||||
def test_timestamp_change(self):
|
def test_timestamp_change(self):
|
||||||
w = create_pos_invoice(do_not_save=1)
|
w = create_pos_invoice(do_not_save=1)
|
||||||
w.docstatus = 0
|
w.docstatus = 0
|
||||||
@@ -677,6 +682,7 @@ class TestPOSInvoice(ERPNextTestSuite):
|
|||||||
get_loyalty_program_details_with_points,
|
get_loyalty_program_details_with_points,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
|
||||||
# add 10 loyalty points
|
# add 10 loyalty points
|
||||||
pos_inv = create_pos_invoice(customer="Test Loyalty Customer", rate=10000, do_not_save=1)
|
pos_inv = create_pos_invoice(customer="Test Loyalty Customer", rate=10000, do_not_save=1)
|
||||||
pos_inv.append(
|
pos_inv.append(
|
||||||
@@ -706,134 +712,6 @@ class TestPOSInvoice(ERPNextTestSuite):
|
|||||||
)
|
)
|
||||||
self.assertEqual(after_redeem_lp_details.loyalty_points, 9)
|
self.assertEqual(after_redeem_lp_details.loyalty_points, 9)
|
||||||
|
|
||||||
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", "amount": 270})
|
|
||||||
pos_inv.save()
|
|
||||||
pos_inv.submit()
|
|
||||||
|
|
||||||
pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
|
|
||||||
pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 3200})
|
|
||||||
pos_inv2.save()
|
|
||||||
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_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", "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.save()
|
|
||||||
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", "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.save()
|
|
||||||
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_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_single_value("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", "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", "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.save()
|
|
||||||
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_pos_batch_reservation(self):
|
def test_pos_batch_reservation(self):
|
||||||
from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import (
|
from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import (
|
||||||
get_auto_batch_nos,
|
get_auto_batch_nos,
|
||||||
|
|||||||
168
erpnext/accounts/doctype/pos_invoice/test_pos_invoice_merge.py
Normal file
168
erpnext/accounts/doctype/pos_invoice/test_pos_invoice_merge.py
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.pos_invoice.test_pos_invoice import POSInvoiceTestMixin, create_pos_invoice
|
||||||
|
from erpnext.stock.doctype.item.test_item import make_item
|
||||||
|
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
|
||||||
|
from erpnext.tests.utils import ERPNextTestSuite
|
||||||
|
|
||||||
|
|
||||||
|
class TestPOSInvoiceMerging(POSInvoiceTestMixin):
|
||||||
|
def clear_pos_data(self):
|
||||||
|
frappe.db.sql("delete from `tabPOS Opening Entry`;")
|
||||||
|
frappe.db.sql("delete from `tabPOS Closing Entry`;")
|
||||||
|
frappe.db.sql("delete from `tabPOS Invoice`;")
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.clear_pos_data()
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry
|
||||||
|
|
||||||
|
self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.clear_pos_data()
|
||||||
|
frappe.db.commit()
|
||||||
|
|
||||||
|
def test_merging_into_sales_invoice_with_discount(self):
|
||||||
|
from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import (
|
||||||
|
make_closing_entry_from_opening,
|
||||||
|
)
|
||||||
|
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", "amount": 270})
|
||||||
|
pos_inv.save()
|
||||||
|
pos_inv.submit()
|
||||||
|
|
||||||
|
pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
|
||||||
|
pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 3200})
|
||||||
|
pos_inv2.save()
|
||||||
|
pos_inv2.submit()
|
||||||
|
|
||||||
|
closing_entry = make_closing_entry_from_opening(self.opening_entry)
|
||||||
|
consolidate_pos_invoices(closing_entry=closing_entry) # does DB commit
|
||||||
|
|
||||||
|
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_into_sales_invoice_with_discount_and_inclusive_tax(self):
|
||||||
|
from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import (
|
||||||
|
make_closing_entry_from_opening,
|
||||||
|
)
|
||||||
|
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", "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.save()
|
||||||
|
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", "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.save()
|
||||||
|
pos_inv2.submit()
|
||||||
|
|
||||||
|
self.closing_entry = make_closing_entry_from_opening(self.opening_entry)
|
||||||
|
consolidate_pos_invoices(closing_entry=self.closing_entry) # does DB commit
|
||||||
|
|
||||||
|
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_merging_with_validate_selling_price(self):
|
||||||
|
from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import (
|
||||||
|
make_closing_entry_from_opening,
|
||||||
|
)
|
||||||
|
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_single_value("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", "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", "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.save()
|
||||||
|
pos_inv2.submit()
|
||||||
|
|
||||||
|
self.closing_entry = make_closing_entry_from_opening(self.opening_entry)
|
||||||
|
consolidate_pos_invoices(closing_entry=self.closing_entry) # does DB commit
|
||||||
|
|
||||||
|
pos_inv2.load_from_db()
|
||||||
|
rounded_total = frappe.db.get_value("Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total")
|
||||||
|
self.assertEqual(rounded_total, 400)
|
||||||
@@ -283,7 +283,7 @@ class POSInvoiceMergeLog(Document):
|
|||||||
base_rounding_adjustment += doc.base_rounding_adjustment
|
base_rounding_adjustment += doc.base_rounding_adjustment
|
||||||
base_rounded_total += doc.base_rounded_total
|
base_rounded_total += doc.base_rounded_total
|
||||||
|
|
||||||
for d in doc.get("item_wise_tax_details"):
|
for d in doc.get("item_wise_tax_details") or []:
|
||||||
row = frappe._dict(
|
row = frappe._dict(
|
||||||
item=old_new_item_map[d.item_row],
|
item=old_new_item_map[d.item_row],
|
||||||
tax=old_new_tax_map[d.tax_row],
|
tax=old_new_tax_map[d.tax_row],
|
||||||
|
|||||||
Reference in New Issue
Block a user