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