Merge pull request #31128 from frappe/mergify/bp/version-13-hotfix/pr-26916
fix: Account currency validation for first transaction (backport #26916)
This commit is contained in:
@@ -78,7 +78,10 @@ class TestPeriodClosingVoucher(unittest.TestCase):
|
||||
expense_account="Cost of Goods Sold - TPC",
|
||||
rate=400,
|
||||
debit_to="Debtors - TPC",
|
||||
currency="USD",
|
||||
customer="_Test Customer USD",
|
||||
)
|
||||
|
||||
create_sales_invoice(
|
||||
company=company,
|
||||
cost_center=cost_center2,
|
||||
@@ -86,6 +89,8 @@ class TestPeriodClosingVoucher(unittest.TestCase):
|
||||
expense_account="Cost of Goods Sold - TPC",
|
||||
rate=200,
|
||||
debit_to="Debtors - TPC",
|
||||
currency="USD",
|
||||
customer="_Test Customer USD",
|
||||
)
|
||||
|
||||
pcv = self.make_period_closing_voucher(submit=False)
|
||||
@@ -119,14 +124,17 @@ class TestPeriodClosingVoucher(unittest.TestCase):
|
||||
surplus_account = create_account()
|
||||
cost_center = create_cost_center("Test Cost Center 1")
|
||||
|
||||
create_sales_invoice(
|
||||
si = create_sales_invoice(
|
||||
company=company,
|
||||
income_account="Sales - TPC",
|
||||
expense_account="Cost of Goods Sold - TPC",
|
||||
cost_center=cost_center,
|
||||
rate=400,
|
||||
debit_to="Debtors - TPC",
|
||||
currency="USD",
|
||||
customer="_Test Customer USD",
|
||||
)
|
||||
|
||||
jv = make_journal_entry(
|
||||
account1="Cash - TPC",
|
||||
account2="Sales - TPC",
|
||||
|
||||
@@ -712,7 +712,7 @@ class TestPricingRule(unittest.TestCase):
|
||||
title="_Test Pricing Rule with Min Qty - 2",
|
||||
)
|
||||
|
||||
si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1, currency="USD")
|
||||
si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1)
|
||||
item = si.items[0]
|
||||
item.stock_qty = 1
|
||||
si.save()
|
||||
|
||||
@@ -898,3 +898,18 @@ def get_default_contact(doctype, name):
|
||||
return None
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def add_party_account(party_type, party, company, account):
|
||||
doc = frappe.get_doc(party_type, party)
|
||||
account_exists = False
|
||||
for d in doc.get("accounts"):
|
||||
if d.account == account:
|
||||
account_exists = True
|
||||
|
||||
if not account_exists:
|
||||
accounts = {"company": company, "account": account}
|
||||
|
||||
doc.append("accounts", accounts)
|
||||
|
||||
doc.save()
|
||||
|
||||
@@ -35,6 +35,7 @@ from erpnext.accounts.doctype.pricing_rule.utils import (
|
||||
from erpnext.accounts.party import (
|
||||
get_party_account,
|
||||
get_party_account_currency,
|
||||
get_party_gle_currency,
|
||||
validate_party_frozen_disabled,
|
||||
)
|
||||
from erpnext.accounts.utils import get_account_currency, get_fiscal_years, validate_fiscal_year
|
||||
@@ -169,6 +170,7 @@ class AccountsController(TransactionBase):
|
||||
|
||||
self.validate_party()
|
||||
self.validate_currency()
|
||||
self.validate_party_account_currency()
|
||||
|
||||
if self.doctype in ["Purchase Invoice", "Sales Invoice"]:
|
||||
pos_check_field = "is_pos" if self.doctype == "Sales Invoice" else "is_paid"
|
||||
@@ -1445,6 +1447,27 @@ class AccountsController(TransactionBase):
|
||||
# at quotation / sales order level and we shouldn't stop someone
|
||||
# from creating a sales invoice if sales order is already created
|
||||
|
||||
def validate_party_account_currency(self):
|
||||
if self.doctype not in ("Sales Invoice", "Purchase Invoice"):
|
||||
return
|
||||
|
||||
if self.is_opening == "Yes":
|
||||
return
|
||||
|
||||
party_type, party = self.get_party()
|
||||
party_gle_currency = get_party_gle_currency(party_type, party, self.company)
|
||||
party_account = (
|
||||
self.get("debit_to") if self.doctype == "Sales Invoice" else self.get("credit_to")
|
||||
)
|
||||
party_account_currency = get_account_currency(party_account)
|
||||
|
||||
if not party_gle_currency and (party_account_currency != self.currency):
|
||||
frappe.throw(
|
||||
_("Party Account {0} currency and document currency should be same").format(
|
||||
frappe.bold(party_account)
|
||||
)
|
||||
)
|
||||
|
||||
def delink_advance_entries(self, linked_doc_name):
|
||||
total_allocated_amount = 0
|
||||
for adv in self.advances:
|
||||
|
||||
@@ -4,6 +4,7 @@ import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import cint, cstr, flt, get_datetime, get_request_session, getdate, nowdate
|
||||
|
||||
from erpnext import get_company_currency
|
||||
from erpnext.erpnext_integrations.doctype.shopify_log.shopify_log import (
|
||||
dump_request_data,
|
||||
make_shopify_log,
|
||||
@@ -143,6 +144,10 @@ def create_sales_order(shopify_order, shopify_settings, company=None):
|
||||
"taxes": get_order_taxes(shopify_order, shopify_settings),
|
||||
"apply_discount_on": "Grand Total",
|
||||
"discount_amount": get_discounted_amount(shopify_order),
|
||||
"currency": frappe.get_value(
|
||||
"Customer", customer or shopify_settings.default_customer, "default_currency"
|
||||
)
|
||||
or get_company_currency(shopify_settings.company),
|
||||
}
|
||||
)
|
||||
|
||||
@@ -178,6 +183,7 @@ def create_sales_invoice(shopify_order, shopify_settings, so, old_order_sync=Fal
|
||||
si.set_posting_time = 1
|
||||
si.posting_date = posting_date
|
||||
si.due_date = posting_date
|
||||
si.currency = so.currency
|
||||
si.naming_series = shopify_settings.sales_invoice_series or "SI-Shopify-"
|
||||
si.flags.ignore_mandatory = True
|
||||
set_cost_center(si.items, shopify_settings.cost_center)
|
||||
|
||||
@@ -58,6 +58,7 @@ class ShopifySettings(unittest.TestCase):
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
"cash_bank_account": "Cash - _TC",
|
||||
"account": "Cash - _TC",
|
||||
"company": "_Test Company",
|
||||
"customer_group": "_Test Customer Group",
|
||||
"cost_center": "Main - _TC",
|
||||
"taxes": [{"shopify_tax": "International Shipping", "tax_account": "Legal Expenses - _TC"}],
|
||||
|
||||
@@ -164,6 +164,7 @@ def create_sales_invoice():
|
||||
sales_invoice.customer = frappe.db.get_value("Patient", patient, "customer")
|
||||
sales_invoice.due_date = getdate()
|
||||
sales_invoice.company = "_Test Company"
|
||||
sales_invoice.currency = "INR"
|
||||
sales_invoice.debit_to = get_receivable_account("_Test Company")
|
||||
|
||||
tests = [insulin_resistance_template, blood_test_template]
|
||||
|
||||
@@ -12,6 +12,7 @@ from frappe.model.document import Document
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.utils import flt, get_link_to_form, get_time, getdate
|
||||
|
||||
from erpnext import get_company_currency
|
||||
from erpnext.healthcare.doctype.healthcare_settings.healthcare_settings import (
|
||||
get_income_account,
|
||||
get_receivable_account,
|
||||
@@ -252,6 +253,10 @@ def create_sales_invoice(appointment_doc):
|
||||
sales_invoice = frappe.new_doc("Sales Invoice")
|
||||
sales_invoice.patient = appointment_doc.patient
|
||||
sales_invoice.customer = frappe.get_value("Patient", appointment_doc.patient, "customer")
|
||||
sales_invoice.currency = frappe.get_value(
|
||||
"Customer", sales_invoice.customer, "default_currency"
|
||||
) or get_company_currency(appointment_doc.company)
|
||||
|
||||
sales_invoice.appointment = appointment_doc.name
|
||||
sales_invoice.due_date = getdate()
|
||||
sales_invoice.company = appointment_doc.company
|
||||
|
||||
@@ -379,6 +379,7 @@ def create_patient(
|
||||
patient.mobile = mobile
|
||||
patient.email = email
|
||||
patient.customer = customer
|
||||
patient.default_currency = "INR"
|
||||
patient.invite_user = create_user
|
||||
patient.save(ignore_permissions=True)
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
from frappe.utils import flt
|
||||
|
||||
from erpnext import get_company_currency
|
||||
|
||||
|
||||
class TherapyPlan(Document):
|
||||
def validate(self):
|
||||
@@ -72,6 +74,9 @@ def make_sales_invoice(reference_name, patient, company, therapy_plan_template):
|
||||
si.company = company
|
||||
si.patient = patient
|
||||
si.customer = frappe.db.get_value("Patient", patient, "customer")
|
||||
si.currency = frappe.get_value(
|
||||
"Customer", si.customer, "default_currency"
|
||||
) or get_company_currency(si.company)
|
||||
|
||||
item = frappe.db.get_value("Therapy Plan Template", therapy_plan_template, "linked_item")
|
||||
price_list, price_list_currency = frappe.db.get_values(
|
||||
|
||||
@@ -13,6 +13,7 @@ from frappe.model.document import Document
|
||||
from frappe.utils import add_days, add_months, add_years, get_link_to_form, getdate, nowdate
|
||||
|
||||
import erpnext
|
||||
from erpnext import get_company_currency
|
||||
from erpnext.non_profit.doctype.member.member import create_member
|
||||
|
||||
|
||||
@@ -203,7 +204,7 @@ def make_invoice(membership, member, plan, settings):
|
||||
"doctype": "Sales Invoice",
|
||||
"customer": member.customer,
|
||||
"debit_to": settings.membership_debit_account,
|
||||
"currency": membership.currency,
|
||||
"currency": membership.currency or get_company_currency(settings.company),
|
||||
"company": settings.company,
|
||||
"is_pos": 0,
|
||||
"items": [{"item_code": plan.linked_item, "rate": membership.amount, "qty": 1}],
|
||||
|
||||
@@ -94,7 +94,7 @@ def make_membership(member, payload={}):
|
||||
"member": member,
|
||||
"membership_status": "Current",
|
||||
"membership_type": "_rzpy_test_milythm",
|
||||
"currency": "INR",
|
||||
"currency": "USD",
|
||||
"paid": 1,
|
||||
"from_date": nowdate(),
|
||||
"amount": 100,
|
||||
|
||||
@@ -84,7 +84,9 @@ class TestTimesheet(unittest.TestCase):
|
||||
emp = make_employee("test_employee_6@salary.com")
|
||||
|
||||
timesheet = make_timesheet(emp, simulate=True, is_billable=1)
|
||||
sales_invoice = make_sales_invoice(timesheet.name, "_Test Item", "_Test Customer")
|
||||
sales_invoice = make_sales_invoice(
|
||||
timesheet.name, "_Test Item", "_Test Customer", currency="INR"
|
||||
)
|
||||
sales_invoice.due_date = nowdate()
|
||||
sales_invoice.submit()
|
||||
timesheet = frappe.get_doc("Timesheet", timesheet.name)
|
||||
|
||||
Reference in New Issue
Block a user