예제 #1
0
    def test_salary_slip_with_holidays_excluded(self):
        no_of_days = self.get_no_of_days()
        dataent.db.set_value("HR Settings", None,
                             "include_holidays_in_total_working_days", 0)
        make_employee("*****@*****.**")
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "relieving_date", None)
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "status", "Active")
        ss = make_employee_salary_slip("*****@*****.**", "Monthly")

        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.earnings[0].amount, 50000)
        self.assertEqual(ss.earnings[0].default_amount, 50000)
        self.assertEqual(ss.earnings[1].amount, 3000)
        self.assertEqual(ss.deductions[0].amount, 5000)
        self.assertEqual(ss.deductions[1].amount, 5000)
        self.assertEqual(ss.gross_pay, 78000)
        self.assertEqual(ss.net_pay, 67418.0)
예제 #2
0
    def test_payroll_frequency(self):
        fiscal_year = get_fiscal_year(nowdate(),
                                      company=epaas.get_default_company())[0]
        month = "%02d" % getdate(nowdate()).month
        m = get_month_details(fiscal_year, month)

        for payroll_frequency in [
                "Monthly", "Bimonthly", "Fortnightly", "Weekly", "Daily"
        ]:
            make_employee(payroll_frequency + "*****@*****.**")
            ss = make_employee_salary_slip(
                payroll_frequency + "*****@*****.**",
                payroll_frequency)
            if payroll_frequency == "Monthly":
                self.assertEqual(ss.end_date, m['month_end_date'])
            elif payroll_frequency == "Bimonthly":
                if getdate(ss.start_date).day <= 15:
                    self.assertEqual(ss.end_date, m['month_mid_end_date'])
                else:
                    self.assertEqual(ss.end_date, m['month_end_date'])
            elif payroll_frequency == "Fortnightly":
                self.assertEqual(ss.end_date, add_days(nowdate(), 13))
            elif payroll_frequency == "Weekly":
                self.assertEqual(ss.end_date, add_days(nowdate(), 6))
            elif payroll_frequency == "Daily":
                self.assertEqual(ss.end_date, nowdate())
예제 #3
0
    def test_employee_salary_slip_read_permission(self):
        make_employee("*****@*****.**")

        salary_slip_test_employee = make_employee_salary_slip(
            "*****@*****.**", "Monthly")
        dataent.set_user("*****@*****.**")
        self.assertTrue(salary_slip_test_employee.has_permission("read"))
예제 #4
0
	def setUp(self):
		for dt in ["Salary Slip", "Salary Structure", "Salary Structure Assignment"]:
			dataent.db.sql("delete from `tab%s`" % dt)

		self.make_holiday_list()
		dataent.db.set_value("Company", epaas.get_default_company(), "default_holiday_list", "Salary Structure Test Holiday List")
		make_employee("*****@*****.**")
		make_employee("*****@*****.**")
예제 #5
0
    def test_email_salary_slip(self):
        dataent.db.sql("delete from `tabEmail Queue`")

        hr_settings = dataent.get_doc("HR Settings", "HR Settings")
        hr_settings.email_salary_slip_to_employee = 1
        hr_settings.save()

        make_employee("*****@*****.**")
        ss = make_employee_salary_slip("*****@*****.**", "Monthly")
        ss.submit()

        email_queue = dataent.db.sql("""select name from `tabEmail Queue`""")
        self.assertTrue(email_queue)
예제 #6
0
    def test_leave_grant(self):
        leave_type = "_Test Leave Type"

        # create the leave policy
        leave_policy = dataent.get_doc({
            "doctype":
            "Leave Policy",
            "leave_policy_details": [{
                "leave_type": leave_type,
                "annual_allocation": 20
            }]
        }).insert()
        leave_policy.submit()

        # create employee and assign the leave period
        employee = "*****@*****.**"
        employee_doc_name = make_employee(employee)
        dataent.db.set_value("Employee", employee_doc_name, "leave_policy",
                             leave_policy.name)

        # clear the already allocated leave
        dataent.db.sql(
            '''delete from `tabLeave Allocation` where employee=%s''',
            "*****@*****.**")

        # create the leave period
        leave_period = create_leave_period(add_months(today(), -3),
                                           add_months(today(), 3))

        # test leave_allocation
        leave_period.grant_leave_allocation(employee=employee_doc_name)
        self.assertEqual(
            get_leave_balance_on(employee_doc_name, leave_type, today()), 20)
예제 #7
0
    def test_loan(self):

        branch = "Test Employee Branch"
        applicant = make_employee("*****@*****.**")
        company = epaas.get_default_company()
        holiday_list = make_holiday("test holiday for loan")

        company_doc = dataent.get_doc('Company', company)
        if not company_doc.default_payroll_payable_account:
            company_doc.default_payroll_payable_account = dataent.db.get_value(
                'Account', {
                    'company': company,
                    'root_type': 'Liability',
                    'account_type': ''
                }, 'name')
            company_doc.save()

        if not dataent.db.exists('Branch', branch):
            dataent.get_doc({'doctype': 'Branch', 'branch': branch}).insert()

        employee_doc = dataent.get_doc('Employee', applicant)
        employee_doc.branch = branch
        employee_doc.holiday_list = holiday_list
        employee_doc.save()

        loan = create_loan(applicant, "Personal Loan", 280000,
                           "Repay Over Number of Periods", 20)
        loan.repay_from_salary = 1
        loan.submit()
        salary_structure = "Test Salary Structure for Loan"
        make_salary_structure(salary_structure, "Monthly", employee_doc.name)

        dates = get_start_end_dates('Monthly', nowdate())
        make_payroll_entry(start_date=dates.start_date,
                           end_date=dates.end_date,
                           branch=branch)

        name = dataent.db.get_value('Salary Slip', {
            'posting_date': nowdate(),
            'employee': applicant
        }, 'name')

        salary_slip = dataent.get_doc('Salary Slip', name)
        for row in salary_slip.loans:
            if row.loan == loan.name:
                interest_amount = (280000 * 8.4) / (12 * 100)
                principal_amount = loan.monthly_repayment_amount - interest_amount
                self.assertEqual(row.interest_amount, interest_amount)
                self.assertEqual(row.principal_amount, principal_amount)
                self.assertEqual(row.total_payment,
                                 interest_amount + principal_amount)

        if salary_slip.docstatus == 0:
            dataent.delete_doc('Salary Slip', name)
예제 #8
0
	def test_salary_structures_assignment(self):
		salary_structure = make_salary_structure("Salary Structure Sample", "Monthly")
		employee = "*****@*****.**"
		employee_doc_name = make_employee(employee)
		# clear the already assigned stuctures
		dataent.db.sql('''delete from `tabSalary Structure Assignment` where employee=%s and salary_structure=%s ''',
					  ("*****@*****.**",salary_structure.name))
		#test structure_assignment
		salary_structure.assign_salary_structure(employee=employee_doc_name,from_date='2013-01-01',base=5000,variable=200)
		salary_structure_assignment = dataent.get_doc("Salary Structure Assignment",{'employee':employee_doc_name, 'from_date':'2013-01-01'})
		self.assertEqual(salary_structure_assignment.docstatus, 1)
		self.assertEqual(salary_structure_assignment.base, 5000)
		self.assertEqual(salary_structure_assignment.variable, 200)
예제 #9
0
 def test_loan_repayment_salary_slip(self):
     from epaas.hr.doctype.loan.test_loan import create_loan_type, create_loan
     applicant = make_employee("*****@*****.**")
     create_loan_type("Car Loan", 500000, 6.4)
     loan = create_loan(applicant, "Car Loan", 11000,
                        "Repay Over Number of Periods", 20)
     loan.repay_from_salary = 1
     loan.submit()
     ss = make_employee_salary_slip("*****@*****.**", "Monthly")
     ss.submit()
     self.assertEqual(ss.total_loan_repayment, 582)
     self.assertEqual(
         ss.net_pay,
         (flt(ss.gross_pay) -
          (flt(ss.total_deduction) + flt(ss.total_loan_repayment))))
예제 #10
0
	def test_movement_for_serialized_asset(self):
		asset_item = "Test Serialized Asset Item"
		pr = make_purchase_receipt(item_code=asset_item, rate = 1000, qty=3, location = "Mumbai")
		asset_name = dataent.db.get_value('Asset', {'purchase_receipt': pr.name}, 'name')

		asset = dataent.get_doc('Asset', asset_name)
		month_end_date = get_last_day(nowdate())
		asset.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)

		asset.calculate_depreciation = 1
		asset.append("finance_books", {
			"expected_value_after_useful_life": 200,
			"depreciation_method": "Straight Line",
			"total_number_of_depreciations": 3,
			"frequency_of_depreciation": 10,
			"depreciation_start_date": month_end_date
		})
		asset.submit()
		serial_nos = dataent.db.get_value('Asset Movement', {'reference_name': pr.name}, 'serial_no')

		mov1 = create_asset_movement(asset=asset_name, purpose = 'Transfer',
			company=asset.company, source_location = "Mumbai", target_location="Pune", serial_no=serial_nos)
		self.assertEqual(mov1.target_location, "Pune")

		serial_no = dataent.db.get_value('Serial No', {'asset': asset_name}, 'name')

		employee = make_employee("*****@*****.**")
		create_asset_movement(asset=asset_name, purpose = 'Transfer',
			company=asset.company, serial_no=serial_no, to_employee=employee)

		self.assertEqual(dataent.db.get_value('Serial No', serial_no, 'employee'), employee)

		create_asset_movement(asset=asset_name, purpose = 'Transfer', company=asset.company,
			serial_no=serial_no, from_employee=employee, to_employee="_T-Employee-00001")

		self.assertEqual(dataent.db.get_value('Serial No', serial_no, 'location'), "Pune")

		mov4 = create_asset_movement(asset=asset_name, purpose = 'Transfer',
			company=asset.company, source_location = "Pune", target_location="Nagpur", serial_no=serial_nos)
		self.assertEqual(mov4.target_location, "Nagpur")
		self.assertEqual(dataent.db.get_value('Serial No', serial_no, 'location'), "Nagpur")
		self.assertEqual(dataent.db.get_value('Serial No', serial_no, 'employee'), "_T-Employee-00001")
예제 #11
0
 def test_date_range(self):
     employee = make_employee("*****@*****.**")
     employee_doc = dataent.get_doc("Employee", employee)
     date_of_joining = "2018-01-02"
     relieving_date = "2018-01-03"
     from_date = "2018-01-01"
     to_date = "2018-01-04"
     employee_doc.date_of_joining = date_of_joining
     employee_doc.relieving_date = relieving_date
     employee_doc.save()
     args = {"from_date": from_date, "to_date": to_date}
     data = get_data(args)
     filtered_data = []
     for row in data:
         if row[1] == employee:
             filtered_data.append(row)
     for row in filtered_data:
         self.assertTrue(
             getdate(row[3]) >= getdate(date_of_joining)
             and getdate(row[3]) <= getdate(relieving_date))
예제 #12
0
	def test_leave_balance_value_and_amount(self):
		employee = "*****@*****.**"
		leave_type = "_Test Leave Type Encashment"

		# create the leave policy
		leave_policy = dataent.get_doc({
			"doctype": "Leave Policy",
			"leave_policy_details": [{
				"leave_type": leave_type,
				"annual_allocation": 10
			}]
		}).insert()
		leave_policy.submit()

		# create employee, salary structure and assignment
		employee = make_employee(employee)
		dataent.db.set_value("Employee", employee, "leave_policy", leave_policy.name) 
		salary_structure = make_salary_structure("Salary Structure for Encashment", "Monthly", employee,
			other_details={"leave_encashment_amount_per_day": 50})

		# create the leave period and assign the leaves
		leave_period = create_leave_period(add_months(today(), -3), add_months(today(), 3))
		leave_period.grant_leave_allocation(employee=employee)

		leave_encashment = dataent.get_doc(dict(
			doctype = 'Leave Encashment',
			employee = employee,
			leave_type = leave_type,
			leave_period = leave_period.name,
			payroll_date = today()
		)).insert()

		self.assertEqual(leave_encashment.leave_balance, 10)
		self.assertEqual(leave_encashment.encashable_days, 5)
		self.assertEqual(leave_encashment.encashment_amount, 250)

		leave_encashment.submit()
		self.assertTrue(dataent.db.get_value("Leave Encashment", leave_encashment.name, "additional_salary"))
	def setUp(self):
		make_employee("*****@*****.**")
		make_employee("*****@*****.**")
		create_payroll_period()
		create_exemption_category()
		dataent.db.sql("""delete from `tabEmployee Tax Exemption Declaration`""")
예제 #14
0
    def test_payment_days(self):
        no_of_days = self.get_no_of_days()
        # Holidays not included in working days
        dataent.db.set_value("HR Settings", None,
                             "include_holidays_in_total_working_days", 1)

        # set joinng date in the same month
        make_employee("*****@*****.**")
        if getdate(nowdate()).day >= 15:
            date_of_joining = getdate(add_days(nowdate(), -10))
            relieving_date = getdate(add_days(nowdate(), -10))
        elif getdate(nowdate()).day < 15 and getdate(nowdate()).day >= 5:
            date_of_joining = getdate(add_days(nowdate(), -3))
            relieving_date = getdate(add_days(nowdate(), -3))
        elif getdate(nowdate()).day < 5 and not getdate(nowdate()).day == 1:
            date_of_joining = getdate(add_days(nowdate(), -1))
            relieving_date = getdate(add_days(nowdate(), -1))
        elif getdate(nowdate()).day == 1:
            date_of_joining = getdate(nowdate())
            relieving_date = getdate(nowdate())

        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "date_of_joining", date_of_joining)
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "relieving_date", None)
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "status", "Active")

        ss = make_employee_salary_slip("*****@*****.**", "Monthly")

        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))

        # set relieving date in the same month
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "date_of_joining",
            (add_days(nowdate(), -60)))
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "relieving_date", relieving_date)
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "status", "Left")
        ss.save()

        self.assertEqual(ss.total_working_days, no_of_days[0])
        self.assertEqual(ss.payment_days, getdate(relieving_date).day)

        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "relieving_date", None)
        dataent.db.set_value(
            "Employee",
            dataent.get_value("Employee",
                              {"employee_name": "*****@*****.**"},
                              "name"), "status", "Active")
예제 #15
0
    def test_tax_for_payroll_period(self):
        data = {}
        # test the impact of tax exemption declaration, tax exemption proof submission
        # and deduct check boxes in annual tax calculation
        # as per assigned salary structure 40500 in monthly salary so 236000*5/100/12
        dataent.db.sql("""delete from `tabPayroll Period`""")
        dataent.db.sql("""delete from `tabSalary Component`""")
        payroll_period = create_payroll_period()
        create_tax_slab(payroll_period)
        employee = make_employee("*****@*****.**")
        delete_docs = [
            "Salary Slip", "Additional Salary",
            "Employee Tax Exemption Declaration",
            "Employee Tax Exemption Proof Submission",
            "Employee Benefit Claim", "Salary Structure Assignment"
        ]
        for doc in delete_docs:
            dataent.db.sql("delete from `tab%s` where employee='%s'" %
                           (doc, employee))

        from epaas.hr.doctype.salary_structure.test_salary_structure import \
         make_salary_structure, create_salary_structure_assignment
        salary_structure = make_salary_structure(
            "Stucture to test tax",
            "Monthly",
            other_details={"max_benefits": 100000},
            test_tax=True)
        create_salary_structure_assignment(employee, salary_structure.name,
                                           payroll_period.start_date)

        # create salary slip for whole period deducting tax only on last period
        # to find the total tax amount paid
        create_salary_slips_for_payroll_period(employee,
                                               salary_structure.name,
                                               payroll_period,
                                               deduct_random=False)
        tax_paid = get_tax_paid_in_period(employee)

        # total taxable income 586000, 250000 @ 5%, 86000 @ 20% ie. 12500 + 17200
        annual_tax = 113568
        try:
            self.assertEqual(tax_paid, annual_tax)
        except AssertionError:
            print("\nSalary Slip - Annual tax calculation failed\n")
            raise
        dataent.db.sql("""delete from `tabSalary Slip` where employee=%s""",
                       (employee))

        # create exemption declaration so the tax amount varies
        create_exemption_declaration(employee, payroll_period.name)

        # create for payroll deducting in random months
        data["deducted_dates"] = create_salary_slips_for_payroll_period(
            employee, salary_structure.name, payroll_period)
        tax_paid = get_tax_paid_in_period(employee)

        # No proof, benefit claim sumitted, total tax paid, should not change
        try:
            self.assertEqual(tax_paid, annual_tax)
        except AssertionError:
            print("\nSalary Slip - Tax calculation failed on following case\n",
                  data, "\n")
            raise

        # Submit proof for total 120000
        data["proof-1"] = create_proof_submission(employee, payroll_period,
                                                  50000)
        data["proof-2"] = create_proof_submission(employee, payroll_period,
                                                  70000)

        # Submit benefit claim for total 50000
        data["benefit-1"] = create_benefit_claim(employee, payroll_period,
                                                 15000, "Medical Allowance")
        data["benefit-2"] = create_benefit_claim(employee, payroll_period,
                                                 35000,
                                                 "Leave Travel Allowance")

        dataent.db.sql("""delete from `tabSalary Slip` where employee=%s""",
                       (employee))
        data["deducted_dates"] = create_salary_slips_for_payroll_period(
            employee, salary_structure.name, payroll_period)
        tax_paid = get_tax_paid_in_period(employee)

        # total taxable income 416000, 166000 @ 5% ie. 8300
        try:
            self.assertEqual(tax_paid, 88608)
        except AssertionError:
            print("\nSalary Slip - Tax calculation failed on following case\n",
                  data, "\n")
            raise

        # create additional salary of 150000
        dataent.db.sql("""delete from `tabSalary Slip` where employee=%s""",
                       (employee))
        data["additional-1"] = create_additional_salary(
            employee, payroll_period, 50000)
        data["additional-2"] = create_additional_salary(
            employee, payroll_period, 100000)
        data["deducted_dates"] = create_salary_slips_for_payroll_period(
            employee, salary_structure.name, payroll_period)

        # total taxable income 566000, 250000 @ 5%, 66000 @ 20%, 12500 + 13200
        tax_paid = get_tax_paid_in_period(employee)
        try:
            self.assertEqual(tax_paid, 121211)
        except AssertionError:
            print("\nSalary Slip - Tax calculation failed on following case\n",
                  data, "\n")
            raise
        dataent.db.sql(
            """delete from `tabAdditional Salary` where employee=%s""",
            (employee))

        # undelete fixture data
        dataent.db.rollback()
예제 #16
0
 def setUp(self):
     make_employee("*****@*****.**")
     make_employee("*****@*****.**")
     dataent.db.sql("""delete from `tabEmployee Transfer`""")