387 lines
10 KiB
PHP
387 lines
10 KiB
PHP
<?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-8859–15");
|
||
return $response;
|
||
break;
|
||
|
||
default:
|
||
return $view;
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function prepareExternalModel($model)
|
||
{
|
||
return $this->prepareModel($model);
|
||
}
|
||
}
|