﻿**********************
Windows PowerShell transcript start
Start time: 20261113163032
Username: DESKTOP-BUG00VA\Asus
RunAs User: DESKTOP-BUG00VA\Asus
Configuration Name: 
Machine: DESKTOP-BUG00VA (Microsoft Windows NT 10.0.26200.0)
Host Application: C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command try { . "c:\Users\Asus\AppData\Local\Programs\Microsoft VS Code\69047191fc\resources\app\out\vs\workbench\contrib\terminal\common\scripts\shellIntegration.ps1" } catch {}
Process ID: 16108
PSVersion: 5.1.26100.9818
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.26100.9818
BuildVersion: 10.0.26100.9818
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is .\AJARA_PAYMENT_AUDIT.txt

========== app\Models\PublicationOrder.php ==========
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PublicationOrder extends Model {protected $fillable=['user_id','competition_id','package','amount','proof_path','payment_status','review_status','admin_note','paid_at'];protected $casts=['paid_at'=>'datetime'];public function user():BelongsTo{return $this->belongsTo(User::class);}public function competition():BelongsTo{return $this->belongsTo(Competition::class);}}

========== app\Http\Controllers\OrganizerController.php ==========
<?php
namespace App\Http\Controllers;
use App\Models\Competition; use App\Models\PublicationOrder; use Illuminate\Http\Request;
class OrganizerController extends Controller {
 private const PACKAGES=['Basic'=>150000,'Premium'=>300000,'Featured'=>500000];
 public function index(){$orders=auth()->user()->publicationOrders()->with('competition')->latest()->get();return view('organizer.dashboard',compact('orders'));}
 public function create(){return view('organizer.create',['packages'=>self::PACKAGES]);}
 public function store(Request $r){$d=$r->validate(['title'=>'required|string|max:180','organizer'=>'required|string|max:180','competition_category'=>'required|string|max:100','competition_level'=>'required|string|max:50','delivery_mode'=>'required|in:Online,Offline,Hybrid','location'=>'nullable|string|max:180','description'=>'required|string|max:10000','requirements'=>'required|string|max:10000','benefits'=>'nullable|string|max:5000','registration_start'=>'required|date','registration_end'=>'required|date|after_or_equal:registration_start','event_start'=>'nullable|date','event_end'=>'nullable|date|after_or_equal:event_start','contact'=>'required|string|max:180','banner'=>'required|image|mimes:jpg,jpeg,png,webp|max:5120','package'=>'required|in:Basic,Premium,Featured']);$mode=$d['delivery_mode'];$banner=$r->file('banner')->store('competition-posters','public');$c=Competition::create(['title'=>$d['title'],'organizer'=>$d['organizer'],'category'=>$d['competition_level']==='Internasional'?'Internasional':($d['competition_level']==='Nasional'?'Nasional':'Kampus'),'competition_category'=>$d['competition_category'],'competition_level'=>$d['competition_level'],'mode'=>$mode==='Offline'?'Offline':'Online','delivery_mode'=>$mode,'location'=>$d['location']??($mode==='Online'?'Online':null),'description'=>$d['description'],'requirements'=>$d['requirements'],'benefits'=>$d['benefits']??null,'registration_start'=>$d['registration_start'],'registration_end'=>$d['registration_end'],'event_start'=>$d['event_start']??null,'event_end'=>$d['event_end']??null,'contact'=>$d['contact'],'banner'=>$banner,'status'=>'draft']);PublicationOrder::create(['user_id'=>auth()->id(),'competition_id'=>$c->id,'package'=>$d['package'],'amount'=>self::PACKAGES[$d['package']]]);return redirect()->route('organizer.dashboard')->with('success','Pengajuan dibuat. Unggah bukti transfer untuk verifikasi.');}
 public function payment(PublicationOrder $order){abort_unless($order->user_id===auth()->id(),403);return view('organizer.payment',compact('order'));}
 public function receipt(PublicationOrder $order){abort_unless($order->user_id===auth()->id(),403);return view('organizer.receipt',compact('order'));}
 public function submitPayment(Request $r,PublicationOrder $order){abort_unless($order->user_id===auth()->id(),403);$d=$r->validate(['proof'=>'required|image|mimes:jpg,jpeg,png,webp|max:5120']);$path=$r->file('proof')->store('payment-proofs','public');$order->update(['proof_path'=>$path,'payment_status'=>'pending','review_status'=>'pending','paid_at'=>now()]);return redirect()->route('organizer.dashboard')->with('success','Bukti transfer terkirim dan menunggu verifikasi Admin.');}
}

========== app\Http\Controllers\AdminController.php ==========
<?php
namespace App\Http\Controllers;
use App\Models\Competition; use App\Models\PublicationOrder; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail;
class AdminController extends Controller {
 public function index(){$stats=['users'=>User::where('role','mahasiswa')->count(),'organizers'=>User::where('role','penyelenggara')->count(),'competitions'=>Competition::count(),'pending'=>PublicationOrder::where('payment_status','pending')->count()];$orders=PublicationOrder::with(['user','competition'])->latest()->take(50)->get();return view('admin.dashboard',compact('stats','orders'));}
 public function review(Request $r,PublicationOrder $order){$d=$r->validate(['decision'=>'required|in:approve,reject','admin_note'=>'nullable|string|max:2000']);if($d['decision']==='approve'){abort_unless($order->proof_path,422,'Bukti transfer belum tersedia.');$order->update(['payment_status'=>'verified','review_status'=>'approved','admin_note'=>$d['admin_note']??'Disetujui Admin']);$order->competition->update(['status'=>'published']);$msg='Pembayaran diverifikasi dan lomba dipublikasikan.';}else{$order->update(['payment_status'=>'rejected','review_status'=>'rejected','admin_note'=>$d['admin_note']??'Mohon perbaiki pengajuan']);$order->competition->update(['status'=>'draft']);$msg='Pengajuan ditolak.';}try {
   $recipient = $order->user->email;
   $subject = $d['decision'] === 'approve' ? 'Pengajuan AJARA disetujui' : 'Pengajuan AJARA perlu diperbaiki';
   $body = "Halo {$order->user->name},\n\n{$msg}\nLomba: {$order->competition->title}\nPaket: {$order->package}\nCatatan Admin: ".($order->admin_note ?? '-')."\n\nSilakan masuk ke dashboard AJARA untuk melihat status terbaru.\nTim AJARA";
   Mail::raw($body, function ($mail) use ($recipient, $subject) { $mail->to($recipient)->subject($subject); });
 } catch (\Throwable $e) {
   report($e); // Email tidak boleh menggagalkan proses verifikasi di dashboard.
 }
 return back()->with('success',$msg . ' Status email akan dikirim jika SMTP sudah dikonfigurasi.');}
}

========== resources\views\organizer\dashboard.blade.php ==========
@extends('layouts.app')
@section('title','Dashboard Penyelenggara')
@section('content')
<main class="min-h-screen bg-slate-50 py-10"><div class="mx-auto max-w-6xl px-4"><div class="flex flex-wrap items-center justify-between gap-4"><div><p class="text-sm font-bold text-ajara-red">RUANG PENYELENGGARA</p><h1 class="mt-1 text-3xl font-extrabold text-ajara-teal">Dashboard publikasi</h1><p class="mt-2 text-slate-600">Kelola pengajuan dan pantau verifikasi lombamu.</p></div><a href="{{ route('organizer.create') }}" class="btn-primary rounded-xl px-5 py-3 font-bold">+ Ajukan Lomba</a></div><div class="mt-8 grid gap-4 md:grid-cols-3">@foreach([['Total pengajuan',$orders->count()],['Menunggu pembayaran',$orders->where('payment_status','pending')->count()],['Disetujui',$orders->where('review_status','approved')->count()]] as [$label,$v])<div class="rounded-2xl bg-white p-5 shadow-sm"><p class="text-sm text-slate-500">{{ $label }}</p><p class="text-3xl font-extrabold text-ajara-teal">{{ $v }}</p></div>@endforeach</div><section class="mt-8 overflow-hidden rounded-2xl bg-white shadow-sm"><h2 class="border-b p-5 font-extrabold text-ajara-teal">Riwayat pengajuan</h2><div class="divide-y">@forelse($orders as $o)<div class="flex flex-wrap items-center justify-between gap-4 p-5"><div><h3 class="font-bold text-slate-900">{{ $o->competition->title }}</h3><p class="mt-1 text-sm text-slate-600">Paket {{ $o->package }} Â· Rp{{ number_format($o->amount,0,',','.') }}</p><p class="mt-1 text-xs text-slate-600">Pembayaran: {{ $o->payment_status }} Â· Publikasi: {{ $o->review_status }}</p>@if($o->admin_note)<p class="mt-2 text-sm text-red-700">Catatan Admin: {{ $o->admin_note }}</p>@endif</div><div class="flex gap-2"><a href="{{ route('organizer.payment.receipt',$o) }}" class="rounded-xl border border-slate-300 px-4 py-2 text-sm font-bold text-ajara-teal">Struk</a><div class="flex gap-2"><a href="{{ route('organizer.payment.receipt',$o) }}" class="rounded-xl border border-slate-300 px-4 py-2 text-sm font-bold text-ajara-teal">Struk</a><a href="{{ route('organizer.payment',$o) }}" class="rounded-xl border border-slate-300 px-4 py-2 text-sm font-bold text-ajara-teal">Pembayaran / Bukti</a></div></div></div>@empty<div class="p-10 text-center text-slate-500">Belum ada pengajuan.</div>@endforelse</div></section></div></main>
@endsection

========== resources\views\organizer\create.blade.php ==========
@extends('layouts.app')
@section('title','Ajukan Publikasi Lomba')
@section('content')
<main class="bg-slate-50 py-10"><div class="mx-auto max-w-4xl px-4"><div class="rounded-3xl bg-white p-6 shadow-xl sm:p-9"><a href="{{ route('organizer.dashboard') }}" class="text-sm font-bold text-ajara-teal">â† Dashboard</a><h1 class="mt-5 text-3xl font-extrabold text-ajara-teal">Ajukan lomba ke AJARA</h1><p class="mt-2 text-sm text-slate-600">Isi informasi lomba, unggah poster, lalu pilih paket publikasi.</p><form method="POST" enctype="multipart/form-data" action="{{ route('organizer.store') }}" class="mt-7 grid gap-4 sm:grid-cols-2">@csrf
@foreach([['title','Nama lomba'],['organizer','Nama penyelenggara'],['contact','Kontak panitia'],['location','Lokasi']] as [$n,$l])<label class="text-sm font-bold text-slate-800">{{ $l }}<input name="{{ $n }}" value="{{ old($n) }}" class="mt-2 w-full rounded-xl border border-slate-300 px-4 py-3 text-slate-900" {{ $n==='location'?'':'required' }}></label>@endforeach
<label class="text-sm font-bold">Kategori<select name="competition_category" class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900">@foreach(['Essay','Karya Tulis Ilmiah','Desain Poster','UI/UX Design','Programming','Business Plan','Debat','Fotografi','Video Kreatif','Olimpiade','Lainnya'] as $v)<option>{{ $v }}</option>@endforeach</select></label><label class="text-sm font-bold">Tingkat<select name="competition_level" class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900">@foreach(['Kampus','Regional','Nasional','Internasional'] as $v)<option>{{ $v }}</option>@endforeach</select></label><label class="text-sm font-bold">Metode<select name="delivery_mode" class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900"><option>Online</option><option>Offline</option><option>Hybrid</option></select></label>
@foreach([['registration_start','Mulai pendaftaran'],['registration_end','Deadline'],['event_start','Tanggal pelaksanaan'],['event_end','Akhir pelaksanaan']] as [$n,$l])<label class="text-sm font-bold">{{ $l }}<input type="date" name="{{ $n }}" class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900" {{ str_starts_with($n,'registration')?'required':'' }}></label>@endforeach
<label class="sm:col-span-2 text-sm font-bold">Deskripsi<textarea name="description" rows="4" required class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900"></textarea></label><label class="sm:col-span-2 text-sm font-bold">Persyaratan peserta<textarea name="requirements" rows="4" required placeholder="Contoh: Mahasiswa aktif, tim maksimal 3 orang..." class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900"></textarea></label><label class="sm:col-span-2 text-sm font-bold">Hadiah dan benefit<textarea name="benefits" rows="2" class="mt-2 w-full rounded-xl border border-slate-300 p-3 text-slate-900"></textarea></label><label class="sm:col-span-2 text-sm font-bold">Poster / flyer lomba<input type="file" name="banner" accept="image/*" required class="mt-2 block w-full rounded-xl border border-slate-300 p-3 text-slate-700"><small class="font-normal text-slate-500">JPG, PNG, WEBP maksimal 5 MB.</small></label>
<div class="sm:col-span-2"><h2 class="font-extrabold text-ajara-teal">Paket publikasi</h2><div class="mt-3 grid gap-3 md:grid-cols-3">@foreach($packages as $pkg=>$price)<label class="rounded-2xl border border-slate-200 p-4 has-[:checked]:border-ajara-red has-[:checked]:bg-red-50"><input type="radio" name="package" value="{{ $pkg }}" required class="accent-red-800"><b class="ml-2 text-ajara-teal">{{ $pkg }}</b><p class="mt-2 text-xl font-extrabold text-ajara-red">Rp{{ number_format($price,0,',','.') }}</p><p class="mt-1 text-xs text-slate-600">{{ $pkg==='Basic'?'Listing standar':($pkg==='Premium'?'Sorotan prioritas':'Posisi unggulan') }}</p></label>@endforeach</div></div><button class="btn-primary rounded-xl py-4 font-extrabold sm:col-span-2">Simpan Pengajuan & Lanjut Pembayaran</button></form></div></div></main>
@endsection

========== resources\views\organizer\payment.blade.php ==========
@extends('layouts.app')
@section('title','Pembayaran Publikasi')
@section('content')
<main class="bg-slate-50 py-12"><div class="mx-auto max-w-2xl px-4"><div class="rounded-3xl bg-white p-7 shadow-xl"><a href="{{ route('organizer.dashboard') }}" class="text-sm font-bold text-ajara-teal">â† Kembali</a><h1 class="mt-5 text-2xl font-extrabold text-ajara-teal">Pembayaran publikasi</h1><div class="mt-5 rounded-2xl bg-teal-50 p-5"><p class="text-sm text-teal-900">{{ $order->competition->title }} Â· Paket {{ $order->package }}</p><p class="mt-1 text-3xl font-extrabold text-ajara-teal">Rp{{ number_format($order->amount,0,',','.') }}</p></div><h2 class="mt-6 font-extrabold text-slate-900">Pembayaran QRIS AJARA</h2>
<div class="mt-4 rounded-2xl border border-slate-200 bg-white p-4 text-center">
 <img src="{{ asset('images/ajara-qris.png') }}" alt="QRIS resmi AJARA" class="mx-auto max-h-[420px] w-auto rounded-xl object-contain" onerror="this.style.display='none';document.getElementById('qris-missing').classList.remove('hidden')">
 <p id="qris-missing" class="hidden rounded-xl bg-amber-50 p-4 text-sm font-semibold text-amber-900">QRIS belum dipasang. Admin perlu menyimpan gambar QRIS resmi sebagai public/images/ajara-qris.png sebelum pembayaran digunakan.</p>
 <p class="mt-3 text-xs text-slate-500">Pastikan nama merchant dan nominal sesuai sebelum membayar.</p>
</div><p class="mt-2 text-sm leading-6 text-slate-600">Scan QRIS AJARA di atas menggunakan aplikasi pembayaran pilihan. Simpan bukti transaksi untuk diunggah pada formulir berikut.</p><div class="mt-4 rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm text-amber-950">Setelah transfer, unggah bukti transfer yang jelas. Admin akan memverifikasi pembayaran dan isi lomba.</div><form method="POST" enctype="multipart/form-data" action="{{ route('organizer.payment.submit',$order) }}" class="mt-6 space-y-4">@csrf<label class="block text-sm font-bold text-slate-800">Bukti transfer<input type="file" name="proof" required accept="image/*" class="mt-2 block w-full rounded-xl border border-slate-300 p-3 text-slate-700"></label><button class="btn-primary w-full rounded-xl py-3 font-extrabold">Kirim Bukti untuk Diverifikasi</button></form></div></div></main>
@endsection

========== resources\views\organizer\receipt.blade.php ==========
@extends('layouts.app')
@section('title','Struk Pembayaran AJARA')
@section('content')
<main class="min-h-screen bg-slate-50 px-4 py-10"><article class="mx-auto max-w-2xl rounded-3xl bg-white p-7 shadow-xl print:shadow-none">
<div class="flex items-start justify-between gap-4 border-b border-dashed border-slate-300 pb-6"><div><p class="text-xs font-extrabold tracking-[.2em] text-ajara-gold">BUKTI PENGAJUAN</p><h1 class="mt-2 text-3xl font-extrabold text-ajara-teal">AJARA</h1><p class="text-sm text-slate-500">Ajang & Jejaring Prestasi Mahasiswa</p></div><span class="rounded-full bg-amber-100 px-3 py-2 text-xs font-bold text-amber-900">{{ strtoupper($order->payment_status) }}</span></div>
<h2 class="mt-6 text-xl font-extrabold text-slate-900">Struk pembayaran publikasi</h2>
<dl class="mt-5 space-y-3 text-sm">
<div class="flex justify-between gap-4"><dt class="text-slate-500">Nomor transaksi</dt><dd class="font-bold text-slate-900">AJR-{{ str_pad($order->id,6,'0',STR_PAD_LEFT) }}</dd></div>
<div class="flex justify-between gap-4"><dt class="text-slate-500">Penyelenggara</dt><dd class="font-semibold text-slate-900">{{ $order->user->name }}</dd></div>
<div class="flex justify-between gap-4"><dt class="text-slate-500">Nama lomba</dt><dd class="text-right font-semibold text-slate-900">{{ $order->competition->title }}</dd></div>
<div class="flex justify-between gap-4"><dt class="text-slate-500">Paket publikasi</dt><dd class="font-semibold text-slate-900">{{ $order->package }}</dd></div>
<div class="flex justify-between gap-4"><dt class="text-slate-500">Tanggal pengajuan</dt><dd class="font-semibold text-slate-900">{{ $order->created_at?->format('d M Y H:i') }}</dd></div>
<div class="flex justify-between gap-4 border-t border-dashed pt-4"><dt class="font-bold text-slate-700">Total</dt><dd class="text-xl font-extrabold text-ajara-red">Rp{{ number_format($order->amount,0,',','.') }}</dd></div></dl>
<p class="mt-6 rounded-xl bg-slate-50 p-4 text-sm leading-6 text-slate-600">Struk ini merupakan bukti pengajuan pembayaran, bukan bukti bahwa pembayaran telah diverifikasi. Status resmi mengikuti pemeriksaan Admin AJARA.</p>
<div class="mt-6 flex flex-wrap gap-3 print:hidden"><button onclick="window.print()" class="btn-primary rounded-xl px-5 py-3 font-bold">Cetak / Simpan PDF</button><a href="{{ route('organizer.dashboard') }}" class="rounded-xl border px-5 py-3 font-bold text-ajara-teal">Kembali</a></div>
</article></main>
@endsection

========== resources\views\admin\dashboard.blade.php ==========
@extends('layouts.app')
@section('title','Admin AJARA')
@section('content')
<main class="min-h-screen bg-slate-50 py-10"><div class="mx-auto max-w-7xl px-4"><div class="flex flex-wrap items-center justify-between gap-4"><div><p class="text-xs font-extrabold tracking-widest text-ajara-red">PANEL ADMINISTRATOR</p><h1 class="mt-2 text-3xl font-extrabold text-ajara-teal">Pusat kendali AJARA</h1><p class="mt-2 text-slate-600">Verifikasi pembayaran dan moderasi pengajuan lomba.</p></div><a href="{{ route('chat.index') }}" class="rounded-xl border bg-white px-4 py-3 font-bold text-ajara-teal">Buka pesan masuk</a></div><div class="mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">@foreach([['Mahasiswa',$stats['users']],['Penyelenggara',$stats['organizers']],['Total lomba',$stats['competitions']],['Perlu verifikasi',$stats['pending']]] as [$label,$v])<div class="rounded-2xl bg-white p-5 shadow-sm"><p class="text-sm text-slate-500">{{ $label }}</p><p class="text-3xl font-extrabold text-ajara-teal">{{ $v }}</p></div>@endforeach</div><section class="mt-8 overflow-hidden rounded-2xl bg-white shadow-sm"><h2 class="border-b p-5 text-lg font-extrabold text-ajara-teal">Pengajuan publikasi</h2><div class="divide-y">@forelse($orders as $o)<div class="grid gap-4 p-5 lg:grid-cols-[1fr_auto]"><div><h3 class="font-extrabold text-slate-900">{{ $o->competition->title }}</h3><p class="mt-1 text-sm text-slate-600">{{ $o->user->name }} Â· {{ $o->user->email }}</p><p class="mt-1 text-sm font-bold text-ajara-teal">{{ $o->package }} Â· Rp{{ number_format($o->amount,0,',','.') }} Â· {{ $o->payment_status }} / {{ $o->review_status }}</p>@if($o->proof_path)<a target="_blank" href="{{ asset('storage/'.$o->proof_path) }}" class="mt-2 inline-block text-sm font-bold text-ajara-red underline">Lihat bukti transfer</a>@else<p class="mt-2 text-xs text-slate-500">Bukti transfer belum diunggah.</p>@endif</div><form method="POST" action="{{ route('admin.publication.review',$o) }}" class="flex min-w-[250px] flex-col gap-2">@csrf<textarea name="admin_note" rows="2" placeholder="Catatan untuk penyelenggara" class="rounded-lg border border-slate-300 p-2 text-sm text-slate-900">{{ $o->admin_note }}</textarea><div class="flex gap-2"><button name="decision" value="approve" class="flex-1 rounded-lg bg-emerald-700 px-3 py-2 text-sm font-bold text-white" {{ !$o->proof_path?'disabled':'' }}>Setujui</button><button name="decision" value="reject" class="flex-1 rounded-lg bg-red-700 px-3 py-2 text-sm font-bold text-white">Tolak</button></div></form></div>@empty<div class="p-10 text-center text-slate-500">Belum ada pengajuan.</div>@endforelse</div></section></div></main>
@endsection

========== database\migrations\2026_11_13_000002_create_publication_orders_table.php ==========
<?php
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;
return new class extends Migration { public function up():void {Schema::create('publication_orders',function(Blueprint $t){$t->id();$t->foreignId('user_id')->constrained()->cascadeOnDelete();$t->foreignId('competition_id')->constrained()->cascadeOnDelete();$t->enum('package',['Basic','Premium','Featured']);$t->unsignedBigInteger('amount');$t->string('proof_path')->nullable();$t->enum('payment_status',['unpaid','pending','verified','rejected'])->default('unpaid');$t->enum('review_status',['pending','approved','rejected'])->default('pending');$t->text('admin_note')->nullable();$t->timestamp('paid_at')->nullable();$t->timestamps();});} public function down():void {Schema::dropIfExists('publication_orders');}};

========== app\Models\Notification.php ==========
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Notification extends Model
{
    protected $fillable = ['user_id', 'title', 'message', 'type', 'read_at'];
    protected $casts = ['read_at' => 'datetime'];
    public function user(): BelongsTo { return $this->belongsTo(User::class); }
}

========== routes\web.php ==========
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\CompetitionController;
use App\Http\Controllers\RegistrationController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\OrganizerController;
use App\Http\Controllers\AdminController;
use App\Http\Controllers\ChatController;

Route::get('/', [HomeController::class, 'index'])->name('welcome');

Route::get('/lomba', [CompetitionController::class, 'index'])->name('competitions.index');
Route::get('/lomba/{competition}', [CompetitionController::class, 'show'])->name('competitions.show');

Route::middleware('guest')->group(function () {
    Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
    Route::get('/forgot-password', [AuthController::class, 'showForgotPassword'])->name('password.request');
    Route::post('/login', [AuthController::class, 'login'])->name('login.store');

    Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
    Route::post('/register', [AuthController::class, 'register'])->name('register.store');
});

Route::middleware('auth')->group(function () {

    Route::post('/logout', [AuthController::class, 'logout'])->name('logout');

    Route::post('/lomba/{competition}/favorit', [CompetitionController::class, 'toggleFavorite'])
        ->name('competitions.favorite');

    Route::get('/chat', [ChatController::class, 'index'])->name('chat.index');
    Route::post('/chat', [ChatController::class, 'store'])->name('chat.store');

    Route::middleware('role:mahasiswa')->group(function () {
        Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');

        Route::get('/lomba/{competition}/daftar', [RegistrationController::class, 'create'])
            ->name('registrations.create');

        Route::post('/lomba/{competition}/daftar', [RegistrationController::class, 'store'])
            ->name('registrations.store');

        Route::get('/notifikasi', [NotificationController::class, 'index'])
            ->name('notifications.index');

        Route::post('/notifikasi/{notification}/read', [NotificationController::class, 'markRead'])
            ->name('notifications.read');

        Route::get('/profil', [ProfileController::class, 'show'])->name('profile.show');
        Route::get('/profil/data-akun', [ProfileController::class, 'edit'])->name('profile.edit');
        Route::put('/profil/data-akun', [ProfileController::class, 'update'])->name('profile.update');
    });

    Route::middleware('role:penyelenggara')
        ->prefix('penyelenggara')
        ->name('organizer.')
        ->group(function () {

            Route::get('/', [OrganizerController::class, 'index'])->name('dashboard');
            Route::get('/lomba/baru', [OrganizerController::class, 'create'])->name('create');
            Route::post('/lomba', [OrganizerController::class, 'store'])->name('store');

            Route::get('/pembayaran/{order}', [OrganizerController::class, 'payment'])
                ->name('payment');

            Route::post('/pembayaran/{order}', [OrganizerController::class, 'submitPayment'])
                ->name('payment.submit');

            Route::get('/pembayaran/{order}/struk', [OrganizerController::class, 'receipt'])
                ->name('payment.receipt');
        });

    Route::middleware('role:admin')
        ->prefix('admin')
        ->name('admin.')
        ->group(function () {

            Route::get('/', [AdminController::class, 'index'])->name('dashboard');

            Route::post('/publikasi/{order}/review', [AdminController::class, 'review'])
                ->name('publication.review');
        });
});
**********************
Windows PowerShell transcript end
End time: 20261113163033
**********************
