Dodanei dedykowane dasboarda dla pracownika

This commit is contained in:
Tomasz Boruc 2026-08-30 22:00:28 +02:00
parent cd1234a118
commit ec39ee9965
3 changed files with 126 additions and 1 deletions

View File

@ -14,6 +14,15 @@ class DashboardController extends Controller
*/
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();
$adminCount = Role::where('name', 'admin')->exists()
? User::role('admin')->whereNull('deleted_at')->count()

View File

@ -1,13 +1,86 @@
<x-app-layout>
<x-slot name="header">
<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>
</x-slot>
<div class="py-12">
<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, ',', ' ') }}
</span>
</div>
@endforeach
</div>
@endif
</div>
</div>
@else
{{-- Karty ze statystykami --}}
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
@ -225,6 +298,8 @@
</div>
@endif
</div>
</div>
</x-app-layout>

View File

@ -207,3 +207,44 @@ test('employee profile shows assigned vehicle with expire dates and insurance de
$response->assertSee('OC');
$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');
});