@extends('docs.layout') @section('title', 'Manajemen Lampiran File') @section('breadcrumb')
Dokumentasi arsitektur penyimpanan berkas lampiran berbasis relasi Polymorphic, 3 tingkat hierarki lampiran, fitur in-page modal preview, dan penanganan multi-modal z-index.
@endsection @section('content')Untuk menghindari pembuatan tabel file yang terpisah-pisah untuk setiap modul, sistem SSE menggunakan satu tabel terpusat project_files dengan memanfaatkan relasi Eloquent Polymorphic (nullableMorphs):
| Kolom Database | Tipe Data | Fungsi & Peran |
|---|---|---|
project_id |
BIGINT (FK) |
Mengaitkan file ke proyek yang bersangkutan (untuk isolasi folder penyimpanan). |
fileable_id |
BIGINT (Nullable) |
ID dari entitas pemilik berkas (misal: ID transaksi Purchase, ID baris RabDetail). |
fileable_type |
VARCHAR (Nullable) |
Nama class Model pemilik berkas (App\Models\Purchase, App\Models\Usage, App\Models\RabDetail, atau NULL untuk level modul). |
nama_file / nama_asli |
VARCHAR |
Nama file terenkripsi unik di disk dan nama asli saat diunggah pengguna. |
path_file |
VARCHAR |
Lokasi penyimpanan pada direktori storage/app/public/project-files/{project_id}/. |
ukuran_file / mime_type |
BIGINT / VARCHAR |
Metadata ukuran berkas dalam bytes dan tipe MIME (cth: application/pdf, image/jpeg). |
Fitur lampiran melayani 3 kebutuhan operasional yang berbeda:
Disediakan via partial project_files_section.blade.php di halaman RAB, Rekap Stok, dan Upah Terbayar. Digunakan untuk dokumen umum (Surat Perjanjian Kontrak, SPK, RAP Master, Berita Acara Rekap).
Tombol paperclip dan badge indikator 📎 N per baris tabel RAB. Digunakan untuk melampirkan gambar kerja teknik, detail potongan konstruksi, atau analisis harga satuan spesifik rincian tersebut.
Tersedia di halaman Detail Pembelian (purchases/show) dan Detail Pemakaian (usages/show). Digunakan untuk melampirkan foto nota belanja toko, invoice vendor, kwitansi, atau surat jalan bermaterai.
#modalGlobalFilePreview): Pengguna tidak perlu membuka tab baru untuk membaca dokumen. Mengklik tombol pratinjau (👁️) akan langsung membuka pop-up modal:
<iframe> bawaan browser.resources/views/layouts/app.blade.php secara otomatis menghitung jumlah modal aktif dan menaikkan z-index modal baru (1090 + count * 20) agar tidak tertutup backdrop abu-abu.download() di ProjectFileController.php mengalirkan file langsung via stream download dengan nama asli file.| Layer | File / Direktori | Fungsi |
|---|---|---|
| Controller | app/Http/Controllers/Admin/ProjectFileController.php |
Method store, destroy, download, preview. |
| Model | app/Models/ProjectFile.php |
Relasi morphTo('fileable'), accessor helper (ukuranReadable, isImage, iconClass). |
| Partial View | resources/views/admin/partials/project_files_section.blade.php |
Komponen reusable daftar berkas & form upload level modul/transaksi. |
| Modal Layout | resources/views/layouts/app.blade.php |
Modal global preview (#modalGlobalFilePreview) dan script multi-modal stacking handler. |