Merge pull request #30602 from deepeshgarg007/deferred_revenue_default_account_fixes
fix: Deferred Revenue/Expense Account validation
This commit is contained in:
commit
76d3c3d617
@ -386,7 +386,6 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
|
|||||||
doc,
|
doc,
|
||||||
credit_account,
|
credit_account,
|
||||||
debit_account,
|
debit_account,
|
||||||
against,
|
|
||||||
amount,
|
amount,
|
||||||
base_amount,
|
base_amount,
|
||||||
end_date,
|
end_date,
|
||||||
@ -570,7 +569,6 @@ def book_revenue_via_journal_entry(
|
|||||||
doc,
|
doc,
|
||||||
credit_account,
|
credit_account,
|
||||||
debit_account,
|
debit_account,
|
||||||
against,
|
|
||||||
amount,
|
amount,
|
||||||
base_amount,
|
base_amount,
|
||||||
posting_date,
|
posting_date,
|
||||||
@ -591,6 +589,7 @@ def book_revenue_via_journal_entry(
|
|||||||
journal_entry.voucher_type = (
|
journal_entry.voucher_type = (
|
||||||
"Deferred Revenue" if doc.doctype == "Sales Invoice" else "Deferred Expense"
|
"Deferred Revenue" if doc.doctype == "Sales Invoice" else "Deferred Expense"
|
||||||
)
|
)
|
||||||
|
journal_entry.process_deferred_accounting = deferred_process
|
||||||
|
|
||||||
debit_entry = {
|
debit_entry = {
|
||||||
"account": credit_account,
|
"account": credit_account,
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"allow_auto_repeat": 1,
|
"allow_auto_repeat": 1,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"autoname": "naming_series:",
|
"autoname": "naming_series:",
|
||||||
"creation": "2013-03-25 10:53:52",
|
"creation": "2022-01-25 10:29:58.717206",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Document",
|
"document_type": "Document",
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
@ -13,6 +13,7 @@
|
|||||||
"voucher_type",
|
"voucher_type",
|
||||||
"naming_series",
|
"naming_series",
|
||||||
"finance_book",
|
"finance_book",
|
||||||
|
"process_deferred_accounting",
|
||||||
"reversal_of",
|
"reversal_of",
|
||||||
"tax_withholding_category",
|
"tax_withholding_category",
|
||||||
"column_break1",
|
"column_break1",
|
||||||
@ -524,13 +525,20 @@
|
|||||||
"label": "Reversal Of",
|
"label": "Reversal Of",
|
||||||
"options": "Journal Entry",
|
"options": "Journal Entry",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "process_deferred_accounting",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Process Deferred Accounting",
|
||||||
|
"options": "Process Deferred Accounting",
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 176,
|
"idx": 176,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-01-04 13:39:36.485954",
|
"modified": "2022-04-06 17:18:46.865259",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Journal Entry",
|
"name": "Journal Entry",
|
||||||
@ -578,6 +586,7 @@
|
|||||||
"search_fields": "voucher_type,posting_date, due_date, cheque_no",
|
"search_fields": "voucher_type,posting_date, due_date, cheque_no",
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
"states": [],
|
||||||
"title_field": "title",
|
"title_field": "title",
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
@ -11,7 +11,7 @@ from erpnext.accounts.deferred_revenue import (
|
|||||||
convert_deferred_expense_to_expense,
|
convert_deferred_expense_to_expense,
|
||||||
convert_deferred_revenue_to_income,
|
convert_deferred_revenue_to_income,
|
||||||
)
|
)
|
||||||
from erpnext.accounts.general_ledger import make_reverse_gl_entries
|
from erpnext.accounts.general_ledger import make_gl_entries
|
||||||
|
|
||||||
|
|
||||||
class ProcessDeferredAccounting(Document):
|
class ProcessDeferredAccounting(Document):
|
||||||
@ -34,4 +34,4 @@ class ProcessDeferredAccounting(Document):
|
|||||||
filters={"against_voucher_type": self.doctype, "against_voucher": self.name},
|
filters={"against_voucher_type": self.doctype, "against_voucher": self.name},
|
||||||
)
|
)
|
||||||
|
|
||||||
make_reverse_gl_entries(gl_entries=gl_entries)
|
make_gl_entries(gl_entries=gl_entries, cancel=1)
|
||||||
|
@ -2240,6 +2240,14 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
check_gl_entries(self, si.name, expected_gle, "2019-01-30")
|
check_gl_entries(self, si.name, expected_gle, "2019-01-30")
|
||||||
|
|
||||||
|
def test_deferred_revenue_missing_account(self):
|
||||||
|
si = create_sales_invoice(posting_date="2019-01-10", do_not_submit=True)
|
||||||
|
si.items[0].enable_deferred_revenue = 1
|
||||||
|
si.items[0].service_start_date = "2019-01-10"
|
||||||
|
si.items[0].service_end_date = "2019-03-15"
|
||||||
|
|
||||||
|
self.assertRaises(frappe.ValidationError, si.save)
|
||||||
|
|
||||||
def test_fixed_deferred_revenue(self):
|
def test_fixed_deferred_revenue(self):
|
||||||
deferred_account = create_account(
|
deferred_account = create_account(
|
||||||
account_name="Deferred Revenue",
|
account_name="Deferred Revenue",
|
||||||
@ -3104,7 +3112,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
acc_settings = frappe.get_single("Accounts Settings")
|
acc_settings = frappe.get_single("Accounts Settings")
|
||||||
acc_settings.book_deferred_entries_via_journal_entry = 0
|
acc_settings.book_deferred_entries_via_journal_entry = 0
|
||||||
acc_settings.submit_journal_entriessubmit_journal_entries = 0
|
acc_settings.submit_journal_entries = 0
|
||||||
acc_settings.save()
|
acc_settings.save()
|
||||||
|
|
||||||
frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", None)
|
frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", None)
|
||||||
|
@ -180,6 +180,7 @@ class AccountsController(TransactionBase):
|
|||||||
else:
|
else:
|
||||||
self.validate_deferred_start_and_end_date()
|
self.validate_deferred_start_and_end_date()
|
||||||
|
|
||||||
|
self.validate_deferred_income_expense_account()
|
||||||
self.set_inter_company_account()
|
self.set_inter_company_account()
|
||||||
|
|
||||||
if self.doctype == "Purchase Invoice":
|
if self.doctype == "Purchase Invoice":
|
||||||
@ -208,6 +209,27 @@ class AccountsController(TransactionBase):
|
|||||||
(self.doctype, self.name),
|
(self.doctype, self.name),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def validate_deferred_income_expense_account(self):
|
||||||
|
field_map = {
|
||||||
|
"Sales Invoice": "deferred_revenue_account",
|
||||||
|
"Purchase Invoice": "deferred_expense_account",
|
||||||
|
}
|
||||||
|
|
||||||
|
for item in self.get("items"):
|
||||||
|
if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
|
||||||
|
if not item.get(field_map.get(self.doctype)):
|
||||||
|
default_deferred_account = frappe.db.get_value(
|
||||||
|
"Company", self.company, "default_" + field_map.get(self.doctype)
|
||||||
|
)
|
||||||
|
if not default_deferred_account:
|
||||||
|
frappe.throw(
|
||||||
|
_(
|
||||||
|
"Row #{0}: Please update deferred revenue/expense account in item row or default account in company master"
|
||||||
|
).format(item.idx)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
item.set(field_map.get(self.doctype), default_deferred_account)
|
||||||
|
|
||||||
def validate_deferred_start_and_end_date(self):
|
def validate_deferred_start_and_end_date(self):
|
||||||
for d in self.items:
|
for d in self.items:
|
||||||
if d.get("enable_deferred_revenue") or d.get("enable_deferred_expense"):
|
if d.get("enable_deferred_revenue") or d.get("enable_deferred_expense"):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user