124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: GNU General Public License v3. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import frappe, copy, os, json
|
|
from frappe.utils import flt
|
|
from erpnext.accounts.doctype.account.account import RootNotEditable
|
|
|
|
def create_sales_tax(args):
|
|
country_wise_tax = get_country_wise_tax(args.get("country"))
|
|
if country_wise_tax and len(country_wise_tax) > 0:
|
|
for sales_tax, tax_data in country_wise_tax.items():
|
|
make_tax_account_and_template(
|
|
args.get("company_name"),
|
|
tax_data.get('account_name'),
|
|
tax_data.get('tax_rate'), sales_tax)
|
|
|
|
def make_tax_account_and_template(company, account_name, tax_rate, template_name=None):
|
|
if not isinstance(account_name, (list, tuple)):
|
|
account_name = [account_name]
|
|
tax_rate = [tax_rate]
|
|
|
|
accounts = []
|
|
for i, name in enumerate(account_name):
|
|
tax_account = make_tax_account(company, account_name[i], tax_rate[i])
|
|
if tax_account:
|
|
accounts.append(tax_account)
|
|
|
|
try:
|
|
if accounts:
|
|
make_sales_and_purchase_tax_templates(accounts, template_name)
|
|
make_item_tax_templates(accounts, template_name)
|
|
except frappe.NameError:
|
|
if frappe.message_log: frappe.message_log.pop()
|
|
except RootNotEditable:
|
|
pass
|
|
|
|
def make_tax_account(company, account_name, tax_rate):
|
|
tax_group = get_tax_account_group(company)
|
|
if tax_group:
|
|
try:
|
|
return frappe.get_doc({
|
|
"doctype":"Account",
|
|
"company": company,
|
|
"parent_account": tax_group,
|
|
"account_name": account_name,
|
|
"is_group": 0,
|
|
"report_type": "Balance Sheet",
|
|
"root_type": "Liability",
|
|
"account_type": "Tax",
|
|
"tax_rate": flt(tax_rate) if tax_rate else None
|
|
}).insert(ignore_permissions=True, ignore_mandatory=True)
|
|
except frappe.NameError:
|
|
if frappe.message_log: frappe.message_log.pop()
|
|
abbr = frappe.get_cached_value('Company', company, 'abbr')
|
|
account = '{0} - {1}'.format(account_name, abbr)
|
|
return frappe.get_doc('Account', account)
|
|
|
|
def make_sales_and_purchase_tax_templates(accounts, template_name=None):
|
|
if not template_name:
|
|
template_name = accounts[0].name
|
|
|
|
sales_tax_template = {
|
|
"doctype": "Sales Taxes and Charges Template",
|
|
"title": template_name,
|
|
"company": accounts[0].company,
|
|
'taxes': []
|
|
}
|
|
|
|
for account in accounts:
|
|
sales_tax_template['taxes'].append({
|
|
"category": "Total",
|
|
"charge_type": "On Net Total",
|
|
"account_head": account.name,
|
|
"description": "{0} @ {1}".format(account.account_name, account.tax_rate),
|
|
"rate": account.tax_rate
|
|
})
|
|
# Sales
|
|
frappe.get_doc(copy.deepcopy(sales_tax_template)).insert(ignore_permissions=True)
|
|
|
|
# Purchase
|
|
purchase_tax_template = copy.deepcopy(sales_tax_template)
|
|
purchase_tax_template["doctype"] = "Purchase Taxes and Charges Template"
|
|
|
|
doc = frappe.get_doc(purchase_tax_template)
|
|
doc.insert(ignore_permissions=True)
|
|
|
|
def make_item_tax_templates(accounts, template_name=None):
|
|
if not template_name:
|
|
template_name = accounts[0].name
|
|
|
|
item_tax_template = {
|
|
"doctype": "Item Tax Template",
|
|
"title": template_name,
|
|
"company": accounts[0].company,
|
|
'taxes': []
|
|
}
|
|
|
|
|
|
for account in accounts:
|
|
item_tax_template['taxes'].append({
|
|
"tax_type": account.name,
|
|
"tax_rate": account.tax_rate
|
|
})
|
|
|
|
# Items
|
|
frappe.get_doc(copy.deepcopy(item_tax_template)).insert(ignore_permissions=True)
|
|
|
|
def get_tax_account_group(company):
|
|
tax_group = frappe.db.get_value("Account",
|
|
{"account_name": "Duties and Taxes", "is_group": 1, "company": company})
|
|
if not tax_group:
|
|
tax_group = frappe.db.get_value("Account", {"is_group": 1, "root_type": "Liability",
|
|
"account_type": "Tax", "company": company})
|
|
|
|
return tax_group
|
|
|
|
def get_country_wise_tax(country):
|
|
data = {}
|
|
with open (os.path.join(os.path.dirname(__file__), "..", "data", "country_wise_tax.json")) as countrywise_tax:
|
|
data = json.load(countrywise_tax).get(country)
|
|
|
|
return data
|