middleware(['auth' => 'servicePermissions'])->except('index', 'show', 'showService'); // Model $this->modelType = StringHelper::toURL(__('models.service')); $this->modelData = [ 'departments' => [ 'type' => 'inputSelect', 'name' => 'tags', 'label' => __('models.department'), 'foreign' => [ 'class' => Tag::class, 'model' => 'tags', 'column' => 'name', 'order' => [ 'column' => 'order', 'direction' => 'ASC' ], 'conditions' => [ [ 'column' => 'type', 'value' => 'abteilung', ], ], ], ], 'instances' => [ 'type' => 'inputSelect', 'name' => 'tags', 'label' => __('models.instance'), 'foreign' => [ 'class' => Tag::class, 'model' => 'tags', 'column' => 'name', 'order' => [ 'column' => 'name', 'direction' => 'ASC' ], 'conditions' => [ [ 'column' => 'type', 'value' => 'instanz', ], ], ], ], 'servicetypes' => [ 'type' => 'inputSelect', 'name' => 'tags', 'label' => __('models.servicetype'), 'foreign' => [ 'class' => Tag::class, 'model' => 'tags', 'column' => 'name', 'order' => [ 'column' => 'name', 'direction' => 'ASC' ], 'conditions' => [ [ 'column' => 'type', 'value' => 'dienstart', ], ], ], ], 'datetime' => [ 'type' => 'inputDateTimePicker', 'datepicker' => [ 'label' => __('general.date'), 'placeholder' => __('general.date_format'), 'format' => __('general.date_format_short'), 'format_picker' => __('general.date_format'), 'multidate' => true, 'language' => config('app.locale'), 'weekStart' => 1, 'validation' => [ 'rules' => 'required', ] ], 'time' => [ 'label' => __('general.time'), 'placeholder' => __('general.time_format'), 'format' => __('general.time_format_short'), 'validation' => [ 'rules' => 'required', ] ], ], 'title' => [ 'type' => 'inputHidden', 'label' => __('models.title'), 'placeholder' => __('models.title'), 'value' => __('models.service'), 'validation' => [ 'rules' => 'required|min:3', ] ], 'content.beschreibung' => [ 'type' => 'inputTextarea', 'label' => __('models.description'), 'placeholder' => __('models.text'), 'toolbar' => [ [ 'insertfile', 'undo', 'redo', ], [ 'bold', 'italic', 'strikethrough' ] ], 'plugins' => [ 'paste', ], 'validation' => [ ] ], 'content.ort' => [ 'type' => 'inputText', 'label' => __('models.place'), 'placeholder' => __('models.place'), 'validation' => [ 'rules' => 'required|min:3', 'validation' => [ 'rules' => 'required', ] ] ], ]; // URL options $this->url = 'service'; $this->route = StringHelper::toURL(__('models.service')); $this->indexOptions = [ 'orderBy' => 'datetime', 'orderDirection' => 'DESC', 'paginate' => 9, 'view' => 'inc.views.cardPreviewContainer2', 'filter' => [ 'departments'=> [ 'type' => 'select', ], 'instances'=> [ 'type' => 'select', ], 'year' => [ 'type' => 'select', 'label' => __('general.year'), 'name' => strtolower(__('general.year')), 'limit' => 5, ], ] ]; $this->adminIndexOptions = [ 'orderBy' => 'datetime', 'orderDirection' => 'DESC', 'paginate' => 10, 'listdata' => [ 'servicetypes' => [], 'departments' => [], 'user' => [ 'label' => __('general.author'), 'foreign' => [ 'model' => 'audits', 'column' => 'name', 'index' => 'last' ], ], 'datetime' => [], 'published' => [ 'label' => __('admin.published'), ] ] ]; // Publishing $this->publishOptions = [ 'date' => '-1w' ]; parent::__construct(); } public function index(Request $request) { $this->prepareModelData('INDEX'); $models = $this->newModel(); $models = $this->filterModel($models, $this->indexOptions); $models = $this->orderModel($models, $this->indexOptions); $models = $models ->select(DB::raw('year(datetime) as `year`'), 'tags1.name as department', 'tags2.name as instance', 'posts.type', 'posts.datetime') ->where('posts.type', $this->modelType) ->join('post_tag as post_tag1', function($join){ $join->on('posts.id', 'post_tag1.post_id'); }) ->join('tags as tags1', function($join){ $join->on('post_tag1.tag_id', 'tags1.id'); $join->where('tags1.type', 'abteilung'); }) ->join('post_tag as post_tag2', function($join){ $join->on('posts.id', 'post_tag2.post_id'); }) ->join('tags as tags2', function($join){ $join->on('post_tag2.tag_id', 'tags2.id'); $join->where('tags2.type', 'instanz'); }) ->groupBy(DB::raw('year(datetime)')) ->groupBy('tags1.name') ->groupBy('tags2.name') ->orderBy('tags1.name'); if(key_exists('paginate', $this->indexOptions)) { $models = $models->paginate($this->indexOptions['paginate']); } else { $models = $models->get(); } // Suche für jeden Dienstplan den nächsten Termin $models->each(function($m){ $m = $this->getNextService($m, $m->department, $m->instance, $m->year); }); $this->prepareModel2($models); $filters = $this->prepareFilters($request); $view = view('inc.views.cardPreviewContainer2'); $view->with('config', array()); $view->with('filters', $filters); $view->with('models', $models); return $view; } private function getNextService($model, $department, $instance, $year) { if($year == Carbon::now()->year) { $temp = $this->newModel() ->where('datetime', '>=', Carbon::now()) ->where(DB::raw('YEAR(`datetime`)'), $year) ->where('type', 'dienst') ->whereHas('tags', function($query) use ($instance){ $query->where('name', $instance) ->where('type', 'instanz'); }) ->whereHas('tags', function($query) use ($department){ $query->where('name', $department) ->where('type', 'abteilung'); }) ->orderBy('datetime') ->limit(1) ->get(); if($temp->count()) { $model->next = $this->prepareModel($temp[0]); $model->next->dienstart = $model->next->tag('dienstart')[0]->name; } } return $model; } public function showService(Request $request, $year, $department, $instance, $type = 'html') { $type = strtolower($type); $this->prepareModelData('SHOW'); $model = $this->newModel() ->select('posts.*', 'tags3.name as serviceType', 'posts.type') ->isPublished() ->where('posts.type', $this->modelType); if($type != 'dienstplan.ical') { if(strtolower($year) != "app") { $model = $model->where(DB::raw('year(datetime)'), $year); } } $model = $model->join('post_tag as post_tag1', function($join){ $join->on('posts.id', 'post_tag1.post_id'); }) ->join('tags as tags1', function($join) use($department){ $join->on('post_tag1.tag_id', 'tags1.id'); $join->where('tags1.type', 'abteilung'); $join->where('tags1.name', $department); }) ->join('post_tag as post_tag2', function($join){ $join->on('posts.id', 'post_tag2.post_id'); }) ->join('tags as tags2', function($join) use($instance){ $join->on('post_tag2.tag_id', 'tags2.id'); $join->where('tags2.type', 'instanz'); $join->where('tags2.name', $instance); }) ->join('post_tag as post_tag3', function($join){ $join->on('posts.id', 'post_tag3.post_id'); }) ->join('tags as tags3', function($join) use($instance){ $join->on('post_tag3.tag_id', 'tags3.id'); $join->where('tags3.type', 'dienstart'); }) ->orderBy('datetime', 'ASC') ->get(); $model->each(function($m){ $m = $this->prepareModel($m); }); if($model->count() > 0) { $department = TagHelper::getTagNameByType($model[0], 'abteilung'); $instance = TagHelper::getTagNameByType($model[0], 'instanz'); $year2 = Carbon::parse($model[0]->datetime)->format('Y'); $model = $this->getNextService($model, $department, $instance, $year); } $this->prepareModel2($model); $model->type = $this->modelType; $model->year = $year2; $model->department = $department; $model->instance = $instance; $model->isMainPost = true; $viewFile = ''; switch($type) { case 'html': $viewFile = 'inc.views.details'; break; case 'dienstplan.ical': $viewFile = 'inc.views.iCal'; break; } $view = view($viewFile); $view->with('config', $this->modelData); $view->with('model', $model); $view->with('url', $this->route); switch($type) { case 'dienstplan.ical': $response = Response::make($view, 200); $response->header("Content-Disposition", "attachment; filename=Dienstplan-$department-$instance.ics"); $response->header("Content-Type", "text/calendar; charset=ISO-8859–15"); return $response; break; default: return $view; break; } } public function prepareExternalModel($model) { return $this->prepareModel($model); } }