diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index efa4c3d..9a02c7e 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -10,6 +10,8 @@ use App\Enums\TicketStatus; use App\Models\Ticket; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\View; class Controller extends BaseController @@ -130,4 +132,43 @@ class Controller extends BaseController } return $query; } + + /** + * Sort columns with a query + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $ignore + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function sortQuery(Builder $query, array $ignore = []): Builder + { + $rName = request()->route()->getName(); + $table = $query->getModel()->getTable(); + if (request()->sort_col) { + Session::put("$rName.sort_col", request()->sort_col); + Session::put("$rName.sorted", true); + } + if (request()->sort_way) { + Session::put("$rName.sort_way", request()->sort_way); + Session::put("$rName.sorted", true); + } + if (request()->rst) { + Session::remove("$rName.sorted"); + Session::remove("$rName.sort_col"); + Session::remove("$rName.sort_way"); + } + if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) { + if ( + !isset($ignore) or + (isset($ignore) and !in_array(request()->sort_col, $ignore)) + ) { + $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way); + } + } elseif (Schema::hasColumn($table, 'order')) { + $query = $query->orderBy('order', 'ASC'); + Session::put("$rName.sort_col", 'order'); + Session::put("$rName.sort_way", 'asc'); + } + return $query; + } } diff --git a/app/Http/Controllers/DutyhourController.php b/app/Http/Controllers/DutyhourController.php new file mode 100644 index 0000000..921fb3b --- /dev/null +++ b/app/Http/Controllers/DutyhourController.php @@ -0,0 +1,22 @@ +', now()->modify('-1 day'))->orderBy('date', 'asc')->limit(10)->get(); + return view('home', compact('dutyhourModels')); } } diff --git a/app/Models/Dutyhour.php b/app/Models/Dutyhour.php new file mode 100644 index 0000000..66f6864 --- /dev/null +++ b/app/Models/Dutyhour.php @@ -0,0 +1,123 @@ + 'date' + ]; + + /** + * Package + * + * @param array $attributes + */ + public function __construct(array $attributes = []) + { + self::$editableProperties = [ + 'date' => [ + 'label' => trans('Date'), + 'type' => CrudType::date(), + 'validate' => [ + 'date', + 'after_or_equal:today', + // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed + function ($attribute, $value, $fail) { + $q = static::query(); + if (request()->dutyhour) { + $q = $q->where('id', '!=', $this->id); + } + if ($q->where('date', $value)->exists()) { + $fail(__('La :attribute est déjà utilisée', [ + 'attribute' => $attribute + ])); + } + } + ], + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'person' => [ + 'label' => trans('Personne présente'), + 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'place' => [ + 'label' => trans('Lieu'), + 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + ]; + parent::__construct($attributes); + } +} diff --git a/app/Policies/DutyhourPolicy.php b/app/Policies/DutyhourPolicy.php new file mode 100644 index 0000000..c77cadd --- /dev/null +++ b/app/Policies/DutyhourPolicy.php @@ -0,0 +1,38 @@ +policies = [ + 'dutyhour' => [ + 'viewAny' => URR::make('userIsAdmin', $user), + 'create' => URR::make('userIsAdmin', $user), + 'update' => URR::make('userIsAdmin', $user), + 'delete' => URR::make('userIsAdmin', $user) + ] + ]; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 8c5438b..48e81b8 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -6,6 +6,7 @@ use App\Models\Brand; use App\Models\Company; use App\Models\Credit\Account; use App\Models\Credit\CreditLog; +use App\Models\Dutyhour; use App\Models\File; use App\Models\Invoice; use App\Models\Label; @@ -91,6 +92,7 @@ class RouteServiceProvider extends ServiceProvider Route::model('label', Label::class); Route::model('marker', Marker::class); Route::model('package', Package::class); + Route::model('dutyhour', Dutyhour::class); Route::model('company', Company::class); Route::model('invoice', Invoice::class); Route::model('file', File::class); diff --git a/database/migrations/2023_04_18_123853_create_dutyhours_table.php b/database/migrations/2023_04_18_123853_create_dutyhours_table.php new file mode 100644 index 0000000..1d8ccb9 --- /dev/null +++ b/database/migrations/2023_04_18_123853_create_dutyhours_table.php @@ -0,0 +1,34 @@ +id(); + $table->date('date')->unique(); + $table->string('person'); + $table->string('place'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dutyhours'); + } +} diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index e4446c6..5f9af5f 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -16,5 +16,6 @@ return [ 'packages' => 'Packages', 'invoices' => 'Invoices', 'companies' => 'Companies', + 'dutyhours' => 'Duty Hours', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index de9519d..7af9451 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -16,5 +16,6 @@ return [ 'packages' => 'Forfaits', 'invoices' => 'Devis', 'companies' => 'Sociétés', + 'dutyhours' => 'Permanences', ] ]; diff --git a/resources/views/dutyhours/index.blade.php b/resources/views/dutyhours/index.blade.php new file mode 100644 index 0000000..4dc6f09 --- /dev/null +++ b/resources/views/dutyhours/index.blade.php @@ -0,0 +1,112 @@ +@extends($viewLayout) + +@section('title', sprintf('%s - %s', transFb(sprintf('models.classes.%s', strtolower(Str::plural(class_basename($modelClass)))), Str::plural(class_basename($modelClass))), __('crud-policies::crud.viewAny'))) +@section('description', sprintf('%s %s', __('crud-policies::crud.viewAny'), trans(Str::plural(class_basename($modelClass))))) +@section('metaIndex', 'noindex,nofollow') + +@section('content') +
+ @include('crud-policies::crud.modules.flashMessage') +
+ @include('crud-policies::crud.modules.breadcrumb', ['action' => CrudAction::viewAny()]) + @include('crud-policies::crud.modules.actionbar.bar', ['action' => CrudAction::viewAny()]) +
+
+
+
+ {{ $models->links() }} +
+
+
+
+ + + + {{ __('crud-policies::crud.reset') }} + +
+
+
+
+ + + @include('crud-policies::crud.modules.sorter') + + + @if(count($models)) + + {{-- INIT QUERIES for OPTIMIZING --}} + @foreach ($modelClass::getEditableProperties() as $fieldName => $prop) + @if($prop['type']->equals(CrudType::order())) + @php ${"$modelTable$fieldName"} = $modelClass::max($fieldName); @endphp + @endif + @if($prop['type']->equals(CrudType::belongsTo())) + @php try { $models->load(Str::singular((new $prop['belongsTo']())->getTable())); } catch(\Exception $e) {} @endphp + @endif + @if($prop['type']->equals(CrudType::belongsToMany())) + @php $models->load("$fieldName"); @endphp + @endif + @endforeach + + {{-- DISPLAY MODELS --}} + @foreach($models as $model) + + @foreach ($modelClass::getEditableProperties() as $fieldName => $prop) + @if(in_array(CrudAction::viewAny(), $prop['actions'])) + @switch($prop['type']) + @case(CrudType::password()) + {{-- Ignore --}} + @break + @default + + @endswitch + @endif + @endforeach + + {{-- MODEL ACTIONS --}} + + + @endforeach + @else + + + + @endif + +
@include('crud-policies::crud.printfield', [ + 'action' => CrudAction::viewAny(), + 'field' => $model->{$fieldName}, + 'props' => $prop, + "$modelTable$fieldName" => ${"$modelTable$fieldName"} ?? null + ]) +
+ @can('view', $model) + {{ __('crud-policies::crud.view') }} + @endcan + @can('update', $model) + {{ __('crud-policies::crud.edit') }} + @endcan + @can('delete', $model) +
+ @csrf + @method('DELETE') + +
+ @endcan + @can('viewAny', \App\Models\Log::class) + {{ __('models.classes.logs') }} + @endcan + @can('viewAny', \App\Models\File::class) + {{ __('models.classes.files') }} + @endcan +
+
+ {{ __('crud-policies::crud.nothingtoshow') }} +
+ {{ $models->links() }} +
+
+@include('crud-policies::crud.modules.scriptConstants') +@endsection diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 2dbc80f..beb7ff7 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -2,17 +2,51 @@ @section('content')
-
-
-

Bienvenue sur le support LDC WEB.

-
-
- +
+
+

+ {{ __('models.classes.dutyhours') . __(' à venir') }} +

+
+
+
+
+
+ + + + + + + + + + @if($dutyhourModels->count()) + @foreach ($dutyhourModels as $dutyhourModel) + + + + + + @endforeach + @else + + + + @endif + +
{{ __('Date') }}{{ __('Personne présente') }}{{ __('Lieu de la permanence') }}
{{ $dutyhourModel->date->formatLocalized('%d/%m/%Y') }}{{ $dutyhourModel->person }}{{ $dutyhourModel->place }}
+ {{ __('Aucune :model prévue prochainement', ['model' => Str::singular(__('models.classes.dutyhours')) ])}} +
+
+
+
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/layout/nav.blade.php b/resources/views/layout/nav.blade.php index c08b854..1c26a94 100644 --- a/resources/views/layout/nav.blade.php +++ b/resources/views/layout/nav.blade.php @@ -46,6 +46,9 @@ @can('viewAny', App\Models\Package::class) {{ __('models.classes.packages') }} @endcan + @can('viewAny', App\Models\Dutyhour::class) + {{ __('models.classes.dutyhours') }} + @endcan
@endif diff --git a/routes/web.php b/routes/web.php index 28e1ef5..bbe7386 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,7 @@ use App\Http\Controllers\CompanyController; use App\Http\Controllers\Credit\AccountController; use App\Http\Controllers\Credit\CreditLogController; use App\Http\Controllers\Credit\EstimationController; +use App\Http\Controllers\DutyhourController; use App\Http\Controllers\FileController; use App\Http\Controllers\HomeController; use App\Http\Controllers\InvoiceController; @@ -74,6 +75,7 @@ Route::middleware('auth:web')->group(function () { Route::resource('ticket', TicketController::class)->except(['destroy']); Route::resource('users', UserController::class); Route::resource('packages', PackageController::class)->except('show'); + Route::resource('dutyhours', DutyhourController::class)->except('show'); Route::resource('companies', CompanyController::class)->except('show'); Route::resource('invoices', InvoiceController::class); Route::resource('labels', LabelController::class)->except('show');