mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-02 11:49:10 +00:00
[Enhancement] Tax Withholding Category (#15064)
* add single, cumulative threshold, remove checkboxes * remove tds child table from supplier & add tds link field * add description field in tax withholding category * add tax withholding data for indian setup, some fixes * add a checkbox for tax withholding in purchase invoice * remove supplier's child table for tds * enable tds field if supplier has tds set inits master * move rates data to child table - adding fiscal year support * change bootstrap data according to child table config of tds * show category name in list view * loyalty program fixes * moved tax calculation to tax_withholding.py - calculation for tds amount for cumulative threshold from gl entry * add fiscal year dependency in company test * minor loyalty program fix * minor tier calculation fix * minor handling duplicate exception * toggle apply_tds according to supplier, code rectify * minor fixes for loyalty program * test case for single and cumulative threshold * codacy fix
This commit is contained in:
@@ -7,6 +7,8 @@ import frappe, os, json
|
||||
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
|
||||
from frappe.permissions import add_permission
|
||||
from erpnext.regional.india import states
|
||||
from erpnext.accounts.utils import get_fiscal_year
|
||||
from frappe.utils import today
|
||||
|
||||
def setup(company=None, patch=True):
|
||||
make_custom_fields()
|
||||
@@ -257,8 +259,10 @@ def make_fixtures(company=None):
|
||||
doc.insert()
|
||||
except frappe.NameError:
|
||||
pass
|
||||
except frappe.DuplicateEntryError:
|
||||
pass
|
||||
|
||||
# create tds fixtures
|
||||
# create records for Tax Withholding Category
|
||||
set_tax_withholding_category(company)
|
||||
|
||||
def set_salary_components(docs):
|
||||
@@ -279,19 +283,24 @@ def set_tax_withholding_category(company):
|
||||
if company and tds_account:
|
||||
accounts = [dict(company=company, account=tds_account)]
|
||||
|
||||
tds = frappe.get_doc({
|
||||
'doctype': 'Tax Withholding Category', 'name': 'TDS',
|
||||
'percent_of_tax_withheld': 10,'threshold': 150000, 'book_on_invoice': 1,
|
||||
'withhold_cumulative_tax_amount': 0, 'accounts': accounts
|
||||
})
|
||||
fiscal_year = get_fiscal_year(today(), company=accounts[0].get('company'))[0]
|
||||
docs = get_tds_details(accounts, fiscal_year)
|
||||
|
||||
try:
|
||||
tds.flags.ignore_permissions = True
|
||||
tds.insert()
|
||||
except frappe.DuplicateEntryError:
|
||||
tds = frappe.get_doc("Tax Withholding Category", tds.get("name"))
|
||||
tds.append("accounts", accounts[0])
|
||||
tds.save()
|
||||
for d in docs:
|
||||
try:
|
||||
doc = frappe.get_doc(d)
|
||||
doc.flags.ignore_permissions = True
|
||||
doc.insert()
|
||||
except frappe.DuplicateEntryError:
|
||||
doc = frappe.get_doc("Tax Withholding Category", d.get("name"))
|
||||
doc.append("accounts", accounts[0])
|
||||
|
||||
# if fiscal year don't match with any of the already entered data, append rate row
|
||||
fy_exist = [k for k in doc.get('rates') if k.get('fiscal_year')==fiscal_year]
|
||||
if not fy_exist:
|
||||
doc.append("rates", d.get('rates')[0])
|
||||
|
||||
doc.save()
|
||||
|
||||
def set_tds_account(docs, company):
|
||||
abbr = frappe.get_value("Company", company, "abbr")
|
||||
@@ -301,3 +310,148 @@ def set_tds_account(docs, company):
|
||||
"parent_account": "Duties and Taxes - {0}".format(abbr), "company": company
|
||||
}
|
||||
])
|
||||
|
||||
def get_tds_details(accounts, fiscal_year):
|
||||
# bootstrap default tax withholding sections
|
||||
return [
|
||||
dict(name="TDS - 194C - Company",
|
||||
category_name="Payment to Contractors (Single / Aggregate)",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 2,
|
||||
"single_threshold": 30000, "cumulative_threshold": 100000}]),
|
||||
dict(name="TDS - 194C - Individual",
|
||||
category_name="Payment to Contractors (Single / Aggregate)",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 1,
|
||||
"single_threshold": 30000, "cumulative_threshold": 100000}]),
|
||||
dict(name="TDS - 194C - No PAN / Invalid PAN",
|
||||
category_name="Payment to Contractors (Single / Aggregate)",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 30000, "cumulative_threshold": 100000}]),
|
||||
dict(name="TDS - 194D - Company",
|
||||
category_name="Insurance Commission",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 5,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194D - Company Assessee",
|
||||
category_name="Insurance Commission",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194D - Individual",
|
||||
category_name="Insurance Commission",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 5,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194D - No PAN / Invalid PAN",
|
||||
category_name="Insurance Commission",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194DA - Company",
|
||||
category_name="Non-exempt payments made under a life insurance policy",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 1,
|
||||
"single_threshold": 100000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194DA - Individual",
|
||||
category_name="Non-exempt payments made under a life insurance policy",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 1,
|
||||
"single_threshold": 100000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194DA - No PAN / Invalid PAN",
|
||||
category_name="Non-exempt payments made under a life insurance policy",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 100000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194H - Company",
|
||||
category_name="Commission / Brokerage",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 5,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194H - Individual",
|
||||
category_name="Commission / Brokerage",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 5,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194H - No PAN / Invalid PAN",
|
||||
category_name="Commission / Brokerage",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 15000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent - Company",
|
||||
category_name="Rent",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent - Individual",
|
||||
category_name="Rent",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent - No PAN / Invalid PAN",
|
||||
category_name="Rent",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent/Machinery - Company",
|
||||
category_name="Rent-Plant / Machinery",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 2,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent/Machinery - Individual",
|
||||
category_name="Rent-Plant / Machinery",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 2,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194I - Rent/Machinery - No PAN / Invalid PAN",
|
||||
category_name="Rent-Plant / Machinery",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 180000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Professional Fees - Company",
|
||||
category_name="Professional Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 30000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Professional Fees - Individual",
|
||||
category_name="Professional Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 30000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Professional Fees - No PAN / Invalid PAN",
|
||||
category_name="Professional Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 30000, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Director Fees - Company",
|
||||
category_name="Director Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 0, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Director Fees - Individual",
|
||||
category_name="Director Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 0, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194J - Director Fees - No PAN / Invalid PAN",
|
||||
category_name="Director Fees",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 0, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194 - Dividends - Company",
|
||||
category_name="Dividends",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 2500, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194 - Dividends - Individual",
|
||||
category_name="Dividends",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 10,
|
||||
"single_threshold": 2500, "cumulative_threshold": 0}]),
|
||||
dict(name="TDS - 194 - Dividends - No PAN / Invalid PAN",
|
||||
category_name="Dividends",
|
||||
doctype="Tax Withholding Category", accounts=accounts,
|
||||
rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20,
|
||||
"single_threshold": 2500, "cumulative_threshold": 0}])
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user