Dodanei dedykowane dasboarda dla pracownika
This commit is contained in:
parent
cd1234a118
commit
ec39ee9965
@ -14,6 +14,15 @@ class DashboardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function index(): View
|
public function index(): View
|
||||||
{
|
{
|
||||||
|
$user = auth()->user();
|
||||||
|
|
||||||
|
if ($user && $user->hasRole('pracownik')) {
|
||||||
|
$myVehicles = $user->vehicles()->orderBy('brand')->orderBy('model')->get();
|
||||||
|
$myAdvances = $user->advances()->with('type')->orderByDesc('date')->orderByDesc('id')->get();
|
||||||
|
|
||||||
|
return view('dashboard', compact('myVehicles', 'myAdvances'));
|
||||||
|
}
|
||||||
|
|
||||||
$totalUsers = User::whereNull('deleted_at')->count();
|
$totalUsers = User::whereNull('deleted_at')->count();
|
||||||
$adminCount = Role::where('name', 'admin')->exists()
|
$adminCount = Role::where('name', 'admin')->exists()
|
||||||
? User::role('admin')->whereNull('deleted_at')->count()
|
? User::role('admin')->whereNull('deleted_at')->count()
|
||||||
|
|||||||
@ -1,13 +1,86 @@
|
|||||||
<x-app-layout>
|
<x-app-layout>
|
||||||
<x-slot name="header">
|
<x-slot name="header">
|
||||||
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
|
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
|
||||||
{{ __('Dashboard') }}
|
{{ auth()->user()->hasRole('pracownik') ? 'Mój dashboard' : __('Dashboard') }}
|
||||||
</h2>
|
</h2>
|
||||||
</x-slot>
|
</x-slot>
|
||||||
|
|
||||||
<div class="py-12">
|
<div class="py-12">
|
||||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
|
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
|
||||||
|
|
||||||
|
@if(auth()->user()->hasRole('pracownik'))
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||||
|
<div class="bg-white dark:bg-gray-800 p-6 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700/50">
|
||||||
|
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">Mój samochód</h3>
|
||||||
|
|
||||||
|
@if(($myVehicles ?? collect())->isEmpty())
|
||||||
|
<p class="text-sm text-gray-500 dark:text-gray-400">Brak przypisanego pojazdu.</p>
|
||||||
|
@else
|
||||||
|
<div class="space-y-4">
|
||||||
|
@foreach($myVehicles as $vehicle)
|
||||||
|
<div class="rounded-lg border border-gray-200 dark:border-gray-700/60 bg-gray-50 dark:bg-gray-900/30 p-4">
|
||||||
|
<div class="flex items-center justify-between gap-3">
|
||||||
|
<div>
|
||||||
|
<p class="text-lg font-semibold text-gray-900 dark:text-white">
|
||||||
|
{{ $vehicle->brand }} {{ $vehicle->model ?? '' }}
|
||||||
|
</p>
|
||||||
|
<p class="text-sm text-gray-500 dark:text-gray-400">
|
||||||
|
{{ $vehicle->registration_number }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-indigo-100 dark:bg-indigo-900/40 text-indigo-700 dark:text-indigo-200">
|
||||||
|
{{ $vehicle->status }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4 grid grid-cols-1 sm:grid-cols-2 gap-3 text-sm">
|
||||||
|
<div>
|
||||||
|
<p class="text-gray-500 dark:text-gray-400">OC</p>
|
||||||
|
<p class="font-medium text-gray-900 dark:text-white">{{ $vehicle->oc_expiry_date?->format('d.m.Y') ?? '—' }}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="text-gray-500 dark:text-gray-400">Przegląd</p>
|
||||||
|
<p class="font-medium text-gray-900 dark:text-white">{{ $vehicle->technical_inspection_date?->format('d.m.Y') ?? '—' }}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="text-gray-500 dark:text-gray-400">Ubezpieczenie</p>
|
||||||
|
<p class="font-medium text-gray-900 dark:text-white">{{ $vehicle->insurance_provider ?? '—' }}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="text-gray-500 dark:text-gray-400">Przebieg</p>
|
||||||
|
<p class="font-medium text-gray-900 dark:text-white">{{ number_format((float) $vehicle->mileage_km, 0, ',', ' ') }} km</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white dark:bg-gray-800 p-6 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700/50">
|
||||||
|
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">Moje zaliczki</h3>
|
||||||
|
|
||||||
|
@if(($myAdvances ?? collect())->isEmpty())
|
||||||
|
<p class="text-sm text-gray-500 dark:text-gray-400">Brak zaliczek.</p>
|
||||||
|
@else
|
||||||
|
<div class="space-y-3">
|
||||||
|
@foreach($myAdvances as $advance)
|
||||||
|
<div class="flex items-center justify-between gap-3 rounded-lg border border-gray-200 dark:border-gray-700/60 p-3">
|
||||||
|
<div>
|
||||||
|
<p class="font-medium text-gray-900 dark:text-white">{{ $advance->type?->name ?? '—' }}</p>
|
||||||
|
<p class="text-xs text-gray-500 dark:text-gray-400">{{ $advance->date->format('d.m.Y') }}</p>
|
||||||
|
</div>
|
||||||
|
<span class="font-semibold {{ $advance->amount >= 0 ? 'text-emerald-600 dark:text-emerald-400' : 'text-red-600 dark:text-red-400' }}">
|
||||||
|
{{ number_format((float) $advance->amount, 2, ',', ' ') }} zł
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
|
||||||
{{-- Karty ze statystykami --}}
|
{{-- Karty ze statystykami --}}
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||||
|
|
||||||
@ -225,6 +298,8 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</x-app-layout>
|
</x-app-layout>
|
||||||
@ -207,3 +207,44 @@ test('employee profile shows assigned vehicle with expire dates and insurance de
|
|||||||
$response->assertSee('OC');
|
$response->assertSee('OC');
|
||||||
$response->assertSee('Przegląd');
|
$response->assertSee('Przegląd');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('employee dashboard shows only own vehicle and advances', function () {
|
||||||
|
Permission::firstOrCreate(['name' => 'zaliczki_access']);
|
||||||
|
|
||||||
|
$employee = User::factory()->create();
|
||||||
|
$role = Role::firstOrCreate(['name' => 'pracownik']);
|
||||||
|
$role->givePermissionTo('zaliczki_access');
|
||||||
|
$employee->assignRole($role);
|
||||||
|
|
||||||
|
$assignedVehicle = Vehicle::create([
|
||||||
|
'brand' => 'Toyota',
|
||||||
|
'model' => 'Corolla',
|
||||||
|
'registration_number' => 'DW1234A',
|
||||||
|
'user_id' => $employee->id,
|
||||||
|
'year' => 2021,
|
||||||
|
'purchase_date' => '2021-05-12',
|
||||||
|
'oc_expiry_date' => now()->addDays(10)->toDateString(),
|
||||||
|
'oil_change_km' => 12000,
|
||||||
|
'insurance_provider' => 'PZU',
|
||||||
|
'technical_inspection_date' => now()->addDays(12)->toDateString(),
|
||||||
|
'mileage_km' => 95000,
|
||||||
|
'status' => 'używany',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$advanceType = \App\Models\AdvanceType::create(['name' => 'Paliwo']);
|
||||||
|
\App\Models\Advance::create([
|
||||||
|
'date' => now()->subDays(2)->toDateString(),
|
||||||
|
'user_id' => $employee->id,
|
||||||
|
'amount' => 250.50,
|
||||||
|
'advance_type_id' => $advanceType->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this->actingAs($employee)->get(route('dashboard'));
|
||||||
|
|
||||||
|
$response->assertOk();
|
||||||
|
$response->assertSee('Mój dashboard');
|
||||||
|
$response->assertSee('Mój samochód');
|
||||||
|
$response->assertSee($assignedVehicle->brand);
|
||||||
|
$response->assertSee('Moje zaliczki');
|
||||||
|
$response->assertSee('250,50');
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user