brotherton-erpnext/erpnext/regional/united_arab_emirates/setup.py
2022-03-28 18:52:46 +05:30

344 lines
9.2 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
from frappe.permissions import add_permission, update_permission_property
from erpnext.payroll.doctype.gratuity_rule.gratuity_rule import get_gratuity_rule
def setup(company=None, patch=True):
make_custom_fields()
add_print_formats()
add_custom_roles_for_reports()
add_permissions()
create_gratuity_rule()
def make_custom_fields():
is_zero_rated = dict(
fieldname="is_zero_rated",
label="Is Zero Rated",
fieldtype="Check",
fetch_from="item_code.is_zero_rated",
insert_after="description",
print_hide=1,
)
is_exempt = dict(
fieldname="is_exempt",
label="Is Exempt",
fieldtype="Check",
fetch_from="item_code.is_exempt",
insert_after="is_zero_rated",
print_hide=1,
)
invoice_fields = [
dict(
fieldname="vat_section",
label="VAT Details",
fieldtype="Section Break",
insert_after="group_same_items",
print_hide=1,
collapsible=1,
),
dict(
fieldname="permit_no",
label="Permit Number",
fieldtype="Data",
insert_after="vat_section",
print_hide=1,
),
]
purchase_invoice_fields = [
dict(
fieldname="company_trn",
label="Company TRN",
fieldtype="Read Only",
insert_after="shipping_address",
fetch_from="company.tax_id",
print_hide=1,
),
dict(
fieldname="supplier_name_in_arabic",
label="Supplier Name in Arabic",
fieldtype="Read Only",
insert_after="supplier_name",
fetch_from="supplier.supplier_name_in_arabic",
print_hide=1,
),
dict(
fieldname="recoverable_standard_rated_expenses",
print_hide=1,
default="0",
label="Recoverable Standard Rated Expenses (AED)",
insert_after="permit_no",
fieldtype="Currency",
),
dict(
fieldname="reverse_charge",
label="Reverse Charge Applicable",
fieldtype="Select",
insert_after="recoverable_standard_rated_expenses",
print_hide=1,
options="Y\nN",
default="N",
),
dict(
fieldname="recoverable_reverse_charge",
label="Recoverable Reverse Charge (Percentage)",
insert_after="reverse_charge",
fieldtype="Percent",
print_hide=1,
depends_on="eval:doc.reverse_charge=='Y'",
default="100.000",
),
]
sales_invoice_fields = [
dict(
fieldname="company_trn",
label="Company TRN",
fieldtype="Read Only",
insert_after="company_address",
fetch_from="company.tax_id",
print_hide=1,
),
dict(
fieldname="customer_name_in_arabic",
label="Customer Name in Arabic",
fieldtype="Read Only",
insert_after="customer_name",
fetch_from="customer.customer_name_in_arabic",
print_hide=1,
),
dict(
fieldname="vat_emirate",
label="VAT Emirate",
insert_after="permit_no",
fieldtype="Select",
options="\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain",
fetch_from="company_address.emirate",
),
dict(
fieldname="tourist_tax_return",
label="Tax Refund provided to Tourists (AED)",
insert_after="vat_emirate",
fieldtype="Currency",
print_hide=1,
default="0",
),
]
invoice_item_fields = [
dict(
fieldname="tax_code",
label="Tax Code",
fieldtype="Read Only",
fetch_from="item_code.tax_code",
insert_after="description",
allow_on_submit=1,
print_hide=1,
),
dict(
fieldname="tax_rate",
label="Tax Rate",
fieldtype="Float",
insert_after="tax_code",
print_hide=1,
hidden=1,
read_only=1,
),
dict(
fieldname="tax_amount",
label="Tax Amount",
fieldtype="Currency",
insert_after="tax_rate",
print_hide=1,
hidden=1,
read_only=1,
options="currency",
),
dict(
fieldname="total_amount",
label="Total Amount",
fieldtype="Currency",
insert_after="tax_amount",
print_hide=1,
hidden=1,
read_only=1,
options="currency",
),
]
delivery_date_field = [
dict(
fieldname="delivery_date",
label="Delivery Date",
fieldtype="Date",
insert_after="item_name",
print_hide=1,
)
]
custom_fields = {
"Item": [
dict(fieldname="tax_code", label="Tax Code", fieldtype="Data", insert_after="item_group"),
dict(
fieldname="is_zero_rated",
label="Is Zero Rated",
fieldtype="Check",
insert_after="tax_code",
print_hide=1,
),
dict(
fieldname="is_exempt",
label="Is Exempt",
fieldtype="Check",
insert_after="is_zero_rated",
print_hide=1,
),
],
"Customer": [
dict(
fieldname="customer_name_in_arabic",
label="Customer Name in Arabic",
fieldtype="Data",
insert_after="customer_name",
),
],
"Supplier": [
dict(
fieldname="supplier_name_in_arabic",
label="Supplier Name in Arabic",
fieldtype="Data",
insert_after="supplier_name",
),
],
"Address": [
dict(
fieldname="emirate",
label="Emirate",
fieldtype="Select",
insert_after="state",
options="\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain",
)
],
"Purchase Invoice": purchase_invoice_fields + invoice_fields,
"Purchase Order": purchase_invoice_fields + invoice_fields,
"Purchase Receipt": purchase_invoice_fields + invoice_fields,
"Sales Invoice": sales_invoice_fields + invoice_fields,
"POS Invoice": sales_invoice_fields + invoice_fields,
"Sales Order": sales_invoice_fields + invoice_fields,
"Delivery Note": sales_invoice_fields + invoice_fields,
"Sales Invoice Item": invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
"POS Invoice Item": invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
"Purchase Invoice Item": invoice_item_fields,
"Sales Order Item": invoice_item_fields,
"Delivery Note Item": invoice_item_fields,
"Quotation Item": invoice_item_fields,
"Purchase Order Item": invoice_item_fields,
"Purchase Receipt Item": invoice_item_fields,
"Supplier Quotation Item": invoice_item_fields,
}
create_custom_fields(custom_fields)
def add_print_formats():
frappe.reload_doc("regional", "print_format", "detailed_tax_invoice")
frappe.reload_doc("regional", "print_format", "simplified_tax_invoice")
frappe.reload_doc("regional", "print_format", "tax_invoice")
frappe.db.sql(
""" update `tabPrint Format` set disabled = 0 where
name in('Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice') """
)
def add_custom_roles_for_reports():
"""Add Access Control to UAE VAT 201."""
if not frappe.db.get_value("Custom Role", dict(report="UAE VAT 201")):
frappe.get_doc(
dict(
doctype="Custom Role",
report="UAE VAT 201",
roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
)
).insert()
def add_permissions():
"""Add Permissions for UAE VAT Settings and UAE VAT Account."""
for doctype in ("UAE VAT Settings", "UAE VAT Account"):
add_permission(doctype, "All", 0)
for role in ("Accounts Manager", "Accounts User", "System Manager"):
add_permission(doctype, role, 0)
update_permission_property(doctype, role, 0, "write", 1)
update_permission_property(doctype, role, 0, "create", 1)
def create_gratuity_rule():
rule_1 = rule_2 = rule_3 = None
# Rule Under Limited Contract
slabs = get_slab_for_limited_contract()
if not frappe.db.exists("Gratuity Rule", "Rule Under Limited Contract (UAE)"):
rule_1 = get_gratuity_rule(
"Rule Under Limited Contract (UAE)",
slabs,
calculate_gratuity_amount_based_on="Sum of all previous slabs",
)
# Rule Under Unlimited Contract on termination
slabs = get_slab_for_unlimited_contract_on_termination()
if not frappe.db.exists("Gratuity Rule", "Rule Under Unlimited Contract on termination (UAE)"):
rule_2 = get_gratuity_rule("Rule Under Unlimited Contract on termination (UAE)", slabs)
# Rule Under Unlimited Contract on resignation
slabs = get_slab_for_unlimited_contract_on_resignation()
if not frappe.db.exists("Gratuity Rule", "Rule Under Unlimited Contract on resignation (UAE)"):
rule_3 = get_gratuity_rule("Rule Under Unlimited Contract on resignation (UAE)", slabs)
# for applicable salary component user need to set this by its own
if rule_1:
rule_1.flags.ignore_mandatory = True
rule_1.save()
if rule_2:
rule_2.flags.ignore_mandatory = True
rule_2.save()
if rule_3:
rule_3.flags.ignore_mandatory = True
rule_3.save()
def get_slab_for_limited_contract():
return [
{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
{"from_year": 1, "to_year": 5, "fraction_of_applicable_earnings": 21 / 30},
{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": 1},
]
def get_slab_for_unlimited_contract_on_termination():
return [
{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
{"from_year": 1, "to_year": 5, "fraction_of_applicable_earnings": 21 / 30},
{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": 1},
]
def get_slab_for_unlimited_contract_on_resignation():
fraction_1 = 1 / 3 * 21 / 30
fraction_2 = 2 / 3 * 21 / 30
fraction_3 = 21 / 30
return [
{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
{"from_year": 1, "to_year": 3, "fraction_of_applicable_earnings": fraction_1},
{"from_year": 3, "to_year": 5, "fraction_of_applicable_earnings": fraction_2},
{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": fraction_3},
]