Skip to content

Commit

Permalink
Merge pull request frappe#26473 from deepeshgarg007/bootstrapped_gst_…
Browse files Browse the repository at this point in the history
…setup_develop

feat(India): Bootstrapped GST Setup
  • Loading branch information
deepeshgarg007 authored Jul 14, 2021
2 parents cc8ba23 + 0f81ccb commit 4bbd254
Show file tree
Hide file tree
Showing 15 changed files with 542 additions and 105 deletions.
10 changes: 5 additions & 5 deletions erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -2118,9 +2118,9 @@ def make_sales_invoice_for_ewaybill():
if not gst_account:
gst_settings.append("gst_accounts", {
"company": "_Test Company",
"cgst_account": "CGST - _TC",
"sgst_account": "SGST - _TC",
"igst_account": "IGST - _TC",
"cgst_account": "Output Tax CGST - _TC",
"sgst_account": "Output Tax SGST - _TC",
"igst_account": "Output Tax IGST - _TC",
})

gst_settings.save()
Expand All @@ -2137,15 +2137,15 @@ def make_sales_invoice_for_ewaybill():

si.append("taxes", {
"charge_type": "On Net Total",
"account_head": "CGST - _TC",
"account_head": "Output Tax CGST - _TC",
"cost_center": "Main - _TC",
"description": "CGST @ 9.0",
"rate": 9
})

si.append("taxes", {
"charge_type": "On Net Total",
"account_head": "SGST - _TC",
"account_head": "Output Tax SGST - _TC",
"cost_center": "Main - _TC",
"description": "SGST @ 9.0",
"rate": 9
Expand Down
2 changes: 1 addition & 1 deletion erpnext/accounts/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,7 @@ def get_children(doctype, parent, company, is_root=False):
return acc

def create_payment_gateway_account(gateway, payment_channel="Email"):
from erpnext.setup.setup_wizard.operations.company_setup import create_bank_account
from erpnext.setup.setup_wizard.operations.install_fixtures import create_bank_account

company = frappe.db.get_value("Global Defaults", None, "default_company")
if not company:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,21 @@
import unittest
from erpnext.erpnext_integrations.doctype.mpesa_settings.mpesa_settings import process_balance_info, verify_transaction
from erpnext.accounts.doctype.pos_invoice.test_pos_invoice import create_pos_invoice
from erpnext.erpnext_integrations.utils import create_mode_of_payment

class TestMpesaSettings(unittest.TestCase):
def setUp(self):
# create payment gateway in setup
create_mpesa_settings(payment_gateway_name="_Test")
create_mpesa_settings(payment_gateway_name="_Account Balance")
create_mpesa_settings(payment_gateway_name="Payment")

def tearDown(self):
frappe.db.sql('delete from `tabMpesa Settings`')
frappe.db.sql('delete from `tabIntegration Request` where integration_request_service = "Mpesa"')

def test_creation_of_payment_gateway(self):
create_mpesa_settings(payment_gateway_name="_Test")

mode_of_payment = frappe.get_doc("Mode of Payment", "Mpesa-_Test")
mode_of_payment = create_mode_of_payment('Mpesa-_Test', payment_type="Phone")
self.assertTrue(frappe.db.exists("Payment Gateway Account", {'payment_gateway': "Mpesa-_Test"}))
self.assertTrue(mode_of_payment.name)
self.assertEqual(mode_of_payment.type, "Phone")
Expand Down Expand Up @@ -47,7 +52,6 @@ def test_processing_of_account_balance(self):
integration_request.delete()

def test_processing_of_callback_payload(self):
create_mpesa_settings(payment_gateway_name="Payment")
mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
frappe.db.set_value("Customer", "_Test Customer", "default_currency", "KES")
Expand Down Expand Up @@ -90,7 +94,6 @@ def test_processing_of_callback_payload(self):
pos_invoice.delete()

def test_processing_of_multiple_callback_payload(self):
create_mpesa_settings(payment_gateway_name="Payment")
mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
frappe.db.set_value("Mpesa Settings", "Payment", "transaction_limit", "500")
Expand Down Expand Up @@ -141,7 +144,6 @@ def test_processing_of_multiple_callback_payload(self):
pos_invoice.delete()

def test_processing_of_only_one_succes_callback_payload(self):
create_mpesa_settings(payment_gateway_name="Payment")
mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
frappe.db.set_value("Mpesa Settings", "Payment", "transaction_limit", "500")
Expand Down Expand Up @@ -202,6 +204,7 @@ def create_mpesa_settings(payment_gateway_name="Express"):

doc = frappe.get_doc(dict( #nosec
doctype="Mpesa Settings",
sandbox=1,
payment_gateway_name=payment_gateway_name,
consumer_key="5sMu9LVI1oS3oBGPJfh3JyvLHwZOdTKn",
consumer_secret="VI1oS3oBGPJfh3JyvLHw",
Expand Down
7 changes: 6 additions & 1 deletion erpnext/erpnext_integrations/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ def create_mode_of_payment(gateway, payment_type="General"):
"payment_gateway": gateway
}, ['payment_account'])

if not frappe.db.exists("Mode of Payment", gateway) and payment_gateway_account:
mode_of_payment = frappe.db.exists("Mode of Payment", gateway)
if not mode_of_payment and payment_gateway_account:
mode_of_payment = frappe.get_doc({
"doctype": "Mode of Payment",
"mode_of_payment": gateway,
Expand All @@ -66,6 +67,10 @@ def create_mode_of_payment(gateway, payment_type="General"):
})
mode_of_payment.insert(ignore_permissions=True)

return mode_of_payment
elif mode_of_payment:
return frappe.get_doc("Mode of Payment", mode_of_payment)

def get_tracking_url(carrier, tracking_number):
# Return the formatted Tracking URL.
tracking_url = ''
Expand Down
7 changes: 4 additions & 3 deletions erpnext/hr/doctype/expense_claim/test_expense_claim.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ def test_expense_claim_status(self):
def test_expense_claim_gl_entry(self):
payable_account = get_payable_account(company_name)
taxes = generate_taxes()
expense_claim = make_expense_claim(payable_account, 300, 200, company_name, "Travel Expenses - _TC4", do_not_submit=True, taxes=taxes)
expense_claim = make_expense_claim(payable_account, 300, 200, company_name, "Travel Expenses - _TC4",
do_not_submit=True, taxes=taxes)
expense_claim.submit()

gl_entries = frappe.db.sql("""select account, debit, credit
Expand All @@ -82,7 +83,7 @@ def test_expense_claim_gl_entry(self):
self.assertTrue(gl_entries)

expected_values = dict((d[0], d) for d in [
['CGST - _TC4',18.0, 0.0],
['Output Tax CGST - _TC4',18.0, 0.0],
[payable_account, 0.0, 218.0],
["Travel Expenses - _TC4", 200.0, 0.0]
])
Expand Down Expand Up @@ -145,7 +146,7 @@ def generate_taxes():
parent_account = frappe.db.get_value('Account',
{'company': company_name, 'is_group':1, 'account_type': 'Tax'},
'name')
account = create_account(company=company_name, account_name="CGST", account_type="Tax", parent_account=parent_account)
account = create_account(company=company_name, account_name="Output Tax CGST", account_type="Tax", parent_account=parent_account)
return {'taxes':[{
"account_head": account,
"rate": 0,
Expand Down
2 changes: 1 addition & 1 deletion erpnext/public/js/setup_wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ erpnext.setup.slides_settings = [
}

// Validate bank name
if(me.values.bank_account){
if(me.values.bank_account) {
frappe.call({
async: false,
method: "erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts.validate_bank_account",
Expand Down
15 changes: 15 additions & 0 deletions erpnext/regional/doctype/gst_settings/gst_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,21 @@ def onload(self):
from tabAddress where country = "India" and ifnull(gstin, '')!='' ''')
self.set_onload('data', data)

def validate(self):
# Validate duplicate accounts
self.validate_duplicate_accounts()

def validate_duplicate_accounts(self):
account_list = []
for account in self.get('gst_accounts'):
for fieldname in ['cgst_account', 'sgst_account', 'igst_account', 'cess_account']:
if account.get(fieldname) in account_list:
frappe.throw(_("Account {0} appears multiple times").format(
frappe.bold(account.get(fieldname))))

if account.get(fieldname):
account_list.append(account.get(fieldname))

@frappe.whitelist()
def send_reminder():
frappe.has_permission('GST Settings', throw=True)
Expand Down
28 changes: 14 additions & 14 deletions erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ def test_gstr_3b_report(self):
make_sales_invoice()
create_purchase_invoices()

if frappe.db.exists("GSTR 3B Report", "GSTR3B-March-2019-_Test Address-Billing"):
report = frappe.get_doc("GSTR 3B Report", "GSTR3B-March-2019-_Test Address-Billing")
if frappe.db.exists("GSTR 3B Report", "GSTR3B-March-2019-_Test Address GST-Billing"):
report = frappe.get_doc("GSTR 3B Report", "GSTR3B-March-2019-_Test Address GST-Billing")
report.save()
else:
report = frappe.get_doc({
"doctype": "GSTR 3B Report",
"company": "_Test Company GST",
"company_address": "_Test Address-Billing",
"company_address": "_Test Address GST-Billing",
"year": getdate().year,
"month": month_number_mapping.get(getdate().month)
}).insert()
Expand Down Expand Up @@ -89,7 +89,7 @@ def test_gst_rounding(self):

si.append("taxes", {
"charge_type": "On Net Total",
"account_head": "IGST - _GST",
"account_head": "Output Tax IGST - _GST",
"cost_center": "Main - _GST",
"description": "IGST @ 18.0",
"rate": 18
Expand Down Expand Up @@ -117,7 +117,7 @@ def make_sales_invoice():

si.append("taxes", {
"charge_type": "On Net Total",
"account_head": "IGST - _GST",
"account_head": "Output Tax IGST - _GST",
"cost_center": "Main - _GST",
"description": "IGST @ 18.0",
"rate": 18
Expand All @@ -138,7 +138,7 @@ def make_sales_invoice():

si1.append("taxes", {
"charge_type": "On Net Total",
"account_head": "IGST - _GST",
"account_head": "Output Tax IGST - _GST",
"cost_center": "Main - _GST",
"description": "IGST @ 18.0",
"rate": 18
Expand All @@ -159,7 +159,7 @@ def make_sales_invoice():

si2.append("taxes", {
"charge_type": "On Net Total",
"account_head": "IGST - _GST",
"account_head": "Output Tax IGST - _GST",
"cost_center": "Main - _GST",
"description": "IGST @ 18.0",
"rate": 18
Expand Down Expand Up @@ -195,15 +195,15 @@ def create_purchase_invoices():

pi.append("taxes", {
"charge_type": "On Net Total",
"account_head": "CGST - _GST",
"account_head": "Input Tax CGST - _GST",
"cost_center": "Main - _GST",
"description": "CGST @ 9.0",
"rate": 9
})

pi.append("taxes", {
"charge_type": "On Net Total",
"account_head": "SGST - _GST",
"account_head": "Input Tax SGST - _GST",
"cost_center": "Main - _GST",
"description": "SGST @ 9.0",
"rate": 9
Expand Down Expand Up @@ -410,10 +410,10 @@ def make_company():
company.country = "India"
company.insert()

if not frappe.db.exists('Address', '_Test Address-Billing'):
if not frappe.db.exists('Address', '_Test Address GST-Billing'):
address = frappe.get_doc({
"address_title": "_Test Address GST",
"address_line1": "_Test Address Line 1",
"address_title": "_Test Address",
"address_type": "Billing",
"city": "_Test City",
"state": "Test State",
Expand Down Expand Up @@ -444,9 +444,9 @@ def set_account_heads():
if not gst_account:
gst_settings.append("gst_accounts", {
"company": "_Test Company GST",
"cgst_account": "CGST - _GST",
"sgst_account": "SGST - _GST",
"igst_account": "IGST - _GST",
"cgst_account": "Output Tax CGST - _GST",
"sgst_account": "Output Tax SGST - _GST",
"igst_account": "Output Tax IGST - _GST"
})

gst_settings.save()
63 changes: 58 additions & 5 deletions erpnext/regional/india/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def setup_company_independent_fixtures(patch=False):
frappe.enqueue('erpnext.regional.india.setup.add_hsn_sac_codes', now=frappe.flags.in_test)
create_gratuity_rule()
add_print_formats()
update_accounts_settings_for_taxes()

def add_hsn_sac_codes():
if frappe.flags.in_test and frappe.flags.created_hsn_codes:
Expand Down Expand Up @@ -680,7 +681,7 @@ def make_custom_fields(update=True):

def make_fixtures(company=None):
docs = []
company = company.name if company else frappe.db.get_value("Global Defaults", None, "default_company")
company = company or frappe.db.get_value("Global Defaults", None, "default_company")

set_salary_components(docs)
set_tds_account(docs, company)
Expand All @@ -698,6 +699,53 @@ def make_fixtures(company=None):
# create records for Tax Withholding Category
set_tax_withholding_category(company)

def update_regional_tax_settings(country, company):
# Will only add default GST accounts if present
input_account_names = ['Input Tax CGST', 'Input Tax SGST', 'Input Tax IGST']
output_account_names = ['Output Tax CGST', 'Output Tax SGST', 'Output Tax IGST']
rcm_accounts = ['Input Tax CGST RCM', 'Input Tax SGST RCM', 'Input Tax IGST RCM']
gst_settings = frappe.get_single('GST Settings')
existing_account_list = []

for account in gst_settings.get('gst_accounts'):
for key in ['cgst_account', 'sgst_account', 'igst_account']:
existing_account_list.append(account.get(key))

gst_accounts = frappe._dict(frappe.get_all("Account",
{'company': company, 'account_name': ('in', input_account_names +
output_account_names + rcm_accounts)}, ['account_name', 'name'], as_list=1))

add_accounts_in_gst_settings(company, input_account_names, gst_accounts,
existing_account_list, gst_settings)
add_accounts_in_gst_settings(company, output_account_names, gst_accounts,
existing_account_list, gst_settings)
add_accounts_in_gst_settings(company, rcm_accounts, gst_accounts,
existing_account_list, gst_settings, is_reverse_charge=1)

gst_settings.save()

def add_accounts_in_gst_settings(company, account_names, gst_accounts,
existing_account_list, gst_settings, is_reverse_charge=0):
accounts_not_added = 1

for account in account_names:
# Default Account Added does not exists
if not gst_accounts.get(account):
accounts_not_added = 0

# Check if already added in GST Settings
if gst_accounts.get(account) in existing_account_list:
accounts_not_added = 0

if accounts_not_added:
gst_settings.append('gst_accounts', {
'company': company,
'cgst_account': gst_accounts.get(account_names[0]),
'sgst_account': gst_accounts.get(account_names[1]),
'igst_account': gst_accounts.get(account_names[2]),
'is_reverse_charge_account': is_reverse_charge
})

def set_salary_components(docs):
docs.extend([
{'doctype': 'Salary Component', 'salary_component': 'Professional Tax',
Expand Down Expand Up @@ -731,12 +779,13 @@ def set_tax_withholding_category(company):
docs = get_tds_details(accounts, fiscal_year)

for d in docs:
try:
if not frappe.db.exists("Tax Withholding Category", d.get("name")):
doc = frappe.get_doc(d)
doc.flags.ignore_validate = True
doc.flags.ignore_permissions = True
doc.flags.ignore_mandatory = True
doc.insert()
except frappe.DuplicateEntryError:
else:
doc = frappe.get_doc("Tax Withholding Category", d.get("name"))

if accounts:
Expand All @@ -749,11 +798,12 @@ def set_tax_withholding_category(company):
doc.append("rates", d.get('rates')[0])

doc.flags.ignore_permissions = True
doc.flags.ignore_validate = True
doc.flags.ignore_mandatory = True
doc.flags.ignore_links = True
doc.save()

def set_tds_account(docs, company):
abbr = frappe.get_value("Company", company, "abbr")
parent_account = frappe.db.get_value("Account", filters = {"account_name": "Duties and Taxes", "company": company})
if parent_account:
docs.extend([
Expand Down Expand Up @@ -912,7 +962,6 @@ def get_tds_details(accounts, fiscal_year):
]

def create_gratuity_rule():

# Standard Indain Gratuity Rule
if not frappe.db.exists("Gratuity Rule", "Indian Standard Gratuity Rule"):
rule = frappe.new_doc("Gratuity Rule")
Expand All @@ -930,3 +979,7 @@ def create_gratuity_rule():

rule.flags.ignore_mandatory = True
rule.save()

def update_accounts_settings_for_taxes():
if frappe.db.count('Company') == 1:
frappe.db.set_value('Accounts Settings', None, "add_taxes_from_item_tax_template", 0)
Loading

0 comments on commit 4bbd254

Please sign in to comment.