Загрузка данных


function GetExpertTasksList() {
    try {
        /** Определение текущего пользователя */
        curUserID = Int(CurRequest.Session.Env.curUserID);
        xCurUser = custom_lib.ForeignElem(curUserID);

        tasksList = {
            amountOverdueTasks: 0,
            amountUnverifiedTasks: 0,
            tasks: [],
            archiveTasks: []
        };

        /** Определение прав доступа */
        bIsAdmin = false;
        query = "for $elem in group_collaborators where $elem/code = 'track_view_all_groups' and $elem/collaborator_id = " + xCurUser.id + " return $elem";
        bIsAdmin = !custom_lib.isEmpty(XQuery(query));

        if(!bIsAdmin) {
            /** Задания, где текущий пользователь указан в качестве эксперта */
            query = "for $elem in learning_task_results where $elem/expert_id = " + xCurUser.id + " order by $elem/learning_task_name, $elem/person_fullname ascending return $elem";
            arr_xLearningTaskResults = XQuery(query);
    
            /** Задания, где текущий пользователь выступает в качестве бизнес-тренера */
            query = "for $elem in object_datas where ForeignElem($elem/object_data_type_id)/code = 'education_plan_tutors' and $elem/sec_object_id = " 
                    + xCurUser.id + " return $elem";
            arr_xObjectDatas = ArraySelectDistinct(XQuery(query), "This.object_id");
    
            if(!custom_lib.isEmpty(arr_xObjectDatas)) {
                query = "for $lt in learning_task_results, $elem in education_plan_collaborators where $lt/id = $elem/result_object_id and $elem/type = 'learning_task' and MatchSome($elem/education_plan_id, (" 
                        + ArrayMerge(arr_xObjectDatas, "This.object_id", ",") + ")) order by $lt/learning_task_name, $lt/person_fullname ascending return $lt";
                arr_xLearningTaskResults = ArrayUnion(arr_xLearningTaskResults, XQuery(query));
                arr_xLearningTaskResults = ArraySort(arr_xLearningTaskResults, "This.learning_task_name", "+", "This.person_fullname", "+");
                arr_xLearningTaskResults = ArraySelectDistinct(arr_xLearningTaskResults, "This.id");
            }
        } else {
            query = "for $elem in learning_task_results where $elem/status_id != 'success'" + 
                " or ($elem/status_id = 'success' and $elem/finish_date > " + XQueryLiteral(DateOffset(Date(), - (182 * 86400))) + ")" +
                " order by $elem/learning_task_name, $elem/person_fullname ascending return $elem";
            arr_xLearningTaskResults = XQuery(query);
        }

        arr_xLearningTasks = ArrayExtract(ArraySelectDistinct(arr_xLearningTaskResults, "This.learning_task_id"), "This.learning_task_id.ForeignElem");

        /** Глобальные значения для виджетов */
        iAmountOverdueTasks = 0;
        iAmountUnverifiedTasks = 0;

        for(xLearningTask in arr_xLearningTasks) {
            try {
                /** Значения по умолчанию */
                /** TO DO:  настроить дополнительно добавление изображения при создании задания */
                oLearningTask = {
                    id: StrInt(xLearningTask.id),
                    title: xLearningTask.name,
                    amountUnverifiedTasks: 0,
                    amountPassedTasks: 0,
                    activeTaskResults: [],
                    passedTaskResults: [],
                    image: {
                        url: "/download_file.html?file_id=6267075769506796660"
                    }
                };

                /** Значения для конкретных заданий */
                iAmountUnverifiedCurrentTask = 0;
                iAmountPassedCurrentTask = 0;

                /** Изображение */
                if(custom_lib.IsValid(xLearningTask.resource_id)) {
                    oLearningTask.image.url = "/download_file.html?file_id=" + xLearningTask.resource_id;
                }

                arr_xCurrentLearningTaskResults = ArraySelect(arr_xLearningTaskResults, ("This.learning_task_id == " + xLearningTask.id));
                arr_xCurrentLearningTaskResults = ArraySort(arr_xCurrentLearningTaskResults, "finish_execution_date", "-", "person_fullname", "+");

                for(xLearningTaskResult in arr_xCurrentLearningTaskResults) {
                    try {
                        /** Статусы заданий */
                        oStatuses = {
                            "assign": "plan",
                            "process": "active",
                            "evaluation": "evaluation",
                            "viewed": "viewed",
                            "success": "passed",
                            "failed": "failed"
                        };

                        xCollaborator = custom_lib.ForeignElem(xLearningTaskResult.person_id);

                        /** Название программы обучения */
                        query = "for $elem in object_datas where ForeignElem($elem/object_data_type_id)/code = 'learning_results' and $elem/object_id = " 
                                + xLearningTaskResult.id + " return $elem";
                        xObjectData = ArrayOptFirstElem(XQuery(query));
                        sProgramName = custom_lib.IsValid(xObjectData) ? custom_lib.ForeignElem(xObjectData.sec_object_id).name : null;

                        /** Дата отправки задания */
                        sSendDate = custom_lib.IsValid(xLearningTaskResult.finish_execution_date) ? Date(xLearningTaskResult.finish_execution_date) : null;

                        oTask = {
                            id: StrInt(xLearningTaskResult.id),
                            title: xLearningTask.name,
                            status: oStatuses[xLearningTaskResult.status_id],
                            person: {
                                id: StrInt(xCollaborator.id),
                                fullname: xCollaborator.fullname,
                                position: xCollaborator.position_name
                            },
                            programName: sProgramName,
                            /**
                             * TODO: Добавить временную зону в даты
                             */
                            sendDate: sSendDate,
                            finishDate: null,
                            score: null,
                            expertFullname: custom_lib.IsValid(xLearningTaskResult.expert_id) && custom_lib.IsValid(xLearningTaskResult.expert_id.OptForeignElem) ?
                                custom_lib.ForeignElem(xLearningTaskResult.expert_id).fullname: null,
                        };

                        switch (xLearningTaskResult.status_id) {
                            case "evaluation":
                                iAmountUnverifiedTasks++;
                                iAmountUnverifiedCurrentTask++
                            case "assign":
                            case "process":
                            case "viewed":
                                oLearningTask.activeTaskResults.push(oTask);

                                if(DateNewTime(Date(), 0, 0, 0) > DateNewTime(xLearningTaskResult.plan_end_date, 0, 0, 0)) {
                                    iAmountOverdueTasks++;
                                }
                            break;

                            case "success":
                            case "failed":
                                iAmountPassedCurrentTask++;

                                /** Дата проверки задания */
                                if(custom_lib.IsValid(xLearningTaskResult.finish_date)) {
                                    oTask.finishDate = Date(xLearningTaskResult.finish_date);
                                }

                                /** Оценка */
                                if(custom_lib.IsValid(xLearningTaskResult.mark)) {
                                    oTask.score = xLearningTaskResult.mark;
                                }

                                oLearningTask.passedTaskResults.push(oTask);
                            break;
                        
                            default:
                            break;
                        }
                    } catch (error) {
                        log("ERROR: " + error,
                            "GetExpertTasksList");
                    }
                }

                oLearningTask.amountUnverifiedTasks = iAmountUnverifiedCurrentTask;
                oLearningTask.amountPassedTasks = iAmountPassedCurrentTask;

                tasksList.tasks.push(oLearningTask);

            } catch (error) {
                log("ERROR: " + error,
                    "GetExpertTasksList");
            }
        }

        tasksList.amountOverdueTasks = iAmountOverdueTasks;
        tasksList.amountUnverifiedTasks = iAmountUnverifiedTasks;

        return {
            success: true,
            data: {
                tasksList: tasksList
            },
            error: null
        };
    } catch (error) {
        log("ERROR: " + error,
            "GetExpertTasksList");

        return {
            success: false,
            data: null,
            error: "Ошибка на стороне сервера"
        };
    }
}