fix: auto separate against accounts
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index e4a8939..1b7b82b 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -676,7 +676,6 @@
)
def set_against_account(self):
- accounts_debited, accounts_credited = [], []
if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
for d in self.get("accounts"):
if d.reference_type == "Sales Invoice":
@@ -689,30 +688,40 @@
d.reference_type, d.reference_name, against_type.lower()
)
else:
- for d in self.get("accounts"):
- if flt(d.debit) > 0:
- accounts_debited.append(d)
- if flt(d.credit) > 0:
- accounts_credited.append(d)
+ self.get_against_accounts()
- for d in self.get("accounts"):
- if d.exchange_rate != 1.0:
- d.against_type = d.party_type
- d.against_account = d.party
- elif flt(d.debit) > 0:
- for acc in accounts_credited:
- if acc.party == d.party:
- d.against_type = "Account"
- d.against_account = d.account
- d.party_type = ""
- d.party = ""
- elif flt(d.credit) > 0:
- for acc in accounts_debited:
- if acc.party == d.party:
- d.against_type = "Account"
- d.against_account = d.account
- d.party_type = ""
- d.party = ""
+ def get_against_accounts(self):
+ accounts_debited, accounts_credited, against_accounts = [], [], []
+ split_account = {}
+ separate_against_account_entries = 1
+ for d in self.get("accounts"):
+ if flt(d.debit) > 0 or flt(d.debit_in_account_currency) > 0:
+ accounts_debited.append(d)
+ elif flt(d.credit) > 0 or flt(d.credit_in_account_currency) > 0:
+ accounts_credited.append(d)
+
+ if d.against_account:
+ separate_against_account_entries = 0
+ break
+
+ if separate_against_account_entries:
+ if len(accounts_credited) > 1 and len(accounts_debited) > 1:
+ frappe.msgprint(
+ _(
+ "Unable to automatically determine {0} accounts. Set them up in the {1} table if needed.".format(
+ frappe.bold("against"), frappe.bold("Accounting Entries")
+ )
+ ),
+ alert=True,
+ )
+ elif len(accounts_credited) == 1:
+ against_accounts = accounts_debited
+ split_account = accounts_credited[0]
+ elif len(accounts_debited) == 1:
+ against_accounts = accounts_credited
+ split_account = accounts_debited[0]
+
+ return separate_against_account_entries, against_accounts, split_account
def validate_debit_credit_amount(self):
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
@@ -909,41 +918,75 @@
def build_gl_map(self):
gl_map = []
+ separate_against_account_entries, against_accounts, split_account = self.get_against_accounts()
for d in self.get("accounts"):
if d.debit or d.credit or (self.voucher_type == "Exchange Gain Or Loss"):
r = [d.user_remark, self.remark]
r = [x for x in r if x]
remarks = "\n".join(r)
- gl_map.append(
- self.get_gl_dict(
- {
- "account": d.account,
- "party_type": d.party_type,
- "due_date": self.due_date,
- "party": d.party,
- "against_type": d.against_type,
- "against": d.against_account,
- "debit": flt(d.debit, d.precision("debit")),
- "credit": flt(d.credit, d.precision("credit")),
- "account_currency": d.account_currency,
- "debit_in_account_currency": flt(
- d.debit_in_account_currency, d.precision("debit_in_account_currency")
- ),
- "credit_in_account_currency": flt(
- d.credit_in_account_currency, d.precision("credit_in_account_currency")
- ),
- "against_voucher_type": d.reference_type,
- "against_voucher": d.reference_name,
- "remarks": remarks,
- "voucher_detail_no": d.reference_detail_no,
- "cost_center": d.cost_center,
- "project": d.project,
- "finance_book": self.finance_book,
- },
- item=d,
- )
+ gl_dict = self.get_gl_dict(
+ {
+ "account": d.account,
+ "party_type": d.party_type,
+ "due_date": self.due_date,
+ "party": d.party,
+ "debit": flt(d.debit, d.precision("debit")),
+ "credit": flt(d.credit, d.precision("credit")),
+ "account_currency": d.account_currency,
+ "debit_in_account_currency": flt(
+ d.debit_in_account_currency, d.precision("debit_in_account_currency")
+ ),
+ "credit_in_account_currency": flt(
+ d.credit_in_account_currency, d.precision("credit_in_account_currency")
+ ),
+ "against_voucher_type": d.reference_type,
+ "against_voucher": d.reference_name,
+ "remarks": remarks,
+ "voucher_detail_no": d.reference_detail_no,
+ "cost_center": d.cost_center,
+ "project": d.project,
+ "finance_book": self.finance_book,
+ },
+ item=d,
)
+
+ if not separate_against_account_entries:
+ gl_dict.update({"against_type": d.against_type, "against_account": d.against_account})
+ gl_map.append(gl_dict)
+
+ elif d in against_accounts:
+ gl_dict.update(
+ {
+ "against_type": split_account.party_type or "Account",
+ "against_account": split_account.party or split_account.account,
+ }
+ )
+ gl_map.append(gl_dict)
+
+ else:
+ for against_account in against_accounts:
+ against_account = against_account.as_dict()
+ debit = against_account.credit or against_account.credit_in_account_currency
+ credit = against_account.debit or against_account.debit_in_account_currency
+ gl_dict = gl_dict.copy()
+ gl_dict.update(
+ {
+ "against_type": against_account.party_type or "Account",
+ "against": against_account.party or against_account.account,
+ "debit": flt(debit, d.precision("debit")),
+ "credit": flt(credit, d.precision("credit")),
+ "account_currency": d.account_currency,
+ "debit_in_account_currency": flt(
+ debit / d.exchange_rate, d.precision("debit_in_account_currency")
+ ),
+ "credit_in_account_currency": flt(
+ credit / d.exchange_rate, d.precision("credit_in_account_currency")
+ ),
+ }
+ )
+ gl_map.append(gl_dict)
+
return gl_map
def make_gl_entries(self, cancel=0, adv_adj=0):