Feuerwehr-eppingen/app/Http/Controllers/ServiceController.php
ppa. Marco Glietsch e76da0d33e Anpassung
iCal-Link hat jetzt die Endung *.ical
2021-11-10 15:37:07 +01:00

378 lines
9.5 KiB
PHP
Executable File

<?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'))
],
]
];
$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')
{
$this->prepareModelData('SHOW');
$model = $this->newModel()
->select('posts.*', 'tags3.name as serviceType', 'posts.type')
->isPublished()
->where('posts.type', $this->modelType)
->where(DB::raw('year(datetime)'), $year)
->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');
$year = Carbon::parse($model[0]->datetime)->format('Y');
$model = $this->getNextService($model, $department, $instance, $year);
}
$this->prepareModel2($model);
$model->type = $this->modelType;
$model->year = $year;
$model->department = $department;
$model->instance = $instance;
$model->isMainPost = true;
$viewFile = '';
$type = strtolower($type);
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-$year-$department-$instance.ics");
$response->header("Content-Type", "text/calendar; charset=utf-8");
return $response;
break;
default:
return $view;
break;
}
}
public function prepareExternalModel($model)
{
return $this->prepareModel($model);
}
}