예제 #1
0
    def assign_team_leader(
        self,
        request_data: request_data_models.CreateTeamLeaderOrEmployeeRequestData
    ):
        """
        Assign team leader to a team without a leader
        :param request_data:
        :return:
        """
        # check if team exists in repository
        team = self._team_repo.team_exists(team_pk=request_data.team_id)
        if team:
            # team is in repository
            if self._team_repo.has_a_leader(team_pk=request_data.team_id):
                raise domain_validators.TeamHasALeader()
            # check is employee exist in repository before assigning him/her as a leader
            employee = self._employee_repo.employee_exists(
                employee_pk=request_data.employee_id)
            if employee:
                # create new team
                new_tl_entity = TeamLeaderEntity(
                    leader=employee,
                    team=team,
                    created_at=datetime.datetime.now(),
                    updated_at=datetime.datetime.now())
                saved_tl_entity = self._team_leader_repo.save_team_leader(
                    new_tl_entity)
                employee.is_a_leader = True
                return saved_tl_entity

            else:
                raise domain_validators.EmployeeDoesNotExist()
        else:
            raise domain_validators.TeamDoesNotExist()
    def create_employee(
            self, request_data: request_data_models.CreateEmployeeRequestData):
        """
        Create new employee along with employee work work arrangement amd work time is employee is part time
        :param request_data:
        :return:
        """
        # check if new employee DI exist in the database
        if self._employee_repo.is_employee_id_unique(
                employee_id=request_data.employee_id) is False:
            raise EmployeeIDIsNotUnique()
        team = self._team_repo.team_exists(request_data.team_id)
        if team is None:
            raise domain_validators.TeamDoesNotExist()

        employee_entity = self._create_new_employee_entity(request_data)
        if employee_entity.is_part_time():
            if request_data.work_arrangement is None:
                raise WorkArrangementPercentageNull()
            work_arrangement = WorkArrangementEntity(
                percent=request_data.work_arrangement, team=team)
            new_employee = self._add_part_time_employee(
                employee_entity=employee_entity,
                work_arrangement=work_arrangement)
        else:
            new_employee = self._add_full_time_employee(employee_entity, team)
        # add team employee
        # check if team exist and team employee
        new_te_entity = TeamEmployeeEntity(employee=new_employee,
                                           team=team,
                                           created_at=datetime.datetime.now(),
                                           updated_at=datetime.datetime.now())
        self._team_employee_repo.save_team_employee(new_te_entity)
        # check if team has a leader
        if team.has_a_leader:
            # team has a leader already
            pass
        else:
            # no team leader, make new team member a leader
            new_tl_entity = TeamLeaderEntity(
                leader=new_employee,
                team=team,
                created_at=datetime.datetime.now(),
                updated_at=datetime.datetime.now())
            tl_entity = self._team_leader_repo.save_team_leader(new_tl_entity)
            new_employee.is_a_leader = True
        return new_employee
예제 #3
0
    def add_team_employee(
        self,
        request_data: request_data_models.CreateTeamLeaderOrEmployeeRequestData
    ):
        """
        Add new team employee to repository. If a team an employee is being added to doesn't have a leader, the
        employee becomes a leader
        :param request_data:
        :return:
        """
        team = self._team_repo.team_exists(request_data.team_id)
        if team is None:
            raise domain_validators.TeamDoesNotExist()
        employee = self._employee_repo.employee_exists(
            employee_pk=request_data.employee_id)
        if employee is None:
            raise domain_validators.EmployeeDoesNotExist()

        if self._team_employee_repo.is_a_member(
                team_pk=request_data.team_id,
                employee_pk=request_data.employee_id):
            raise domain_validators.EmployeeIsATeamMember()
        else:
            print("Not a member")
            # save team new team employee
            new_te_entity = TeamEmployeeEntity(
                team=team,
                employee=employee,
                created_at=datetime.datetime.now(),
                updated_at=datetime.datetime.now())
            team_employee = self._team_employee_repo.save_team_employee(
                new_te_entity)
            if team.leader:
                pass
            else:
                team.leader = employee
                self._team_repo.save(team)
            return team_employee
예제 #4
0
    def change_team_leader(
            self,
            request_data: request_data_models.UpdateTeamLeaderRequestData):
        """
        Change  a leader of a team to a new leader
        :param request_data:
        :return:
        """
        # check if team exists in repository
        old_team_leader = self._team_leader_repo.retrieve_team_leader(
            request_data.id)

        if old_team_leader is None:
            raise domain_validators.ObjectEntityDoesNotExist(
                "Team leader does not exist")
        team = self._team_repo.team_exists(team_pk=request_data.team_id)
        if team is None:
            raise domain_validators.TeamDoesNotExist()
        if team.id != old_team_leader.id:
            raise domain_validators.UpdateOfTeamLeaderOfWrongTeam()
        print(F"Old team: {team.id}")
        # team is in repository
        # check is employee exist in repository before assigning him/her as a leader
        employee = self._employee_repo.employee_exists(
            employee_pk=request_data.employee_id)
        if employee is None:
            raise domain_validators.EmployeeDoesNotExist()
        updated_tl_entity = TeamLeaderEntity(
            id=old_team_leader.id,
            leader=employee,
            team=team,
            created_at=old_team_leader.created_at,
            updated_at=datetime.datetime.now())

        tl_entity = self._team_leader_repo.save_team_leader(updated_tl_entity)
        return tl_entity
예제 #5
0
    def add_work_arrangement(
            self, request_data: request_data_models.CreateWorkArrangementData):
        """
        Add new work arrangement of an employee
        :param request_data:
        :return:
        """
        employee = self._employee_repo.employee_exists(
            request_data.employee_id)
        if employee is None:
            raise domain_validators.ObjectEntityDoesNotExist(
                "Employee does not exist")
        # check if employee is part time: can not add multiple work arrangement for full time employees
        if not employee.is_part_time():
            raise domain_validators.MultipleWorksForFullTimeEmployee()
        team = self._team_repo.team_exists(request_data.team_id)
        # check if team exist in repository
        if team is None:
            raise domain_validators.TeamDoesNotExist()

        total_percent = self._work_arrangement_repo.get_employee_work_arrangements_percent(
            employee_pk=employee.id)
        if total_percent + request_data.percent > 100:
            raise domain_validators.Max40HoursExceeded()

        # check if an employee is a team employee
        if self._team_employee_repo.is_a_member(team_pk=team.id,
                                                employee_pk=employee.id):
            if self._work_arrangement_repo.has_work_arrangement_with_team(
                    employee_pk=employee.id, team_pk=team.id):
                # employee can not have more than 1 work arrangement in on team
                raise domain_validators.MultipleWorkArrangementInOneTeam()
        else:
            # add team employee if an employee is not a team employee
            new_te_entity = TeamEmployeeEntity(
                employee=employee,
                team=team,
                created_at=datetime.datetime.now(),
                updated_at=datetime.datetime.now())
            self._team_employee_repo.save_team_employee(new_te_entity)
            # check if team has a leader otherwise make an employee a team leader
            if team.has_a_leader:
                # team already have a leader
                pass
            else:
                # No leader, make new employee the leader by default
                new_tl_entity = TeamLeaderEntity(
                    leader=employee,
                    team=team,
                    created_at=datetime.datetime.now(),
                    updated_at=datetime.datetime.now())
                self._team_leader_repo.save_team_leader(new_tl_entity)

        # create work arrangement entity
        work_arrangement = WorkArrangementEntity(percent=request_data.percent,
                                                 remarks=request_data.remarks,
                                                 employee=employee,
                                                 team=team)
        # save new work arrangement
        new_wa_entity = self._work_arrangement_repo.save(work_arrangement)
        # save respective work time
        work_hours = WorkArrangementEntity.calculate_work_time_hours(
            request_data.percent)
        work_time = WorkTimeEntity(hours=work_hours,
                                   employee=employee,
                                   work_arrangement=new_wa_entity)
        self._work_time_repo.save_work_time(work_time)
        # get employee with update work times and pay
        employee_with_updated_pay = self._employee_repo.retrieve_by_id(
            new_wa_entity.employee.id)
        new_wa_entity.employee = employee_with_updated_pay
        return new_wa_entity
예제 #6
0
    def update_work_arrangement(
            self, request_data: request_data_models.UpdateWorkArrangementData):
        """
        Update existing work arrangement
        :param request_data:
        :return:
        """
        work_arrangement_entity = self._work_arrangement_repo.work_arrangement_exists(
            wa_pk=request_data.id)
        if work_arrangement_entity is None:
            raise domain_validators.ObjectEntityDoesNotExist(
                "Work arrangement does not exist in repository")

        employee = self._employee_repo.employee_exists(
            request_data.employee_id)
        if employee is None:
            raise domain_validators.ObjectEntityDoesNotExist(
                "Employee doesn't exist")
        # check if employee is part time: can not add multiple work arrangement for full time employees
        if not employee.is_part_time():
            raise domain_validators.MultipleWorksForFullTimeEmployee()
        team = self._team_repo.team_exists(request_data.team_id)
        # check if team exist in repository
        if team is None:
            raise domain_validators.TeamDoesNotExist()
        total_percent = self._work_arrangement_repo.get_employee_work_arrangements_percent(
            employee_pk=employee.id)
        if (total_percent -
                work_arrangement_entity.percent) + request_data.percent > 100:
            raise domain_validators.Max40HoursExceeded()

        # check if an employee is a team employee
        if self._team_employee_repo.is_a_member(team_pk=team.id,
                                                employee_pk=employee.id):
            if self._work_arrangement_repo.has_work_arrangement_with_team(employee_pk=request_data.id,
                                                                          team_pk=team.id) and \
                    request_data.id != employee.id:
                # employee can not have more than 1 work arrangement in on team if work arrangement team is updated
                raise domain_validators.MultipleWorkArrangementInOneTeam()
        else:
            # add team employee if an employee is not a team employee
            new_te_entity = TeamEmployeeEntity(
                employee=employee,
                team=team,
                created_at=datetime.datetime.now(),
                updated_at=datetime.datetime.now())
            self._team_employee_repo.save_team_employee(new_te_entity)
            # check if team has a leader otherwise make an employee a team leader
            if team.has_a_leader:
                pass
            else:
                new_tl_entity = TeamLeaderEntity(
                    leader=employee,
                    team=team,
                    created_at=datetime.datetime.now(),
                    updated_at=datetime.datetime.now())
                self._team_leader_repo.save_team_leader(new_tl_entity)

        # create updated work arrangement entity
        work_arrangement = WorkArrangementEntity(id=request_data.id,
                                                 percent=request_data.percent,
                                                 remarks=request_data.remarks,
                                                 employee=employee,
                                                 team=team)
        # save new work arrangement
        new_wa_entity = self._work_arrangement_repo.save(work_arrangement)
        # get and update respective work time
        work_time = self._work_time_repo.retrieve_by_work_arrangement_pk(
            work_arrangement_pk=new_wa_entity.id)
        work_hours = WorkArrangementEntity.calculate_work_time_hours(
            request_data.percent)
        print(F"work time {work_time}")
        if work_time:
            # work time in repository: update it
            work_time.hours = work_hours
        else:
            # work time not in database: create new one
            work_time = WorkTimeEntity(hours=work_hours,
                                       employee=employee,
                                       work_arrangement=new_wa_entity)
        self._work_time_repo.save_work_time(work_time)
        # get employee with update work times and pay
        employee_with_updated_pay = self._employee_repo.retrieve_by_id(
            new_wa_entity.employee.id)
        new_wa_entity.employee = employee_with_updated_pay
        return new_wa_entity