Added CRUD for Duty Hours

This commit is contained in:
noah.lancien 2023-04-18 10:46:40 +00:00
parent 4ab70133d4
commit d49bb5eaa7
10 changed files with 314 additions and 0 deletions

View file

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Dutyhour;
use Kwaadpepper\CrudPolicies\Traits\CrudController;
class DutyhourController extends Controller
{
use CrudController;
/** @var \App\Models\MacroSchedule\Marker */
public static $modelClass = Dutyhour::class;
/**
* Crud Layout
*
* @var string
*/
public static $layout = 'layout.app';
}

99
app/Models/Dutyhour.php Normal file
View file

@ -0,0 +1,99 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Kwaadpepper\CrudPolicies\Enums\CrudAction;
use Kwaadpepper\CrudPolicies\Enums\CrudType;
use Kwaadpepper\CrudPolicies\Traits\IsCrudModel;
class Dutyhour extends Model
{
use HasFactory;
use IsCrudModel;
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = true;
/**
* Crud label column
*
* @var string
*/
protected $crudLabelColumn = 'date';
/**
* Crud value column
*
* @var string
*/
protected $crudValueColumn = 'id';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'date', 'person', 'place'
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $casts = [
'date' => 'date'
];
/**
* Package
*
* @param array $attributes
*/
public function __construct(array $attributes = [])
{
self::$editableProperties = [
'date' => [
'label' => trans('Date'),
'type' => CrudType::date(),
'nullable' => false,
'actions' => [
CrudAction::viewAny(),
CrudAction::view(),
CrudAction::update(),
CrudAction::create()
]
],
'person' => [
'label' => trans('Personne présente'),
'type' => CrudType::string(),
'nullable' => false,
'actions' => [
CrudAction::viewAny(),
CrudAction::view(),
CrudAction::update(),
CrudAction::create()
]
],
'place' => [
'label' => trans('Lieu'),
'type' => CrudType::string(),
'nullable' => false,
'actions' => [
CrudAction::viewAny(),
CrudAction::view(),
CrudAction::update(),
CrudAction::create()
]
],
];
parent::__construct($attributes);
}
}

View file

@ -0,0 +1,38 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Policies\Rules\UserRoleRules as URR;
use Illuminate\Auth\Access\HandlesAuthorization;
use Illuminate\Database\Eloquent\Model;
use Kwaadpepper\CrudPolicies\Policies\RootPolicy;
class DutyhourPolicy extends RootPolicy
{
use HandlesAuthorization;
/**
* Init policies on call
*
* @param \App\Models\User $user
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed
*/
public function setPolicies(User $user, Model $model = null)
{
// phpcs:enable
/**
* This first rule to return true in a policy action authorises the action
*/
$this->policies = [
'dutyhour' => [
'viewAny' => URR::make('userIsAdmin', $user),
'create' => URR::make('userIsAdmin', $user),
'update' => URR::make('userIsAdmin', $user),
'delete' => URR::make('userIsAdmin', $user)
]
];
}
}

View file

@ -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);

View file

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateDutyhoursTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('dutyhours', function (Blueprint $table) {
$table->id();
$table->date('date');
$table->string('person');
$table->string('place');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('dutyhours');
}
}

View file

@ -16,5 +16,6 @@ return [
'packages' => 'Packages',
'invoices' => 'Invoices',
'companies' => 'Companies',
'dutyhours' => 'Duty Hours',
]
];

View file

@ -16,5 +16,6 @@ return [
'packages' => 'Forfaits',
'invoices' => 'Devis',
'companies' => 'Sociétés',
'dutyhours' => 'Permanences',
]
];

View file

@ -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')
<div class="card">
@include('crud-policies::crud.modules.flashMessage')
<div class="card-header">
@include('crud-policies::crud.modules.breadcrumb', ['action' => CrudAction::viewAny()])
@include('crud-policies::crud.modules.actionbar.bar', ['action' => CrudAction::viewAny()])
</div>
<div class="card-body">
<div class="row justify-content-center">
<div class="col">
{{ $models->links() }}
</div>
<div class="col">
<form action="{{ url()->current() }}">
<div class="input-group mb-3">
<input type="search" name="search" class="form-control" value="{{ request()->search }}"/>
<input type="text" name="sort_col" class="d-none" value="{{ request()->sort_col }}"/>
<input type="text" name="sort_way" class="d-none" value="{{ request()->sort_way }}"/>
<a class="btn btn-danger" href="{{ url()->current() }}">{{ __('crud-policies::crud.reset') }}</a>
<button type="submit" class="btn btn-primary">
{{ __('crud-policies::crud.search') }}
</button>
</div>
</form>
</div>
</div>
<table class="table text-center">
<thead class="thead-dark">
@include('crud-policies::crud.modules.sorter')
</thead>
<tbody>
@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)
<tr>
@foreach ($modelClass::getEditableProperties() as $fieldName => $prop)
@if(in_array(CrudAction::viewAny(), $prop['actions']))
@switch($prop['type'])
@case(CrudType::password())
{{-- Ignore --}}
@break
@default
<td>@include('crud-policies::crud.printfield', [
'action' => CrudAction::viewAny(),
'field' => $model->{$fieldName},
'props' => $prop,
"$modelTable$fieldName" => ${"$modelTable$fieldName"} ?? null
])</td>
@endswitch
@endif
@endforeach
{{-- MODEL ACTIONS --}}
<td>
<div class="btn-group" role="group" aria-label="{{ Str::plural(__('crud-policies::crud.action')) }}">
@can('view', $model)
<a href="{{ CrudController::getRoutePrefixed("$modelTable.show", $model) }}" class="btn btn-sm btn-primary">{{ __('crud-policies::crud.view') }}</a>
@endcan
@can('update', $model)
<a href="{{ CrudController::getRoutePrefixed("$modelTable.edit", $model) }}" class="btn btn-sm btn-info">{{ __('crud-policies::crud.edit') }}</a>
@endcan
@can('delete', $model)
<form class="CrudConfirmDelete" action="{{ CrudController::getRoutePrefixed("$modelTable.destroy", $model) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-danger">{{ __('crud-policies::crud.delete') }}</button>
</form>
@endcan
@can('viewAny', \App\Models\Log::class)
<a href="{{ CrudController::getRoutePrefixed("dutyhours.logs.index", $model) }}" class="btn btn-sm btn-dark">{{ __('models.classes.logs') }}</a>
@endcan
@can('viewAny', \App\Models\File::class)
<a href="{{ CrudController::getRoutePrefixed("dutyhours.files.index", $model) }}" class="btn btn-sm btn-dark">{{ __('models.classes.files') }}</a>
@endcan
</div>
</td>
</tr>
@endforeach
@else
<tr>
<td colspan="{{ count($modelClass::getEditableProperties()) }}">
{{ __('crud-policies::crud.nothingtoshow') }}
</td>
</tr>
@endif
</tbody>
</table>
{{ $models->links() }}
</div>
</div>
@include('crud-policies::crud.modules.scriptConstants')
@endsection

View file

@ -46,6 +46,9 @@
@can('viewAny', App\Models\Package::class)
<a class="dropdown-item @if(strpos(request()->route()->getName(), 'packages') === 0)active @endif" href="{{ route('packages.index') }}">{{ __('models.classes.packages') }}</a>
@endcan
@can('viewAny', App\Models\Dutyhour::class)
<a class="dropdown-item @if(strpos(request()->route()->getName(), 'dutyhours') === 0)active @endif" href="{{ route('dutyhours.index') }}">{{ __('models.classes.dutyhours') }}</a>
@endcan
</div>
</li>
@endif

View file

@ -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');