From a27eac1ef648d540bebb0b752b69132664b7153d Mon Sep 17 00:00:00 2001 From: Lakshit Jain <108322669+ljain112@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:52:25 +0530 Subject: [PATCH 1/2] fix: use currency defined in plan for subscription invoice (#45104) (cherry picked from commit a4453fb77b458dfde91b5330a798d44024da722f) --- .../doctype/subscription/subscription.py | 4 +-- .../doctype/subscription/test_subscription.py | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 9309950cce6..a3bcdc37c30 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -414,8 +414,8 @@ class Subscription(Document): if frappe.db.get_value("Supplier", self.party, "tax_withholding_category"): invoice.apply_tds = 1 - # Add party currency to invoice - invoice.currency = get_party_account_currency(self.party_type, self.party, self.company) + # Add currency to invoice + invoice.currency = frappe.db.get_value("Subscription Plan", {"name": self.plans[0].plan}, "currency") # Add dimensions in invoice for subscription: accounting_dimensions = get_accounting_dimensions() diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py index 8d4ec3dd084..f3e3e9c8862 100644 --- a/erpnext/accounts/doctype/subscription/test_subscription.py +++ b/erpnext/accounts/doctype/subscription/test_subscription.py @@ -470,6 +470,28 @@ class TestSubscription(FrappeTestCase): currency = frappe.db.get_value("Sales Invoice", subscription.invoices[0].name, "currency") self.assertEqual(currency, "USD") + @IntegrationTestCase.change_settings( + "Accounts Settings", + {"allow_multi_currency_invoices_against_single_party_account": 1}, + ) + def test_multi_currency_subscription_with_default_company_currency(self): + party = "Test Subscription Customer Multi Currency" + frappe.db.set_value("Customer", party, "default_currency", "USD") + subscription = create_subscription( + start_date="2018-01-01", + generate_invoice_at="Beginning of the current subscription period", + plans=[{"plan": "_Test Plan Multicurrency", "qty": 1, "currency": "USD"}], + party=party, + ) + + subscription.process(posting_date="2018-01-01") + self.assertEqual(len(subscription.invoices), 1) + self.assertEqual(subscription.status, "Unpaid") + + # Check the currency of the created invoice + currency = frappe.db.get_value("Sales Invoice", subscription.invoices[0].name, "currency") + self.assertEqual(currency, "USD") + def test_subscription_recovery(self): """Test if Subscription recovers when start/end date run out of sync with created invoices.""" subscription = create_subscription( @@ -581,6 +603,12 @@ def create_parties(): customer.append("accounts", {"company": "_Test Company", "account": "_Test Receivable USD - _TC"}) customer.insert() + if not frappe.db.exists("Customer", "_Test Subscription Customer Multi Currency"): + customer = frappe.new_doc("Customer") + customer.customer_name = "Test Subscription Customer Multi Currency" + customer.default_currency = "USD" + customer.insert() + if not frappe.db.exists("Customer", "_Test Subscription Customer John Doe"): customer = frappe.new_doc("Customer") customer.customer_name = "_Test Subscription Customer John Doe" From bdaf3761c064150f8705a61234261d01c00788b6 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Wed, 15 Jan 2025 15:39:48 +0530 Subject: [PATCH 2/2] fix: conflict --- erpnext/accounts/doctype/subscription/test_subscription.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py index f3e3e9c8862..b1e5653e8da 100644 --- a/erpnext/accounts/doctype/subscription/test_subscription.py +++ b/erpnext/accounts/doctype/subscription/test_subscription.py @@ -3,7 +3,7 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests.utils import FrappeTestCase, change_settings from frappe.utils.data import ( add_days, add_months, @@ -470,7 +470,7 @@ class TestSubscription(FrappeTestCase): currency = frappe.db.get_value("Sales Invoice", subscription.invoices[0].name, "currency") self.assertEqual(currency, "USD") - @IntegrationTestCase.change_settings( + @change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1}, )