From bb629de49b678fc75300f5cc8df611dc8c6d2b54 Mon Sep 17 00:00:00 2001 From: anoop Date: Tue, 15 May 2018 12:14:12 +0530 Subject: [PATCH 1/3] doctype retention bonus --- .../hr/doctype/retention_bonus/__init__.py | 0 .../retention_bonus/retention_bonus.js | 8 + .../retention_bonus/retention_bonus.json | 309 ++++++++++++++++++ .../retention_bonus/retention_bonus.py | 14 + .../retention_bonus/test_retention_bonus.js | 23 ++ .../retention_bonus/test_retention_bonus.py | 10 + 6 files changed, 364 insertions(+) create mode 100644 erpnext/hr/doctype/retention_bonus/__init__.py create mode 100644 erpnext/hr/doctype/retention_bonus/retention_bonus.js create mode 100644 erpnext/hr/doctype/retention_bonus/retention_bonus.json create mode 100644 erpnext/hr/doctype/retention_bonus/retention_bonus.py create mode 100644 erpnext/hr/doctype/retention_bonus/test_retention_bonus.js create mode 100644 erpnext/hr/doctype/retention_bonus/test_retention_bonus.py diff --git a/erpnext/hr/doctype/retention_bonus/__init__.py b/erpnext/hr/doctype/retention_bonus/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.js b/erpnext/hr/doctype/retention_bonus/retention_bonus.js new file mode 100644 index 0000000000..b481af0b6e --- /dev/null +++ b/erpnext/hr/doctype/retention_bonus/retention_bonus.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Retention Bonus', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.json b/erpnext/hr/doctype/retention_bonus/retention_bonus.json new file mode 100644 index 0000000000..b21d3098a1 --- /dev/null +++ b/erpnext/hr/doctype/retention_bonus/retention_bonus.json @@ -0,0 +1,309 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Retention-Bonus-.####", + "beta": 0, + "creation": "2018-05-13 14:59:42.038964", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date_of_joining", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date of Joining", + "length": 0, + "no_copy": 0, + "options": "employee.date_of_joining", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bonus_payment_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Bonus Payment Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Retention Bonus", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-13 15:00:55.913521", + "modified_by": "Administrator", + "module": "HR", + "name": "Retention Bonus", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.py b/erpnext/hr/doctype/retention_bonus/retention_bonus.py new file mode 100644 index 0000000000..361c9bdb0a --- /dev/null +++ b/erpnext/hr/doctype/retention_bonus/retention_bonus.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class RetentionBonus(Document): + def on_submit(self): + pass + + def on_cancel(self): + pass diff --git a/erpnext/hr/doctype/retention_bonus/test_retention_bonus.js b/erpnext/hr/doctype/retention_bonus/test_retention_bonus.js new file mode 100644 index 0000000000..a4b95d3cb1 --- /dev/null +++ b/erpnext/hr/doctype/retention_bonus/test_retention_bonus.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Retention Bonus", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Retention Bonus + () => frappe.tests.make('Retention Bonus', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/retention_bonus/test_retention_bonus.py b/erpnext/hr/doctype/retention_bonus/test_retention_bonus.py new file mode 100644 index 0000000000..eef4f1444e --- /dev/null +++ b/erpnext/hr/doctype/retention_bonus/test_retention_bonus.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestRetentionBonus(unittest.TestCase): + pass From 7d394c14cec7c161f37e065b100b187a7a1bc103 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Tue, 15 May 2018 19:15:58 +0530 Subject: [PATCH 2/3] Email Alert for Retention Bonus --- .../email_alert/retention_bonus/__init__.py | 0 .../retention_bonus/retention_bonus.json | 26 +++++++++++++++++++ .../retention_bonus/retention_bonus.md | 3 +++ .../retention_bonus/retention_bonus.py | 7 +++++ 4 files changed, 36 insertions(+) create mode 100644 erpnext/hr/email_alert/retention_bonus/__init__.py create mode 100644 erpnext/hr/email_alert/retention_bonus/retention_bonus.json create mode 100644 erpnext/hr/email_alert/retention_bonus/retention_bonus.md create mode 100644 erpnext/hr/email_alert/retention_bonus/retention_bonus.py diff --git a/erpnext/hr/email_alert/retention_bonus/__init__.py b/erpnext/hr/email_alert/retention_bonus/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/email_alert/retention_bonus/retention_bonus.json b/erpnext/hr/email_alert/retention_bonus/retention_bonus.json new file mode 100644 index 0000000000..90b8f0d87b --- /dev/null +++ b/erpnext/hr/email_alert/retention_bonus/retention_bonus.json @@ -0,0 +1,26 @@ +{ + "attach_print": 0, + "condition": "doc.docstatus==1", + "creation": "2018-05-15 18:52:36.362838", + "date_changed": "bonus_payment_date", + "days_in_advance": 14, + "docstatus": 0, + "doctype": "Email Alert", + "document_type": "Retention Bonus", + "enabled": 1, + "event": "Days Before", + "idx": 0, + "is_standard": 1, + "message": "

{{ _(\"Hello\") }},

\n\n

{{ _(\"Retention Bonus for\") }} {{ doc.employee_name }} {{ _(\"due on\") }} {{ doc.bonus_payment_date }}

", + "modified": "2018-05-15 19:00:24.294418", + "modified_by": "ranjith@earthianslive.com", + "module": "HR", + "name": "Retention Bonus", + "owner": "ranjith@earthianslive.com", + "recipients": [ + { + "email_by_role": "HR Manager" + } + ], + "subject": "Retention Bonus alert for {{ doc.employee }}" +} \ No newline at end of file diff --git a/erpnext/hr/email_alert/retention_bonus/retention_bonus.md b/erpnext/hr/email_alert/retention_bonus/retention_bonus.md new file mode 100644 index 0000000000..8f48193994 --- /dev/null +++ b/erpnext/hr/email_alert/retention_bonus/retention_bonus.md @@ -0,0 +1,3 @@ +

{{ _("Hello") }},

+ +

{{ _("Retention Bonus for") }} {{ doc.employee_name }} {{ _("due on") }} {{ doc.bonus_payment_date }}

\ No newline at end of file diff --git a/erpnext/hr/email_alert/retention_bonus/retention_bonus.py b/erpnext/hr/email_alert/retention_bonus/retention_bonus.py new file mode 100644 index 0000000000..2334f8b26d --- /dev/null +++ b/erpnext/hr/email_alert/retention_bonus/retention_bonus.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +import frappe + +def get_context(context): + # do your magic here + pass From 819c3b1bf698827898d32262dc71eb6ef5a6097f Mon Sep 17 00:00:00 2001 From: Ranjith Date: Tue, 15 May 2018 19:17:31 +0530 Subject: [PATCH 3/3] Retention Bonus - menu, validate --- erpnext/config/hr.py | 4 ++++ .../hr/doctype/retention_bonus/retention_bonus.js | 9 +++++++++ .../hr/doctype/retention_bonus/retention_bonus.py | 12 +++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index c2ccbd3905..ef28ee8ff0 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -106,6 +106,10 @@ def get_data(): "type": "doctype", "name": "Employee Incentive", }, + { + "type": "doctype", + "name": "Retention Bonus", + }, ] }, { diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.js b/erpnext/hr/doctype/retention_bonus/retention_bonus.js index b481af0b6e..58f6b53604 100644 --- a/erpnext/hr/doctype/retention_bonus/retention_bonus.js +++ b/erpnext/hr/doctype/retention_bonus/retention_bonus.js @@ -2,6 +2,15 @@ // For license information, please see license.txt frappe.ui.form.on('Retention Bonus', { + setup: function(frm) { + frm.set_query("employee", function() { + return { + filters: { + "status": "Active" + } + }; + }); + }, refresh: function(frm) { } diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.py b/erpnext/hr/doctype/retention_bonus/retention_bonus.py index 361c9bdb0a..20d4c13f19 100644 --- a/erpnext/hr/doctype/retention_bonus/retention_bonus.py +++ b/erpnext/hr/doctype/retention_bonus/retention_bonus.py @@ -5,10 +5,12 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document +from frappe import _ +from frappe.utils import getdate class RetentionBonus(Document): - def on_submit(self): - pass - - def on_cancel(self): - pass + def validate(self): + if frappe.get_value("Employee", self.employee, "status") == "Left": + frappe.throw(_("Cannot create Retention Bonus for left Employees")) + if getdate(self.bonus_payment_date) < getdate(): + frappe.throw(_("Bonus Payment Date cannot be a past date"))