def setUp(self):
     db = FakeDb().build()
     self.time_sheet_storage = TimeSheetsStorage(db)
     self.employee_storage = EmployeesStorage(db)
     self.calculator = VacationCalculator()
     reporter = ExcelReporter()
     self.use_case = ReporterUseCase(self.employee_storage,
                                     self.time_sheet_storage,
                                     self.calculator, reporter)
    def test_update_time_sheet(self):
        ts_storage = TimeSheetsStorage(FakeDb().build())
        e_storage = EmployeesStorage(FakeDb().build())
        e_provider = EmployeeProvider()
        ts_provider = TimeSheetProvider()
        e_use_case = GetEmployeeUseCase(e_provider, e_storage)
        calculator = VacationCalculator()
        use_case = UpdateTimeSheetUseCase(ts_provider, e_use_case, calculator,
                                          ts_storage)

        use_case.update_time_sheet(0, sheet=fixtures.load('february'), norm=19)

        saved_time_sheet = ts_storage.find_by_id(0)
        self.assertEqual(saved_time_sheet.id, 0)
        self.assertEqual(saved_time_sheet.sheet, fixtures.load('february'))
        self.assertEqual(saved_time_sheet.norm, 19)
        self.assertNotEqual(saved_time_sheet.vacation, 1.0)

        use_case.update_time_sheet_for(0,
                                       2019,
                                       1,
                                       sheet=fixtures.load('full_january'))

        saved_time_sheet = ts_storage.find_first_by(employee_id=0,
                                                    year=2019,
                                                    month=1)
        self.assertEqual(saved_time_sheet.employee_id, 0)
        self.assertEqual(saved_time_sheet.sheet, fixtures.load('full_january'))
        self.assertEqual(saved_time_sheet.norm, 19)
        self.assertNotEqual(saved_time_sheet.vacation, 1.0)
class TestProvideEmployeeUseCase(unittest.TestCase):
    def setUp(self):
        db = FakeDb().build()
        self.time_sheet_storage = TimeSheetsStorage(db)
        self.employee_storage = EmployeesStorage(db)
        self.calculator = VacationCalculator()
        reporter = ExcelReporter()
        self.use_case = ReporterUseCase(self.employee_storage,
                                        self.time_sheet_storage,
                                        self.calculator, reporter)

    def test_get_report_data(self):
        data = self.use_case.get_data(datetime(2018, 1, 1))
        employees = self.employee_storage.find_by(activated=True)
        time_sheets = self.time_sheet_storage.get_all()

        expected_columns_count = 6
        self.assertEqual(data.__len__(), expected_columns_count)

        expected_names = [employee.name for employee in employees]
        self.assertEqual(data['ФИО'], expected_names)
        expected_worked_days = [
            self.calculator.calculate_days_worked(time_sheet)
            for time_sheet in time_sheets
        ]
        self.assertEqual(data['Отработано дней'], expected_worked_days)
        expected_norms = [time_sheet.norm for time_sheet in time_sheets]
        self.assertEqual(data['Норма рабочих дней'], expected_norms)
        expected_month_vac = [
            time_sheet.vacation for time_sheet in time_sheets
        ]
        self.assertEqual(data['Зачислено отпускных дней'], expected_month_vac)
        expected_used_vac = [
            self.calculator.calculate_used_vacation(time_sheet)
            for time_sheet in time_sheets
        ]
        self.assertEqual(data['Использовано отпускных дней'],
                         expected_used_vac)
        expected_total_vacation = [employee.vacation for employee in employees]
        self.assertEqual(data['Всего отпускных дней'], expected_total_vacation)

    def test_get_report(self):
        path = self.use_case.get_formed_report_by_date(datetime(2018, 1, 1))
        report_path = '{}/reports/{}.xlsx'.format(ROOT_APP_PATH, '1.2018')
        self.assertEqual(path, report_path)
        os.remove(path)
    def test_update_one_day(self):
        ts_storage = TimeSheetsStorage(FakeDb().build())
        e_storage = EmployeesStorage(FakeDb().build())
        e_provider = EmployeeProvider()
        ts_provider = TimeSheetProvider()
        e_use_case = GetEmployeeUseCase(e_provider, e_storage)
        calculator = VacationCalculator()
        use_case = UpdateTimeSheetUseCase(ts_provider, e_use_case, calculator,
                                          ts_storage)

        use_case.update_day_mark(0, 1, 0.5)

        saved_time_sheet = ts_storage.find_by_id(0)
        self.assertEqual(saved_time_sheet.sheet[0], 0.5)
        self.assertNotEqual(saved_time_sheet.vacation, 1.0)
    def test_update_time_sheet_for_not_exist(self):
        ts_storage = TimeSheetsStorage(FakeDb().build())
        e_storage = EmployeesStorage(FakeDb().build())
        e_provider = EmployeeProvider()
        ts_provider = TimeSheetProvider()
        e_use_case = GetEmployeeUseCase(e_provider, e_storage)
        calculator = VacationCalculator()
        use_case = UpdateTimeSheetUseCase(ts_provider, e_use_case, calculator,
                                          ts_storage)
        try:
            ts_storage.find_first_by(employee_id=3, year=2019, month=5)
            raise Exception('Time sheet should not exist')
        except NotFoundError:
            pass
        use_case.update_time_sheet_for(employee_id=3,
                                       year=2019,
                                       month=5,
                                       sheet=fixtures.load('february'))

        saved_time_sheet = ts_storage.find_first_by(employee_id=3,
                                                    year=2019,
                                                    month=5)
        self.assertEqual(saved_time_sheet.sheet, fixtures.load('february'))
示例#6
0
    def test_calculate_with_full_time_sheet(self):
        time_sheet = self.january_time_sheet
        calculator = VacationCalculator()

        time_sheet.rate = RateCalculator.MIN_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 3.29)

        time_sheet.rate = RateCalculator.DAYS_FOR_3_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.88)

        time_sheet.rate = RateCalculator.DAYS_FOR_2_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.56)

        time_sheet.rate = RateCalculator.MAX_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.3)
示例#7
0
    def test_calculate_with_compensation_sheet(self):
        time_sheet = self.january_time_sheet
        time_sheet.sheet = fixtures.load("compensation_january")
        calculator = VacationCalculator()

        time_sheet.rate = RateCalculator.MIN_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 3.29)

        time_sheet.rate = RateCalculator.DAYS_FOR_3_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.88)

        time_sheet.rate = RateCalculator.DAYS_FOR_2_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.56)

        time_sheet.rate = RateCalculator.MAX_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 2.3)
示例#8
0
    def test_calculate_with_half_time_sheet(self):
        time_sheet = self.january_time_sheet
        time_sheet.sheet = fixtures.load("half_january")
        calculator = VacationCalculator()

        time_sheet.rate = RateCalculator.MIN_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, -5.86)

        time_sheet.rate = RateCalculator.DAYS_FOR_3_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, -6.12)

        time_sheet.rate = RateCalculator.DAYS_FOR_2_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, -6.33)

        time_sheet.rate = RateCalculator.MAX_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, -6.5)
示例#9
0
    def test_calculate_with_full_sheet(self):
        time_sheet = self.january_time_sheet
        time_sheet.sheet = fixtures.load("full_january")
        calculator = VacationCalculator()

        time_sheet.rate = RateCalculator.MIN_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 4.43)

        time_sheet.rate = RateCalculator.DAYS_FOR_3_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 3.88)

        time_sheet.rate = RateCalculator.DAYS_FOR_2_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 3.44)

        time_sheet.rate = RateCalculator.MAX_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet)
        self.assertEqual(time_sheet.vacation, 3.1)
示例#10
0
    def test_calculate_with_half_time_sheet_for_day(self):
        time_sheet = self.january_time_sheet
        time_sheet.sheet = fixtures.load("half_january")
        calculator = VacationCalculator()

        time_sheet.rate = RateCalculator.MIN_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet, 12)
        self.assertEqual(time_sheet.vacation, 2.14)
        self.assertEqual(time_sheet.norm, 23)

        time_sheet.rate = RateCalculator.DAYS_FOR_3_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet, 12)
        self.assertEqual(time_sheet.vacation, 1.88)
        self.assertEqual(time_sheet.norm, 23)

        time_sheet.rate = RateCalculator.DAYS_FOR_2_YEARS
        time_sheet = calculator.calculate_vacation(time_sheet, 12)
        self.assertEqual(time_sheet.vacation, 1.67)
        self.assertEqual(time_sheet.norm, 23)

        time_sheet.rate = RateCalculator.MAX_DAYS
        time_sheet = calculator.calculate_vacation(time_sheet, 12)
        self.assertEqual(time_sheet.vacation, 1.5)
        self.assertEqual(time_sheet.norm, 23)
示例#11
0
    def create_app(self):
        if self.app is None:
            self.app = App()

        if self.db is None:
            self.db = DbBuilder().build()

        self.to_hash = ToHash()
        self.tokenizer = Tokenizer()

        self.vacation_calculator = VacationCalculator()
        self.employee_storage = EmployeesStorage(self.db)
        self.time_sheet_storage = TimeSheetsStorage(self.db)

        self.employee_provider = EmployeeProvider()
        self.time_sheet_provider = TimeSheetProvider()

        self.app.get_employee_use_case = GetEmployeeUseCase(self.employee_provider,
                                                            self.employee_storage)
        self.app.get_employees_use_case = GetAllEmployeeUseCase(self.employee_provider,
                                                                self.employee_storage)
        self.app.create_employee_use_case = CreateEmployeeUseCase(self.employee_provider,
                                                                  self.employee_storage,
                                                                  self.tokenizer,
                                                                  self.to_hash)
        self.app.check_employee_use_case = CheckEmployeeUseCase(self.employee_provider,
                                                                self.employee_storage,
                                                                self.tokenizer,
                                                                self.to_hash)
        self.app.check_admin_rights_use_case = CheckAdminRightsUseCase(self.employee_storage)
        self.app.register_employee_use_case = RegisterEmployeeUseCase(self.employee_provider,
                                                                      self.employee_storage)
        self.app.update_employee_use_case = UpdateEmployeeUseCase(self.to_hash,
                                                                  self.employee_provider,
                                                                  self.employee_storage)
        self.app.admin_rights_employee_use_case = AdminRightsEmployeeUseCase(self.employee_provider,
                                                                             self.employee_storage)

        self.app.get_time_sheet_use_case = GetTimeSheetUseCase(self.time_sheet_provider,
                                                               self.app.get_employee_use_case,
                                                               self.time_sheet_storage)
        self.app.get_time_sheets_use_case = GetTimeSheetsUseCase(self.time_sheet_provider,
                                                                 self.app.get_employee_use_case,
                                                                 self.time_sheet_storage)
        self.app.create_time_sheet_use_case = CreateTimeSheetUseCase(self.time_sheet_provider,
                                                                     self.time_sheet_storage)
        self.app.update_time_sheet_use_case = UpdateTimeSheetUseCase(self.time_sheet_provider,
                                                                     self.app.get_employee_use_case,
                                                                     self.vacation_calculator,
                                                                     self.time_sheet_storage)
        self.app.close_time_sheet_use_case = CloseTimeSheetUseCase(self.time_sheet_provider,
                                                                   self.time_sheet_storage)

        self.app.calculate_vacation_use_case = CalculateVacationUseCase(self.vacation_calculator,
                                                                        self.employee_storage,
                                                                        self.time_sheet_storage)

        self.registration_employee_controller = RegistrationEmployeeController(
            self.app.create_employee_use_case)
        self.authentication_employee_controller = AuthenticationEmployeeController(
            self.app.check_employee_use_case)
        self.get_employee_profile_controller = ProfileController(
            self.app.get_employee_use_case,
            self.app.check_employee_use_case,
            self.app.update_employee_use_case)
        self.accept_employee_controller = AcceptEmployeeController(
            self.app.check_admin_rights_use_case,
            self.app.register_employee_use_case)
        self.employee_controller = GetEmployeeController(self.app.get_employee_use_case)
        self.get_employees_controller = GetEmployeesController(self.app.get_employees_use_case)

        self.time_sheet_controller = TimeSheetController(
            self.app.get_time_sheet_use_case,
            self.app.update_time_sheet_use_case
        )
        self.day_of_time_sheet_controller = DayOfTimeSheetController(
            self.app.get_time_sheet_use_case,
            self.app.update_time_sheet_use_case
        )
        self.employee_time_sheets_controller = EmployeeTimeSheetsController(
            self.app.get_time_sheets_use_case, self.app.update_time_sheet_use_case)
        self.get_employees_time_sheets_controller = GetEmployeesTimeSheetsController(
            self.app.get_time_sheets_use_case)

        self.calculate_vacation_controller = VacationCalculatorController(
            self.app.calculate_vacation_use_case)

        self._init_routes()
        return self.app