Skip to content

Commit

Permalink
Merge pull request #2682 from resilient-tech/mergify/bp/version-15-ho…
Browse files Browse the repository at this point in the history
…tfix/pr-2656

fix: add comment in gst return log for backdated transactions (backport #2656)
  • Loading branch information
mergify[bot] authored Oct 22, 2024
2 parents 28155b0 + c457198 commit d292b7f
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,21 @@
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.utils import get_datetime, get_datetime_str, get_last_day, getdate
from frappe.utils import (
get_datetime,
get_datetime_str,
get_last_day,
get_link_to_form,
getdate,
)

from india_compliance.gst_india.doctype.gst_return_log.generate_gstr_1 import (
GenerateGSTR1,
)
from india_compliance.gst_india.utils import is_production_api_enabled

DOCTYPE = "GST Return Log"


class GSTReturnLog(GenerateGSTR1, Document):
@property
Expand Down Expand Up @@ -199,7 +207,7 @@ def process_gstr_1_returns_info(company, gstin, response):
# existing logs
gstr1_logs = frappe._dict(
frappe.get_all(
"GST Return Log",
DOCTYPE,
filters={"name": ("in", list(return_info.keys()))},
fields=["name", "acknowledgement_number"],
as_list=1,
Expand Down Expand Up @@ -234,15 +242,15 @@ def _update_gstr_1_filed_upto(filing_date):

if key in gstr1_logs:
if gstr1_logs[key] != info["arn"]:
frappe.db.set_value("GST Return Log", key, filing_details)
frappe.db.set_value(DOCTYPE, key, filing_details)
_update_gstr_1_filed_upto(filed_upto)

# No updates if status is same
continue

frappe.get_doc(
{
"doctype": "GST Return Log",
"doctype": DOCTYPE,
"company": company,
"gstin": gstin,
"return_period": info["ret_prd"],
Expand All @@ -252,6 +260,36 @@ def _update_gstr_1_filed_upto(filing_date):
_update_gstr_1_filed_upto(filed_upto)


def get_gst_return_log(posting_date, company_gstin):
period = getdate(posting_date).strftime("%m%Y")
if name := frappe.db.exists(DOCTYPE, f"GSTR1-{period}-{company_gstin}"):
return frappe.get_doc(DOCTYPE, name)


def add_comment_to_gst_return_log(doc, action):
if not (log := get_gst_return_log(doc.posting_date, doc.company_gstin)):
return

log.add_comment(
"Comment",
f"{doc.doctype} : {get_link_to_form(doc.doctype, doc.name)} has been {action} by {frappe.session.user}",
)


def update_is_not_latest_gstr1_data(posting_date, company_gstin):
period = posting_date.strftime("%m%Y")

frappe.db.set_value(
"GST Return Log", f"GSTR1-{period}-{company_gstin}", "is_latest_data", 0
)

frappe.publish_realtime(
"is_not_latest_data",
message={"filters": {"company_gstin": company_gstin, "period": period}},
doctype="GSTR-1 Beta",
)


def get_file_doc(doctype, docname, attached_to_field):
try:
return frappe.get_doc(
Expand Down
30 changes: 11 additions & 19 deletions india_compliance/gst_india/doctype/gst_settings/gst_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
E_WAYBILL_FIELDS,
SALES_REVERSE_CHARGE_FIELDS,
)
from india_compliance.gst_india.doctype.gst_return_log.gst_return_log import (
add_comment_to_gst_return_log,
update_is_not_latest_gstr1_data,
)
from india_compliance.gst_india.doctype.gstin.gstin import get_gstr_1_filed_upto
from india_compliance.gst_india.page.india_compliance_account import (
_disable_api_promo,
Expand Down Expand Up @@ -496,12 +500,12 @@ def update_not_applicable_status(e_invoice_applicability_date=None, company=None
query.run()


def restrict_gstr_1_transaction_for(posting_date, company_gstin, gst_settings=None):
def restrict_gstr_1_transaction_for(doc, gst_settings=None, action="submit"):
"""
Check if the user is allowed to modify transactions before the GSTR-1 filing date
Additionally, update the `is_not_latest_gstr1_data` field in the GST Return Log
"""
posting_date = getdate(posting_date)
posting_date = getdate(doc.posting_date)

if not gst_settings:
gst_settings = frappe.get_cached_doc("GST Settings")
Expand All @@ -511,7 +515,7 @@ def restrict_gstr_1_transaction_for(posting_date, company_gstin, gst_settings=No
if not gst_settings.restrict_changes_after_gstr_1:
restrict = False

gstr_1_filed_upto = get_gstr_1_filed_upto(company_gstin)
gstr_1_filed_upto = get_gstr_1_filed_upto(doc.company_gstin)

if not gstr_1_filed_upto:
restrict = False
Expand All @@ -528,20 +532,8 @@ def restrict_gstr_1_transaction_for(posting_date, company_gstin, gst_settings=No
if restrict:
return gstr_1_filed_upto

update_is_not_latest_gstr1_data(posting_date, company_gstin)

return None


def update_is_not_latest_gstr1_data(posting_date, company_gstin):
period = posting_date.strftime("%m%Y")
# postprocess
update_is_not_latest_gstr1_data(posting_date, doc.company_gstin)

frappe.db.set_value(
"GST Return Log", f"GSTR1-{period}-{company_gstin}", "is_latest_data", 0
)

frappe.publish_realtime(
"is_not_latest_data",
message={"filters": {"company_gstin": company_gstin, "period": period}},
doctype="GSTR-1 Beta",
)
if posting_date <= getdate(gstr_1_filed_upto):
add_comment_to_gst_return_log(doc, action)
7 changes: 4 additions & 3 deletions india_compliance/gst_india/overrides/payment_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,6 @@ def validate(doc, method=None):
return

if doc.party_type == "Customer":
validate_backdated_transaction(doc)

# Presume is export with GST if GST accounts are present
doc.is_export_with_gst = 1
validate_transaction_for_advance_payment(doc, method)
Expand All @@ -98,6 +96,9 @@ def validate(doc, method=None):


def on_submit(doc, method=None):
if doc.party_type == "Customer":
validate_backdated_transaction(doc)

make_gst_revesal_entry_from_advance_payment(doc)


Expand All @@ -112,7 +113,7 @@ def before_cancel(doc, method=None):
validate_backdated_transaction(doc, action="cancel")


def validate_backdated_transaction(doc, action="create"):
def validate_backdated_transaction(doc, action="submit"):
for row in doc.taxes:
if row.gst_tax_type in TAX_TYPES and row.tax_amount != 0:
_validate_backdated_transaction(doc, action=action)
Expand Down
3 changes: 2 additions & 1 deletion india_compliance/gst_india/overrides/sales_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ def validate(doc, method=None):

gst_settings = frappe.get_cached_doc("GST Settings")

validate_backdated_transaction(doc, gst_settings)
validate_invoice_number(doc)
validate_credit_debit_note(doc)
validate_fields_and_set_status_for_e_invoice(doc, gst_settings)
Expand Down Expand Up @@ -139,6 +138,8 @@ def is_shipping_address_in_india(doc):


def on_submit(doc, method=None):
validate_backdated_transaction(doc)

if getattr(doc, "_submitted_from_ui", None) or validate_transaction(doc) is False:
return

Expand Down
63 changes: 62 additions & 1 deletion india_compliance/gst_india/overrides/test_transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import today
from frappe.utils import add_days, getdate, today
from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import (
make_regional_gl_entries,
)
Expand Down Expand Up @@ -931,6 +931,10 @@ def get_lead(first_name):


class TestSpecificTransactions(FrappeTestCase):
@classmethod
def tearDown(cls):
frappe.db.rollback()

def test_copy_e_waybill_fields_from_dn_to_si(self):
"Make sure e-Waybill fields are copied from Delivery Note to Sales Invoice"
dn = create_transaction(doctype="Delivery Note", vehicle_no="GJ01AA1111")
Expand All @@ -945,6 +949,63 @@ def test_copy_e_waybill_fields_from_si_to_return(self):

self.assertEqual(si_return.vehicle_no, None)

@change_settings("GST Settings", {"restrict_changes_after_gstr_1": 1})
def test_backdated_transaction(self):
si = create_transaction(doctype="Sales Invoice", do_not_submit=True)

# update filing date
gstin_doc = frappe.new_doc(
"GSTIN",
gstin=si.company_gstin,
status="Active",
gstr_1_filed_upto=add_days(today(), 1),
)
gstin_doc.save(ignore_permissions=True)

# create user
test_user = frappe.get_doc("User", {"email": "[email protected]"})
test_user.add_roles("Accounts User")
frappe.set_user(test_user.name)

# submit invoice
self.assertRaisesRegex(
frappe.exceptions.ValidationError,
re.compile(r"You are not allowed to submit Sales Invoice"),
si.submit,
)

def test_backdated_transaction_with_comment(self):
si = create_transaction(doctype="Sales Invoice", do_not_submit=True)

# create filing log
posting_date = getdate(si.posting_date)
gst_return_log = frappe.new_doc(
"GST Return Log",
return_period=f"{posting_date.month:02d}{posting_date.year}",
gstin=si.company_gstin,
return_type="GSTR1",
)
gst_return_log.save()

# update filing date
gstin_doc = frappe.new_doc(
"GSTIN",
gstin=si.company_gstin,
status="Active",
gstr_1_filed_upto=add_days(today(), 1),
)
gstin_doc.save(ignore_permissions=True)

# submit invoice
si.submit()

comment = frappe.get_value(
"Comment",
{"comment_type": "Comment", "reference_name": gst_return_log.name},
["content"],
)
self.assertTrue(si.name in comment)


def create_cess_accounts():
input_cess_non_advol_account = create_tax_accounts("Input Tax Cess Non Advol")
Expand Down
6 changes: 2 additions & 4 deletions india_compliance/gst_india/overrides/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -709,10 +709,8 @@ def get_source_state_code(doc):
return (doc.supplier_gstin or doc.company_gstin)[:2]


def validate_backdated_transaction(doc, gst_settings=None, action="create"):
if gstr_1_filed_upto := restrict_gstr_1_transaction_for(
doc.posting_date, doc.company_gstin, gst_settings
):
def validate_backdated_transaction(doc, gst_settings=None, action="submit"):
if gstr_1_filed_upto := restrict_gstr_1_transaction_for(doc, gst_settings, action):
frappe.throw(
_(
"You are not allowed to {0} {1} as GSTR-1 has been filed upto {2}"
Expand Down

0 comments on commit d292b7f

Please sign in to comment.