Example #1
0
    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
Example #2
0
            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)
Example #3
0
            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)
Example #4
0
            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)
Example #5
0
    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])
Example #6
0
            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)
Example #7
0
            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)