Skip to content
Snippets Groups Projects
StudyPlan.php 7.43 KiB
Newer Older
class Controller_Api_V0_StudyPlan extends Controller_Handler_Api
{
    private function normalizeDisciplinesData($disciplineData, $facultyID)
    {
        foreach ($disciplineData->teachers as $teacherData) {
            if (empty($teacherData->hashSnils)) {
                Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array(
                    '{0}' => 'SYNC_DISCIPLINES',
                    '{1}' => 'Discipline with empty teacher\'s hash INILA',
                    '{2}' => json_encode($disciplineData),
                $ID = Model_Teacher::withINILA($teacherData->hashSnils);
                if ($ID != -1) {
                    $disciplineData->teacherIDs[] = $ID;
        if (empty($disciplineData->teacherIDs)) {
            throw new InvalidArgumentException('Discipline without teachers');
        switch ($disciplineData->type) {
            case 'Экзамен':
                $disciplineData->type = Model_Discipline::EXAM;
            case 'Кандидатский экзамен':
                $disciplineData->type = Model_Discipline::EXAM;
                break;

                $disciplineData->type = Model_Discipline::CREDIT;
            case 'Дифференцированный зачет':
                $disciplineData->type = Model_Discipline::GRADING_CREDIT;
                break;

                throw new InvalidArgumentException('Discipline has bad type');

        if (!isset($disciplineData->subjectID) && isset($disciplineData->externalID)) {
            $disciplineData->subjectID = Model_Subject::withExternalID($disciplineData->externalID, $disciplineData->name, NULL, $facultyID);
        }
        return $disciplineData;
    private function processDiscipline($disciplineData, $studyPlanID, $semesterID, $facultyID)
    {
        if (isset($disciplineData->subjectID)) {
            $discipline = Model_Discipline::find($studyPlanID, $semesterID, $disciplineData->subjectID, $disciplineData->type);
        if (isset($discipline)) {
            if (isset($disciplineData->gradeID)) {
                $discipline->changeGradeUnsafe($disciplineData->gradeID);
            }
            if (empty($disciplineData->teacherIDs)) {
                throw new InvalidArgumentException('Cannot create discipline without teachers');
            }
            $discipline = Model_Discipline::make()
                ->author($disciplineData->teacherIDs[0])
                ->subject($disciplineData->subjectID)
                ->semester($semesterID)
                ->type($disciplineData->type)
                ->faculty($facultyID)
                ->create();
        }
        if (!empty($disciplineData->teacherIDs)) {
            foreach ($disciplineData->teacherIDs as $teacherID) {
                $teacher = Model_Teacher::with($teacherID);
                $discipline->bind($teacher);
            }
        $doSyncGlobal = Kohana::$config->load('sync.syncs')['global'];
        if ($doSyncGlobal) {
            if (isset($discipline)) {
                // global = 0 или 1
                if ($disciplineData->global) {
                    $discipline->setInactive();
                    $discipline->setGlobal();
                } else {
                    if ($discipline->isGlobal()) {
                        $discipline->setNotGlobal();
                        $discipline->setActive();
                    }
        return (int)$discipline->ID;
    private function processStudyPlan($studyPlanData, $year, $semesterID, $facultyID)
    {
        if (!isset($studyPlanData->id) && isset($studyPlanData->externalID)) {
            $studyPlan = Model_Plan::withExternalID($studyPlanData->externalID);
            if (is_null($studyPlan)) {
                    ->externalID($studyPlanData->externalID)
                    ->year($year)
                    ->faculty($facultyID)
                $studyPlan->changeInfo($year, $facultyID);
        } elseif (isset($studyPlanData->id)) {
            $studyPlan = Model_Plan::load($studyPlanData->id);
        } else {
            throw new InvalidArgumentException('Study plan has no id or external id!');
        foreach ($studyPlanData->disciplines as &$disciplineData) {
            try {
                $disciplineData = $this->normalizeDisciplinesData($disciplineData, $facultyID);
                $disciplineID = $this->processDiscipline($disciplineData, $studyPlan->ID, $semesterID, $facultyID);
                $studyPlan->bindDiscipline($disciplineID);
                $disciplineIDs[] = $disciplineID;
            } catch (Exception $e) {
                Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array(
                    '{0}' => 'SYNC_DISCIPLINES',
                    '{1}' => $e->getMessage(),
                    '{2}' => json_encode($disciplineData),
        return $disciplineIDs;
    /**
     * @api {put} api/v0/studyPlan Add new study plan(s)
     * @apiName Add new study plan
     * @apiGroup Study plans
     * @apiVersion 0.1.2
     * @apiParam {String} token Api key
     * @apiDescription This method accepts json body
     *    with list of study plans to add or update.
     *  each study plan includes list of disciplines inside
     * @apiExample {curl} Example usage:
     * curl --header "Content-Type: application/json" \
     * --request POST \
     * --data '{
     *      "faculty": "000001387",
     *      "year": "2018",
     *      "semester": "1",
     *      "plans": [
     *       {
     *            "externalID": "000133620",
     *            "disciplines": [
     *                 {
     *                 "externalID": "000145371",
     *                 "name": "Иностранный язык 2 (английский)",
     *                 "type": "Зачет",
     *                 "teachers": [
     *                        {
     *                              "hashSnils": "E043D16D4A36F7C4306B0EDC1C82E0E1D6E5CFF6"
     *                        },
     *                        {
     *                               "hashSnils": "435F6F584A5636D881CF085487157DAEA76FBC8E"
     *                        },
     *                        {
     *                               "hashSnils": "653A81C0F2FD15983C5671A4020CCA545A403426"
     *                        }
     *                 ]
     *                 }
     *            ]
     *       }
     *    ]
     * }' \
     *   http://grade/~dev_rating/api/v0/studyPlan?token=osw839hfgh9a23hgfh92hasff232f2oasf
     */
    public function action_put_index()
    {
            $data = json_decode($this->request->body());
            $year = (int)$data->year;
            $semesterID = (int)Model_Semesters::find($year, (int)$data->semester)->ID;
            $facultyID = Model_Faculties::getIdByExternalID($data->faculty);
            foreach ($data->plans as $studyPlanData) {
                $res[] = $this->processStudyPlan($studyPlanData, $year, $semesterID, $facultyID);
            }
        } catch (Exception $e) {
            $this->badRequestError($e->getMessage());
        }

        return $res;
    }
}