diff --git a/app/Http/Controllers/Master/VendorController.php b/app/Http/Controllers/Master/VendorController.php new file mode 100644 index 0000000..c151147 --- /dev/null +++ b/app/Http/Controllers/Master/VendorController.php @@ -0,0 +1,63 @@ +get(); + + return view('masters.vendors', [ + 'title' => 'Vendor & Kontrak', + 'contracts' => $contracts, + ]); + } + + public function store(Request $request): RedirectResponse + { + $data = $request->validate([ + 'vendor_name' => ['required', 'string', 'max:255'], + 'contract_number' => ['nullable', 'string', 'max:255'], + 'start_date' => ['nullable', 'date'], + 'end_date' => ['nullable', 'date', 'after_or_equal:start_date'], + 'sla_response_hours' => ['nullable', 'integer', 'min:0'], + 'sla_resolution_hours' => ['nullable', 'integer', 'min:0'], + 'notes' => ['nullable', 'string'], + ]); + + VendorContract::create($data); + + return back()->with('success', 'Vendor/kontrak berhasil ditambahkan.'); + } + + public function update(Request $request, VendorContract $vendor_contract): RedirectResponse + { + $data = $request->validate([ + 'vendor_name' => ['required', 'string', 'max:255'], + 'contract_number' => ['nullable', 'string', 'max:255'], + 'start_date' => ['nullable', 'date'], + 'end_date' => ['nullable', 'date', 'after_or_equal:start_date'], + 'sla_response_hours' => ['nullable', 'integer', 'min:0'], + 'sla_resolution_hours' => ['nullable', 'integer', 'min:0'], + 'notes' => ['nullable', 'string'], + ]); + + $vendor_contract->update($data); + + return back()->with('success', 'Vendor/kontrak berhasil diperbarui.'); + } + + public function destroy(VendorContract $vendor_contract): RedirectResponse + { + $vendor_contract->delete(); + + return back()->with('success', 'Vendor/kontrak berhasil dihapus.'); + } +} diff --git a/database/seeders/AssetSeeder.php b/database/seeders/AssetSeeder.php index 15912f0..eecb3f8 100644 --- a/database/seeders/AssetSeeder.php +++ b/database/seeders/AssetSeeder.php @@ -33,15 +33,17 @@ class AssetSeeder extends Seeder $user = AssetUser::first(); $location = AssetLocation::first(); $warranty = Warranty::first(); - $contract = VendorContract::create([ - 'vendor_name' => 'Vendor Default', - 'contract_number' => 'CNT-001', - 'start_date' => now()->subMonths(6), - 'end_date' => now()->addMonths(6), - 'sla_response_hours' => 4, - 'sla_resolution_hours' => 24, - 'notes' => 'Kontrak default untuk sample aset', - ]); + $contract = VendorContract::firstOrCreate( + ['contract_number' => 'CNT-001'], + [ + 'vendor_name' => 'Vendor Default', + 'start_date' => now()->subMonths(6), + 'end_date' => now()->addMonths(6), + 'sla_response_hours' => 4, + 'sla_resolution_hours' => 24, + 'notes' => 'Kontrak default untuk sample aset', + ] + ); $names = [ 'Laptop Dell XPS 13', diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6eca200..a5cac03 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -14,6 +14,7 @@ class DatabaseSeeder extends Seeder $this->call([ SettingSeeder::class, RbacSeeder::class, + VendorContractSeeder::class, TwoFactorUserSeeder::class, MasterDataSeeder::class, AssetSeeder::class, diff --git a/database/seeders/VendorContractSeeder.php b/database/seeders/VendorContractSeeder.php new file mode 100644 index 0000000..079428e --- /dev/null +++ b/database/seeders/VendorContractSeeder.php @@ -0,0 +1,40 @@ + 'Vendor Default', + 'contract_number' => 'CNT-001', + 'start_date' => now()->subMonths(6), + 'end_date' => now()->addMonths(6), + 'sla_response_hours' => 4, + 'sla_resolution_hours' => 24, + 'notes' => 'Kontrak default untuk sample aset', + ], + [ + 'vendor_name' => 'PT Tech Service', + 'contract_number' => 'CNT-002', + 'start_date' => now()->subMonths(3), + 'end_date' => now()->addMonths(9), + 'sla_response_hours' => 2, + 'sla_resolution_hours' => 12, + 'notes' => 'Support perangkat jaringan & server', + ], + ]; + + foreach ($contracts as $c) { + VendorContract::firstOrCreate( + ['contract_number' => $c['contract_number']], + $c + ); + } + } +} diff --git a/resources/views/layouts/components/main-sidebar.blade.php b/resources/views/layouts/components/main-sidebar.blade.php index 954a3a2..d682620 100644 --- a/resources/views/layouts/components/main-sidebar.blade.php +++ b/resources/views/layouts/components/main-sidebar.blade.php @@ -130,6 +130,8 @@
  • Masa Garansi
  • +
  • Vendor & Kontrak
  • diff --git a/resources/views/masters/vendor_form.blade.php b/resources/views/masters/vendor_form.blade.php new file mode 100644 index 0000000..47bfbbe --- /dev/null +++ b/resources/views/masters/vendor_form.blade.php @@ -0,0 +1,36 @@ + + diff --git a/resources/views/masters/vendors.blade.php b/resources/views/masters/vendors.blade.php new file mode 100644 index 0000000..14f004a --- /dev/null +++ b/resources/views/masters/vendors.blade.php @@ -0,0 +1,143 @@ +@extends('layouts.master') + +@section('content') +
    +
    +

    Vendor & Kontrak

    +

    Kelola vendor, kontrak, dan SLA untuk integrasi aset.

    +
    + +
    + +
    +
    +
    Data Vendor / Kontrak
    +
    +
    + @if(session('success')) + + @endif + + @if($errors->any()) +
    +
      + @foreach($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    + @endif + +
    + + + + + + + + + + + + + @forelse($contracts as $item) + + + + + + + + + @empty + + @endforelse + +
    VendorKontrak #PeriodeSLA (Resp/Res)CatatanAksi
    {{ $item->vendor_name }}{{ $item->contract_number ?: '-' }} + {{ optional($item->start_date)->format('d/m/Y') ?: '-' }} - + {{ optional($item->end_date)->format('d/m/Y') ?: '-' }} + {{ $item->sla_response_hours ?? '-' }}h / {{ $item->sla_resolution_hours ?? '-' }}h{{ $item->notes ?: '-' }} + +
    + @csrf + @method('DELETE') + +
    +
    Belum ada data.
    +
    +
    +
    + + {{-- Modal create --}} + + + {{-- Modal edit --}} + +@endsection + +@section('scripts') + +@endsection diff --git a/routes/web.php b/routes/web.php index 95e49be..6a9d083 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,6 +16,7 @@ use App\Http\Controllers\Master\AssetUserController; use App\Http\Controllers\Master\AssetCategoryController; use App\Http\Controllers\Master\AssetLocationController; use App\Http\Controllers\Master\WarrantyController; +use App\Http\Controllers\Master\VendorController; use App\Http\Controllers\AssetController; use App\Http\Controllers\AssetTransactionController; use App\Http\Controllers\AssetAuditController; @@ -82,6 +83,8 @@ Route::middleware(['auth','maintenance.readonly','session.timeout','audit.reques ->middleware('permission:assets.manage'); Route::resource('warranties', WarrantyController::class)->only(['index', 'store', 'update', 'destroy']) ->middleware('permission:assets.manage'); + Route::resource('vendor-contracts', VendorController::class)->only(['index', 'store', 'update', 'destroy']) + ->middleware('permission:assets.manage'); Route::get('assets/{asset}/history', [AssetController::class, 'history'])->name('assets.history')->middleware('permission:assets.view'); Route::resource('assets', AssetController::class)->only(['index', 'store', 'update', 'show'])