mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-31 18:59:08 +00:00
fix: test cases
This commit is contained in:
@@ -962,7 +962,7 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=
|
|||||||
party_account = set_party_account(dt, dn, doc, party_type)
|
party_account = set_party_account(dt, dn, doc, party_type)
|
||||||
exchange_rate = 1
|
exchange_rate = 1
|
||||||
party_account_currency = set_party_account_currency(dt, party_account, doc)
|
party_account_currency = set_party_account_currency(dt, party_account, doc)
|
||||||
if party_account_currency != doc.currency:
|
if dt != 'Expense Claim' and party_account_currency != doc.currency:
|
||||||
exchange_rate = doc.get('exchange_rate', 1)
|
exchange_rate = doc.get('exchange_rate', 1)
|
||||||
payment_type = set_payment_type(dt, doc)
|
payment_type = set_payment_type(dt, doc)
|
||||||
grand_total, outstanding_amount = set_grand_total_and_outstanding_amount(party_amount, dt, party_account_currency, doc, exchange_rate)
|
grand_total, outstanding_amount = set_grand_total_and_outstanding_amount(party_amount, dt, party_account_currency, doc, exchange_rate)
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import g
|
|||||||
class AssetValueAdjustment(Document):
|
class AssetValueAdjustment(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_date()
|
self.validate_date()
|
||||||
self.set_difference_amount()
|
|
||||||
self.set_current_asset_value()
|
self.set_current_asset_value()
|
||||||
|
self.set_difference_amount()
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
self.make_depreciation_entry()
|
self.make_depreciation_entry()
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ def setup_employee():
|
|||||||
salary_component = frappe.get_doc('Salary Component', d.name)
|
salary_component = frappe.get_doc('Salary Component', d.name)
|
||||||
salary_component.append('accounts', dict(
|
salary_component.append('accounts', dict(
|
||||||
company=erpnext.get_default_company(),
|
company=erpnext.get_default_company(),
|
||||||
default_account=frappe.get_value('Account', dict(account_name=('like', 'Salary%')))
|
account=frappe.get_value('Account', dict(account_name=('like', 'Salary%')))
|
||||||
))
|
))
|
||||||
salary_component.save()
|
salary_component.save()
|
||||||
|
|
||||||
|
|||||||
@@ -3,15 +3,17 @@
|
|||||||
# See license.txt
|
# See license.txt
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import frappe
|
import frappe, erpnext
|
||||||
import unittest
|
import unittest
|
||||||
from frappe.utils import nowdate
|
from frappe.utils import nowdate
|
||||||
from erpnext.hr.doctype.employee_advance.employee_advance import make_bank_entry
|
from erpnext.hr.doctype.employee_advance.employee_advance import make_bank_entry
|
||||||
from erpnext.hr.doctype.employee_advance.employee_advance import EmployeeAdvanceOverPayment
|
from erpnext.hr.doctype.employee_advance.employee_advance import EmployeeAdvanceOverPayment
|
||||||
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
|
|
||||||
class TestEmployeeAdvance(unittest.TestCase):
|
class TestEmployeeAdvance(unittest.TestCase):
|
||||||
def test_paid_amount_and_status(self):
|
def test_paid_amount_and_status(self):
|
||||||
advance = make_employee_advance()
|
employee_name = make_employee("_T@employe.advance")
|
||||||
|
advance = make_employee_advance(employee_name)
|
||||||
|
|
||||||
journal_entry = make_payment_entry(advance)
|
journal_entry = make_payment_entry(advance)
|
||||||
journal_entry.submit()
|
journal_entry.submit()
|
||||||
@@ -33,11 +35,13 @@ def make_payment_entry(advance):
|
|||||||
|
|
||||||
return journal_entry
|
return journal_entry
|
||||||
|
|
||||||
def make_employee_advance():
|
def make_employee_advance(employee_name):
|
||||||
doc = frappe.new_doc("Employee Advance")
|
doc = frappe.new_doc("Employee Advance")
|
||||||
doc.employee = "_T-Employee-00001"
|
doc.employee = employee_name
|
||||||
doc.company = "_Test company"
|
doc.company = "_Test company"
|
||||||
doc.purpose = "For site visit"
|
doc.purpose = "For site visit"
|
||||||
|
doc.currency = erpnext.get_company_currency("_Test company")
|
||||||
|
doc.exchange_rate = 1
|
||||||
doc.advance_amount = 1000
|
doc.advance_amount = 1000
|
||||||
doc.posting_date = nowdate()
|
doc.posting_date = nowdate()
|
||||||
doc.advance_account = "_Test Employee Advance - _TC"
|
doc.advance_account = "_Test Employee Advance - _TC"
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ class TestLeaveEncashment(unittest.TestCase):
|
|||||||
employee=self.employee,
|
employee=self.employee,
|
||||||
leave_type="_Test Leave Type Encashment",
|
leave_type="_Test Leave Type Encashment",
|
||||||
leave_period=self.leave_period.name,
|
leave_period=self.leave_period.name,
|
||||||
payroll_date=today()
|
payroll_date=today(),
|
||||||
|
currency="INR"
|
||||||
)).insert()
|
)).insert()
|
||||||
|
|
||||||
self.assertEqual(leave_encashment.leave_balance, 10)
|
self.assertEqual(leave_encashment.leave_balance, 10)
|
||||||
@@ -65,7 +66,8 @@ class TestLeaveEncashment(unittest.TestCase):
|
|||||||
employee=self.employee,
|
employee=self.employee,
|
||||||
leave_type="_Test Leave Type Encashment",
|
leave_type="_Test Leave Type Encashment",
|
||||||
leave_period=self.leave_period.name,
|
leave_period=self.leave_period.name,
|
||||||
payroll_date=today()
|
payroll_date=today(),
|
||||||
|
currency="INR"
|
||||||
)).insert()
|
)).insert()
|
||||||
|
|
||||||
leave_encashment.submit()
|
leave_encashment.submit()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from erpnext.loan_management.doctype.loan_security_unpledge.loan_security_unpled
|
|||||||
from erpnext.loan_management.doctype.loan_application.loan_application import create_pledge
|
from erpnext.loan_management.doctype.loan_application.loan_application import create_pledge
|
||||||
from erpnext.loan_management.doctype.loan_disbursement.loan_disbursement import get_disbursal_amount
|
from erpnext.loan_management.doctype.loan_disbursement.loan_disbursement import get_disbursal_amount
|
||||||
from erpnext.loan_management.doctype.loan_repayment.loan_repayment import calculate_amounts
|
from erpnext.loan_management.doctype.loan_repayment.loan_repayment import calculate_amounts
|
||||||
|
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
|
||||||
|
|
||||||
class TestLoan(unittest.TestCase):
|
class TestLoan(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -44,6 +45,7 @@ class TestLoan(unittest.TestCase):
|
|||||||
create_loan_security_price("Test Security 2", 250, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
|
create_loan_security_price("Test Security 2", 250, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
|
||||||
|
|
||||||
self.applicant1 = make_employee("robert_loan@loan.com")
|
self.applicant1 = make_employee("robert_loan@loan.com")
|
||||||
|
make_salary_structure("Test Salary Structure Loan", "Monthly", employee=self.applicant1, currency='INR')
|
||||||
if not frappe.db.exists("Customer", "_Test Loan Customer"):
|
if not frappe.db.exists("Customer", "_Test Loan Customer"):
|
||||||
frappe.get_doc(get_customer_dict('_Test Loan Customer')).insert(ignore_permissions=True)
|
frappe.get_doc(get_customer_dict('_Test Loan Customer')).insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
import unittest
|
import unittest
|
||||||
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee
|
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee, make_salary_structure
|
||||||
from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan_accounts
|
from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan_accounts
|
||||||
|
|
||||||
class TestLoanApplication(unittest.TestCase):
|
class TestLoanApplication(unittest.TestCase):
|
||||||
@@ -14,6 +14,7 @@ class TestLoanApplication(unittest.TestCase):
|
|||||||
create_loan_type("Home Loan", 500000, 9.2, 0, 1, 0, 'Cash', 'Payment Account - _TC', 'Loan Account - _TC',
|
create_loan_type("Home Loan", 500000, 9.2, 0, 1, 0, 'Cash', 'Payment Account - _TC', 'Loan Account - _TC',
|
||||||
'Interest Income Account - _TC', 'Penalty Income Account - _TC', 'Repay Over Number of Periods', 18)
|
'Interest Income Account - _TC', 'Penalty Income Account - _TC', 'Repay Over Number of Periods', 18)
|
||||||
self.applicant = make_employee("kate_loan@loan.com", "_Test Company")
|
self.applicant = make_employee("kate_loan@loan.com", "_Test Company")
|
||||||
|
make_salary_structure("Test Salary Structure Loan", "Monthly", employee=self.applicant, currency='INR')
|
||||||
self.create_loan_application()
|
self.create_loan_application()
|
||||||
|
|
||||||
def create_loan_application(self):
|
def create_loan_application(self):
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ from frappe.utils import nowdate, add_days
|
|||||||
from erpnext.hr.doctype.employee.test_employee import make_employee
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
from erpnext.payroll.doctype.salary_component.test_salary_component import create_salary_component
|
from erpnext.payroll.doctype.salary_component.test_salary_component import create_salary_component
|
||||||
from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_employee_salary_slip, setup_test
|
from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_employee_salary_slip, setup_test
|
||||||
|
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
|
||||||
|
|
||||||
|
|
||||||
class TestAdditionalSalary(unittest.TestCase):
|
class TestAdditionalSalary(unittest.TestCase):
|
||||||
@@ -16,11 +17,14 @@ class TestAdditionalSalary(unittest.TestCase):
|
|||||||
setup_test()
|
setup_test()
|
||||||
|
|
||||||
def test_recurring_additional_salary(self):
|
def test_recurring_additional_salary(self):
|
||||||
|
amount = 0
|
||||||
|
salary_component = None
|
||||||
emp_id = make_employee("test_additional@salary.com")
|
emp_id = make_employee("test_additional@salary.com")
|
||||||
frappe.db.set_value("Employee", emp_id, "relieving_date", add_days(nowdate(), 1800))
|
frappe.db.set_value("Employee", emp_id, "relieving_date", add_days(nowdate(), 1800))
|
||||||
|
salary_structure = make_salary_structure("Test Salary Structure Additional Salary", "Monthly", employee=emp_id)
|
||||||
add_sal = get_additional_salary(emp_id)
|
add_sal = get_additional_salary(emp_id)
|
||||||
|
|
||||||
ss = make_employee_salary_slip("test_additional@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_additional@salary.com", "Monthly", salary_structure=salary_structure.name)
|
||||||
for earning in ss.earnings:
|
for earning in ss.earnings:
|
||||||
if earning.salary_component == "Recurring Salary Component":
|
if earning.salary_component == "Recurring Salary Component":
|
||||||
amount = earning.amount
|
amount = earning.amount
|
||||||
@@ -40,6 +44,7 @@ def get_additional_salary(emp_id):
|
|||||||
add_sal.from_date = add_days(nowdate(), -50)
|
add_sal.from_date = add_days(nowdate(), -50)
|
||||||
add_sal.to_date = add_days(nowdate(), 180)
|
add_sal.to_date = add_days(nowdate(), 180)
|
||||||
add_sal.amount = 5000
|
add_sal.amount = 5000
|
||||||
|
add_sal.currency = erpnext.get_default_currency()
|
||||||
add_sal.save()
|
add_sal.save()
|
||||||
add_sal.submit()
|
add_sal.submit()
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
|||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
|
"currency": erpnext.get_default_currency(),
|
||||||
"declarations": [
|
"declarations": [
|
||||||
dict(exemption_sub_category = "_Test Sub Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
exemption_category = "_Test Category",
|
exemption_category = "_Test Category",
|
||||||
@@ -39,6 +40,7 @@ class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
|||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
|
"currency": erpnext.get_default_currency(),
|
||||||
"declarations": [
|
"declarations": [
|
||||||
dict(exemption_sub_category = "_Test Sub Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
exemption_category = "_Test Category",
|
exemption_category = "_Test Category",
|
||||||
@@ -54,6 +56,7 @@ class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
|||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
|
"currency": erpnext.get_default_currency(),
|
||||||
"declarations": [
|
"declarations": [
|
||||||
dict(exemption_sub_category = "_Test Sub Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
exemption_category = "_Test Category",
|
exemption_category = "_Test Category",
|
||||||
@@ -70,6 +73,7 @@ class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
|||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
|
"currency": erpnext.get_default_currency(),
|
||||||
"declarations": [
|
"declarations": [
|
||||||
dict(exemption_sub_category = "_Test Sub Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
exemption_category = "_Test Category",
|
exemption_category = "_Test Category",
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ frappe.ui.form.on('Payroll Entry', {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query("default_payroll_payable_account", function() {
|
frm.set_query("payroll_payable_account", function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
"company": frm.doc.company,
|
"company": frm.doc.company,
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"column_break1",
|
"column_break1",
|
||||||
"currency",
|
"currency",
|
||||||
"exchange_rate",
|
"exchange_rate",
|
||||||
"default_payroll_payable_account",
|
"payroll_payable_account",
|
||||||
"section_break_8",
|
"section_break_8",
|
||||||
"branch",
|
"branch",
|
||||||
"department",
|
"department",
|
||||||
@@ -280,7 +280,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "company",
|
"depends_on": "company",
|
||||||
"fieldname": "default_payroll_payable_account",
|
"fieldname": "payroll_payable_account",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Payroll Payable Account",
|
"label": "Payroll Payable Account",
|
||||||
"options": "Account",
|
"options": "Account",
|
||||||
@@ -290,7 +290,7 @@
|
|||||||
"icon": "fa fa-cog",
|
"icon": "fa fa-cog",
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-10-22 01:57:27.226066",
|
"modified": "2020-10-23 13:00:33.753228",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Payroll",
|
"module": "Payroll",
|
||||||
"name": "Payroll Entry",
|
"name": "Payroll Entry",
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class PayrollEntry(Document):
|
|||||||
|
|
||||||
if sal_struct:
|
if sal_struct:
|
||||||
cond += "and t2.salary_structure IN %(sal_struct)s "
|
cond += "and t2.salary_structure IN %(sal_struct)s "
|
||||||
cond += "and t2.default_payroll_payable_account = %(default_payroll_payable_account)s "
|
cond += "and t2.payroll_payable_account = %(payroll_payable_account)s "
|
||||||
cond += "and %(from_date)s >= t2.from_date"
|
cond += "and %(from_date)s >= t2.from_date"
|
||||||
emp_list = frappe.db.sql("""
|
emp_list = frappe.db.sql("""
|
||||||
select
|
select
|
||||||
@@ -70,7 +70,7 @@ class PayrollEntry(Document):
|
|||||||
t1.name = t2.employee
|
t1.name = t2.employee
|
||||||
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, "default_payroll_payable_account": self.default_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)
|
||||||
return emp_list
|
return emp_list
|
||||||
|
|
||||||
def fill_employee_details(self):
|
def fill_employee_details(self):
|
||||||
@@ -163,10 +163,10 @@ class PayrollEntry(Document):
|
|||||||
|
|
||||||
def get_salary_component_account(self, salary_component):
|
def get_salary_component_account(self, salary_component):
|
||||||
account = frappe.db.get_value("Salary Component Account",
|
account = frappe.db.get_value("Salary Component Account",
|
||||||
{"parent": salary_component, "company": self.company}, "default_account")
|
{"parent": salary_component, "company": self.company}, "account")
|
||||||
|
|
||||||
if not account:
|
if not account:
|
||||||
frappe.throw(_("Please set default account in Salary Component {0}")
|
frappe.throw(_("Please set account in Salary Component {0}")
|
||||||
.format(salary_component))
|
.format(salary_component))
|
||||||
|
|
||||||
return account
|
return account
|
||||||
@@ -210,7 +210,7 @@ class PayrollEntry(Document):
|
|||||||
self.check_permission('write')
|
self.check_permission('write')
|
||||||
earnings = self.get_salary_component_total(component_type = "earnings") or {}
|
earnings = self.get_salary_component_total(component_type = "earnings") or {}
|
||||||
deductions = self.get_salary_component_total(component_type = "deductions") or {}
|
deductions = self.get_salary_component_total(component_type = "deductions") or {}
|
||||||
default_payroll_payable_account = self.default_payroll_payable_account
|
payroll_payable_account = self.payroll_payable_account
|
||||||
jv_name = ""
|
jv_name = ""
|
||||||
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
|
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
|
||||||
|
|
||||||
@@ -255,9 +255,9 @@ class PayrollEntry(Document):
|
|||||||
})
|
})
|
||||||
|
|
||||||
# Payable amount
|
# Payable amount
|
||||||
exchange_rate, conversion_rate = self.get_exchange_rate(default_payroll_payable_account, company_currency, currencies)
|
exchange_rate, conversion_rate = self.get_exchange_rate(payroll_payable_account, company_currency, currencies)
|
||||||
accounts.append({
|
accounts.append({
|
||||||
"account": default_payroll_payable_account,
|
"account": payroll_payable_account,
|
||||||
"credit_in_account_currency": flt((payable_amount * conversion_rate), precision),
|
"credit_in_account_currency": flt((payable_amount * conversion_rate), precision),
|
||||||
"exchange_rate": flt(exchange_rate),
|
"exchange_rate": flt(exchange_rate),
|
||||||
"party_type": '',
|
"party_type": '',
|
||||||
@@ -268,7 +268,7 @@ class PayrollEntry(Document):
|
|||||||
if len(currencies) > 1:
|
if len(currencies) > 1:
|
||||||
multi_currency = 1
|
multi_currency = 1
|
||||||
journal_entry.multi_currency = multi_currency
|
journal_entry.multi_currency = multi_currency
|
||||||
journal_entry.title = default_payroll_payable_account
|
journal_entry.title = payroll_payable_account
|
||||||
journal_entry.save()
|
journal_entry.save()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -319,7 +319,7 @@ class PayrollEntry(Document):
|
|||||||
self.create_journal_entry(salary_slip_total, "salary")
|
self.create_journal_entry(salary_slip_total, "salary")
|
||||||
|
|
||||||
def create_journal_entry(self, je_payment_amount, user_remark):
|
def create_journal_entry(self, je_payment_amount, user_remark):
|
||||||
default_payroll_payable_account = self.default_payroll_payable_account
|
payroll_payable_account = self.payroll_payable_account
|
||||||
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
|
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
|
||||||
|
|
||||||
accounts = []
|
accounts = []
|
||||||
@@ -335,9 +335,9 @@ class PayrollEntry(Document):
|
|||||||
"exchange_rate": flt(exchange_rate),
|
"exchange_rate": flt(exchange_rate),
|
||||||
})
|
})
|
||||||
|
|
||||||
exchange_rate, conversion_rate = self.get_exchange_rate(default_payroll_payable_account, company_currency, currencies)
|
exchange_rate, conversion_rate = self.get_exchange_rate(payroll_payable_account, company_currency, currencies)
|
||||||
accounts.append({
|
accounts.append({
|
||||||
"account": default_payroll_payable_account,
|
"account": payroll_payable_account,
|
||||||
"debit_in_account_currency": flt(je_payment_amount * conversion_rate, precision),
|
"debit_in_account_currency": flt(je_payment_amount * conversion_rate, precision),
|
||||||
"exchange_rate": flt(exchange_rate),
|
"exchange_rate": flt(exchange_rate),
|
||||||
"reference_type": self.doctype,
|
"reference_type": self.doctype,
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ from __future__ import unicode_literals
|
|||||||
import unittest
|
import unittest
|
||||||
import erpnext
|
import erpnext
|
||||||
import frappe
|
import frappe
|
||||||
|
import random
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from erpnext.accounts.utils import get_fiscal_year, getdate, nowdate
|
from erpnext.accounts.utils import get_fiscal_year, getdate, nowdate
|
||||||
from frappe.utils import add_months
|
from frappe.utils import add_months
|
||||||
|
from frappe.utils.make_random import get_random
|
||||||
from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_start_end_dates, get_end_date
|
from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_start_end_dates, get_end_date
|
||||||
from erpnext.hr.doctype.employee.test_employee import make_employee
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
from erpnext.payroll.doctype.salary_slip.test_salary_slip import get_salary_component_account, \
|
from erpnext.payroll.doctype.salary_slip.test_salary_slip import get_salary_component_account, \
|
||||||
@@ -34,10 +36,30 @@ class TestPayrollEntry(unittest.TestCase):
|
|||||||
get_salary_component_account(data.name)
|
get_salary_component_account(data.name)
|
||||||
|
|
||||||
employee = frappe.db.get_value("Employee", {'company': company})
|
employee = frappe.db.get_value("Employee", {'company': company})
|
||||||
make_salary_structure("_Test Salary Structure", "Monthly", employee, company=company)
|
company_doc = frappe.get_doc('Company', company)
|
||||||
|
make_salary_structure("_Test Salary Structure", "Monthly", employee, company=company, currency=company_doc.default_currency)
|
||||||
dates = get_start_end_dates('Monthly', nowdate())
|
dates = get_start_end_dates('Monthly', nowdate())
|
||||||
if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
|
if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
|
||||||
make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date)
|
make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date, payable_account=company_doc.default_payroll_payable_account,
|
||||||
|
currency=company_doc.default_currency)
|
||||||
|
|
||||||
|
|
||||||
|
def test_multi_currency_payroll_entry(self): # pylint: disable=no-self-use
|
||||||
|
company = erpnext.get_default_company()
|
||||||
|
for data in frappe.get_all('Salary Component', fields = ["name"]):
|
||||||
|
if not frappe.db.get_value('Salary Component Account',
|
||||||
|
{'parent': data.name, 'company': company}, 'name'):
|
||||||
|
get_salary_component_account(data.name)
|
||||||
|
|
||||||
|
employee = frappe.db.get_value("Employee", {'company': company})
|
||||||
|
company_doc = frappe.get_doc('Company', company)
|
||||||
|
currency = frappe.db.get_value("Currency", {'currency_name': ('not in',[company_doc.default_currency]), 'enabled': 1}, 'currency_name')
|
||||||
|
exchange_rate = random.random()*100
|
||||||
|
make_salary_structure("_Test Multi Currency Salary Structure", "Monthly", employee, company=company, currency=currency)
|
||||||
|
dates = get_start_end_dates('Monthly', nowdate())
|
||||||
|
if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
|
||||||
|
make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date, payable_account=company_doc.default_payroll_payable_account,
|
||||||
|
currency=currency, exchange_rate=exchange_rate)
|
||||||
|
|
||||||
def test_payroll_entry_with_employee_cost_center(self): # pylint: disable=no-self-use
|
def test_payroll_entry_with_employee_cost_center(self): # pylint: disable=no-self-use
|
||||||
for data in frappe.get_all('Salary Component', fields = ["name"]):
|
for data in frappe.get_all('Salary Component', fields = ["name"]):
|
||||||
@@ -56,9 +78,9 @@ class TestPayrollEntry(unittest.TestCase):
|
|||||||
department="cc - _TC", company="_Test Company")
|
department="cc - _TC", company="_Test Company")
|
||||||
employee2 = make_employee("test_employee2@example.com", payroll_cost_center="_Test Cost Center 2 - _TC",
|
employee2 = make_employee("test_employee2@example.com", payroll_cost_center="_Test Cost Center 2 - _TC",
|
||||||
department="cc - _TC", company="_Test Company")
|
department="cc - _TC", company="_Test Company")
|
||||||
|
company_doc = frappe.get_doc('Company', '_Test Company')
|
||||||
make_salary_structure("_Test Salary Structure 1", "Monthly", employee1, company="_Test Company")
|
make_salary_structure("_Test Salary Structure 1", "Monthly", employee1, company="_Test Company", currency=company_doc.default_currency)
|
||||||
make_salary_structure("_Test Salary Structure 2", "Monthly", employee2, company="_Test Company")
|
make_salary_structure("_Test Salary Structure 2", "Monthly", employee2, company="_Test Company", currency=company_doc.default_currency)
|
||||||
|
|
||||||
if not frappe.db.exists("Account", "_Test Payroll Payable - _TC"):
|
if not frappe.db.exists("Account", "_Test Payroll Payable - _TC"):
|
||||||
create_account(account_name="_Test Payroll Payable",
|
create_account(account_name="_Test Payroll Payable",
|
||||||
@@ -68,8 +90,8 @@ class TestPayrollEntry(unittest.TestCase):
|
|||||||
|
|
||||||
dates = get_start_end_dates('Monthly', nowdate())
|
dates = get_start_end_dates('Monthly', nowdate())
|
||||||
if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
|
if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
|
||||||
pe = make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date,
|
pe = make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date, payable_account=company_doc.default_payroll_payable_account,
|
||||||
department="cc - _TC", company="_Test Company", payment_account="Cash - _TC", cost_center="Main - _TC")
|
currency=company_doc.default_currency, department="cc - _TC", company="_Test Company", payment_account="Cash - _TC", cost_center="Main - _TC")
|
||||||
je = frappe.db.get_value("Salary Slip", {"payroll_entry": pe.name}, "journal_entry")
|
je = frappe.db.get_value("Salary Slip", {"payroll_entry": pe.name}, "journal_entry")
|
||||||
je_entries = frappe.db.sql("""
|
je_entries = frappe.db.sql("""
|
||||||
select account, cost_center, debit, credit
|
select account, cost_center, debit, credit
|
||||||
@@ -121,7 +143,7 @@ class TestPayrollEntry(unittest.TestCase):
|
|||||||
employee_doc.save()
|
employee_doc.save()
|
||||||
|
|
||||||
salary_structure = "Test Salary Structure for Loan"
|
salary_structure = "Test Salary Structure for Loan"
|
||||||
make_salary_structure(salary_structure, "Monthly", employee=employee_doc.name, company="_Test Company")
|
make_salary_structure(salary_structure, "Monthly", employee=employee_doc.name, company="_Test Company", currency=company_doc.default_currency)
|
||||||
|
|
||||||
loan = create_loan(applicant, "Car Loan", 280000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
|
loan = create_loan(applicant, "Car Loan", 280000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
|
||||||
loan.repay_from_salary = 1
|
loan.repay_from_salary = 1
|
||||||
@@ -133,8 +155,8 @@ class TestPayrollEntry(unittest.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
dates = get_start_end_dates('Monthly', nowdate())
|
dates = get_start_end_dates('Monthly', nowdate())
|
||||||
make_payroll_entry(company="_Test Company", start_date=dates.start_date,
|
make_payroll_entry(company="_Test Company", start_date=dates.start_date, payable_account=company_doc.default_payroll_payable_account,
|
||||||
end_date=dates.end_date, branch=branch, cost_center="Main - _TC", payment_account="Cash - _TC")
|
currency=company_doc.default_currency, end_date=dates.end_date, branch=branch, cost_center="Main - _TC", payment_account="Cash - _TC")
|
||||||
|
|
||||||
name = frappe.db.get_value('Salary Slip',
|
name = frappe.db.get_value('Salary Slip',
|
||||||
{'posting_date': nowdate(), 'employee': applicant}, 'name')
|
{'posting_date': nowdate(), 'employee': applicant}, 'name')
|
||||||
@@ -165,6 +187,9 @@ def make_payroll_entry(**args):
|
|||||||
payroll_entry.payroll_frequency = "Monthly"
|
payroll_entry.payroll_frequency = "Monthly"
|
||||||
payroll_entry.branch = args.branch or None
|
payroll_entry.branch = args.branch or None
|
||||||
payroll_entry.department = args.department or None
|
payroll_entry.department = args.department or None
|
||||||
|
payroll_entry.payroll_payable_account = args.payable_account
|
||||||
|
payroll_entry.currency = args.currency
|
||||||
|
payroll_entry.exchange_rate = args.exchange_rate or 1
|
||||||
|
|
||||||
if args.cost_center:
|
if args.cost_center:
|
||||||
payroll_entry.cost_center = args.cost_center
|
payroll_entry.cost_center = args.cost_center
|
||||||
|
|||||||
@@ -9,45 +9,45 @@ QUnit.test("test: Set Salary Components", function (assert) {
|
|||||||
() => {
|
() => {
|
||||||
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
||||||
row.company = 'For Testing';
|
row.company = 'For Testing';
|
||||||
row.default_account = 'Salary - FT';
|
row.account = 'Salary - FT';
|
||||||
},
|
},
|
||||||
|
|
||||||
() => cur_frm.save(),
|
() => cur_frm.save(),
|
||||||
() => frappe.timeout(2),
|
() => frappe.timeout(2),
|
||||||
() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
|
() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
|
||||||
|
|
||||||
() => frappe.set_route('Form', 'Salary Component', 'Basic'),
|
() => frappe.set_route('Form', 'Salary Component', 'Basic'),
|
||||||
() => {
|
() => {
|
||||||
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
||||||
row.company = 'For Testing';
|
row.company = 'For Testing';
|
||||||
row.default_account = 'Salary - FT';
|
row.account = 'Salary - FT';
|
||||||
},
|
},
|
||||||
|
|
||||||
() => cur_frm.save(),
|
() => cur_frm.save(),
|
||||||
() => frappe.timeout(2),
|
() => frappe.timeout(2),
|
||||||
() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
|
() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
|
||||||
|
|
||||||
() => frappe.set_route('Form', 'Salary Component', 'Income Tax'),
|
() => frappe.set_route('Form', 'Salary Component', 'Income Tax'),
|
||||||
() => {
|
() => {
|
||||||
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
||||||
row.company = 'For Testing';
|
row.company = 'For Testing';
|
||||||
row.default_account = 'Salary - FT';
|
row.account = 'Salary - FT';
|
||||||
},
|
},
|
||||||
|
|
||||||
() => cur_frm.save(),
|
() => cur_frm.save(),
|
||||||
() => frappe.timeout(2),
|
() => frappe.timeout(2),
|
||||||
() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
|
() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
|
||||||
|
|
||||||
() => frappe.set_route('Form', 'Salary Component', 'Arrear'),
|
() => frappe.set_route('Form', 'Salary Component', 'Arrear'),
|
||||||
() => {
|
() => {
|
||||||
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
|
||||||
row.company = 'For Testing';
|
row.company = 'For Testing';
|
||||||
row.default_account = 'Salary - FT';
|
row.account = 'Salary - FT';
|
||||||
},
|
},
|
||||||
|
|
||||||
() => cur_frm.save(),
|
() => cur_frm.save(),
|
||||||
() => frappe.timeout(2),
|
() => frappe.timeout(2),
|
||||||
() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
|
() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
|
||||||
|
|
||||||
() => frappe.set_route('Form', 'Company', 'For Testing'),
|
() => frappe.set_route('Form', 'Company', 'For Testing'),
|
||||||
() => cur_frm.set_value('default_payroll_payable_account', 'Payroll Payable - FT'),
|
() => cur_frm.set_value('default_payroll_payable_account', 'Payroll Payable - FT'),
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
frappe.ui.form.on('Salary Component', {
|
frappe.ui.form.on('Salary Component', {
|
||||||
setup: function(frm) {
|
setup: function(frm) {
|
||||||
frm.set_query("default_account", "accounts", function(doc, cdt, cdn) {
|
frm.set_query("account", "accounts", function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Attendance")
|
frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Attendance")
|
||||||
frappe.db.set_value("Payroll Settings", None, "daily_wages_fraction_for_half_day", 0.75)
|
frappe.db.set_value("Payroll Settings", None, "daily_wages_fraction_for_half_day", 0.75)
|
||||||
|
|
||||||
emp_id = make_employee("test_for_attendance@salary.com")
|
emp_id = make_employee("test_payment_days_based_on_attendance@salary.com")
|
||||||
frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"})
|
frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"})
|
||||||
|
|
||||||
frappe.db.set_value("Leave Type", "Leave Without Pay", "include_holiday", 0)
|
frappe.db.set_value("Leave Type", "Leave Without Pay", "include_holiday", 0)
|
||||||
@@ -53,7 +53,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
mark_attendance(emp_id, add_days(first_sunday, 4), 'On Leave', leave_type='Casual Leave', ignore_validate=True) # invalid lwp
|
mark_attendance(emp_id, add_days(first_sunday, 4), 'On Leave', leave_type='Casual Leave', ignore_validate=True) # invalid lwp
|
||||||
mark_attendance(emp_id, add_days(first_sunday, 7), 'On Leave', leave_type='Leave Without Pay', ignore_validate=True) # invalid lwp
|
mark_attendance(emp_id, add_days(first_sunday, 7), 'On Leave', leave_type='Leave Without Pay', ignore_validate=True) # invalid lwp
|
||||||
|
|
||||||
ss = make_employee_salary_slip("test_for_attendance@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_payment_days_based_on_attendance@salary.com", "Monthly", "Test Payment Based On Attendence")
|
||||||
|
|
||||||
self.assertEqual(ss.leave_without_pay, 1.25)
|
self.assertEqual(ss.leave_without_pay, 1.25)
|
||||||
self.assertEqual(ss.absent_days, 1)
|
self.assertEqual(ss.absent_days, 1)
|
||||||
@@ -76,7 +76,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
# Payroll based on attendance
|
# Payroll based on attendance
|
||||||
frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Leave")
|
frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Leave")
|
||||||
|
|
||||||
emp_id = make_employee("test_for_attendance@salary.com")
|
emp_id = make_employee("test_payment_days_based_on_leave_application@salary.com")
|
||||||
frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"})
|
frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"})
|
||||||
|
|
||||||
frappe.db.set_value("Leave Type", "Leave Without Pay", "include_holiday", 0)
|
frappe.db.set_value("Leave Type", "Leave Without Pay", "include_holiday", 0)
|
||||||
@@ -93,7 +93,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
|
|
||||||
make_leave_application(emp_id, first_sunday, add_days(first_sunday, 3), "Leave Without Pay")
|
make_leave_application(emp_id, first_sunday, add_days(first_sunday, 3), "Leave Without Pay")
|
||||||
|
|
||||||
ss = make_employee_salary_slip("test_for_attendance@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_payment_days_based_on_leave_application@salary.com", "Monthly", "Test Payment Based On Leave Application")
|
||||||
|
|
||||||
self.assertEqual(ss.leave_without_pay, 3)
|
self.assertEqual(ss.leave_without_pay, 3)
|
||||||
|
|
||||||
@@ -112,12 +112,12 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
def test_salary_slip_with_holidays_included(self):
|
def test_salary_slip_with_holidays_included(self):
|
||||||
no_of_days = self.get_no_of_days()
|
no_of_days = self.get_no_of_days()
|
||||||
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1)
|
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1)
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_salary_slip_with_holidays_included@salary.com")
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
{"employee_name":"test_salary_slip_with_holidays_included@salary.com"}, "name"), "relieving_date", None)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_salary_slip_with_holidays_included@salary.com"}, "name"), "status", "Active")
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_salary_slip_with_holidays_included@salary.com", "Monthly", "Test Salary Slip With Holidays Included")
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0])
|
self.assertEqual(ss.total_working_days, no_of_days[0])
|
||||||
self.assertEqual(ss.payment_days, no_of_days[0])
|
self.assertEqual(ss.payment_days, no_of_days[0])
|
||||||
@@ -128,12 +128,12 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
def test_salary_slip_with_holidays_excluded(self):
|
def test_salary_slip_with_holidays_excluded(self):
|
||||||
no_of_days = self.get_no_of_days()
|
no_of_days = self.get_no_of_days()
|
||||||
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0)
|
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0)
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_salary_slip_with_holidays_excluded@salary.com")
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
{"employee_name":"test_salary_slip_with_holidays_excluded@salary.com"}, "name"), "relieving_date", None)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_salary_slip_with_holidays_excluded@salary.com"}, "name"), "status", "Active")
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_salary_slip_with_holidays_excluded@salary.com", "Monthly", "Test Salary Slip With Holidays Excluded")
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0] - no_of_days[1])
|
self.assertEqual(ss.total_working_days, no_of_days[0] - no_of_days[1])
|
||||||
self.assertEqual(ss.payment_days, no_of_days[0] - no_of_days[1])
|
self.assertEqual(ss.payment_days, no_of_days[0] - no_of_days[1])
|
||||||
@@ -148,7 +148,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1)
|
frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1)
|
||||||
|
|
||||||
# set joinng date in the same month
|
# set joinng date in the same month
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_payment_days@salary.com")
|
||||||
if getdate(nowdate()).day >= 15:
|
if getdate(nowdate()).day >= 15:
|
||||||
relieving_date = getdate(add_days(nowdate(),-10))
|
relieving_date = getdate(add_days(nowdate(),-10))
|
||||||
date_of_joining = getdate(add_days(nowdate(),-10))
|
date_of_joining = getdate(add_days(nowdate(),-10))
|
||||||
@@ -163,39 +163,39 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
relieving_date = getdate(nowdate())
|
relieving_date = getdate(nowdate())
|
||||||
|
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "date_of_joining", date_of_joining)
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "date_of_joining", date_of_joining)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "relieving_date", None)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "status", "Active")
|
||||||
|
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_payment_days@salary.com", "Monthly", "Test Payment Days")
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0])
|
self.assertEqual(ss.total_working_days, no_of_days[0])
|
||||||
self.assertEqual(ss.payment_days, (no_of_days[0] - getdate(date_of_joining).day + 1))
|
self.assertEqual(ss.payment_days, (no_of_days[0] - getdate(date_of_joining).day + 1))
|
||||||
|
|
||||||
# set relieving date in the same month
|
# set relieving date in the same month
|
||||||
frappe.db.set_value("Employee",frappe.get_value("Employee",
|
frappe.db.set_value("Employee",frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "date_of_joining", (add_days(nowdate(),-60)))
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "date_of_joining", (add_days(nowdate(),-60)))
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", relieving_date)
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "relieving_date", relieving_date)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Left")
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "status", "Left")
|
||||||
ss.save()
|
ss.save()
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0])
|
self.assertEqual(ss.total_working_days, no_of_days[0])
|
||||||
self.assertEqual(ss.payment_days, getdate(relieving_date).day)
|
self.assertEqual(ss.payment_days, getdate(relieving_date).day)
|
||||||
|
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "relieving_date", None)
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_payment_days@salary.com"}, "name"), "status", "Active")
|
||||||
|
|
||||||
def test_employee_salary_slip_read_permission(self):
|
def test_employee_salary_slip_read_permission(self):
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_employee_salary_slip_read_permission@salary.com")
|
||||||
|
|
||||||
salary_slip_test_employee = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
salary_slip_test_employee = make_employee_salary_slip("test_employee_salary_slip_read_permission@salary.com", "Monthly", "Test Employee Salary Slip Read Permission")
|
||||||
frappe.set_user("test_employee@salary.com")
|
frappe.set_user("test_employee_salary_slip_read_permission@salary.com")
|
||||||
self.assertTrue(salary_slip_test_employee.has_permission("read"))
|
self.assertTrue(salary_slip_test_employee.has_permission("read"))
|
||||||
|
|
||||||
def test_email_salary_slip(self):
|
def test_email_salary_slip(self):
|
||||||
@@ -203,8 +203,8 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
|
|
||||||
frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 1)
|
frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 1)
|
||||||
|
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_email_salary_slip@salary.com")
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_email_salary_slip@salary.com", "Monthly", "Test Salary Slip Email")
|
||||||
ss.company = "_Test Company"
|
ss.company = "_Test Company"
|
||||||
ss.save()
|
ss.save()
|
||||||
ss.submit()
|
ss.submit()
|
||||||
@@ -215,8 +215,9 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
def test_loan_repayment_salary_slip(self):
|
def test_loan_repayment_salary_slip(self):
|
||||||
from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan, make_loan_disbursement_entry, create_loan_accounts
|
from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan, make_loan_disbursement_entry, create_loan_accounts
|
||||||
from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans
|
from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans
|
||||||
|
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
|
||||||
|
|
||||||
applicant = make_employee("test_loanemployee@salary.com", company="_Test Company")
|
applicant = make_employee("test_loan_repayment_salary_slip@salary.com", company="_Test Company")
|
||||||
|
|
||||||
create_loan_accounts()
|
create_loan_accounts()
|
||||||
|
|
||||||
@@ -228,6 +229,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
interest_income_account='Interest Income Account - _TC',
|
interest_income_account='Interest Income Account - _TC',
|
||||||
penalty_income_account='Penalty Income Account - _TC')
|
penalty_income_account='Penalty Income Account - _TC')
|
||||||
|
|
||||||
|
make_salary_structure("Test Loan Repayment Salary Structure", "Monthly", employee=applicant, currency='INR')
|
||||||
loan = create_loan(applicant, "Car Loan", 11000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
|
loan = create_loan(applicant, "Car Loan", 11000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
|
||||||
loan.repay_from_salary = 1
|
loan.repay_from_salary = 1
|
||||||
loan.submit()
|
loan.submit()
|
||||||
@@ -236,7 +238,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
|
|
||||||
process_loan_interest_accrual_for_term_loans(posting_date=nowdate())
|
process_loan_interest_accrual_for_term_loans(posting_date=nowdate())
|
||||||
|
|
||||||
ss = make_employee_salary_slip("test_loanemployee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_loan_repayment_salary_slip@salary.com", "Monthly", "Test Loan Repayment Salary Structure")
|
||||||
ss.submit()
|
ss.submit()
|
||||||
|
|
||||||
self.assertEqual(ss.total_loan_repayment, 592)
|
self.assertEqual(ss.total_loan_repayment, 592)
|
||||||
@@ -249,7 +251,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
|
|
||||||
for payroll_frequency in ["Monthly", "Bimonthly", "Fortnightly", "Weekly", "Daily"]:
|
for payroll_frequency in ["Monthly", "Bimonthly", "Fortnightly", "Weekly", "Daily"]:
|
||||||
make_employee(payroll_frequency + "_test_employee@salary.com")
|
make_employee(payroll_frequency + "_test_employee@salary.com")
|
||||||
ss = make_employee_salary_slip(payroll_frequency + "_test_employee@salary.com", payroll_frequency)
|
ss = make_employee_salary_slip(payroll_frequency + "_test_employee@salary.com", payroll_frequency, payroll_frequency + "_Test Payroll Frequency")
|
||||||
if payroll_frequency == "Monthly":
|
if payroll_frequency == "Monthly":
|
||||||
self.assertEqual(ss.end_date, m['month_end_date'])
|
self.assertEqual(ss.end_date, m['month_end_date'])
|
||||||
elif payroll_frequency == "Bimonthly":
|
elif payroll_frequency == "Bimonthly":
|
||||||
@@ -264,6 +266,19 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
elif payroll_frequency == "Daily":
|
elif payroll_frequency == "Daily":
|
||||||
self.assertEqual(ss.end_date, nowdate())
|
self.assertEqual(ss.end_date, nowdate())
|
||||||
|
|
||||||
|
def test_multi_currency_salary_slip(self):
|
||||||
|
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
|
||||||
|
applicant = make_employee("test_multi_currency_salary_slip@salary.com", company="_Test Company")
|
||||||
|
salary_structure = make_salary_structure("Test Multi Currency Salary Slip", "Monthly", employee=applicant, company="_Test Company", currency='USD')
|
||||||
|
salary_slip = make_salary_slip(salary_structure.name, employee = applicant)
|
||||||
|
salary_slip.exchange_rate = 70
|
||||||
|
salary_slip.calculate_net_pay()
|
||||||
|
# salary_slip.submit()
|
||||||
|
|
||||||
|
self.assertEqual(salary_slip.gross_pay, 78000)
|
||||||
|
self.assertEqual(salary_slip.base_gross_pay, 78000*70)
|
||||||
|
|
||||||
|
|
||||||
def test_tax_for_payroll_period(self):
|
def test_tax_for_payroll_period(self):
|
||||||
data = {}
|
data = {}
|
||||||
# test the impact of tax exemption declaration, tax exemption proof submission
|
# test the impact of tax exemption declaration, tax exemption proof submission
|
||||||
@@ -384,7 +399,10 @@ def make_employee_salary_slip(user, payroll_frequency, salary_structure=None):
|
|||||||
salary_structure = payroll_frequency + " Salary Structure Test for Salary Slip"
|
salary_structure = payroll_frequency + " Salary Structure Test for Salary Slip"
|
||||||
|
|
||||||
employee = frappe.db.get_value("Employee", {"user_id": user})
|
employee = frappe.db.get_value("Employee", {"user_id": user})
|
||||||
salary_structure_doc = make_salary_structure(salary_structure, payroll_frequency, employee)
|
if not frappe.db.exists('Salary Structure', salary_structure):
|
||||||
|
salary_structure_doc = make_salary_structure(salary_structure, payroll_frequency, employee)
|
||||||
|
else:
|
||||||
|
salary_structure_doc = frappe.get_doc('Salary Structure', salary_structure)
|
||||||
salary_slip = frappe.db.get_value("Salary Slip", {"employee": frappe.db.get_value("Employee", {"user_id": user})})
|
salary_slip = frappe.db.get_value("Salary Slip", {"employee": frappe.db.get_value("Employee", {"user_id": user})})
|
||||||
|
|
||||||
if not salary_slip:
|
if not salary_slip:
|
||||||
@@ -434,7 +452,7 @@ def get_salary_component_account(sal_comp, company_list=None):
|
|||||||
|
|
||||||
sal_comp.append("accounts", {
|
sal_comp.append("accounts", {
|
||||||
"company": d,
|
"company": d,
|
||||||
"default_account": create_account(account_name, d, parent_account)
|
"account": create_account(account_name, d, parent_account)
|
||||||
})
|
})
|
||||||
sal_comp.save()
|
sal_comp.save()
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ frappe.ui.form.on('Salary Structure', {
|
|||||||
{fieldname:'department', fieldtype:'Link', options: 'Department', label: __('Department')},
|
{fieldname:'department', fieldtype:'Link', options: 'Department', label: __('Department')},
|
||||||
{fieldname:'designation', fieldtype:'Link', options: 'Designation', label: __('Designation')},
|
{fieldname:'designation', fieldtype:'Link', options: 'Designation', label: __('Designation')},
|
||||||
{fieldname:"employee", fieldtype: "Link", options: "Employee", label: __("Employee")},
|
{fieldname:"employee", fieldtype: "Link", options: "Employee", label: __("Employee")},
|
||||||
{fieldname:"default_payroll_payable_account", fieldtype: "Link", options: "Account", filters: {"company": frm.doc.company, "root_type": "Liability", "is_group": 0, "account_currency": frm.doc.currency}, label: __("Default Payroll Payable Account")},
|
{fieldname:"payroll_payable_account", fieldtype: "Link", options: "Account", filters: {"company": frm.doc.company, "root_type": "Liability", "is_group": 0, "account_currency": frm.doc.currency}, label: __("Payroll Payable Account")},
|
||||||
{fieldname:'base_variable', fieldtype:'Section Break'},
|
{fieldname:'base_variable', fieldtype:'Section Break'},
|
||||||
{fieldname:'from_date', fieldtype:'Date', label: __('From Date'), "reqd": 1},
|
{fieldname:'from_date', fieldtype:'Date', label: __('From Date'), "reqd": 1},
|
||||||
{fieldname:'income_tax_slab', fieldtype:'Link', label: __('Income Tax Slab'), options: 'Income Tax Slab'},
|
{fieldname:'income_tax_slab', fieldtype:'Link', label: __('Income Tax Slab'), options: 'Income Tax Slab'},
|
||||||
|
|||||||
@@ -89,25 +89,25 @@ class SalaryStructure(Document):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def assign_salary_structure(self, grade=None, department=None, designation=None,employee=None,
|
def assign_salary_structure(self, grade=None, department=None, designation=None,employee=None,
|
||||||
default_payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
|
payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
|
||||||
employees = self.get_employees(company= self.company, grade= grade,department= department,designation= designation,name=employee)
|
employees = self.get_employees(company= self.company, grade= grade,department= department,designation= designation,name=employee)
|
||||||
|
|
||||||
if employees:
|
if employees:
|
||||||
if len(employees) > 20:
|
if len(employees) > 20:
|
||||||
frappe.enqueue(assign_salary_structure_for_employees, timeout=600,
|
frappe.enqueue(assign_salary_structure_for_employees, timeout=600,
|
||||||
employees=employees, salary_structure=self,
|
employees=employees, salary_structure=self,
|
||||||
default_payroll_payable_account=default_payroll_payable_account,
|
payroll_payable_account=payroll_payable_account,
|
||||||
from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
|
from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
|
||||||
else:
|
else:
|
||||||
assign_salary_structure_for_employees(employees, self,
|
assign_salary_structure_for_employees(employees, self,
|
||||||
default_payroll_payable_account=default_payroll_payable_account,
|
payroll_payable_account=payroll_payable_account,
|
||||||
from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
|
from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
|
||||||
else:
|
else:
|
||||||
frappe.msgprint(_("No Employee Found"))
|
frappe.msgprint(_("No Employee Found"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def assign_salary_structure_for_employees(employees, salary_structure, default_payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
|
def assign_salary_structure_for_employees(employees, salary_structure, payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
|
||||||
salary_structures_assignments = []
|
salary_structures_assignments = []
|
||||||
existing_assignments_for = get_existing_assignments(employees, salary_structure, from_date)
|
existing_assignments_for = get_existing_assignments(employees, salary_structure, from_date)
|
||||||
count=0
|
count=0
|
||||||
@@ -117,7 +117,7 @@ def assign_salary_structure_for_employees(employees, salary_structure, default_p
|
|||||||
count +=1
|
count +=1
|
||||||
|
|
||||||
salary_structures_assignment = create_salary_structures_assignment(employee,
|
salary_structures_assignment = create_salary_structures_assignment(employee,
|
||||||
salary_structure, default_payroll_payable_account, from_date, base, variable, income_tax_slab)
|
salary_structure, payroll_payable_account, from_date, base, variable, income_tax_slab)
|
||||||
salary_structures_assignments.append(salary_structures_assignment)
|
salary_structures_assignments.append(salary_structures_assignment)
|
||||||
frappe.publish_progress(count*100/len(set(employees) - set(existing_assignments_for)), title = _("Assigning Structures..."))
|
frappe.publish_progress(count*100/len(set(employees) - set(existing_assignments_for)), title = _("Assigning Structures..."))
|
||||||
|
|
||||||
@@ -125,21 +125,21 @@ def assign_salary_structure_for_employees(employees, salary_structure, default_p
|
|||||||
frappe.msgprint(_("Structures have been assigned successfully"))
|
frappe.msgprint(_("Structures have been assigned successfully"))
|
||||||
|
|
||||||
|
|
||||||
def create_salary_structures_assignment(employee, salary_structure, default_payroll_payable_account, from_date, base, variable, income_tax_slab=None):
|
def create_salary_structures_assignment(employee, salary_structure, payroll_payable_account, from_date, base, variable, income_tax_slab=None):
|
||||||
if not default_payroll_payable_account:
|
if not payroll_payable_account:
|
||||||
default_payroll_payable_account = frappe.db.get_value('Company', salary_structure.company, 'default_payroll_payable_account')
|
payroll_payable_account = frappe.db.get_value('Company', salary_structure.company, 'payroll_payable_account')
|
||||||
if not default_payroll_payable_account:
|
if not payroll_payable_account:
|
||||||
frappe.throw(_('Please set "Default Payroll Payable Account" in Company Defaults'))
|
frappe.throw(_('Please set "Default Payroll Payable Account" in Company Defaults'))
|
||||||
account_currency = frappe.db.get_value('Account', default_payroll_payable_account, 'account_currency')
|
account_currency = frappe.db.get_value('Account', payroll_payable_account, 'account_currency')
|
||||||
if account_currency != salary_structure.currency:
|
if account_currency != salary_structure.currency:
|
||||||
frappe.throw(_("Account currency of Account: {0} is different than what is specified in salary structure: {1}").format(default_payroll_payable_account, salary_structure))
|
frappe.throw(_("Account currency of Account: {0} is different than what is specified in salary structure: {1}").format(payroll_payable_account, salary_structure))
|
||||||
|
|
||||||
assignment = frappe.new_doc("Salary Structure Assignment")
|
assignment = frappe.new_doc("Salary Structure Assignment")
|
||||||
assignment.employee = employee
|
assignment.employee = employee
|
||||||
assignment.salary_structure = salary_structure.name
|
assignment.salary_structure = salary_structure.name
|
||||||
assignment.company = salary_structure.company
|
assignment.company = salary_structure.company
|
||||||
assignment.currency = salary_structure.currency
|
assignment.currency = salary_structure.currency
|
||||||
assignment.default_payroll_payable_account = default_payroll_payable_account
|
assignment.payroll_payable_account = payroll_payable_account
|
||||||
assignment.from_date = from_date
|
assignment.from_date = from_date
|
||||||
assignment.base = base
|
assignment.base = base
|
||||||
assignment.variable = variable
|
assignment.variable = variable
|
||||||
|
|||||||
@@ -94,7 +94,8 @@ class TestSalaryStructure(unittest.TestCase):
|
|||||||
self.assertFalse(("\n" in row.formula) or ("\n" in row.condition))
|
self.assertFalse(("\n" in row.formula) or ("\n" in row.condition))
|
||||||
|
|
||||||
def test_salary_structures_assignment(self):
|
def test_salary_structures_assignment(self):
|
||||||
salary_structure = make_salary_structure("Salary Structure Sample", "Monthly")
|
company_currency = erpnext.get_default_currency()
|
||||||
|
salary_structure = make_salary_structure("Salary Structure Sample", "Monthly", currency=company_currency)
|
||||||
employee = "test_assign_stucture@salary.com"
|
employee = "test_assign_stucture@salary.com"
|
||||||
employee_doc_name = make_employee(employee)
|
employee_doc_name = make_employee(employee)
|
||||||
# clear the already assigned stuctures
|
# clear the already assigned stuctures
|
||||||
@@ -107,8 +108,13 @@ class TestSalaryStructure(unittest.TestCase):
|
|||||||
self.assertEqual(salary_structure_assignment.base, 5000)
|
self.assertEqual(salary_structure_assignment.base, 5000)
|
||||||
self.assertEqual(salary_structure_assignment.variable, 200)
|
self.assertEqual(salary_structure_assignment.variable, 200)
|
||||||
|
|
||||||
|
def test_multi_currency_salary_structure(self):
|
||||||
|
emp = make_employee("test_muti_currency_employee@salary.com")
|
||||||
|
sal_struct = make_salary_structure("Salary Structure Multi Currency", "Monthly", currency='USD')
|
||||||
|
self.assertEqual(sal_struct.currency, 'USD')
|
||||||
|
|
||||||
def make_salary_structure(salary_structure, payroll_frequency, employee=None, dont_submit=False, other_details=None,
|
def make_salary_structure(salary_structure, payroll_frequency, employee=None, dont_submit=False, other_details=None,
|
||||||
test_tax=False, company=None):
|
test_tax=False, company=None, currency=erpnext.get_default_currency()):
|
||||||
if test_tax:
|
if test_tax:
|
||||||
frappe.db.sql("""delete from `tabSalary Structure` where name=%s""",(salary_structure))
|
frappe.db.sql("""delete from `tabSalary Structure` where name=%s""",(salary_structure))
|
||||||
|
|
||||||
@@ -120,7 +126,8 @@ def make_salary_structure(salary_structure, payroll_frequency, employee=None, do
|
|||||||
"earnings": make_earning_salary_component(test_tax=test_tax, company_list=["_Test Company"]),
|
"earnings": make_earning_salary_component(test_tax=test_tax, company_list=["_Test Company"]),
|
||||||
"deductions": make_deduction_salary_component(test_tax=test_tax, company_list=["_Test Company"]),
|
"deductions": make_deduction_salary_component(test_tax=test_tax, company_list=["_Test Company"]),
|
||||||
"payroll_frequency": payroll_frequency,
|
"payroll_frequency": payroll_frequency,
|
||||||
"payment_account": get_random("Account")
|
"payment_account": get_random("Account", filters={'account_currency': currency}),
|
||||||
|
"currency": currency
|
||||||
}
|
}
|
||||||
if other_details and isinstance(other_details, dict):
|
if other_details and isinstance(other_details, dict):
|
||||||
details.update(other_details)
|
details.update(other_details)
|
||||||
@@ -134,11 +141,11 @@ def make_salary_structure(salary_structure, payroll_frequency, employee=None, do
|
|||||||
|
|
||||||
if employee and not frappe.db.get_value("Salary Structure Assignment",
|
if employee and not frappe.db.get_value("Salary Structure Assignment",
|
||||||
{'employee':employee, 'docstatus': 1}) and salary_structure_doc.docstatus==1:
|
{'employee':employee, 'docstatus': 1}) and salary_structure_doc.docstatus==1:
|
||||||
create_salary_structure_assignment(employee, salary_structure, company=company)
|
create_salary_structure_assignment(employee, salary_structure, company=company, currency=currency)
|
||||||
|
|
||||||
return salary_structure_doc
|
return salary_structure_doc
|
||||||
|
|
||||||
def create_salary_structure_assignment(employee, salary_structure, from_date=None, company=None):
|
def create_salary_structure_assignment(employee, salary_structure, from_date=None, company=None, currency=erpnext.get_default_currency()):
|
||||||
if frappe.db.exists("Salary Structure Assignment", {"employee": employee}):
|
if frappe.db.exists("Salary Structure Assignment", {"employee": employee}):
|
||||||
frappe.db.sql("""delete from `tabSalary Structure Assignment` where employee=%s""",(employee))
|
frappe.db.sql("""delete from `tabSalary Structure Assignment` where employee=%s""",(employee))
|
||||||
|
|
||||||
@@ -151,8 +158,15 @@ def create_salary_structure_assignment(employee, salary_structure, from_date=Non
|
|||||||
salary_structure_assignment.variable = 5000
|
salary_structure_assignment.variable = 5000
|
||||||
salary_structure_assignment.from_date = from_date or add_days(nowdate(), -1)
|
salary_structure_assignment.from_date = from_date or add_days(nowdate(), -1)
|
||||||
salary_structure_assignment.salary_structure = salary_structure
|
salary_structure_assignment.salary_structure = salary_structure
|
||||||
|
salary_structure_assignment.currency = currency
|
||||||
|
salary_structure_assignment.payroll_payable_account = get_payable_account(company)
|
||||||
salary_structure_assignment.company = company or erpnext.get_default_company()
|
salary_structure_assignment.company = company or erpnext.get_default_company()
|
||||||
salary_structure_assignment.save(ignore_permissions=True)
|
salary_structure_assignment.save(ignore_permissions=True)
|
||||||
salary_structure_assignment.income_tax_slab = "Tax Slab: _Test Payroll Period"
|
salary_structure_assignment.income_tax_slab = "Tax Slab: _Test Payroll Period"
|
||||||
salary_structure_assignment.submit()
|
salary_structure_assignment.submit()
|
||||||
return salary_structure_assignment
|
return salary_structure_assignment
|
||||||
|
|
||||||
|
def get_payable_account(company=None):
|
||||||
|
if not company:
|
||||||
|
company = erpnext.get_default_company()
|
||||||
|
return frappe.db.get_value("Company", company, "default_payroll_payable_account")
|
||||||
@@ -29,7 +29,7 @@ frappe.ui.form.on('Salary Structure Assignment', {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query("default_payroll_payable_account", function() {
|
frm.set_query("payroll_payable_account", function() {
|
||||||
var company_currency = erpnext.get_currency(frm.doc.company);
|
var company_currency = erpnext.get_currency(frm.doc.company);
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"employee_name",
|
"employee_name",
|
||||||
"department",
|
"department",
|
||||||
"company",
|
"company",
|
||||||
"default_payroll_payable_account",
|
"payroll_payable_account",
|
||||||
"column_break_6",
|
"column_break_6",
|
||||||
"designation",
|
"designation",
|
||||||
"salary_structure",
|
"salary_structure",
|
||||||
@@ -123,13 +123,6 @@
|
|||||||
"label": "Income Tax Slab",
|
"label": "Income Tax Slab",
|
||||||
"options": "Income Tax Slab"
|
"options": "Income Tax Slab"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"depends_on": "salary_structure",
|
|
||||||
"fieldname": "default_payroll_payable_account",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Payroll Payable Account",
|
|
||||||
"options": "Account"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"default": "Company:company:default_currency",
|
"default": "Company:company:default_currency",
|
||||||
"depends_on": "eval:(doc.docstatus==1 || doc.salary_structure)",
|
"depends_on": "eval:(doc.docstatus==1 || doc.salary_structure)",
|
||||||
@@ -141,11 +134,18 @@
|
|||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "salary_structure",
|
||||||
|
"fieldname": "payroll_payable_account",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Payroll Payable Account",
|
||||||
|
"options": "Account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-10-21 22:43:55.208492",
|
"modified": "2020-10-23 13:20:29.906934",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Payroll",
|
"module": "Payroll",
|
||||||
"name": "Salary Structure Assignment",
|
"name": "Salary Structure Assignment",
|
||||||
|
|||||||
Reference in New Issue
Block a user