diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index 5b1b9e4a14f5..5a1652f6db27 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.json +++ b/erpnext/accounts/doctype/payment_request/payment_request.json @@ -20,10 +20,11 @@ "reference_name", "transaction_details", "grand_total", + "outstanding_amount", "is_a_subscription", "column_break_18", - "outstanding_amount", "currency", + "party_account_currency", "subscription_section", "subscription_plans", "bank_account_details", @@ -146,7 +147,7 @@ "label": "Transaction Details" }, { - "description": "Amount in party's account currency", + "description": "Amount in transaction currency", "fieldname": "grand_total", "fieldtype": "Currency", "in_preview": 1, @@ -168,7 +169,7 @@ { "fieldname": "currency", "fieldtype": "Link", - "label": "Party Account Currency", + "label": "Transaction Currency", "options": "Currency", "read_only": 1 }, @@ -415,7 +416,7 @@ "in_preview": 1, "label": "Outstanding Amount", "non_negative": 1, - "options": "currency", + "options": "party_account_currency", "read_only": 1 }, { @@ -428,13 +429,20 @@ { "fieldname": "column_break_pnyv", "fieldtype": "Column Break" + }, + { + "fieldname": "party_account_currency", + "fieldtype": "Link", + "label": "Party Account Currency", + "options": "Currency", + "read_only": 1 } ], "in_create": 1, "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-09-13 19:17:28.734384", + "modified": "2024-09-16 06:34:36.517077", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Request", diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index da838a1e803f..969071e95f02 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -7,6 +7,7 @@ from frappe.utils import flt, nowdate from frappe.utils.background_jobs import enqueue +from erpnext import get_company_currency from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( get_accounting_dimensions, ) @@ -61,6 +62,7 @@ class PaymentRequest(Document): naming_series: DF.Literal["ACC-PRQ-.YYYY.-"] outstanding_amount: DF.Currency party: DF.DynamicLink | None + party_account_currency: DF.Link | None party_type: DF.Link | None payment_account: DF.ReadOnly | None payment_channel: DF.Literal["", "Email", "Phone", "Other"] @@ -159,7 +161,20 @@ def validate_subscription_details(self): ) def before_submit(self): - self.outstanding_amount = self.grand_total + if ( + self.currency != self.party_account_currency + and self.party_account_currency == get_company_currency(self.company) + ): + invoice = frappe.get_value( + self.reference_doctype, self.reference_name, ["grand_total", "base_grand_total"] + ) + self.outstanding_amount = flt( + self.grand_total / invoice.grand_total * invoice.base_grand_total, + self.precision("outstanding_amount"), + ) + + else: + self.outstanding_amount = self.grand_total if self.payment_request_type == "Outward": self.status = "Initiated" @@ -287,13 +302,35 @@ def create_payment_entry(self, submit=True): ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) + if self.reference_doctype in ["Sales Invoice", "POS Invoice"]: + party_account = ref_doc.debit_to + elif self.reference_doctype == "Purchase Invoice": + party_account = ref_doc.credit_to + else: + party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company) + + party_account_currency = ( + self.get("party_account_currency") + or ref_doc.get("party_account_currency") + or get_account_currency(party_account) + ) + + bank_amount = self.outstanding_amount + + if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency: + total = ref_doc.get("rounded_total") or ref_doc.get("grand_total") + base_total = ref_doc.get("base_rounded_total") or ref_doc.get("base_grand_total") + party_amount = flt(self.outstanding_amount / total * base_total, self.precision("grand_total")) + else: + party_amount = self.outstanding_amount + # outstanding amount is already in Part's account currency payment_entry = get_payment_entry( self.reference_doctype, self.reference_name, - party_amount=self.outstanding_amount, + party_amount=party_amount, bank_account=self.payment_account, - bank_amount=self.outstanding_amount, + bank_amount=bank_amount, created_from_payment_request=True, ) @@ -554,7 +591,8 @@ def make_payment_request(**args): "payment_account": gateway_account.get("payment_account"), "payment_channel": gateway_account.get("payment_channel"), "payment_request_type": args.get("payment_request_type"), - "currency": party_account_currency, # consistent with PE + "currency": ref_doc.currency, + "party_account_currency": party_account_currency, "grand_total": grand_total, "mode_of_payment": args.mode_of_payment, "email_to": args.recipient_id or ref_doc.owner, @@ -614,8 +652,12 @@ def get_amount(ref_doc, payment_account=None): grand_total = flt(ref_doc.rounded_total) or flt(ref_doc.grand_total) elif dt in ["Sales Invoice", "Purchase Invoice"]: if not ref_doc.get("is_pos"): - # always get base amount to create a payment request (to match with PE) - grand_total = flt(ref_doc.base_rounded_total) or flt(ref_doc.base_grand_total) + if ref_doc.party_account_currency == ref_doc.currency: + grand_total = flt(ref_doc.rounded_total or ref_doc.grand_total) + else: + grand_total = flt( + flt(ref_doc.base_rounded_total or ref_doc.base_grand_total) / ref_doc.conversion_rate + ) elif dt == "Sales Invoice": for pay in ref_doc.payments: if pay.type == "Phone" and pay.account == payment_account: diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py index 8aa169fa3a24..022a8214379f 100644 --- a/erpnext/accounts/doctype/payment_request/test_payment_request.py +++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py @@ -116,6 +116,7 @@ def test_payment_request_linkings(self): recipient_id="saurabh@erpnext.com", payment_gateway_account="_Test Gateway - USD", ) + frappe.db.commit() self.assertEqual(pr.reference_doctype, "Sales Invoice") self.assertEqual(pr.reference_name, si_usd.name)