open-synergy/opnsynid-hr

View on GitHub
hr_payslip_import_input/tests/test_import.py

Summary

Maintainability
D
2 days
Test Coverage
# -*- coding: utf-8 -*-
# Copyright 2017 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import time

from openerp.exceptions import Warning as UserError
from openerp.modules.module import get_module_resource
from openerp.tests.common import TransactionCase


class TestImport(TransactionCase):
    def get_file(self, filename):
        """Retrieve file from test data, encode it as base64"""
        path = get_module_resource("hr_payslip_import_input", "tests", "data", filename)
        test_data = open(path).read()
        return test_data.encode("base64")

    def setUp(self, *args, **kwargs):
        super(TestImport, self).setUp(*args, **kwargs)
        # Objects
        self.obj_hr_employee = self.env["hr.employee"]
        self.obj_payslip = self.env["hr.payslip"]
        self.obj_contract = self.env["hr.contract"]
        self.obj_struct = self.env["hr.payroll.structure"]
        self.obj_payslip_run = self.env["hr.payslip.run"]
        self.obj_payslip_emp = self.env["hr.payslip.employees"]
        self.wiz = self.env["hr.payslip_import_input"]

        # Data
        self.country = self.env.ref("base.id")
        self.department = self.env.ref("hr.dep_rd")
        self.company = self.env.ref("base.main_company")
        self.type = self.env.ref("hr_contract.hr_contract_type_emp")
        self.resource = self.env.ref("resource.timesheet_group1")
        self.rule_1 = self.env.ref("hr_payroll.hr_salary_rule_houserentallowance1")
        self.rule_2 = self.env.ref("hr_payroll.hr_salary_rule_convanceallowance1")
        self.rule_3 = self.env.ref("hr_payroll.hr_salary_rule_professionaltax1")
        self.rule_4 = self.env.ref("hr_payroll.hr_salary_rule_providentfund1")
        self.rule_5 = self.env.ref("hr_payroll.hr_salary_rule_meal_voucher")
        self.rule_6 = self.env.ref("hr_payroll.hr_salary_rule_sales_commission")
        self.employee_1 = self._create_employee_1()
        self.employee_2 = self._create_employee_2()
        self.struct = self._create_structure()
        self.contract_1 = self._create_contract_1()
        self.contract_2 = self._create_contract_2()

    def _create_employee_1(self):
        vals = {
            "name": "Alan",
            "country_id": self.country.id,
            "department_id": self.department.id,
            "birthday": "1967-01-01",
            "gender": "male",
        }

        employee = self.obj_hr_employee.create(vals)
        employee.identification_id = "001"
        return employee

    def _create_employee_2(self):
        vals = {
            "name": "Robert",
            "identification_id": "002",
            "country_id": self.country.id,
            "department_id": self.department.id,
            "birthday": "1982-01-01",
            "gender": "male",
        }

        employee = self.obj_hr_employee.create(vals)
        employee.identification_id = "002"
        return employee

    def _create_structure(self):
        vals = {
            "name": "Test Salary Structure",
            "code": "TST",
            "company_id": self.company.id,
            "rule_ids": [
                (
                    6,
                    0,
                    [
                        self.rule_1.id,
                        self.rule_2.id,
                        self.rule_3.id,
                        self.rule_4.id,
                        self.rule_5.id,
                        self.rule_6.id,
                    ],
                )
            ],
        }

        struct = self.obj_struct.create(vals)
        return struct

    def _create_contract_1(self):
        vals = {
            "name": "Contract 1",
            "date_start": time.strftime("%Y-%m") + "-1",
            "date_end": time.strftime("%Y") + "-12-31",
            "wage": 7500000.0,
            "type_id": self.type.id,
            "employee_id": self.employee_1.id,
            "struct_id": self.struct.id,
            "working_hours": self.resource.id,
        }

        contract = self.obj_contract.create(vals)
        return contract

    def _create_contract_2(self):
        vals = {
            "name": "Contract 2",
            "date_start": time.strftime("%Y-%m") + "-1",
            "date_end": time.strftime("%Y") + "-12-31",
            "wage": 7500000.0,
            "type_id": self.type.id,
            "employee_id": self.employee_2.id,
            "struct_id": self.struct.id,
            "working_hours": self.resource.id,
        }

        contract = self.obj_contract.create(vals)
        return contract

    def test_import_data(self):
        # Generate Payslip
        vals = {
            "name": "Test Payslip",
            "date_end": time.strftime("%Y-%m-%d"),
            "date_start": time.strftime("%Y-%m-%d"),
        }
        payslip_run = self.obj_payslip_run.create(vals)
        data_wzd = {"employee_ids": [(6, 0, [self.employee_1.id, self.employee_2.id])]}
        payslip_emp = self.obj_payslip_emp.with_context(
            active_id=payslip_run.id
        ).create(data_wzd)
        payslip_emp.compute_sheet()

        # Check Generate Payslip
        self.assertNotEqual(len(payslip_run.slip_ids), 0)

        # Check Input
        z = 0
        for payslip in payslip_run.slip_ids:
            if payslip.input_line_ids:
                for _number in payslip.input_line_ids:
                    z += 1

        self.assertEqual(z, 4)

        # Check Error 1
        wiz = self.wiz.with_context(active_id=[payslip_run.id]).create(
            {
                "data": self.get_file("import_error_1.xlsx"),
                "name": "import_error_1.xlsx",
                "delimeter": "",
            }
        )

        msg_error_1 = "Not a valid file!"
        with self.assertRaises(UserError) as error:
            wiz.import_data()

        self.assertEqual(error.exception.message, msg_error_1)

        # Check Error 2
        wiz = self.wiz.with_context(active_id=[payslip_run.id]).create(
            {
                "data": self.get_file("import_error_2.csv"),
                "name": "import_error_2.csv",
            }
        )

        msg_error_2 = "Not employee or code or amount keys found"
        with self.assertRaises(UserError) as error:
            wiz.import_data()

        self.assertEqual(error.exception.message, msg_error_2)

        # Import Data
        wiz = self.wiz.with_context(active_id=[payslip_run.id]).create(
            {
                "data": self.get_file("test_import.csv"),
                "name": "test_import.csv",
                "delimeter": ",",
            }
        )
        wiz.import_data()

        # Check Import Data
        self.assertEqual(payslip_run.imported_files.name, "test_import.csv")

        # Check Process Input
        x = 0
        for inputs in payslip_run.process_inputs:
            if inputs.input_id:
                x += 1

        self.assertEqual(x, 4)

        # Check Error Duplicate Data
        wiz = self.wiz.with_context(active_id=[payslip_run.id]).create(
            {
                "data": self.get_file("test_import.csv"),
                "name": "test_import.csv",
                "delimeter": ",",
            }
        )
        msg_error_3 = "Cannot import with the same file"
        with self.assertRaises(UserError) as error:
            wiz.import_data()

        self.assertEqual(error.exception.message, msg_error_3)