Feuerwehr-eppingen/app/Http/Controllers/ServiceController.php
Marco Glietsch 8d87112492 Anpassung für EinsatzApp
Der Kalenderfeed (iCal) jeder Abteilung läuft jetzt endlos. Umlaute werden angepasst und der Ort tauch jetzt im Beschreibungstext auf
2023-01-21 21:54:53 +01:00

386 lines
9.7 KiB
PHP
Executable File
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'))
],
]
];
$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);
}
}