Пример #1
0
    def handle_cancel_request_with_another_year(cls, remain_leave_last_year,
                                                request_off):
        present_year = datetime.now().year
        list_date = DateOff.objects.filter(request_off_id=request_off.id)
        list_date_present_year = list(
            filter(lambda date_off: date_off.date.year == present_year,
                   list_date))
        list_date_off_all = list(list_date) + list_date_present_year
        list_date_another_year = list(
            filter(lambda date_off: list_date_off_all.count(date_off) == 1,
                   list_date_off_all))

        if list_date_another_year[0].date.year == datetime.now().year - 1:
            RemainLeaveService.handle_annual_leave(
                request_off.profile,
                -DateOffService.get_num_days_off_by_list_date(
                    list_date_present_year), True)

            RemainLeaveService.handle_annual_leave_last_year(
                request_off.profile,
                -DateOffService.get_num_days_off_by_list_date(
                    list_date_another_year))
        else:
            RemainLeaveService.handle_annual_leave(
                request_off.profile,
                -DateOffService.get_num_days_off_by_list_date(
                    list_date_present_year))
            RemainLeaveService.handle_annual_leave_next_year(
                request_off.profile,
                -DateOffService.get_num_days_off_by_list_date(
                    list_date_another_year))
Пример #2
0
    def get_unconfirmed_days(cls, list_request_off_unconfirmed):
        company_setting = Company.objects.all().first()
        if not company_setting:
            return Exception('Company setting not found')
        month_annual_leave_last_year = company_setting.expired_annual_leave_last_year
        list_date_unconfirmed = []
        for request_off in list_request_off_unconfirmed:
            list_date_unconfirmed += DateOff.objects.filter(
                request_off_id=request_off.id,
                request_off__type_off__add_sub_day_off=1)

        list_date_sub_annual_leave_last_year = list(
            filter(
                lambda date_off: date_off.date.month <
                month_annual_leave_last_year, list_date_unconfirmed))
        list_date_not_sub_annual_leave_last_year = list(
            filter(
                lambda date_off: date_off.date.month >=
                month_annual_leave_last_year, list_date_unconfirmed))

        unconfirmed_days_sub_annual_leave_last_year = DateOffService.get_num_days_off_by_list_date(
            list_date_sub_annual_leave_last_year)
        unconfirmed_days_not_sub_annual_leave_last_year = DateOffService.get_num_days_off_by_list_date(
            list_date_not_sub_annual_leave_last_year)

        return unconfirmed_days_sub_annual_leave_last_year, unconfirmed_days_not_sub_annual_leave_last_year
Пример #3
0
    def get_request_canceled(cls, request_off):
        company_setting = Company.objects.all().first()
        if not company_setting:
            return Exception('Company setting not found')
        month_use_annual_leave_last_year = company_setting.expired_annual_leave_last_year

        list_date_approve = [
            date_off for date_off in DateOff.objects.filter(
                request_off_id__profile_id=request_off.profile.id,
                request_off_id__status=Workday.STATUS_APPROVED)
        ]

        list_date_by_request_off = [
            date_off for date_off in DateOff.objects.filter(
                request_off_id=request_off.id)
        ]

        list_date_out_sub_month = list(
            filter(
                lambda date_off: date_off.date.month >
                month_use_annual_leave_last_year - 1,
                list_date_by_request_off))
        list_date_in_sub_month = list(
            filter(
                lambda date_off: date_off.date.month <
                month_use_annual_leave_last_year, list_date_by_request_off))

        list_date_approve_in_sub_month = list(
            filter(
                lambda date_off: date_off.date.month <
                month_use_annual_leave_last_year, list_date_approve))
        list_date_all = list_date_approve_in_sub_month + list_date_in_sub_month

        list_date_approve_in_sub_month_not_request_off = list(
            filter(lambda date_off: list_date_all.count(date_off) == 1,
                   list_date_all))

        num_days_off_in_sub_month_not_request = DateOffService.get_num_days_off_by_list_date(
            list_date_approve_in_sub_month_not_request_off)

        num_days_off_in_sub_month_by_request = DateOffService.get_num_days_off_by_list_date(
            list_date_in_sub_month)
        return num_days_off_in_sub_month_not_request, num_days_off_in_sub_month_by_request, list_date_out_sub_month
Пример #4
0
 def action_cancel(cls, request_off_id, profile):
     if profile.user.is_staff:
         request_off = RequestOff.objects.filter(id=request_off_id).first()
     else:
         request_off = RequestOff.objects.filter(id=request_off_id,
                                                 profile=profile).first()
         if request_off.status == Workday.STATUS_CANCEL:
             raise APIException('The request was canceled earlier')
     date_offs = request_off.date_off.order_by('date')
     if not cls.allow_or_not_cancel(date_offs.first(), profile):
         raise APIException(
             'Cancellation can only be made 1 hour in advance')
     if request_off.status == Workday.STATUS_APPROVED and DateOffService.get_num_days_off(
             request_off) > 0:
         remain_leave_last_year = RemainLeave.objects.filter(
             year=datetime.now().year - 1,
             profile_id=request_off.profile.id).first()
         if remain_leave_last_year is not None:
             if len(set([date_off.date.year
                         for date_off in date_offs])) > 1:
                 cls.handle_cancel_request_with_another_year(
                     remain_leave_last_year, request_off)
             elif date_offs.first().date.year == datetime.now().year - 1:
                 RemainLeaveService.handle_annual_leave_last_year(
                     request_off.profile,
                     -DateOffService.get_num_days_off(request_off))
             else:
                 cls.handle_cancel_request(remain_leave_last_year,
                                           request_off)
         else:
             RemainLeaveService.handle_annual_leave(
                 request_off.profile,
                 -DateOffService.get_num_days_off(request_off))
     request_off.status = Workday.STATUS_CANCEL
     request_off.save()
     request_detail = RequestDetail.objects.filter(
         request_off_id=request_off_id)
     list_email_admin = [item.approve.user.email for item in request_detail]
     SendMailRequestOff.send_cancel_request(request_off.type_off,
                                            profile.name, list_email_admin,
                                            date_offs)
     return request_off
Пример #5
0
    def handle_cancel_request(cls, remain_leave_last_year, request_off):
        num_days_off_on_sub_month_not_request_off, \
            num_days_off_on_sub_month_by_request_off, \
            list_date_out_sub_month = cls.get_request_canceled(request_off)
        if num_days_off_on_sub_month_not_request_off >= remain_leave_last_year.current_days_off:
            RemainLeaveService.handle_annual_leave(
                request_off.profile, -num_days_off_on_sub_month_by_request_off)
        else:
            if num_days_off_on_sub_month_not_request_off == 0:
                if num_days_off_on_sub_month_by_request_off - remain_leave_last_year.current_days_off > 0:
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        -remain_leave_last_year.current_days_off, True)
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        remain_leave_last_year.current_days_off -
                        num_days_off_on_sub_month_by_request_off)
                else:
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        -num_days_off_on_sub_month_by_request_off, True)

            elif num_days_off_on_sub_month_not_request_off > remain_leave_last_year. \
                    current_days_off:
                RemainLeaveService.handle_annual_leave(
                    request_off.profile,
                    -num_days_off_on_sub_month_by_request_off)
            else:
                if num_days_off_on_sub_month_by_request_off + num_days_off_on_sub_month_not_request_off - \
                        remain_leave_last_year.current_days_off > 0:
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        num_days_off_on_sub_month_not_request_off -
                        remain_leave_last_year.current_days_off, True)
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        remain_leave_last_year.current_days_off -
                        num_days_off_on_sub_month_by_request_off -
                        num_days_off_on_sub_month_not_request_off)
                else:
                    RemainLeaveService.handle_annual_leave(
                        request_off.profile,
                        -num_days_off_on_sub_month_by_request_off, True)
            RemainLeaveService.handle_annual_leave(
                request_off.profile,
                -DateOffService.get_num_days_off_by_list_date(
                    list_date_out_sub_month))
Пример #6
0
    def action_approve(cls, request_off_id, user, comment):
        company_setting = Company.objects.all().first()
        month_annual_leave_last_year = company_setting.expired_annual_leave_last_year
        user_action = RequestDetail.objects.filter(
            request_off_id=request_off_id)
        request_off, request_detail, list_email_manage, list_date_off = cls.get_request_helper(
            request_off_id, user)
        if request_detail.status or request_off.status == Workday.STATUS_CANCEL:
            return request_detail
        level = request_off.profile.maximum_level_approved
        with transaction.atomic():
            if request_off.status != Workday.STATUS_CANCEL:
                condition = user_action.count() < level and user.line_manager is not None \
                            and request_off.type_off.type != 1
                if condition:
                    request_off.status = Workday.STATUS_FORWARDED
                    request_off.save()
                    cls.create_action_user(request_off, user.line_manager)
                    email = {
                        'user': [request_off.profile.user.email],
                        'admin': [user.line_manager.user.email]
                    }
                    SendMailRequestOff.send_forward_request(
                        type_off=request_off.type_off,
                        name_admin=user.name,
                        name_admin_manage=user.line_manager.name,
                        name_user=request_off.profile.name,
                        email=email,
                        date_off=request_off.date_off.all())
                else:
                    request_off.status = Workday.STATUS_APPROVED

                    if request_off.type_off.add_sub_day_off == Workday.ANNUAL_LEAVE:
                        if len(
                                set([
                                    date_off.date.year
                                    for date_off in list_date_off
                                ])) > 1:
                            cls.handle_approve_with_another_year(
                                list_date_off, request_off)
                        elif list_date_off.first(
                        ).date.year == datetime.now().year - 1:
                            RemainLeaveService.handle_annual_leave_last_year(
                                request_off.profile,
                                DateOffService.get_num_days_off(request_off))
                        elif list_date_off.first().date.year == datetime.now(
                        ).year:
                            # day off have July and June
                            if len(
                                    set([
                                        date_off.date.month
                                        for date_off in list_date_off
                                    ])) > 1 and list_date_off.first(
                                    ).date.month == (
                                        month_annual_leave_last_year
                                        or month_annual_leave_last_year - 1):

                                list_date_present_month = list(
                                    filter(
                                        lambda date_off: date_off.date.month ==
                                        month_annual_leave_last_year - 1,
                                        list_date_off))
                                list_date_next_month = list(
                                    filter(
                                        lambda date_off: date_off.date.month ==
                                        month_annual_leave_last_year,
                                        list_date_off))

                                RemainLeaveService.handle_annual_leave(
                                    request_off.profile,
                                    DateOffService.
                                    get_num_days_off_by_list_date(
                                        list_date_present_month), True)
                                RemainLeaveService.handle_annual_leave(
                                    request_off.profile,
                                    DateOffService.
                                    get_num_days_off_by_list_date(
                                        list_date_next_month))

                            # day off of month in [7, 12]
                            elif list_date_off.first(
                            ).date.month > month_annual_leave_last_year - 1:
                                RemainLeaveService.handle_annual_leave(
                                    request_off.profile,
                                    DateOffService.get_num_days_off(
                                        request_off))
                            # day off of month in [1, 6]
                            else:
                                RemainLeaveService.handle_annual_leave(
                                    request_off.profile,
                                    DateOffService.get_num_days_off(
                                        request_off), True)
                        else:
                            RemainLeaveService.handle_annual_leave_next_year(
                                request_off.profile,
                                DateOffService.get_num_days_off(request_off))

                    request_off.save()
                    cls.change_lunch(list_date_off, request_off)

                    SendMailRequestOff.send_approve_request_to_user(
                        type_off=request_off.type_off,
                        name_admin=user.name,
                        name_user=request_off.profile.name,
                        list_email=[request_off.profile.user.email],
                        date_off=request_off.date_off.all())

                    SendMailRequestOff.send_approve_request_to_manage(
                        type_off=request_off.type_off,
                        name_user=request_off.profile.name,
                        email_user=request_off.profile.user.email,
                        list_email=list_email_manage,
                        date_off=request_off.date_off.all())
            request_detail.status = Workday.STATUS_APPROVED
            request_detail.comment = comment
            request_detail.save()
        return request_detail