test: gratuity
diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
index d54a47e..3247369 100644
--- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
+++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
@@ -12,7 +12,7 @@
self.validate_accounts()
self.validate_repeating_companies()
self.validate_pos_mode_of_payment()
-
+
def validate_repeating_companies(self):
"""Error when Same Company is entered multiple times in accounts"""
accounts_list = []
@@ -31,10 +31,10 @@
def validate_pos_mode_of_payment(self):
if not self.enabled:
- pos_profiles = frappe.db.sql("""SELECT sip.parent FROM `tabSales Invoice Payment` sip
+ pos_profiles = frappe.db.sql("""SELECT sip.parent FROM `tabSales Invoice Payment` sip
WHERE sip.parenttype = 'POS Profile' and sip.mode_of_payment = %s""", (self.name))
pos_profiles = list(map(lambda x: x[0], pos_profiles))
-
+
if pos_profiles:
message = "POS Profile " + frappe.bold(", ".join(pos_profiles)) + " contains \
Mode of Payment " + frappe.bold(str(self.name)) + ". Please remove them to disable this mode."
diff --git a/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py b/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
index 5de355f..93cadf5 100644
--- a/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
+++ b/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
@@ -3,13 +3,16 @@
from __future__ import unicode_literals
-import erpnext
+import erpnext, frappe
def execute():
+ frappe.reload_doc('payroll', 'doctype', 'gratuity_rule')
+ frappe.reload_doc('payroll', 'doctype', 'gratuity_rule_slab')
+ frappe.reload_doc('payroll', 'doctype', 'gratuity_applicable_component')
region = erpnext.get_region()
if region == "India":
- from erpnext.regional.india.setup import create_standard_documents
- create_standard_documents()
+ from erpnext.regional.india.setup import create_gratuity_rule
+ create_gratuity_rule()
elif region == "United Arab Emirates":
- from erpnext.regional.united_arab_emirates.setup import create_standard_documents
- create_standard_documents()
\ No newline at end of file
+ from erpnext.regional.united_arab_emirates.setup import create_gratuity_rule
+ create_gratuity_rule()
\ No newline at end of file
diff --git a/erpnext/payroll/doctype/gratuity/gratuity.py b/erpnext/payroll/doctype/gratuity/gratuity.py
index 9f59280..815e24d 100644
--- a/erpnext/payroll/doctype/gratuity/gratuity.py
+++ b/erpnext/payroll/doctype/gratuity/gratuity.py
@@ -12,7 +12,9 @@
from frappe.utils import get_datetime
class Gratuity(Document):
def validate(self):
- calculate_work_experience_and_amount(self.employee, self.gratuity_rule)
+ data = calculate_work_experience_and_amount(self.employee, self.gratuity_rule)
+ self.current_work_experience = data["current_work_experience"]
+ self.amount = data["amount"]
def before_submit(self):
self.status = "Unpaid"
diff --git a/erpnext/payroll/doctype/gratuity/test_gratuity.py b/erpnext/payroll/doctype/gratuity/test_gratuity.py
index 92c1248..fb2488c 100644
--- a/erpnext/payroll/doctype/gratuity/test_gratuity.py
+++ b/erpnext/payroll/doctype/gratuity/test_gratuity.py
@@ -3,8 +3,178 @@
# See license.txt
from __future__ import unicode_literals
-# import frappe
+import frappe
import unittest
+from erpnext.hr.doctype.employee.test_employee import make_employee
+from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_employee_salary_slip
+from erpnext.payroll.doctype.gratuity.gratuity import get_last_salary_slip
+from erpnext.regional.united_arab_emirates.setup import create_gratuity_rule
+from frappe.utils import getdate, add_days, get_datetime, flt
+
class TestGratuity(unittest.TestCase):
- pass
+
+ def setUp(self):
+ frappe.db.sql("DELETE FROM `tabgratuity`")
+ frappe.db.sql("DELETE FROM `tabAdditional Salary` WHERE ref_doctype = 'Gratuity'")
+
+
+ def test_check_gratuity_amount_based_on_current_slab_and_additional_salary_creation(self):
+ employee, sal_slip = create_employee_and_get_last_salary_slip()
+ rule = frappe.db.exists("Gratuity Rule", "Rule Under Unlimited Contract on termination (UAE)")
+ if not rule:
+ create_gratuity_rule()
+ else:
+ rule = frappe.get_doc("Gratuity Rule", "Rule Under Unlimited Contract on termination (UAE)")
+ rule.applicable_earnings_component = []
+ rule.append("applicable_earnings_component", {
+ "salary_component": "Basic Salary"
+ })
+ rule.save()
+ rule.reload()
+
+ gra = frappe.new_doc("Gratuity")
+ gra.employee = employee
+ gra.posting_date = getdate()
+ gra.gratuity_rule = rule.name
+ gra.pay_via_salary_slip = 1
+ gra.salary_component = "Performance Bonus"
+ gra.payroll_date = getdate()
+ gra.save()
+ gra.submit()
+
+ #work experience calculation
+ date_of_joining, relieving_date = frappe.db.get_value('Employee', employee, ['date_of_joining', 'relieving_date'])
+ employee_total_workings_days = (get_datetime(relieving_date) - get_datetime(date_of_joining)).days
+
+ experience = employee_total_workings_days/rule.total_working_days_per_year
+
+ gra.reload()
+
+ from math import floor
+
+ self.assertEqual(floor(experience), gra.current_work_experience)
+
+ #amount Calculation 6
+ component_amount = frappe.get_list("Salary Detail",
+ filters={
+ "docstatus": 1,
+ 'parent': sal_slip,
+ "parentfield": "earnings",
+ 'salary_component': "Basic Salary"
+ },
+ fields=["amount"])
+
+ ''' 5 - 0 fraction is 1 '''
+
+ gratuity_amount = component_amount[0].amount * experience
+ gra.reload()
+
+ self.assertEqual(flt(gratuity_amount, 2), flt(gra.amount, 2))
+
+ #additional salary creation (Pay via salary slip)
+ self.assertTrue(frappe.db.exists("Additional Salary", {"ref_docname": gra.name}))
+ self.assertEqual(gra.status, "Paid")
+
+
+
+ def test_check_gratuity_amount_based_on_all_previous_slabs(self):
+ employee, sal_slip = create_employee_and_get_last_salary_slip()
+ rule = frappe.db.exists("Gratuity Rule", "Rule Under Limited Contract (UAE)")
+ if not rule:
+ create_gratuity_rule()
+ else:
+ rule = frappe.get_doc("Gratuity Rule", rule)
+ rule.applicable_earnings_component = []
+ rule = frappe.get_doc("Gratuity Rule", "Rule Under Limited Contract (UAE)")
+ rule.append("applicable_earnings_component", {
+ "salary_component": "Basic Salary"
+ })
+ rule.save()
+ rule.reload()
+
+ mof = frappe.get_doc("Mode of Payment", "Cheque")
+ mof.accounts = []
+ mof.append("accounts", {
+ "company": "_Test Company",
+ "default_account": "_Test Bank - _TC"
+ })
+
+ mof.save()
+
+ gra = frappe.new_doc("Gratuity")
+ gra.employee = employee
+ gra.posting_date = getdate()
+ gra.gratuity_rule = rule.name
+ gra.pay_via_salary_slip = 0
+ gra.payroll_date = getdate()
+ gra.expense_account = "Payment Account - _TC"
+ gra.mode_of_payment = "Cheque"
+
+ gra.save()
+ gra.submit()
+
+ #work experience calculation
+ date_of_joining, relieving_date = frappe.db.get_value('Employee', employee, ['date_of_joining', 'relieving_date'])
+ employee_total_workings_days = (get_datetime(relieving_date) - get_datetime(date_of_joining)).days
+
+ experience = employee_total_workings_days/rule.total_working_days_per_year
+
+ gra.reload()
+
+ from math import floor
+
+ self.assertEqual(floor(experience), gra.current_work_experience)
+
+ #amount Calculation 6
+ component_amount = frappe.get_list("Salary Detail",
+ filters={
+ "docstatus": 1,
+ 'parent': sal_slip,
+ "parentfield": "earnings",
+ 'salary_component': "Basic Salary"
+ },
+ fields=["amount"])
+
+
+ ''' range | Fraction
+ 0-1 | 0
+ 1-5 | 0.7
+ 5-0 | 1
+ '''
+
+
+ gratuity_amount = ((0 * 1) + (4 * 0.7) + (1 * 1)) * component_amount[0].amount
+ gra.reload()
+
+ self.assertEqual(flt(gratuity_amount, 2), flt(gra.amount, 2))
+ self.assertEqual(gra.status, "Unpaid")
+
+
+ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
+
+ pay_entry = get_payment_entry("Gratuity", gra.name)
+ pay_entry.reference_no = "123467"
+ pay_entry.reference_date = getdate()
+
+ pay_entry.save()
+ pay_entry.submit()
+
+ gra.reload()
+
+ self.assertEqual(gra.status, "Paid")
+ self.assertEqual(gra.paid_amount, flt(gra.amount, 2))
+
+def create_employee_and_get_last_salary_slip():
+ employee = make_employee("test_employee@salary.com")
+ frappe.db.set_value("Employee", employee, "relieving_date", getdate())
+ frappe.db.set_value("Employee", employee, "date_of_joining", add_days(getdate(), - (6*365)))
+ if not frappe.db.exists("Salary Slip", {"employee":employee}):
+ salary_slip = make_employee_salary_slip("test_employee@salary.com", "Monthly")
+ salary_slip.submit()
+ salary_slip = salary_slip.name
+ else:
+ salary_slip = get_last_salary_slip(employee)
+
+ return employee, salary_slip
+
diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py
index a8ff3f8..9be5239 100644
--- a/erpnext/regional/india/setup.py
+++ b/erpnext/regional/india/setup.py
@@ -21,7 +21,7 @@
add_permissions()
add_custom_roles_for_reports()
frappe.enqueue('erpnext.regional.india.setup.add_hsn_sac_codes', now=frappe.flags.in_test)
- create_standard_documents()
+ create_gratuity_rule()
add_print_formats()
def add_hsn_sac_codes():
@@ -796,7 +796,7 @@
"single_threshold": 2500, "cumulative_threshold": 0}])
]
-def create_standard_documents():
+def create_gratuity_rule():
# Standard Indain Gratuity Rule
diff --git a/erpnext/regional/united_arab_emirates/setup.py b/erpnext/regional/united_arab_emirates/setup.py
index 1a89927..72d7c13 100644
--- a/erpnext/regional/united_arab_emirates/setup.py
+++ b/erpnext/regional/united_arab_emirates/setup.py
@@ -11,9 +11,13 @@
def setup(company=None, patch=True):
make_custom_fields()
add_print_formats()
+<<<<<<< HEAD
add_custom_roles_for_reports()
add_permissions()
create_standard_documents()
+=======
+ create_gratuity_rule()
+>>>>>>> test: gratuity
if company:
create_sales_tax(company)
@@ -155,7 +159,8 @@
add_permission(doctype, role, 0)
update_permission_property(doctype, role, 0, 'write', 1)
update_permission_property(doctype, role, 0, 'create', 1)
-def create_standard_documents():
+
+def create_gratuity_rule():
# Standard Gratuity Rules for UAE