public function actionForm($id = NULL) { $model = $id ? Visits::findOne($id) : new Visits(); if ($model->load(Yii::$app->request->post()) && $model->validate()) { /* Check if it is a new record before we save it */ $newRecord = $model->isNewRecord; /* Attempt to save model */ if ($model->save(false)) { /* Only when the record is new */ if ($newRecord) { /* Register null-observations for un-checked boxes if available */ if (!$model->checked_all) { foreach ($model->project->boxes as $box) { if (in_array($box->id, $model->checked_boxes)) { Observations::createNullObservation($model->id, $box->id); } } } /* Register checked boxes */ if ($model->checked_boxes) { $model->unlinkAll('visitBox', true); foreach ($model->checked_boxes as $checkedBox) { $visitBoxModel = new VisitBoxes(); $visitBoxModel->box_id = $checkedBox; $visitBoxModel->link('visit', $model); $visitBoxModel->save(); } } /* Register null-observations for all boxes in project when "checked-all" is selected */ if ($model->checked_all) { foreach ($model->project->boxes as $box) { Observations::createNullObservation($model->id, $box->id); } } } /* Register observers by this visit */ if ($model->observers) { $model->unlinkAll('observers', true); foreach ($model->observers as $observer) { $visitObservers = new VisitObservers(); $visitObservers->observer_id = $observer; $visitObservers->link('visit', $model); $visitObservers->save(); } } /* Redirect on success */ return $this->redirect(Url::toRoute('visits/detail/' . $model->id)); } } return $this->render('form', ['model' => $model, 'projects' => Projects::find()->hasRights()->hasBoxes()->all()]); }
public function search($params, $personal = false) { /* User identifier */ $userIdentifier = \Yii::$app->user->getId() ? \Yii::$app->user->getId() : 0; /* Base query */ $query = Observations::find(); /* Joins */ $query->join('LEFT JOIN', 'boxes', '"observations"."box_id" = "boxes"."id" AND "boxes"."deleted" = FALSE'); $query->join('LEFT JOIN', 'visits', '"observations"."visit_id" = "visits"."id" AND "visits"."deleted" = FALSE'); $query->join('LEFT JOIN', 'projects', '"boxes"."project_id" = "projects"."id" AND "projects"."deleted" = FALSE'); $query->join('LEFT JOIN', 'project_counters', '"projects"."id" = "project_counters"."project_id" AND "project_counters"."user_id" = :user_id', ['user_id' => $userIdentifier]); /* Conditions */ $query->where(['and', ['observations.deleted' => false], ['not', ['visits.id' => NULL]], ['not', ['boxes.id' => NULL]], ['not', ['projects.id' => NULL]], ['or', ['is', '"visits"."embargo"', NULL], ['<=', '"visits"."embargo"', 'NOW()'], ['in', 'visit_id', (new Query())->select('id')->from(VisitObservers::tableName())->where(['observer_id' => $userIdentifier])]], ['<>', 'observations.observation_type', Observations::OBSERVATION_TYPE_NULL]]); if (!is_object(Yii::$app->user->getIdentity()) || is_object(Yii::$app->user->getIdentity()) && !Yii::$app->user->getIdentity()->hasRole(['validator', 'administrator'])) { $query->andWhere(['or', ['"projects"."owner_id"' => $userIdentifier], ['"projects"."main_observer_id"' => $userIdentifier], ['or', ['is', '"projects"."embargo"', NULL], ['<=', '"projects"."embargo"', 'NOW()']], ['is not', '"project_counters"."user_id"', NULL]]); } $query->andWhere(['and', ['"projects"."deleted"' => false], ['"boxes"."deleted"' => false], ['"visits"."deleted"' => false], ['"observations"."deleted"' => false]]); $dataProvider = new ActiveDataProvider(['query' => $query]); $this->load($params); return $dataProvider; }
public function personal() { return $this->andWhere(['in', 'visits.id', (new Query())->select('id')->from(VisitObservers::tableName())->where(['observer_id' => \Yii::$app->user->getId()])]); }