diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..a186cd2079e78c66fca5e037bafa0917818116df
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[compose.yaml]
+indent_size = 4
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000000000000000000000000000000000000..c0660ea143a7a23e6a182cbe42dbd7fc6e242b45
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,65 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+APP_LOCALE=en
+APP_FALLBACK_LOCALE=en
+APP_FAKER_LOCALE=en_US
+
+APP_MAINTENANCE_DRIVER=file
+# APP_MAINTENANCE_STORE=database
+
+# PHP_CLI_SERVER_WORKERS=4
+
+BCRYPT_ROUNDS=12
+
+LOG_CHANNEL=stack
+LOG_STACK=single
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+# DB_HOST=127.0.0.1
+# DB_PORT=3306
+# DB_DATABASE=laravel
+# DB_USERNAME=root
+# DB_PASSWORD=
+
+SESSION_DRIVER=database
+SESSION_LIFETIME=120
+SESSION_ENCRYPT=false
+SESSION_PATH=/
+SESSION_DOMAIN=null
+
+BROADCAST_CONNECTION=log
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=database
+
+CACHE_STORE=database
+# CACHE_PREFIX=
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_CLIENT=phpredis
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=log
+MAIL_SCHEME=null
+MAIL_HOST=127.0.0.1
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+VITE_APP_NAME="${APP_NAME}"
diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..fcb21d396d657f597ef8b6729f73d89b0a871c9b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,35 +1,11 @@
-*.7z filter=lfs diff=lfs merge=lfs -text
-*.arrow filter=lfs diff=lfs merge=lfs -text
-*.bin filter=lfs diff=lfs merge=lfs -text
-*.bz2 filter=lfs diff=lfs merge=lfs -text
-*.ckpt filter=lfs diff=lfs merge=lfs -text
-*.ftz filter=lfs diff=lfs merge=lfs -text
-*.gz filter=lfs diff=lfs merge=lfs -text
-*.h5 filter=lfs diff=lfs merge=lfs -text
-*.joblib filter=lfs diff=lfs merge=lfs -text
-*.lfs.* filter=lfs diff=lfs merge=lfs -text
-*.mlmodel filter=lfs diff=lfs merge=lfs -text
-*.model filter=lfs diff=lfs merge=lfs -text
-*.msgpack filter=lfs diff=lfs merge=lfs -text
-*.npy filter=lfs diff=lfs merge=lfs -text
-*.npz filter=lfs diff=lfs merge=lfs -text
-*.onnx filter=lfs diff=lfs merge=lfs -text
-*.ot filter=lfs diff=lfs merge=lfs -text
-*.parquet filter=lfs diff=lfs merge=lfs -text
-*.pb filter=lfs diff=lfs merge=lfs -text
-*.pickle filter=lfs diff=lfs merge=lfs -text
-*.pkl filter=lfs diff=lfs merge=lfs -text
-*.pt filter=lfs diff=lfs merge=lfs -text
-*.pth filter=lfs diff=lfs merge=lfs -text
-*.rar filter=lfs diff=lfs merge=lfs -text
-*.safetensors filter=lfs diff=lfs merge=lfs -text
-saved_model/**/* filter=lfs diff=lfs merge=lfs -text
-*.tar.* filter=lfs diff=lfs merge=lfs -text
-*.tar filter=lfs diff=lfs merge=lfs -text
-*.tflite filter=lfs diff=lfs merge=lfs -text
-*.tgz filter=lfs diff=lfs merge=lfs -text
-*.wasm filter=lfs diff=lfs merge=lfs -text
-*.xz filter=lfs diff=lfs merge=lfs -text
-*.zip filter=lfs diff=lfs merge=lfs -text
-*.zst filter=lfs diff=lfs merge=lfs -text
-*tfevents* filter=lfs diff=lfs merge=lfs -text
+* text=auto eol=lf
+
+*.blade.php diff=html
+*.css diff=css
+*.html diff=html
+*.md diff=markdown
+*.php diff=php
+
+/.github export-ignore
+CHANGELOG.md export-ignore
+.styleci.yml export-ignore
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f2ad2d3b4d86614040bb846a5eedc9e0bccdff95
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,51 @@
+name: Build & Push Docker Image to GHCR
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata (tags, labels)
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ tags: |
+ type=raw,value=latest,enable={{is_default_branch}}
+ type=sha,prefix=,format=short
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: ./docker/Dockerfile.sumopod
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b71b1ea3c2db0dc18242c9b510c88ea7f00bc3cd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+*.log
+.DS_Store
+.env
+.env.backup
+.env.production
+.phpactor.json
+.phpunit.result.cache
+/.fleet
+/.idea
+/.nova
+/.phpunit.cache
+/.vscode
+/.zed
+/auth.json
+/node_modules
+/public/build
+/public/hot
+/public/storage
+/storage/*.key
+/storage/pail
+/vendor
+Homestead.json
+Homestead.yaml
+Thumbs.db
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..81c2e0e8c9081f3aa8cd2c3f551a53f4db9a931c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,56 @@
+FROM php:8.4-apache
+
+# Enable Apache modules and ensure correct MPM for mod_php
+RUN a2dismod mpm_event mpm_worker || true \
+ && a2enmod mpm_prefork rewrite headers
+
+# Install system dependencies + PHP extensions (PostgreSQL)
+RUN apt-get update && apt-get install -y \
+ git curl libpng-dev libonig-dev libxml2-dev libpq-dev libzip-dev \
+ libfreetype6-dev libjpeg-dev libicu-dev zip unzip \
+ && docker-php-ext-configure gd --with-freetype --with-jpeg \
+ && docker-php-ext-install pdo pdo_pgsql pgsql mbstring exif pcntl bcmath gd zip intl \
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
+
+# PHP production settings
+RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \
+ && sed -i 's/memory_limit = .*/memory_limit = 256M/' /usr/local/etc/php/php.ini \
+ && sed -i 's/upload_max_filesize = .*/upload_max_filesize = 10M/' /usr/local/etc/php/php.ini \
+ && sed -i 's/post_max_size = .*/post_max_size = 12M/' /usr/local/etc/php/php.ini \
+ && sed -i 's/max_execution_time = .*/max_execution_time = 60/' /usr/local/etc/php/php.ini
+
+# Install Composer
+COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
+
+# Set Apache document root to Laravel's public directory
+RUN sed -ri -e 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/*.conf \
+ && sed -ri -e 's!/var/www/!/var/www/public/!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
+
+# Allow .htaccess overrides (required for Laravel routing)
+RUN sed -i '/
| Nama | Slug | Events | Aksi |
|---|---|---|---|
| + + | +{{ $cat->slug }} | +{{ $cat->events_count }} | ++ @if($cat->events_count == 0) + + @else In use + @endif + | +
Total Revenue
+Rp {{ number_format($totalRevenue, 0, ',', '.') }}
+Orders (Paid)
+{{ $totalOrders }}
+Total Events
+{{ $totalEvents }}
+Total Users
+{{ $totalUsers }}
+| Order | Event | User | Total | Status |
|---|---|---|---|---|
| {{ $order->order_code }} | +{{ Str::limit($order->event->title, 25) }} | +{{ $order->user->name }} | +Rp {{ number_format($order->total, 0, ',', '.') }} | +{{ $order->status }} | +
| Belum ada order. | ||||
| Event | Organizer | Tanggal | Status | Aksi |
|---|---|---|---|---|
{{ $event->title }} {{ $event->category->name ?? '-' }} |
+ {{ $event->organizer->name }} | +{{ $event->start_at->format('d M Y') }} | ++ + | +View | +
| Tidak ada event. | ||||
Belum ada data revenue.
+ @else +| Bulan | Revenue | Jumlah Order |
|---|---|---|
| {{ $m->month }} | +Rp {{ number_format($m->revenue, 0, ',', '.') }} | +{{ $m->order_count }} | +
| # | Event | Revenue | Orders |
|---|---|---|---|
| {{ $i + 1 }} | +{{ $event->title }} | +Rp {{ number_format($event->revenue ?? 0, 0, ',', '.') }} | +{{ $event->paid_orders ?? 0 }} | +
{{ $statusBreakdown[$s] ?? 0 }}
+{{ $s }}
+| Nama | Role | Join | Aksi | |
|---|---|---|---|---|
| {{ $user->name }} | +{{ $user->email }} | ++ + | +{{ $user->created_at->format('d M Y') }} | ++ @if($user->id !== auth()->id()) + + @endif + | +
Order {{ $order->order_code }}
+ +{{ $order->event->start_at->format('d M Y, H:i') }}
+Total: Rp {{ number_format($order->total, 0, ',', '.') }}
+{{ $att->ticket_code }}
+{{ $att->orderItem->ticketTier->name ?? '' }}
+Kode: {{ $order->order_code }}
+ + @if($order->isPending() && $order->expires_at) +{{ $order->event->start_at->format('d M Y, H:i') }} ยท {{ $order->event->venue_name ?? 'Online' }}
+{{ $activeTickets }}
Tiket Aktif
{{ $totalOrders }}
Total Order
Jelajahi Event
Temukan event โ
{{ $order->event->title }}
+{{ $order->order_code }} ยท {{ $order->created_at->format('d M Y') }}
+Rp {{ number_format($order->total, 0, ',', '.') }}
+ {{ $order->status }} +Belum ada order.
+ @endforelse +Coba ubah filter pencarian Anda.
+{{ $event->start_at->format('d M Y, H:i') }}
+{{ $event->venue_name ?? ($event->is_online ? 'Online' : $event->city) }}
+Login terlebih dahulu untuk membeli tiket.
+ Login + @endauth +{{ $order->event->title }}
+{{ $order->order_code }} ยท {{ $order->created_at->format('d M Y H:i') }}
+Rp {{ number_format($order->total, 0, ',', '.') }}
+ {{ $order->status }} +Belum ada order.
+ @endforelse +{{ $order->order_code }}
+Revenue
+Rp {{ number_format($totalRevenue, 0, ',', '.') }}
+Orders (Paid)
+{{ $totalOrders }}
+Tiket Terjual
+{{ $totalSold }}
+Event Aktif
+{{ $activeEvents }}
+| Order | Event | Customer | Total | Status | +
|---|---|---|---|---|
| {{ $order->order_code }} | +{{ Str::limit($order->event->title, 30) }} | +{{ $order->user->name }} | +Rp {{ number_format($order->total, 0, ',', '.') }} | +{{ $order->status }} | +
| Belum ada order. | ||||
Terjual: {{ $tier->sold_count }}/{{ $tier->quota }}
+| Event | Tanggal | Terjual | Status | Aksi | +
|---|---|---|---|---|
{{ $event->title }} {{ $event->category->name ?? '-' }} |
+ {{ $event->start_at->format('d M Y') }} | +{{ $event->getTotalSold() }}/{{ $event->getTotalQuota() }} | +{{ $event->status }} | ++ + | +
| Belum ada event. | ||||
| Order | Customer | Total | Status | Tanggal | +
|---|---|---|---|---|
| {{ $order->order_code }} | +{{ $order->user->name }} {{ $order->user->email }} |
+ Rp {{ number_format($order->total, 0, ',', '.') }} | +{{ $order->status }} | +{{ $order->created_at->format('d M Y H:i') }} | +
| Belum ada order. | ||||
{{ session('scan_success') }}
+ @if(session('scan_attendee')) + @php $att = session('scan_attendee'); @endphp +Nama: {{ $att->full_name }}
+Kode: {{ $att->ticket_code }}
+Check-in: {{ $att->checkin_at?->format('d M Y H:i') }}
+{{ session('scan_error') }}
+ @if(session('scan_attendee')) + @php $att = session('scan_attendee'); @endphp +Nama: {{ $att->full_name ?? '-' }}
+Kode: {{ $att->ticket_code ?? '-' }}
++ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }} +
++ {{ __('Ensure your account is using a long, random password to stay secure.') }} +
++ {{ __("Update your account's profile information and email address.") }} +
+{{ $att->ticket_code }}
+{{ $att->orderItem->ticketTier->name ?? '' }}
+{{ $attendee->ticket_code }}
+{{ $attendee->orderItem->order->event->start_at->format('d M Y, H:i') }}
+{{ $attendee->orderItem->order->event->venue_name ?? 'Online' }}
+{{ $attendee->orderItem->ticketTier->name }}
+{{ $attendee->full_name }}
++ Jelajahi ribuan event menarik, beli tiket dengan mudah, dan nikmati pengalaman tak terlupakan bersama Eventify. +
+{{ $totalEvents }}+
+Event Aktif
+1K+
+Tiket Terjual
+100%
+Aman & Terpercaya
+{{ $event->start_at->format('d M Y, H:i') }}
+{{ $event->city ?? ($event->is_online ? 'Online' : '-') }}
+