feat: validated employees whose salary has been already precessed

This commit is contained in:
Anurag Mishra
2020-12-23 17:22:51 +05:30
parent d556847fca
commit 527a156512
2 changed files with 97 additions and 32 deletions

View File

@@ -10,6 +10,11 @@ frappe.ui.form.on('Payroll Entry', {
} }
frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet); frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet);
frm.events.department_filters(frm);
frm.events.payroll_payable_account_filters(frm);
},
department_filters: function (frm) {
frm.set_query("department", function () { frm.set_query("department", function () {
return { return {
"filters": { "filters": {
@@ -17,7 +22,9 @@ frappe.ui.form.on('Payroll Entry', {
} }
}; };
}); });
},
payroll_payable_account_filters: function (frm) {
frm.set_query("payroll_payable_account", function () { frm.set_query("payroll_payable_account", function () {
return { return {
filters: { filters: {
@@ -141,8 +148,37 @@ frappe.ui.form.on('Payroll Entry', {
}, },
payroll_frequency: function (frm) { payroll_frequency: function (frm) {
frm.trigger("set_start_end_dates"); frm.trigger("set_start_end_dates").then( ()=> {
frm.events.clear_employee_table(frm); frm.events.clear_employee_table(frm);
frm.events.get_employee_with_salary_slip_and_set_query(frm);
});
},
employee_filters: function (frm, emp_list) {
frm.set_query('employee', 'employees', () => {
return {
filters: {
name: ["not in", emp_list]
}
};
});
},
get_employee_with_salary_slip_and_set_query: function (frm) {
frappe.db.get_list('Salary Slip', {
filters: {
start_date: frm.doc.start_date,
end_date: frm.doc.end_date,
docstatus: 1,
},
fields: ['employee']
}).then((emp) => {
var emp_list = [];
emp.forEach((employee_data) => {
emp_list.push(Object.values(employee_data)[0]);
});
frm.events.employee_filters(frm, emp_list);
});
}, },
company: function (frm) { company: function (frm) {
@@ -167,8 +203,8 @@ frappe.ui.form.on('Payroll Entry', {
callback: function (r) { callback: function (r) {
frm.set_value("exchange_rate", flt(r.message)); frm.set_value("exchange_rate", flt(r.message));
frm.set_df_property('exchange_rate', 'hidden', 0); frm.set_df_property('exchange_rate', 'hidden', 0);
frm.set_df_property("exchange_rate", "description", "1 " + frm.doc.currency frm.set_df_property("exchange_rate", "description", "1 " + frm.doc.currency +
+ " = [?] " + company_currency); " = [?] " + company_currency);
} }
}); });
} else { } else {
@@ -299,7 +335,9 @@ let make_bank_entry = function (frm) {
method: "make_payment_entry", method: "make_payment_entry",
callback: function () { callback: function () {
frappe.set_route( frappe.set_route(
'List', 'Journal Entry', {"Journal Entry Account.reference_name": frm.doc.name} 'List', 'Journal Entry', {
"Journal Entry Account.reference_name": frm.doc.name
}
); );
}, },
freeze: true, freeze: true,
@@ -311,7 +349,6 @@ let make_bank_entry = function (frm) {
} }
}; };
let render_employee_attendance = function (frm, data) { let render_employee_attendance = function (frm, data) {
frm.fields_dict.attendance_detail_html.html( frm.fields_dict.attendance_detail_html.html(
frappe.render_template('employees_to_mark_attendance', { frappe.render_template('employees_to_mark_attendance', {
@@ -319,3 +356,12 @@ let render_employee_attendance = function(frm, data) {
}) })
); );
}; };
frappe.ui.form.on('Payroll Employee Detail', {
employee: function(frm) {
frm.events.clear_employee_table(frm);
if (!frm.doc.payroll_frequency) {
frappe.throw(__("Please set a Payroll Frequency"));
}
}
});

View File

@@ -6,7 +6,7 @@ from __future__ import unicode_literals
import frappe, erpnext import frappe, erpnext
from frappe.model.document import Document from frappe.model.document import Document
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from frappe.utils import cint, flt, nowdate, add_days, getdate, fmt_money, add_to_date, DATE_FORMAT, date_diff from frappe.utils import cint, flt, add_days, getdate, add_to_date, DATE_FORMAT, date_diff, comma_and
from frappe import _ from frappe import _
from erpnext.accounts.utils import get_fiscal_year from erpnext.accounts.utils import get_fiscal_year
from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
@@ -25,10 +25,20 @@ class PayrollEntry(Document):
self.create_salary_slips() self.create_salary_slips()
def before_submit(self): def before_submit(self):
self.validate_employee_details()
if self.validate_attendance: if self.validate_attendance:
if self.validate_employee_attendance(): if self.validate_employee_attendance():
frappe.throw(_("Cannot Submit, Employees left to mark attendance")) frappe.throw(_("Cannot Submit, Employees left to mark attendance"))
def validate_employee_details(self):
emp_with_sal_slip = []
for employee_details in self.employees:
if frappe.db.exists("Salary Slip", {"employee": employee_details.employee, "start_date": self.start_date, "end_date": self.end_date, "docstatus": 1}):
emp_with_sal_slip.append(employee_details.employee)
if len(emp_with_sal_slip):
frappe.throw(_("Salary Slip already exists for {0} ").format(comma_and(emp_with_sal_slip)))
def on_cancel(self): def on_cancel(self):
frappe.delete_doc("Salary Slip", frappe.db.sql_list("""select name from `tabSalary Slip` frappe.delete_doc("Salary Slip", frappe.db.sql_list("""select name from `tabSalary Slip`
where payroll_entry=%s """, (self.name))) where payroll_entry=%s """, (self.name)))
@@ -71,6 +81,15 @@ class PayrollEntry(Document):
and t2.docstatus = 1 and t2.docstatus = 1
%s order by t2.from_date desc %s order by t2.from_date desc
""" % cond, {"sal_struct": tuple(sal_struct), "from_date": self.end_date, "payroll_payable_account": self.payroll_payable_account}, as_dict=True) """ % cond, {"sal_struct": tuple(sal_struct), "from_date": self.end_date, "payroll_payable_account": self.payroll_payable_account}, as_dict=True)
emp_list = self.remove_payrolled_employees(emp_list)
return emp_list
def remove_payrolled_employees(self, emp_list):
for employee_details in emp_list:
if frappe.db.exists("Salary Slip", {"employee": employee_details.employee, "start_date": self.start_date, "end_date": self.end_date, "docstatus": 1}):
emp_list.remove(employee_details)
return emp_list return emp_list
def fill_employee_details(self): def fill_employee_details(self):