Skip to content

Commit

Permalink
fix: use transaction currency as base in payment request
Browse files Browse the repository at this point in the history
  • Loading branch information
vorasmit committed Sep 16, 2024
1 parent 7ceeb2c commit bd2d3bf
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 11 deletions.
18 changes: 13 additions & 5 deletions erpnext/accounts/doctype/payment_request/payment_request.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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,
Expand All @@ -168,7 +169,7 @@
{
"fieldname": "currency",
"fieldtype": "Link",
"label": "Party Account Currency",
"label": "Transaction Currency",
"options": "Currency",
"read_only": 1
},
Expand Down Expand Up @@ -415,7 +416,7 @@
"in_preview": 1,
"label": "Outstanding Amount",
"non_negative": 1,
"options": "currency",
"options": "party_account_currency",
"read_only": 1
},
{
Expand All @@ -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",
Expand Down
54 changes: 48 additions & 6 deletions erpnext/accounts/doctype/payment_request/payment_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down Expand Up @@ -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"]
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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,
)

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit bd2d3bf

Please sign in to comment.