diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.js b/erpnext/hr/doctype/payroll_entry/payroll_entry.js index 5de8228934..cc10d7081d 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.js +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.js @@ -1,6 +1,8 @@ // Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt +var in_progress = false; + frappe.ui.form.on('Payroll Entry', { onload: function (frm) { frm.doc.posting_date = frappe.datetime.nowdate(); @@ -35,23 +37,23 @@ frappe.ui.form.on('Payroll Entry', { "is_group": 0, "company": frm.doc.company } - } + }; }), - frm.set_query("cost_center", function () { - return { - filters: { - "is_group": 0, - company: frm.doc.company - } + frm.set_query("cost_center", function () { + return { + filters: { + "is_group": 0, + company: frm.doc.company } - }), - frm.set_query("project", function () { - return { - filters: { - company: frm.doc.company - } + }; + }), + frm.set_query("project", function () { + return { + filters: { + company: frm.doc.company } - }) + }; + }); }, payroll_frequency: function (frm) { @@ -63,7 +65,7 @@ frappe.ui.form.on('Payroll Entry', { frm.trigger("set_end_date"); }else{ // reset flag - in_progress = false + in_progress = false; } }, @@ -71,7 +73,6 @@ frappe.ui.form.on('Payroll Entry', { frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet); }, - set_start_end_dates: function (frm) { if (!frm.doc.salary_slip_based_on_timesheet) { frappe.call({ @@ -87,7 +88,7 @@ frappe.ui.form.on('Payroll Entry', { frm.set_value('end_date', r.message.end_date); } } - }) + }); } }, @@ -109,19 +110,19 @@ frappe.ui.form.on('Payroll Entry', { // Create salary slips -cur_frm.cscript.custom_before_submit = function (doc, cdt, cdn) { +cur_frm.cscript.custom_before_submit = function (doc) { return $c('runserverobj', { 'method': 'create_salary_slips', 'docs': doc }); -} +}; // Submit salary slips -submit_salary_slip = function (frm, cdt, cdn) { - doc = frm.doc; +let submit_salary_slip = function (frm) { + var doc = frm.doc; return $c('runserverobj', { 'method': 'submit_salary_slips', 'docs': doc }); } -make_bank_entry = function (frm, cdt, cdn) { - doc = frm.doc; +let make_bank_entry = function (frm) { + var doc = frm.doc; if (doc.company && doc.start_date && doc.end_date) { return frappe.call({ doc: cur_frm.doc, diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.py b/erpnext/hr/doctype/payroll_entry/payroll_entry.py index ef9e4ae6d6..a77df95180 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.py +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.py @@ -112,8 +112,9 @@ class PayrollEntry(Document): return self.create_log(ss_list) def create_log(self, ss_list): - if not ss_list or len(ss_list) < 1: + if not ss_list or len(ss_list) < 1: frappe.throw(_("No employee for the above selected criteria OR salary slip already created")) + return def get_sal_slip_list(self, ss_status, as_dict=False): """ @@ -147,7 +148,7 @@ class PayrollEntry(Document): ss_dict["Total Pay"] = fmt_money(ss_obj.net_pay, currency = frappe.defaults.get_global_default("currency")) ss_dict["Salary Slip"] = self.format_as_links(ss_obj.name)[0] - + if ss_obj.net_pay<0: not_submitted_ss.append(ss_dict) else: @@ -173,7 +174,7 @@ class PayrollEntry(Document): Possible reasons:
\ 1. Net pay is less than 0.
\ 2. Company Email Address specified in employee master is not valid.
") - + return def format_as_links(self, salary_slip): return ['{0}'.format(salary_slip)] @@ -188,9 +189,9 @@ class PayrollEntry(Document): where t1.docstatus = 1 and start_date >= %s and end_date <= %s %s """ % ('%s', '%s', cond), (self.start_date, self.end_date), as_dict=True) return totals[0] - + def get_loan_accounts(self): - loan_accounts = frappe.get_all("Employee Loan", fields=["employee_loan_account", "interest_income_account"], + loan_accounts = frappe.get_all("Employee Loan", fields=["employee_loan_account", "interest_income_account"], filters = {"company": self.company, "docstatus":1}) if loan_accounts: return loan_accounts[0] @@ -237,7 +238,7 @@ class PayrollEntry(Document): frappe.throw(_("Please set Default Payroll Payable Account in Company {0}") .format(self.company)) - return payroll_payable_account + return payroll_payable_account def make_accural_jv_entry(self): self.check_permission('write') @@ -353,7 +354,7 @@ class PayrollEntry(Document): frappe.db.set_value("Salary Slip", ss_obj.name, "journal_entry", jv_name) def set_start_end_dates(self): - self.update(get_start_end_dates(self.payroll_frequency, + self.update(get_start_end_dates(self.payroll_frequency, self.start_date or self.posting_date, self.company)) @frappe.whitelist() @@ -414,9 +415,7 @@ def get_end_date(start_date, frequency): def get_month_details(year, month): ysd = frappe.db.get_value("Fiscal Year", year, "year_start_date") if ysd: - from dateutil.relativedelta import relativedelta import calendar, datetime - frappe.msgprint diff_mnt = cint(month)-cint(ysd.month) if diff_mnt<0: diff_mnt = 12-int(ysd.month)+cint(month) diff --git a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.js b/erpnext/hr/doctype/payroll_entry/test_payroll_entry.js index f1b82e0cc3..69599bdaf4 100644 --- a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.js +++ b/erpnext/hr/doctype/payroll_entry/test_payroll_entry.js @@ -1,38 +1,38 @@ -QUnit.module('HR') +QUnit.module('HR'); QUnit.test("test: Payroll Entry", function (assert) { assert.expect(5); let done = assert.async(); frappe.run_serially([ - () => { + () => { return frappe.tests.make('Payroll Entry', [ {company: 'For Testing'}, {posting_date: frappe.datetime.add_days(frappe.datetime.nowdate(), 0)}, {payroll_frequency: 'Monthly'}, - // {start_date: }, {cost_center: 'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} ]); }, + () => frappe.timeout(1), + () => { + assert.equal(cur_frm.doc.company, 'For Testing'); + assert.equal(cur_frm.doc.posting_date, frappe.datetime.add_days(frappe.datetime.nowdate(), 0)); + assert.equal(cur_frm.doc.cost_center, 'Main - FT'); + }, + () => frappe.click_button('Submit'), () => frappe.timeout(1), () => frappe.click_button('Yes'), () => frappe.timeout(2), - () => { - assert.equal(cur_frm.doc.company, 'For Testing'); - assert.equal(cur_frm.doc.posting_date, frappe.datetime.add_days(frappe.datetime.nowdate(), 0)); - assert.equal(cur_frm.doc.cost_center, 'Main - FT'); - }, - () => frappe.click_button('View Salary Slip'), () => frappe.timeout(2), () => assert.equal(cur_list.data[0].docstatus, 0), - () => frappe.set_route('Form', 'Payroll Entry', 'Payroll 0041'), + () => frappe.set_route('Form', 'Payroll Entry', 'Payroll 0001'), () => frappe.click_button('Submit Salary Slip'), - () => frappe.timeout(2), + () => frappe.timeout(3), () => frappe.click_button('Close'), () => frappe.timeout(1), @@ -40,7 +40,7 @@ QUnit.test("test: Payroll Entry", function (assert) { () => frappe.click_button('View Salary Slip'), () => frappe.timeout(2), () => { - assert.ok(cur_list.data[0].docstatus == 1, "Salary slip submitted"); + assert.ok(cur_list.data[0].docstatus == 1, "Salary slip submitted"); }, () => done() diff --git a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py b/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py index 47aba56a5c..163a809947 100644 --- a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py +++ b/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py @@ -3,7 +3,6 @@ # See license.txt from __future__ import unicode_literals -import frappe import unittest class TestPayrollEntry(unittest.TestCase): diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index edf1d78ffb..a5dcbcb5cc 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -78,6 +78,7 @@ erpnext/hr/doctype/training_feedback/test_training_feedback.js erpnext/hr/doctype/loan_type/test_loan_type.js erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js erpnext/hr/doctype/employee_loan/test_employee_loan.js +erpnext/hr/doctype/payroll_entry/test_payroll_entry.js erpnext/buying/doctype/supplier/test_supplier.js erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js