* fix: set_amounts after deductions and losses are set * test: difference_amount changes after update_references_in_payment_entry * chore: linter * fix: use kwargs instad of destructing a dict [skip ci] * fix(test): test payment entry difference_amount after payment reconciliation.
		
			
				
	
	
		
			169 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| 
 | |
| import frappe
 | |
| from frappe.test_runner import make_test_objects
 | |
| 
 | |
| from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
 | |
| from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
 | |
| from erpnext.accounts.party import get_party_shipping_address
 | |
| from erpnext.accounts.utils import (
 | |
| 	get_future_stock_vouchers,
 | |
| 	get_voucherwise_gl_entries,
 | |
| 	sort_stock_vouchers_by_posting_date,
 | |
| 	update_reference_in_payment_entry,
 | |
| )
 | |
| 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.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 | |
| 
 | |
| 
 | |
| class TestUtils(unittest.TestCase):
 | |
| 	@classmethod
 | |
| 	def setUpClass(cls):
 | |
| 		super(TestUtils, cls).setUpClass()
 | |
| 		make_test_objects("Address", ADDRESS_RECORDS)
 | |
| 
 | |
| 	def test_get_party_shipping_address(self):
 | |
| 		address = get_party_shipping_address("Customer", "_Test Customer 1")
 | |
| 		self.assertEqual(address, "_Test Billing Address 2 Title-Billing")
 | |
| 
 | |
| 	def test_get_party_shipping_address2(self):
 | |
| 		address = get_party_shipping_address("Customer", "_Test Customer 2")
 | |
| 		self.assertEqual(address, "_Test Shipping Address 2 Title-Shipping")
 | |
| 
 | |
| 	def test_get_voucher_wise_gl_entry(self):
 | |
| 
 | |
| 		pr = make_purchase_receipt(
 | |
| 			item_code="_Test Item",
 | |
| 			posting_date="2021-02-01",
 | |
| 			rate=100,
 | |
| 			qty=1,
 | |
| 			warehouse="Stores - TCP1",
 | |
| 			company="_Test Company with perpetual inventory",
 | |
| 		)
 | |
| 
 | |
| 		future_vouchers = get_future_stock_vouchers("2021-01-01", "00:00:00", for_items=["_Test Item"])
 | |
| 
 | |
| 		voucher_type_and_no = ("Purchase Receipt", pr.name)
 | |
| 		self.assertTrue(
 | |
| 			voucher_type_and_no in future_vouchers,
 | |
| 			msg="get_future_stock_vouchers not returning correct value",
 | |
| 		)
 | |
| 
 | |
| 		posting_date = "2021-01-01"
 | |
| 		gl_entries = get_voucherwise_gl_entries(future_vouchers, posting_date)
 | |
| 		self.assertTrue(
 | |
| 			voucher_type_and_no in gl_entries,
 | |
| 			msg="get_voucherwise_gl_entries not returning expected GLes",
 | |
| 		)
 | |
| 
 | |
| 	def test_stock_voucher_sorting(self):
 | |
| 		vouchers = []
 | |
| 
 | |
| 		item = make_item().name
 | |
| 
 | |
| 		stock_entry = {"item": item, "to_warehouse": "_Test Warehouse - _TC", "qty": 1, "rate": 10}
 | |
| 
 | |
| 		se1 = make_stock_entry(posting_date="2022-01-01", **stock_entry)
 | |
| 		se3 = make_stock_entry(posting_date="2022-03-01", **stock_entry)
 | |
| 		se2 = make_stock_entry(posting_date="2022-02-01", **stock_entry)
 | |
| 
 | |
| 		for doc in (se1, se2, se3):
 | |
| 			vouchers.append((doc.doctype, doc.name))
 | |
| 
 | |
| 		vouchers.append(("Stock Entry", "Wat"))
 | |
| 
 | |
| 		sorted_vouchers = sort_stock_vouchers_by_posting_date(list(reversed(vouchers)))
 | |
| 		self.assertEqual(sorted_vouchers, vouchers)
 | |
| 
 | |
| 	def test_update_reference_in_payment_entry(self):
 | |
| 		item = make_item().name
 | |
| 
 | |
| 		purchase_invoice = make_purchase_invoice(
 | |
| 			item=item, supplier="_Test Supplier USD", currency="USD", conversion_rate=82.32
 | |
| 		)
 | |
| 		purchase_invoice.submit()
 | |
| 
 | |
| 		payment_entry = get_payment_entry(purchase_invoice.doctype, purchase_invoice.name)
 | |
| 		payment_entry.target_exchange_rate = 62.9
 | |
| 		payment_entry.paid_amount = 15725
 | |
| 		payment_entry.deductions = []
 | |
| 		payment_entry.insert()
 | |
| 
 | |
| 		self.assertEqual(payment_entry.difference_amount, -4855.00)
 | |
| 		payment_entry.references = []
 | |
| 		payment_entry.submit()
 | |
| 
 | |
| 		payment_reconciliation = frappe.new_doc("Payment Reconciliation")
 | |
| 		payment_reconciliation.company = payment_entry.company
 | |
| 		payment_reconciliation.party_type = "Supplier"
 | |
| 		payment_reconciliation.party = purchase_invoice.supplier
 | |
| 		payment_reconciliation.receivable_payable_account = payment_entry.paid_to
 | |
| 		payment_reconciliation.get_unreconciled_entries()
 | |
| 		payment_reconciliation.allocate_entries(
 | |
| 			{
 | |
| 				"payments": [d.__dict__ for d in payment_reconciliation.payments],
 | |
| 				"invoices": [d.__dict__ for d in payment_reconciliation.invoices],
 | |
| 			}
 | |
| 		)
 | |
| 		for d in payment_reconciliation.invoices:
 | |
| 			# Reset invoice outstanding_amount because allocate_entries will zero this value out.
 | |
| 			d.outstanding_amount = d.amount
 | |
| 		for d in payment_reconciliation.allocation:
 | |
| 			d.difference_account = "Exchange Gain/Loss - _TC"
 | |
| 		payment_reconciliation.reconcile()
 | |
| 
 | |
| 		payment_entry.load_from_db()
 | |
| 		self.assertEqual(len(payment_entry.references), 1)
 | |
| 		self.assertEqual(payment_entry.difference_amount, 0)
 | |
| 
 | |
| 
 | |
| ADDRESS_RECORDS = [
 | |
| 	{
 | |
| 		"doctype": "Address",
 | |
| 		"address_type": "Billing",
 | |
| 		"address_line1": "Address line 1",
 | |
| 		"address_title": "_Test Billing Address Title",
 | |
| 		"city": "Lagos",
 | |
| 		"country": "Nigeria",
 | |
| 		"links": [
 | |
| 			{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}
 | |
| 		],
 | |
| 	},
 | |
| 	{
 | |
| 		"doctype": "Address",
 | |
| 		"address_type": "Shipping",
 | |
| 		"address_line1": "Address line 2",
 | |
| 		"address_title": "_Test Shipping Address 1 Title",
 | |
| 		"city": "Lagos",
 | |
| 		"country": "Nigeria",
 | |
| 		"links": [
 | |
| 			{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}
 | |
| 		],
 | |
| 	},
 | |
| 	{
 | |
| 		"doctype": "Address",
 | |
| 		"address_type": "Shipping",
 | |
| 		"address_line1": "Address line 3",
 | |
| 		"address_title": "_Test Shipping Address 2 Title",
 | |
| 		"city": "Lagos",
 | |
| 		"country": "Nigeria",
 | |
| 		"is_shipping_address": "1",
 | |
| 		"links": [
 | |
| 			{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}
 | |
| 		],
 | |
| 	},
 | |
| 	{
 | |
| 		"doctype": "Address",
 | |
| 		"address_type": "Billing",
 | |
| 		"address_line1": "Address line 4",
 | |
| 		"address_title": "_Test Billing Address 2 Title",
 | |
| 		"city": "Lagos",
 | |
| 		"country": "Nigeria",
 | |
| 		"is_shipping_address": "1",
 | |
| 		"links": [
 | |
| 			{"link_doctype": "Customer", "link_name": "_Test Customer 1", "doctype": "Dynamic Link"}
 | |
| 		],
 | |
| 	},
 | |
| ]
 |