# 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 }]