fix: deduplicate gain/loss JE creation for journals as payment
This commit is contained in:
parent
0d26f67be5
commit
79c6f0165b
@ -474,10 +474,12 @@ def reconcile_against_document(args, skip_ref_details_update_for_pe=False): # n
|
|||||||
|
|
||||||
# update ref in advance entry
|
# update ref in advance entry
|
||||||
if voucher_type == "Journal Entry":
|
if voucher_type == "Journal Entry":
|
||||||
update_reference_in_journal_entry(entry, doc, do_not_save=True)
|
referenced_row = update_reference_in_journal_entry(entry, doc, do_not_save=False)
|
||||||
# advance section in sales/purchase invoice and reconciliation tool,both pass on exchange gain/loss
|
# advance section in sales/purchase invoice and reconciliation tool,both pass on exchange gain/loss
|
||||||
# amount and account in args
|
# amount and account in args
|
||||||
doc.make_exchange_gain_loss_journal(args)
|
# referenced_row is used to deduplicate gain/loss journal
|
||||||
|
entry.update({"referenced_row": referenced_row})
|
||||||
|
doc.make_exchange_gain_loss_journal([entry])
|
||||||
else:
|
else:
|
||||||
update_reference_in_payment_entry(
|
update_reference_in_payment_entry(
|
||||||
entry, doc, do_not_save=True, skip_ref_details_update_for_pe=skip_ref_details_update_for_pe
|
entry, doc, do_not_save=True, skip_ref_details_update_for_pe=skip_ref_details_update_for_pe
|
||||||
@ -627,6 +629,8 @@ def update_reference_in_journal_entry(d, journal_entry, do_not_save=False):
|
|||||||
if not do_not_save:
|
if not do_not_save:
|
||||||
journal_entry.save(ignore_permissions=True)
|
journal_entry.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
return new_row.name
|
||||||
|
|
||||||
|
|
||||||
def update_reference_in_payment_entry(
|
def update_reference_in_payment_entry(
|
||||||
d, payment_entry, do_not_save=False, skip_ref_details_update_for_pe=False
|
d, payment_entry, do_not_save=False, skip_ref_details_update_for_pe=False
|
||||||
@ -1901,6 +1905,7 @@ def create_gain_loss_journal(
|
|||||||
journal_entry.company = company
|
journal_entry.company = company
|
||||||
journal_entry.posting_date = nowdate()
|
journal_entry.posting_date = nowdate()
|
||||||
journal_entry.multi_currency = 1
|
journal_entry.multi_currency = 1
|
||||||
|
journal_entry.is_system_generated = True
|
||||||
|
|
||||||
party_account_currency = frappe.get_cached_value("Account", party_account, "account_currency")
|
party_account_currency = frappe.get_cached_value("Account", party_account, "account_currency")
|
||||||
|
|
||||||
|
@ -1023,6 +1023,44 @@ class AccountsController(TransactionBase):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def gain_loss_journal_already_booked(
|
||||||
|
self,
|
||||||
|
gain_loss_account,
|
||||||
|
exc_gain_loss,
|
||||||
|
ref2_dt,
|
||||||
|
ref2_dn,
|
||||||
|
ref2_detail_no,
|
||||||
|
) -> bool:
|
||||||
|
"""
|
||||||
|
Check if gain/loss is booked
|
||||||
|
"""
|
||||||
|
if res := frappe.db.get_all(
|
||||||
|
"Journal Entry Account",
|
||||||
|
filters={
|
||||||
|
"docstatus": 1,
|
||||||
|
"account": gain_loss_account,
|
||||||
|
"reference_type": ref2_dt, # this will be Journal Entry
|
||||||
|
"reference_name": ref2_dn,
|
||||||
|
"reference_detail_no": ref2_detail_no,
|
||||||
|
},
|
||||||
|
pluck="parent",
|
||||||
|
):
|
||||||
|
# deduplicate
|
||||||
|
res = list({x for x in res})
|
||||||
|
if exc_vouchers := frappe.db.get_all(
|
||||||
|
"Journal Entry",
|
||||||
|
filters={"name": ["in", res], "voucher_type": "Exchange Gain Or Loss"},
|
||||||
|
fields=["voucher_type", "total_debit", "total_credit"],
|
||||||
|
):
|
||||||
|
booked_voucher = exc_vouchers[0]
|
||||||
|
if (
|
||||||
|
booked_voucher.total_debit == exc_gain_loss
|
||||||
|
and booked_voucher.total_credit == exc_gain_loss
|
||||||
|
and booked_voucher.voucher_type == "Exchange Gain Or Loss"
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def make_exchange_gain_loss_journal(self, args: dict = None) -> None:
|
def make_exchange_gain_loss_journal(self, args: dict = None) -> None:
|
||||||
"""
|
"""
|
||||||
Make Exchange Gain/Loss journal for Invoices and Payments
|
Make Exchange Gain/Loss journal for Invoices and Payments
|
||||||
@ -1051,6 +1089,13 @@ class AccountsController(TransactionBase):
|
|||||||
|
|
||||||
reverse_dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
|
reverse_dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
|
||||||
|
|
||||||
|
if not self.gain_loss_journal_already_booked(
|
||||||
|
gain_loss_account,
|
||||||
|
difference_amount,
|
||||||
|
self.doctype,
|
||||||
|
self.name,
|
||||||
|
arg.get("referenced_row"),
|
||||||
|
):
|
||||||
je = create_gain_loss_journal(
|
je = create_gain_loss_journal(
|
||||||
self.company,
|
self.company,
|
||||||
arg.get("party_type"),
|
arg.get("party_type"),
|
||||||
@ -1065,7 +1110,7 @@ class AccountsController(TransactionBase):
|
|||||||
arg.get("idx"),
|
arg.get("idx"),
|
||||||
self.doctype,
|
self.doctype,
|
||||||
self.name,
|
self.name,
|
||||||
arg.get("idx"),
|
arg.get("referenced_row"),
|
||||||
)
|
)
|
||||||
frappe.msgprint(
|
frappe.msgprint(
|
||||||
_("Exchange Gain/Loss amount has been booked through {0}").format(
|
_("Exchange Gain/Loss amount has been booked through {0}").format(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user