Sistem Manajemen Aset berbasis Laravel untuk pencatatan aset fisik end-to-end: registrasi aset + identifikasi (QR/RFID/NFC), movement, disposal + reverse, maintenance, audit/stocktake, approval workflow, laporan (Excel/PDF), changelog, dan pengaturan sistem berbasis database.
Project ini dibuat dengan fokus pada best practice, clean code, dan siap untuk dikembangkan menjadi open-source.
- Fitur Utama
- Arsitektur Singkat
- Kebutuhan Sistem
- Quick Start (Local Development)
- Setup Wizard (First Run)
- Akun Default (Sample Data)
- RBAC (Role & Permission)
- System Settings (Database-driven)
- Identifikasi Aset (QR/RFID/NFC)
- Transaksi Aset
- Approval Workflow
- Authentication, 2FA, Session Timeout
- Audit Trail & Logging
- Import/Export Aset
- Laporan (Excel & PDF)
- Landing Page & Public Asset View (QR Scan)
- Notifikasi Email (SMTP)
- Notifikasi Terjadwal (Command)
- Maintenance Mode (Read-only)
- Testing
- Deployment Notes
- Contributing
- Dokumentasi Lengkap
1) User Management + RBAC (Spatie Permission)
- Role & permission berbasis UUID
- Pembatasan akses per modul melalui middleware
permission:*
2) Master Data
- Status Aset, Kelas Aset, Unit, Departemen, Person in Charge, Pengguna Aset, Kategori, Lokasi, Warranty, Vendor Contract
3) Manajemen Aset
- Registrasi aset dengan kode otomatis
- Foto/thumbnail aset (multi foto) tersimpan di storage
- QR code otomatis menuju halaman publik detail aset (tanpa login)
- RFID/NFC tag (opsional + bisa auto-generate via setting)
- Arsip/retensi + soft delete + restore
4) Transaksi Aset
- Movement (mutasi lokasi/departemen/user)
- Disposal + Reverse Disposal
- Audit/Stocktake
- Maintenance (planned/in_progress/completed + dukungan flow approval
pending)
5) Approval Workflow
- Permintaan approval untuk movement/disposal/maintenance (pending/approved/rejected)
- Halaman approvals untuk approver
6) Laporan
- Export Excel (multi sheet) + PDF untuk aset dan transaksi
- Filter laporan (date range, lokasi, dsb.) sesuai halaman laporan
7) Landing & Dokumentasi
- Landing one-page untuk memperkenalkan sistem
- Public asset view untuk QR scan:
GET /asset-view/{asset} - Dokumentasi API internal app:
GET /api-docs
- Framework: Laravel
- Template UI: Vyzor (Bootstrap)
- Settings: disimpan di tabel
settingsdan diakses melaluiApp\Services\System\SystemSettingService - Audit log: file log khusus channel
asset_activity(bukan database) - UUID: hampir seluruh tabel inti menggunakan UUID sebagai primary key
Folder penting:
app/Services/→ business logic (tanpa repository pattern)app/Http/Controllers/→ controller tipis, delegasi ke servicedatabase/seeders/→ sample dataresources/views/→ Blade UI
- PHP 8.2+ (sesuaikan dengan
composer.json) - Composer
- Node.js + NPM (Vite build)
- Database: MySQL/MariaDB (production) / SQLite (testing)
- (Opsional) Laragon untuk dev di Windows
- Install dependency PHP & JS
composer install
npm install- Siapkan
.env
cp .env.example .env
php artisan key:generate- Jalankan Vite
npm run dev- Jalankan aplikasi
php artisan serve- Buat symbolic link storage (wajib untuk foto aset & QR)
php artisan storage:linkSaat aplikasi pertama kali dijalankan dan koneksi database belum siap, middleware akan mengarahkan ke wizard:
GET /setup
Wizard terdiri dari 2 tahap besar:
- Database Setup
- Aplikasi akan menampilkan panduan mengisi
.env(DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD) - Tombol migrasi tersedia:
Migrate & Seed Minimal (RBAC)→ seedRbacSeeder+SettingSeederMigrate + Sample Data (Full Seed)→ seedDatabaseSeeder
- Wizard Aplikasi (4 langkah)
- Step 1: buat user admin
- Step 2: isi nilai setting (form dibentuk dari data di tabel
settings) - Step 3: buat master data dasar
- Step 4: buat aset pertama (sample)
Jika memilih Full Seed, akun admin default dibuat oleh database/seeders/RbacSeeder.php:
- Email:
admin@example.com - Password:
password123
RBAC memakai spatie/laravel-permission yang sudah disesuaikan untuk UUID:
- Primary key role/permission:
uuid - Pivot model:
model_uuid(lihatconfig/permission.php)
Permission dasar (seed):
settings.manageusers.manage,roles.manage,permissions.manageassets.view,assets.managemovements.manage,disposals.manage,audits.manage,maintenance.managereports.view,approvals.manage
Role dasar (seed):
super-admin,asset-manager,auditor,maintenance,viewer
Catatan scoping data:
- Model
AssetmemilikiscopeForUser()danisVisibleTo()untuk pembatasan berbasis departemen/lokasi. - (Opsional) Permission
assets.view_alldapat ditambahkan untuk bypass scoping (lihatapp/Models/Asset.php).
Setting disimpan di tabel settings dan dapat dikelola lewat:
- Dashboard:
GET /dashboard/settings - Setup Wizard step 2:
GET /setup?step=2
Setting dibaca via App\Services\System\SystemSettingService:
- Default berasal dari
config/system.php - Nilai DB akan override default
Contoh setting penting (lihat database/seeders/SettingSeeder.php):
asset.code_prefix,asset.qr_enabled,asset.qr_format,asset.qr_sizeasset.rfid_enabled,asset.nfc_enabled,asset.rfid_auto_generate,asset.nfc_auto_generatemaintenance.readonly_modesecurity.audit_log,security.session_idle_minutes,security.two_factor_enforcedintegration.api_key,integration.webhook_*asset.import_*(import limit/dedupe/default lookup)
QR Code
- Dibuat otomatis saat aset dibuat/di-update (jika
asset.qr_enabled = true) - Tersimpan di
storage/app/public/qr/ - Isi QR mengarah ke public asset view:
route('assets.public.show')(/asset-view/{asset})
RFID/NFC
- Disimpan sebagai
rfid_tagdannfc_tagdi tabelassets - Bisa diwajibkan (
asset.rfid_required/asset.nfc_required) dan/atau auto-generate (asset.rfid_auto_generate/asset.nfc_auto_generate) olehAssetService.
- Movement
- Membuat record
asset_movements - Jika auto-approve aktif, aset akan ikut berubah: lokasi/departemen/user
- Disposal
- Membuat record
asset_disposals - Jika approved, aset diarahkan ke status
DISPOSED(jika status ini ada) - Reverse disposal mengembalikan status/lokasi/departemen sebelumnya
- Audit/Stocktake
- Membuat record
asset_audits(matched/missing/damaged)
- Maintenance
- Membuat record
asset_maintenances - Flow status:
pending(menunggu approval) →planned→in_progress→completed
Approval disimpan di tabel asset_approval_requests (morph ke movement/disposal/maintenance):
- Status:
pending,approved,rejected
Halaman approvals:
GET /dashboard/approvals(butuh permissionapprovals.manage)
Login/Register
- Login:
GET /login/POST /login - Register:
GET /register/POST /register - Logout:
POST /logout
2FA (TOTP 6 digit)
- User dapat mengaktifkan 2FA dari menu profile:
GET /dashboard/profile
- Flow login:
- Jika
two_factor_enabled = true, setelah password benar user akan diarahkan ke:GET /two-factor-challenge
- User memasukkan 6 digit dari aplikasi authenticator (Google Authenticator/1Password/Authy) melalui:
POST /two-factor-challenge
- Jika
Session Timeout (idle timeout)
- Middleware
session.timeoutmemaksa logout ketika tidak ada aktivitas selama X menit. - Setting terkait:
security.session_idle_minutes
1) Request Audit (End-to-end)
- Middleware
audit.requestmencatat request non-GET beserta durasi response. - Disimpan via
ActivityLogger::audit().
2) Log Aktivitas Domain
- Helper:
asset_activity_log(...)asset_request_log(...)
- Service:
app/Services/Logging/ActivityLogger.php
Output log
- Channel:
asset_activity - Lokasi:
storage/logs/asset-activity.log(daily rotation) - ENV yang relevan:
ASSET_LOG_FILE,ASSET_LOG_LEVEL,ASSET_LOG_DAYS
Import
- UI import ada di halaman daftar aset (
/dashboard/assets) - Mendukung:
Preview(tanpa menyimpan) + ringkasan create/update/invalidImportlangsung (create/update)- Gambar dari:
- URL (
image_url) (jikaasset.import_allow_remote_images = true) - ZIP upload (
images_zip) dengan mapping nama file (image_file)
- URL (
Sample file import tersedia:
public/samples/assets_import_sample.csv
Export
- CSV export (limit 2000 rows) tersedia via route:
GET /dashboard/assets-export
Menu laporan:
GET /dashboard/reports/assetsGET /dashboard/reports/movementsGET /dashboard/reports/disposalsGET /dashboard/reports/audits
Export:
- Excel: multi-sheet (termasuk relasi utama)
- PDF: layout khusus report
Landing:
GET /atauGET /landing
Public asset view (tanpa login):
GET /asset-view/{asset}
Transaksi dari halaman public (wajib login + permission terkait):
- Movement:
POST /asset-view/{asset}/movement - Disposal:
POST /asset-view/{asset}/disposal - Maintenance:
POST /asset-view/{asset}/maintenance
Notifikasi saat approval menggunakan Laravel Notifications (channel mail):
- Approver menerima email “approval requested”
- Requester menerima email “approval approved/rejected”
Agar email terkirim, konfigurasi SMTP pada .env (contoh):
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="Asset Management System"Tersedia command untuk reminder sederhana (mencatat ke log asset_activity):
php artisan asset:notify-dueAnda bisa menjadwalkannya via cron (contoh setiap hari jam 08:00):
0 8 * * * cd /path/to/project && php artisan asset:notify-due >> /dev/null 2>&1Jika setting maintenance.readonly_mode = true:
- Middleware
maintenance.readonlyakan memblokir aksi tulis. - Dashboard menampilkan badge “Mode Read-only Aktif”.
Menjalankan test (SQLite):
php artisan testChecklist singkat production:
APP_ENV=production,APP_DEBUG=false,APP_KEYsudah terisiphp artisan migrate --forcephp artisan storage:linknpm run build(atau gunakan build artifact yang sudah ada dipublic/build)- Pastikan permission folder:
storage/danbootstrap/cache/writable
Kontribusi sangat diterima.
- Gunakan style & struktur yang sudah ada (controller tipis, logic di service)
- Tambahkan test untuk fitur baru bila memungkinkan
- Buat PR kecil dan fokus per fitur
Dokumentasi teknis terperinci (alur, setting, workflow, integrasi, notifikasi, dsb.) tersedia di:
documentation/guide.md
