def avail_dao(cls, start, end, worker_names=None, date_model='round'): avail = timedelta(hours=0) avail_deduct = timedelta(hours=0) if date_model == 'round': start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) elif date_model == 'accurate': start_date = start end_date = end else: start_date = start end_date = end if worker_names: worker = Workers.objects.filter(id__in=worker_names) worker_avail = WorkerAvailable.objects.filter( date__range=[start_date, end_date], name__in=worker_names) else: worker_avail = WorkerAvailable.objects.filter( date__range=[start_date, end_date]) if worker_avail.exists(): pass
def worker_submit(request, *args, **kwargs): command_type = request.GET.get('CommandType') start = request.GET.get('start') end = request.GET.get('end') worker_id = request.GET.get('resourceId') start = UDatetime.datetime_str_init(start) end = UDatetime.datetime_str_init(end, start, timedelta(hours=2)) start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) worker = Workers.objects.get(id=worker_id) response = [] if command_type == 'ClearTasks': WorkScheduleReviseDAO.remove_schedule_by_date_range_and_worker( start_date, end_date, worker) elif command_type == 'ClearAll': WorkScheduleReviseDAO.remove_available_by_date_range_and_worker( start_date, end_date, worker) WorkScheduleReviseDAO.remove_schedule_by_date_range_and_worker( start_date, end_date, worker) return JsonResponse(response, safe=False)
def resources(request, *args, **kwargs): start = request.GET.get('start') end = request.GET.get('end') start = UDatetime.datetime_str_init(start) end = UDatetime.datetime_str_init(end, start, timedelta(days=1)) start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) workers_df = WorkScheduleDataDAO.get_all_include_workers_by_date_range( start_date, end_date) response = [] if not workers_df.empty: workers_df.rename_axis( { 'name': 'title', 'balance': 'Avail' }, axis=1, inplace=True) response = workers_df.to_dict(orient='records') return JsonResponse(response, safe=False) else: return JsonResponse(response, safe=False)
def add_worker_workers(request, *args, **kwargs): start = request.GET.get('start') end = request.GET.get('end') start = UDatetime.datetime_str_init(start) end = UDatetime.datetime_str_init(end, start, timedelta(days=1)) start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) workers_df = WorkScheduleDataDAO.get_all_exclude_workers_by_date_range( start_date, end_date) workers_df_contractor = pd.DataFrame(columns=['id', 'text']) workers_df_contractor['id'] = workers_df[workers_df['type'] == 'contractor']['id'] workers_df_contractor['text'] = workers_df[ workers_df['type'] == 'contractor']['name'] if not workers_df_contractor.empty: workers_dict_contractor = workers_df_contractor.to_dict( orient='records') else: workers_dict_contractor = [] workers_df_employee = pd.DataFrame(columns=['id', 'text']) workers_df_employee['id'] = workers_df[workers_df['type'] == 'employee']['id'] workers_df_employee['text'] = workers_df[workers_df['type'] == 'employee']['name'] if not workers_df_employee.empty: workers_dict_employee = workers_df_employee.to_dict( orient='records') else: workers_dict_employee = [] response = [ { 'text': 'Contractor', 'children': workers_dict_contractor }, { 'text': 'Employee', 'children': workers_dict_employee }, ] return JsonResponse(response, safe=False)
def balance_dao(cls, start, end, worker_names=None, date_model='round'): if date_model == 'round': start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) elif date_model == 'accurate': start_date = start end_date = end else: start_date = start end_date = end if worker_names: worker = Workers.objects.filter(id__in=worker_names) worker_avail = WorkerAvailable.objects.filter( date__range=[start_date, end_date], name__in=worker_names) else: worker_avail = WorkerAvailable.objects.filter( date__range=[start_date, end_date])
def events(request, *args, **kwargs): start = request.GET.get('start') end = request.GET.get('end') start = UDatetime.datetime_str_init(start) end = UDatetime.datetime_str_init(end, start, timedelta(days=1)) start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) # avail events avail_records = WorkerAvailable.objects.filter( date__range=[start_date, end_date]) if avail_records.exists(): avail_events = pd.DataFrame.from_records( avail_records.values('name__id', 'time_start', 'time_end', 'date')) avail_events['id'] = 'WorkerAvail' avail_events['rendering'] = 'background' avail_events['color'] = 'lightgreen' avail_events.rename_axis( { 'name__id': 'resourceId', 'time_start': 'start', 'time_end': 'end' }, axis=1, inplace=True) avail_events['resourceId'] = avail_events[ 'resourceId'].astype('str') # avail_events['start'] = avail_events['start'].apply(lambda x: x.astimezone(EST)) # avail_events['end'] = avail_events['end'].apply(lambda x: x.astimezone(EST)) avail_response = avail_events.to_dict(orient='records') else: avail_response = [] # task events event_records = WorkerScheduled.objects.filter( date__range=[start_date, end_date]) if event_records.exists(): event_records = pd.DataFrame.from_records( event_records.values( 'id', 'name__id', 'task_id__work_order', 'task_id__description', 'task_id__AOR__equip_code', 'task_id__priority', 'task_id__estimate_hour', 'duration', 'time_start', 'time_end').annotate(total_duration=Sum( 'task_id__workerscheduled__duration'))) event_records.rename_axis( { 'id': 'workerscheduledId', 'name__id': 'resourceId', 'task_id__work_order': 'taskId', 'task_id__description': 'description', 'task_id__AOR__equip_code': 'equip_code', 'task_id__priority': 'priority', 'task_id__estimate_hour': 'est', 'duration': 'duration', 'time_start': 'start', 'time_end': 'end' }, axis=1, inplace=True) event_records['resourceId'] = event_records[ 'resourceId'].astype('str') event_records['title'] = event_records['taskId'] event_records['constraint'] = 'WorkerAvail' event_records['percent'] = event_records[ 'total_duration'] / event_records['est'] event_records['percent'] = event_records['percent'].apply( lambda x: np.round(x, 2)) event_records['remaining_hours'] = event_records[ 'est'] - event_records['duration'] event_records['remaining_hours'] = event_records[ 'remaining_hours'].apply( lambda x: round(x.total_seconds() / 3600)) # event_records['start'] = event_records['start'].apply(lambda x: x.astimezone(EST)) # event_records['end'] = event_records['end'].apply(lambda x: x.astimezone(EST)) event_records['duration'] = event_records[ 'duration'].apply( lambda x: np.round(x.total_seconds() / 3600, 2)) # revise time off event percent event_records[event_records['priority'] == 'T']['percent'] = 1 event_records = event_records.to_dict(orient='records') else: event_records = [] response = [] response += avail_response response += event_records return JsonResponse(response, safe=False)
def update(request, *args, **kwargs): start = request.GET.get('start') end = request.GET.get('end') start = UDatetime.datetime_str_init(start) end = UDatetime.datetime_str_init(end, start, timedelta(days=1)) start_date = UDatetime.pick_date_by_one_date(start) end_date = UDatetime.pick_date_by_one_date(end) print(start_date, end_date) worker_avail = WorkerAvailable.objects.filter( date__range=[start_date, end_date]) worker_scheduled = WorkerScheduled.objects.filter(date__range=[start_date, end_date])\ .exclude(task_id__priority__in=['0', 'T']) worker_scheduled_others = WorkerScheduled.objects.filter( date__range=[start_date, end_date], task_id__priority__in=['0', 'T']) tasks = WorkScheduleDataDAO.get_all_tasks_open()[0] if worker_avail.exists(): worker_avail_df = pd.DataFrame.from_records( worker_avail.values('duration', 'deduction')) avail = (worker_avail_df['duration'] ).sum().total_seconds() / 3600 else: avail = 0 if worker_scheduled.exists(): worker_scheduled_df = pd.DataFrame.from_records( worker_scheduled.values('duration')) scheduled = worker_scheduled_df['duration'].sum( ).total_seconds() / 3600 else: scheduled = 0 if worker_scheduled_others.exists(): worker_scheduled_others_df = pd.DataFrame.from_records( worker_scheduled_others.values('duration')) scheduled_others = worker_scheduled_others_df[ 'duration'].sum().total_seconds() / 3600 else: scheduled_others = 0 if not tasks.empty: tasks_df = tasks[['estimate_hour', 'schedule_hour']] tasks_est = tasks_df['estimate_hour'].sum() tasks_count = len(tasks_df) tasks_scheduled_count = len( tasks_df[tasks_df['schedule_hour'] > 0]) else: tasks_est = 0 tasks_count = 0 tasks_scheduled_count = 0 avail_orig = avail - scheduled_others avail_remain = avail - scheduled - scheduled_others task_est_remain = tasks_est - scheduled response = { 'scheduled': scheduled, 'avail': avail_orig, 'avail_remain': avail_remain, 'tasks_est': tasks_est, 'task_est_remain': task_est_remain, 'tasks_count': tasks_count, 'tasks_scheduled_count': tasks_scheduled_count } return JsonResponse(response)