Initial commit: Struktur aplikasi ilycats

This commit is contained in:
Dwi F Sukmana
2026-02-08 15:16:35 +07:00
commit 0921901aed
235 changed files with 29016 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
<?php
use App\Http\Controllers\Auth\AuthenticatedSessionController;
use App\Http\Controllers\Auth\ConfirmablePasswordController;
use App\Http\Controllers\Auth\EmailVerificationNotificationController;
use App\Http\Controllers\Auth\EmailVerificationPromptController;
use App\Http\Controllers\Auth\NewPasswordController;
use App\Http\Controllers\Auth\PasswordController;
use App\Http\Controllers\Auth\PasswordResetLinkController;
use App\Http\Controllers\Auth\RegisteredUserController;
use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;
Route::middleware('guest')->group(function () {
Route::get('register', [RegisteredUserController::class, 'create'])
->name('register');
Route::post('register', [RegisteredUserController::class, 'store']);
Route::get('login', [AuthenticatedSessionController::class, 'create'])
->name('login');
Route::post('login', [AuthenticatedSessionController::class, 'store']);
Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])
->name('password.request');
Route::post('forgot-password', [PasswordResetLinkController::class, 'store'])
->name('password.email');
Route::get('reset-password/{token}', [NewPasswordController::class, 'create'])
->name('password.reset');
Route::post('reset-password', [NewPasswordController::class, 'store'])
->name('password.store');
});
Route::middleware('auth')->group(function () {
Route::get('verify-email', EmailVerificationPromptController::class)
->name('verification.notice');
Route::get('verify-email/{id}/{hash}', VerifyEmailController::class)
->middleware(['signed', 'throttle:6,1'])
->name('verification.verify');
Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store'])
->middleware('throttle:6,1')
->name('verification.send');
Route::get('confirm-password', [ConfirmablePasswordController::class, 'show'])
->name('password.confirm');
Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']);
Route::put('password', [PasswordController::class, 'update'])->name('password.update');
Route::post('logout', [AuthenticatedSessionController::class, 'destroy'])
->name('logout');
});
+12
View File
@@ -0,0 +1,12 @@
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
// Menjalankan perintah pembersihan log setiap hari pada jam 00:00
Schedule::command('activity-log:clean')->daily();
+120
View File
@@ -0,0 +1,120 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\{
ProfileController, CatController, DashboardController,
InventoryController, TreatmentController, UserController,
MedicalDashboardController, SettingController, MedicineController,
CategoryController, FoodController, ReportController, SupplyController,
MattingReportController, RoleController
};
use App\Http\Controllers\Breeding\MattingController;
// --- GUEST / PUBLIC ---
Route::get('/', fn() => redirect()->route('login'));
// --- AUTHENTICATED ROUTES ---
Route::middleware(['auth', 'verified'])->group(function () {
// --- DASHBOARD & INSIGHTS ---
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('/medical/insights', [MedicalDashboardController::class, 'index'])->name('medical.dashboard');
// --- OPERASIONAL: CATS & MEDICAL ---
Route::resource('cats', CatController::class);
Route::get('/cats/{cat}/pdf', [CatController::class, 'downloadPdf'])->name('cats.pdf'); // Rute PDF Existing
Route::resource('treatments', TreatmentController::class);
Route::resource('matting', MattingController::class);
// API Helpers (Data fetching untuk keperluan form dinamis - TETAP ADA)
Route::get('/api/cats/{id}', [MattingController::class, 'getCatData'])->name('api.cat.details');
// --- MASTER CATEGORIES ---
// Rute Sinkronisasi Kategori (Existing)
Route::post('/categories/recategorize', [CategoryController::class, 'recategorizeAll'])->name('categories.recategorize');
Route::resource('categories', CategoryController::class);
// --- LOGISTIK & INVENTORI (MODUL LENGKAP) ---
Route::prefix('inventory')->name('inventory.')->group(function () {
// Medicines (Template & Batch Upload Tetap Ada)
Route::prefix('medicines')->name('medicines.')->group(function() {
Route::get('/template', [MedicineController::class, 'downloadTemplate'])->name('template');
Route::post('/batch', [MedicineController::class, 'batchUpload'])->name('batch');
});
Route::resource('medicines', MedicineController::class);
// Foods (Template & Batch Upload Tetap Ada)
Route::prefix('foods')->name('foods.')->group(function() {
Route::get('/template', [FoodController::class, 'downloadTemplate'])->name('template');
Route::post('/batch', [FoodController::class, 'batchUpload'])->name('batch');
});
Route::resource('foods', FoodController::class);
// Supplies (Template & Batch Upload Tetap Ada)
Route::prefix('supplies')->name('supplies.')->group(function() {
Route::get('/template', [SupplyController::class, 'downloadTemplate'])->name('template');
Route::post('/batch', [SupplyController::class, 'batchUpload'])->name('batch');
});
Route::resource('supplies', SupplyController::class);
// Utility: Update stok cepat (Patch Route Existing)
Route::patch('/update-stock/{type}/{id}', [InventoryController::class, 'updateStock'])->name('update-stock');
});
// --- USER PROFILE ---
Route::controller(ProfileController::class)->name('profile.')->group(function () {
Route::get('/profile', 'edit')->name('edit');
Route::patch('/profile', 'update')->name('update');
Route::delete('/profile', 'destroy')->name('destroy');
});
/**
* PERBAIKAN: ADMINISTRATOR & INTELLIGENCE CENTER
* Dipindahkan keluar dari middleware 'admin' agar akses bisa diatur via Role Management.
* Prefix 'admin' dan Name 'admin.' tetap dipertahankan agar link sidebar tidak rusak.
*/
Route::prefix('admin')->name('admin.')->group(function () {
// 1. ROLE & PERMISSION MANAGEMENT (Pindah ke matriks izin)
Route::prefix('roles')->name('roles.')->group(function() {
Route::get('/', [RoleController::class, 'index'])->name('index');
Route::get('/create', [RoleController::class, 'create'])->name('create');
Route::post('/store', [RoleController::class, 'store'])->name('store');
Route::get('/{id}/edit', [RoleController::class, 'edit'])->name('edit');
Route::post('/{id}/update', [RoleController::class, 'update'])->name('update');
Route::delete('/{role}/destroy', [RoleController::class, 'destroy'])->name('destroy');
});
// 2. USER MANAGEMENT & LOGS (Audit Trail Lengkap)
Route::resource('users', UserController::class);
Route::prefix('logs')->name('logs.')->group(function() {
Route::get('/', [UserController::class, 'activityLogs'])->name('index');
Route::get('/export', [UserController::class, 'exportLogs'])->name('export'); // Export Excel Audit Trail
Route::delete('/clear', [UserController::class, 'clearLogs'])->name('clear'); // Bersihkan Log
});
// 3. INTELLIGENCE & REPORTS (Pusat Laporan)
Route::prefix('reports')->name('reports.')->group(function() {
Route::get('/', [ReportController::class, 'index'])->name('index');
Route::get('/export/{module}/{format}', [ReportController::class, 'export'])->name('export');
// Matting Report: Read-Only Archive (Histori Breeding)
Route::prefix('matting')->name('matting.')->group(function() {
Route::get('/', [MattingReportController::class, 'index'])->name('index');
Route::get('/{id}', [MattingReportController::class, 'show'])->name('show');
Route::get('/{id}/print', [MattingReportController::class, 'printSingle'])->name('print');
});
});
// 4. GENERAL SYSTEM SETTINGS
Route::prefix('settings')->name('settings.')->group(function() {
Route::get('/', [SettingController::class, 'index'])->name('index');
Route::post('/update', [SettingController::class, 'update'])->name('update');
});
});
});
require __DIR__.'/auth.php';