Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Provision to assign multiple payroll cost centers against a single employee #29024

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: linter issues
  • Loading branch information
ruchamahabal committed Dec 28, 2021
commit 8226ea65c81b432dcd71e9eaa872e15c7c729cde
49 changes: 25 additions & 24 deletions erpnext/patches/v14_0/set_payroll_cost_centers.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
import frappe


def execute():
frappe.reload_doc('payroll', 'doctype', 'employee_cost_center')
frappe.reload_doc('payroll', 'doctype', 'salary_structure_assignment')
frappe.reload_doc('payroll', 'doctype', 'employee_cost_center')
frappe.reload_doc('payroll', 'doctype', 'salary_structure_assignment')

employees = frappe.get_all("Employee", fields=["department", "payroll_cost_center", "name"])

employees = frappe.get_all("Employee", fields=["department", "payroll_cost_center", "name"])
employee_cost_center = {}
for d in employees:
cost_center = d.payroll_cost_center
if not cost_center and d.department:
cost_center = frappe.get_cached_value("Department", d.department, "payroll_cost_center")

employee_cost_center = {}
for d in employees:
cost_center = d.payroll_cost_center
if not cost_center and d.department:
cost_center = frappe.get_cached_value("Department", d.department, "payroll_cost_center")
if cost_center:
employee_cost_center.setdefault(d.name, cost_center)

if cost_center:
employee_cost_center.setdefault(d.name, cost_center)

salary_structure_assignments = frappe.get_all("Salary Structure Assignment",
filters = {"docstatus": ["!=", 2]},
fields=["name", "employee"])
salary_structure_assignments = frappe.get_all("Salary Structure Assignment",
filters = {"docstatus": ["!=", 2]},
fields=["name", "employee"])

for d in salary_structure_assignments:
cost_center = employee_cost_center.get(d.employee)
if cost_center:
assignment = frappe.get_doc("Salary Structure Assignment", d.name)
if not assignment.get("payroll_cost_centers"):
assignment.append("payroll_cost_centers", {
"cost_center": cost_center,
"percentage": 100
})
assignment.save()
for d in salary_structure_assignments:
cost_center = employee_cost_center.get(d.employee)
if cost_center:
assignment = frappe.get_doc("Salary Structure Assignment", d.name)
if not assignment.get("payroll_cost_centers"):
assignment.append("payroll_cost_centers", {
"cost_center": cost_center,
"percentage": 100
})
assignment.save()
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
# import frappe
from frappe.model.document import Document


class EmployeeCostCenter(Document):
pass
4 changes: 2 additions & 2 deletions erpnext/payroll/doctype/payroll_entry/payroll_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ def get_payroll_cost_centers_for_employee(self, employee, salary_structure):
if not self.employee_cost_centers.get(employee):
ss_assignment_name = frappe.db.get_value("Salary Structure Assignment",
{"employee": employee, "salary_structure": salary_structure, "docstatus": 1}, 'name')

if ss_assignment_name:
cost_centers = dict(frappe.get_all("Employee Cost Center", {"parent": ss_assignment_name},
["cost_center", "percentage"], as_list=1))
Expand All @@ -244,7 +244,7 @@ def get_payroll_cost_centers_for_employee(self, employee, salary_structure):
default_cost_center = frappe.get_cached_value("Department", department, "payroll_cost_center")
if not default_cost_center:
default_cost_center = self.cost_center

cost_centers = {
default_cost_center: 100
}
Expand Down
4 changes: 2 additions & 2 deletions erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,14 @@ def test_payroll_entry_with_employee_cost_center(self): # pylint: disable=no-sel
frappe.db.set_value("Company", "_Test Company", "default_payroll_payable_account",
"_Test Payroll Payable - _TC")
currency=frappe.db.get_value("Company", "_Test Company", "default_currency")

make_salary_structure("_Test Salary Structure 1", "Monthly", employee1, company="_Test Company", currency=currency, test_tax=False)
ss = make_salary_structure("_Test Salary Structure 2", "Monthly", employee2, company="_Test Company", currency=currency, test_tax=False)

# update cost centers in salary structure assignment for employee2
ssa = frappe.db.get_value("Salary Structure Assignment",
{"employee": employee2, "salary_structure": ss.name, "docstatus": 1}, 'name')

ssa_doc = frappe.get_doc("Salary Structure Assignment", ssa)
ssa_doc.payroll_cost_centers = []
ssa_doc.append("payroll_cost_centers", {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.utils import getdate, flt
from frappe.utils import flt, getdate


class DuplicateAssignment(frappe.ValidationError): pass
Expand Down Expand Up @@ -54,7 +54,7 @@ def set_payroll_payable_account(self):
"account_name": _("Payroll Payable"), "company": self.company, "account_currency": frappe.db.get_value(
"Company", self.company, "default_currency"), "is_group": 0})
self.payroll_payable_account = payroll_payable_account

@frappe.whitelist()
def set_payroll_cost_centers(self):
self.payroll_cost_centers = []
Expand All @@ -69,16 +69,15 @@ def get_payroll_cost_center(self):
payroll_cost_center = frappe.db.get_value("Employee", self.employee, "payroll_cost_center")
if not payroll_cost_center and self.department:
payroll_cost_center = frappe.db.get_value("Department", self.department, "payroll_cost_center")

return payroll_cost_center

def validate_cost_center_distribution(self):
if self.get("payroll_cost_centers"):
total_percentage = sum([flt(d.percentage) for d in self.get("payroll_cost_centers", [])])
if total_percentage != 100:
frappe.throw(_("Total percentage against cost centers should be 100"))




def get_assigned_salary_structure(employee, on_date):
if not employee or not on_date:
Expand All @@ -93,6 +92,7 @@ def get_assigned_salary_structure(employee, on_date):
})
return salary_structure[0][0] if salary_structure else None


@frappe.whitelist()
def get_employee_currency(employee):
employee_currency = frappe.db.get_value('Salary Structure Assignment', {'employee': employee}, 'currency')
Expand Down