Merge branch 'develop' into refactor-addiional-salary
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.js b/erpnext/hr/doctype/additional_salary/additional_salary.js
index 18f6b8b..fb42b6f 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.js
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.js
@@ -13,5 +13,5 @@
}
};
});
- }
+ },
});
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.json b/erpnext/hr/doctype/additional_salary/additional_salary.json
index 7d69f7e..bf9d819 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.json
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.json
@@ -13,10 +13,14 @@
"salary_component",
"overwrite_salary_structure_amount",
"deduct_full_tax_on_selected_payroll_date",
+ "ref_doctype",
+ "ref_docname",
"column_break_5",
"company",
+ "is_recurring",
+ "from_date",
+ "to_date",
"payroll_date",
- "salary_slip",
"type",
"department",
"amount",
@@ -74,12 +78,13 @@
"fieldtype": "Column Break"
},
{
+ "depends_on": "eval:(doc.is_recurring==0)",
"description": "Date on which this component is applied",
"fieldname": "payroll_date",
"fieldtype": "Date",
"in_list_view": 1,
"label": "Payroll Date",
- "reqd": 1,
+ "mandatory_depends_on": "eval:(doc.is_recurring==0)",
"search_index": 1
},
{
@@ -106,13 +111,6 @@
"reqd": 1
},
{
- "fieldname": "salary_slip",
- "fieldtype": "Link",
- "label": "Salary Slip",
- "options": "Salary Slip",
- "read_only": 1
- },
- {
"fetch_from": "salary_component.type",
"fieldname": "type",
"fieldtype": "Data",
@@ -127,11 +125,45 @@
"options": "Additional Salary",
"print_hide": 1,
"read_only": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "is_recurring",
+ "fieldtype": "Check",
+ "label": "Is Recurring"
+ },
+ {
+ "depends_on": "eval:(doc.is_recurring==1)",
+ "fieldname": "from_date",
+ "fieldtype": "Date",
+ "label": "From Date",
+ "mandatory_depends_on": "eval:(doc.is_recurring==1)"
+ },
+ {
+ "depends_on": "eval:(doc.is_recurring==1)",
+ "fieldname": "to_date",
+ "fieldtype": "Date",
+ "label": "To Date",
+ "mandatory_depends_on": "eval:(doc.is_recurring==1)"
+ },
+ {
+ "fieldname": "ref_doctype",
+ "fieldtype": "Link",
+ "label": "Reference Document Type",
+ "options": "DocType",
+ "read_only": 1
+ },
+ {
+ "fieldname": "ref_docname",
+ "fieldtype": "Dynamic Link",
+ "label": "Reference Document",
+ "options": "ref_doctype",
+ "read_only": 1
}
],
"is_submittable": 1,
"links": [],
- "modified": "2019-12-12 19:07:23.635901",
+ "modified": "2020-03-02 18:06:29.170878",
"modified_by": "Administrator",
"module": "HR",
"name": "Additional Salary",
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.py b/erpnext/hr/doctype/additional_salary/additional_salary.py
index bc7dcee..4076ffe 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.py
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.py
@@ -9,6 +9,13 @@
from frappe.utils import getdate, date_diff
class AdditionalSalary(Document):
+
+ def on_submit(self):
+ if self.ref_doctype == "Employee Advance" and self.ref_docname:
+ emp_adv = frappe.get_doc(self.ref_doctype, self.ref_docname)
+ emp_adv.return_amount = self.amount
+ emp_adv.save()
+
def before_insert(self):
if frappe.db.exists("Additional Salary", {"employee": self.employee, "salary_component": self.salary_component,
"amount": self.amount, "payroll_date": self.payroll_date, "company": self.company, "docstatus": 1}):
@@ -21,10 +28,19 @@
frappe.throw(_("Amount should not be less than zero."))
def validate_dates(self):
- date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee,
+ date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee,
["date_of_joining", "relieving_date"])
- if date_of_joining and getdate(self.payroll_date) < getdate(date_of_joining):
- frappe.throw(_("Payroll date can not be less than employee's joining date"))
+
+ if getdate(self.from_date) > getdate(self.to_date):
+ frappe.throw(_("From Date can not be greater than To Date."))
+
+ if date_of_joining:
+ if getdate(self.payroll_date) < getdate(date_of_joining):
+ frappe.throw(_("Payroll date can not be less than employee's joining date."))
+ elif getdate(self.from_date) < getdate(date_of_joining):
+ frappe.throw(_("From date can not be less than employee's joining date."))
+ elif getdate(self.to_date) > getdate(relieving_date):
+ frappe.throw(_("To date can not be greater than employee's relieving date."))
def get_amount(self, sal_start_date, sal_end_date):
start_date = getdate(sal_start_date)
@@ -40,15 +56,18 @@
@frappe.whitelist()
def get_additional_salary_component(employee, start_date, end_date, component_type):
- additional_components = frappe.db.sql("""
- select salary_component, sum(amount) as amount, overwrite_salary_structure_amount, deduct_full_tax_on_selected_payroll_date
+ additional_salaries = frappe.db.sql("""
+ select name, salary_component, type, amount, overwrite_salary_structure_amount, deduct_full_tax_on_selected_payroll_date
from `tabAdditional Salary`
where employee=%(employee)s
and docstatus = 1
- and payroll_date between %(from_date)s and %(to_date)s
- and type = %(component_type)s
- group by salary_component, overwrite_salary_structure_amount
- order by salary_component, overwrite_salary_structure_amount
+ and (
+ payroll_date between %(from_date)s and %(to_date)s
+ or
+ from_date <= %(to_date)s and to_date >= %(to_date)s
+ )
+ and type = %(component_type)s
+ order by salary_component, overwrite_salary_structure_amount DESC
""", {
'employee': employee,
'from_date': start_date,
@@ -56,21 +75,38 @@
'component_type': "Earning" if component_type == "earnings" else "Deduction"
}, as_dict=1)
- additional_components_list = []
+ existing_salary_components= []
+ salary_components_details = {}
+ additional_salary_details = []
+
+ overwrites_components = [ele.salary_component for ele in additional_salaries if ele.overwrite_salary_structure_amount == 1]
+
component_fields = ["depends_on_payment_days", "salary_component_abbr", "is_tax_applicable", "variable_based_on_taxable_salary", 'type']
- for d in additional_components:
- struct_row = frappe._dict({'salary_component': d.salary_component})
- component = frappe.get_all("Salary Component", filters={'name': d.salary_component}, fields=component_fields)
- if component:
- struct_row.update(component[0])
+ for d in additional_salaries:
- struct_row['deduct_full_tax_on_selected_payroll_date'] = d.deduct_full_tax_on_selected_payroll_date
- struct_row['is_additional_component'] = 1
+ if d.salary_component not in existing_salary_components:
+ component = frappe.get_all("Salary Component", filters={'name': d.salary_component}, fields=component_fields)
+ struct_row = frappe._dict({'salary_component': d.salary_component})
+ if component:
+ struct_row.update(component[0])
- additional_components_list.append(frappe._dict({
- 'amount': d.amount,
- 'type': component[0].type,
- 'struct_row': struct_row,
- 'overwrite': d.overwrite_salary_structure_amount,
- }))
- return additional_components_list
\ No newline at end of file
+ struct_row['deduct_full_tax_on_selected_payroll_date'] = d.deduct_full_tax_on_selected_payroll_date
+ struct_row['is_additional_component'] = 1
+
+ salary_components_details[d.salary_component] = struct_row
+
+
+ if overwrites_components.count(d.salary_component) > 1:
+ frappe.throw(_("Multiple Additional Salaries with overwrite property exist for Salary Component: {0} between {1} and {2}.".format(d.salary_component, start_date, end_date)), title=_("Error"))
+ else:
+ additional_salary_details.append({
+ 'name': d.name,
+ 'component': d.salary_component,
+ 'amount': d.amount,
+ 'type': d.type,
+ 'overwrite': d.overwrite_salary_structure_amount,
+ })
+
+ existing_salary_components.append(d.salary_component)
+
+ return salary_components_details, additional_salary_details
\ No newline at end of file
diff --git a/erpnext/hr/doctype/additional_salary/test_additional_salary.py b/erpnext/hr/doctype/additional_salary/test_additional_salary.py
index 949ba20..ebe6b20 100644
--- a/erpnext/hr/doctype/additional_salary/test_additional_salary.py
+++ b/erpnext/hr/doctype/additional_salary/test_additional_salary.py
@@ -3,6 +3,45 @@
# See license.txt
from __future__ import unicode_literals
import unittest
+import frappe, erpnext
+from frappe.utils import nowdate, add_days
+from erpnext.hr.doctype.employee.test_employee import make_employee
+from erpnext.hr.doctype.salary_component.test_salary_component import create_salary_component
+from erpnext.hr.doctype.salary_slip.test_salary_slip import make_employee_salary_slip
+
class TestAdditionalSalary(unittest.TestCase):
- pass
+
+ def setUp(self):
+ from erpnext.hr.doctype.salary_slip.test_salary_slip import TestSalarySlip
+ TestSalarySlip().setUp()
+
+ def test_recurring_additional_salary(self):
+ emp_id = make_employee("test_additional@salary.com")
+ frappe.db.set_value("Employee", emp_id, "relieving_date", add_days(nowdate(), 1800))
+ add_sal = get_additional_salary(emp_id)
+
+ ss = make_employee_salary_slip("test_additional@salary.com", "Monthly")
+ for earning in ss.earnings:
+ if earning.salary_component == "Recurring Salary Component":
+ amount = earning.amount
+ salary_component = earning.salary_component
+
+ self.assertEqual(amount, add_sal.amount)
+ self.assertEqual(salary_component, add_sal.salary_component)
+
+
+
+def get_additional_salary(emp_id):
+ create_salary_component("Recurring Salary Component")
+ add_sal = frappe.new_doc("Additional Salary")
+ add_sal.employee = emp_id
+ add_sal.salary_component = "Recurring Salary Component"
+ add_sal.is_recurring = 1
+ add_sal.from_date = add_days(nowdate(), -50)
+ add_sal.to_date = add_days(nowdate(), 180)
+ add_sal.amount = 5000
+ add_sal.save()
+ add_sal.submit()
+
+ return add_sal
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.js b/erpnext/hr/doctype/employee_advance/employee_advance.js
index 3896603..38561d4 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance.js
+++ b/erpnext/hr/doctype/employee_advance/employee_advance.js
@@ -23,6 +23,14 @@
}
};
});
+
+ frm.set_query('salary_component', function(doc) {
+ return {
+ filters: {
+ "type": "Deduction"
+ }
+ };
+ });
},
refresh: function(frm) {
@@ -47,19 +55,38 @@
}
if (frm.doc.docstatus === 1
- && (flt(frm.doc.claimed_amount) + flt(frm.doc.return_amount) < flt(frm.doc.paid_amount))
- && frappe.model.can_create("Journal Entry")) {
+ && (flt(frm.doc.claimed_amount) < flt(frm.doc.paid_amount) && flt(frm.doc.paid_amount) != flt(frm.doc.return_amount))) {
- frm.add_custom_button(__("Return"), function() {
- frm.trigger('make_return_entry');
- }, __('Create'));
+ if (frm.doc.repay_unclaimed_amount_from_salary == 0 && frappe.model.can_create("Journal Entry")){
+ frm.add_custom_button(__("Return"), function() {
+ frm.trigger('make_return_entry');
+ }, __('Create'));
+ }else if (frm.doc.repay_unclaimed_amount_from_salary == 1 && frappe.model.can_create("Additional Salary")){
+ frm.add_custom_button(__("Deduction from salary"), function() {
+ frm.events.make_deduction_via_additional_salary(frm)
+ }, __('Create'));
+ }
}
},
+ make_deduction_via_additional_salary: function(frm){
+ frappe.call({
+ method: "erpnext.hr.doctype.employee_advance.employee_advance.create_return_through_additional_salary",
+ args: {
+ doc: frm.doc
+ },
+ callback: function (r){
+ console.log("Helloxs")
+ var doclist = frappe.model.sync(r.message);
+ frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
+ }
+ });
+ },
+
make_payment_entry: function(frm) {
var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry";
if(frm.doc.__onload && frm.doc.__onload.make_payment_via_journal_entry) {
- method = "erpnext.hr.doctype.employee_advance.employee_advance.make_bank_entry"
+ method = "erpnext.hr.doctype.employee_advance.employee_advance.make_bank_entry";
}
return frappe.call({
method: method,
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.json b/erpnext/hr/doctype/employee_advance/employee_advance.json
index d233a2b..8c5ce42 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance.json
+++ b/erpnext/hr/doctype/employee_advance/employee_advance.json
@@ -10,9 +10,10 @@
"naming_series",
"employee",
"employee_name",
+ "department",
"column_break_4",
"posting_date",
- "department",
+ "repay_unclaimed_amount_from_salary",
"section_break_8",
"purpose",
"column_break_11",
@@ -164,16 +165,23 @@
"options": "Mode of Payment"
},
{
+ "allow_on_submit": 1,
"fieldname": "return_amount",
"fieldtype": "Currency",
"label": "Returned Amount",
"options": "Company:company:default_currency",
"read_only": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "repay_unclaimed_amount_from_salary",
+ "fieldtype": "Check",
+ "label": "Repay unclaimed amount from salary"
}
],
"is_submittable": 1,
"links": [],
- "modified": "2019-12-15 19:04:07.044505",
+ "modified": "2020-03-06 15:11:33.747535",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee Advance",
@@ -210,4 +218,4 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.py b/erpnext/hr/doctype/employee_advance/employee_advance.py
index f0663ae..23e4992 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance.py
+++ b/erpnext/hr/doctype/employee_advance/employee_advance.py
@@ -133,8 +133,20 @@
return je.as_dict()
@frappe.whitelist()
-def make_return_entry(employee, company, employee_advance_name,
- return_amount, advance_account, mode_of_payment=None):
+def create_return_through_additional_salary(doc):
+ import json
+ doc = frappe._dict(json.loads(doc))
+ additional_salary = frappe.new_doc('Additional Salary')
+ additional_salary.employee = doc.employee
+ additional_salary.amount = doc.paid_amount - doc.claimed_amount
+ additional_salary.company = doc.company
+ additional_salary.ref_doctype = doc.doctype
+ additional_salary.ref_docname = doc.name
+
+ return additional_salary
+
+@frappe.whitelist()
+def make_return_entry(employee_name, company, employee_advance_name, return_amount, mode_of_payment, advance_account):
return_account = get_default_bank_cash_account(company, account_type='Cash', mode_of_payment = mode_of_payment)
mode_of_payment_type = ''
diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.json b/erpnext/hr/doctype/employee_incentive/employee_incentive.json
index ce8e1ea..e2d8a11 100644
--- a/erpnext/hr/doctype/employee_incentive/employee_incentive.json
+++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.json
@@ -9,10 +9,9 @@
"employee",
"incentive_amount",
"employee_name",
- "additional_salary",
+ "salary_component",
"column_break_5",
"payroll_date",
- "salary_component",
"department",
"amended_from"
],
@@ -66,14 +65,6 @@
"read_only": 1
},
{
- "fieldname": "additional_salary",
- "fieldtype": "Link",
- "label": "Additional Salary",
- "no_copy": 1,
- "options": "Additional Salary",
- "read_only": 1
- },
- {
"fieldname": "salary_component",
"fieldtype": "Link",
"label": "Salary Component",
@@ -83,7 +74,7 @@
],
"is_submittable": 1,
"links": [],
- "modified": "2019-12-12 13:24:44.761540",
+ "modified": "2020-03-05 18:59:40.526014",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee Incentive",
diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.py b/erpnext/hr/doctype/employee_incentive/employee_incentive.py
index 2e138f8..44763fc 100644
--- a/erpnext/hr/doctype/employee_incentive/employee_incentive.py
+++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.py
@@ -9,37 +9,13 @@
class EmployeeIncentive(Document):
def on_submit(self):
company = frappe.db.get_value('Employee', self.employee, 'company')
- additional_salary = frappe.db.exists('Additional Salary', {
- 'employee': self.employee,
- 'salary_component': self.salary_component,
- 'payroll_date': self.payroll_date,
- 'company': company,
- 'docstatus': 1
- })
- if not additional_salary:
- additional_salary = frappe.new_doc('Additional Salary')
- additional_salary.employee = self.employee
- additional_salary.salary_component = self.salary_component
- additional_salary.amount = self.incentive_amount
- additional_salary.payroll_date = self.payroll_date
- additional_salary.company = company
- additional_salary.submit()
- self.db_set('additional_salary', additional_salary.name)
-
- else:
- incentive_added = frappe.db.get_value('Additional Salary', additional_salary, 'amount') + self.incentive_amount
- frappe.db.set_value('Additional Salary', additional_salary, 'amount', incentive_added)
- self.db_set('additional_salary', additional_salary)
-
- def on_cancel(self):
- if self.additional_salary:
- incentive_removed = frappe.db.get_value('Additional Salary', self.additional_salary, 'amount') - self.incentive_amount
- if incentive_removed == 0:
- frappe.get_doc('Additional Salary', self.additional_salary).cancel()
- else:
- frappe.db.set_value('Additional Salary', self.additional_salary, 'amount', incentive_removed)
-
- self.db_set('additional_salary', '')
-
-
+ additional_salary = frappe.new_doc('Additional Salary')
+ additional_salary.employee = self.employee
+ additional_salary.salary_component = self.salary_component
+ additional_salary.amount = self.incentive_amount
+ additional_salary.payroll_date = self.payroll_date
+ additional_salary.company = company
+ additional_salary.ref_doctype = self.doctype
+ additional_salary.ref_docname = self.name
+ additional_salary.submit()
diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.py b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
index 7d6fd42..50a08b1 100644
--- a/erpnext/hr/doctype/leave_encashment/leave_encashment.py
+++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
@@ -30,13 +30,16 @@
additional_salary = frappe.new_doc("Additional Salary")
additional_salary.company = frappe.get_value("Employee", self.employee, "company")
additional_salary.employee = self.employee
- additional_salary.salary_component = frappe.get_value("Leave Type", self.leave_type, "earning_component")
+ earning_component = frappe.get_value("Leave Type", self.leave_type, "earning_component")
+ if not earning_component:
+ frappe.throw(_("Please set Earning Component for Leave type: {0}.".format(self.leave_type)))
+ additional_salary.salary_component = earning_component
additional_salary.payroll_date = self.encashment_date
additional_salary.amount = self.encashment_amount
+ additional_salary.ref_doctype = self.doctype
+ additional_salary.ref_docname = self.name
additional_salary.submit()
- self.db_set("additional_salary", additional_salary.name)
-
# Set encashed leaves in Allocation
frappe.db.set_value("Leave Allocation", self.leave_allocation, "total_leaves_encashed",
frappe.db.get_value('Leave Allocation', self.leave_allocation, 'total_leaves_encashed') + self.encashable_days)
@@ -118,4 +121,4 @@
leave_type=allocation.leave_type,
encashment_date=allocation.to_date
))
- leave_encashment.insert(ignore_permissions=True)
+ leave_encashment.insert(ignore_permissions=True)
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_detail/salary_detail.json b/erpnext/hr/doctype/salary_detail/salary_detail.json
index 545f56a..92942d8 100644
--- a/erpnext/hr/doctype/salary_detail/salary_detail.json
+++ b/erpnext/hr/doctype/salary_detail/salary_detail.json
@@ -26,6 +26,7 @@
"tax_on_flexible_benefit",
"tax_on_additional_salary",
"section_break_11",
+ "additional_salary",
"condition_and_formula_help"
],
"fields": [
@@ -193,6 +194,12 @@
"options": "<h3>Condition and Formula Help</h3>\n\n<p>Notes:</p>\n\n<ol>\n<li>Use field <code>base</code> for using base salary of the Employee</li>\n<li>Use Salary Component abbreviations in conditions and formulas. <code>BS = Basic Salary</code></li>\n<li>Use field name for employee details in conditions and formulas. <code>Employment Type = employment_type</code><code>Branch = branch</code></li>\n<li>Use field name from Salary Slip in conditions and formulas. <code>Payment Days = payment_days</code><code>Leave without pay = leave_without_pay</code></li>\n<li>Direct Amount can also be entered based on Condtion. See example 3</li></ol>\n\n<h4>Examples</h4>\n<ol>\n<li>Calculating Basic Salary based on <code>base</code>\n<pre><code>Condition: base < 10000</code></pre>\n<pre><code>Formula: base * .2</code></pre></li>\n<li>Calculating HRA based on Basic Salary<code>BS</code> \n<pre><code>Condition: BS > 2000</code></pre>\n<pre><code>Formula: BS * .1</code></pre></li>\n<li>Calculating TDS based on Employment Type<code>employment_type</code> \n<pre><code>Condition: employment_type==\"Intern\"</code></pre>\n<pre><code>Amount: 1000</code></pre></li>\n</ol>"
},
{
+ "fieldname": "additional_salary",
+ "fieldtype": "Link",
+ "label": "Additional Salary ",
+ "options": "Additional Salary"
+ },
+ {
"default": "0",
"depends_on": "eval:doc.parentfield=='deductions'",
"fetch_from": "salary_component.exempted_from_income_tax",
@@ -213,4 +220,4 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC"
-}
\ No newline at end of file
+}
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index db93f31..4d5c843 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -66,7 +66,6 @@
else:
self.set_status()
self.update_status(self.name)
- self.update_salary_slip_in_additional_salary()
self.make_loan_repayment_entry()
if (frappe.db.get_single_value("HR Settings", "email_salary_slip_to_employee")) and not frappe.flags.via_payroll_entry:
self.email_salary_slip()
@@ -74,7 +73,6 @@
def on_cancel(self):
self.set_status()
self.update_status()
- self.update_salary_slip_in_additional_salary()
self.cancel_loan_repayment_entry()
def on_trash(self):
@@ -464,14 +462,15 @@
self.update_component_row(frappe._dict(last_benefit.struct_row), amount, "earnings")
def add_additional_salary_components(self, component_type):
- additional_components = get_additional_salary_component(self.employee,
+ salary_components_details, additional_salary_details = get_additional_salary_component(self.employee,
self.start_date, self.end_date, component_type)
- if additional_components:
- for additional_component in additional_components:
- amount = additional_component.amount
- overwrite = additional_component.overwrite
- self.update_component_row(frappe._dict(additional_component.struct_row), amount,
- component_type, overwrite=overwrite)
+ if salary_components_details and additional_salary_details:
+ for additional_salary in additional_salary_details:
+ additional_salary =frappe._dict(additional_salary)
+ amount = additional_salary.amount
+ overwrite = additional_salary.overwrite
+ self.update_component_row(frappe._dict(salary_components_details[additional_salary.component]), amount,
+ component_type, overwrite=overwrite, additional_salary=additional_salary.name)
def add_tax_components(self, payroll_period):
# Calculate variable_based_on_taxable_salary after all components updated in salary slip
@@ -491,13 +490,12 @@
tax_row = self.get_salary_slip_row(d)
self.update_component_row(tax_row, tax_amount, "deductions")
- def update_component_row(self, struct_row, amount, key, overwrite=1):
+ def update_component_row(self, struct_row, amount, key, overwrite=1, additional_salary = ''):
component_row = None
for d in self.get(key):
if d.salary_component == struct_row.salary_component:
component_row = d
-
- if not component_row:
+ if not component_row or (struct_row.get("is_additional_component") and not overwrite):
if amount:
self.append(key, {
'amount': amount,
@@ -505,6 +503,7 @@
'depends_on_payment_days' : struct_row.depends_on_payment_days,
'salary_component' : struct_row.salary_component,
'abbr' : struct_row.abbr,
+ 'additional_salary': additional_salary,
'do_not_include_in_total' : struct_row.do_not_include_in_total,
'is_tax_applicable': struct_row.is_tax_applicable,
'is_flexible_benefit': struct_row.is_flexible_benefit,
@@ -517,6 +516,7 @@
if struct_row.get("is_additional_component"):
if overwrite:
component_row.additional_amount = amount - component_row.get("default_amount", 0)
+ component_row.additional_salary = additional_salary
else:
component_row.additional_amount = amount
@@ -936,14 +936,6 @@
"repay_from_salary": 1,
})
-
- def update_salary_slip_in_additional_salary(self):
- salary_slip = self.name if self.docstatus==1 else None
- frappe.db.sql("""
- update `tabAdditional Salary` set salary_slip=%s
- where employee=%s and payroll_date between %s and %s and docstatus=1
- """, (salary_slip, self.employee, self.start_date, self.end_date))
-
def make_loan_repayment_entry(self):
for loan in self.loans:
repayment_entry = create_repayment_entry(loan.loan, self.employee,