Feuerwehr-eppingen/app/Http/Controllers/ServiceController.php

387 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\Tag;
use Illuminate\Support\Facades\DB;
use Response;
use App\Helpers\TagHelper;
use App\Helpers\StringHelper;
class ServiceController extends PostController
{
public function __construct()
{
$this->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-885915");
return $response;
break;
default:
return $view;
break;
}
}
public function prepareExternalModel($model)
{
return $this->prepareModel($model);
}
}