Cinema Counter - Platform Analitik Performa Film
Cinema Counter adalah sebuah platform web internal yang dirancang untuk mengumpulkan, mengolah, dan memvisualisasikan data penonton bioskop secara near real-time. Sistem ini memiliki dua komponen utama: Scraper Data yang berjalan di latar belakang untuk mengambil data dari sumber eksternal (Mtix), dan Platform Web sebagai antarmuka bagi pengguna internal (Admin) dan klien (Producer).
Tujuan utama dari proyek ini adalah untuk memberikan insight bisnis yang mendalam kepada para produser film mengenai performa film mereka di berbagai kota dan bioskop, langsung dari data okupansi kursi yang aktual.
Fitur Utama
Platform ini memiliki dua peran pengguna utama dengan fungsionalitas yang berbeda:
1. Panel Admin
Panel Admin berfungsi sebagai pusat kontrol dan pemantauan sistem.
●	Manajemen Akun Producer: Admin dapat melakukan operasi CRUD (Create, Read, Update, Delete) untuk akun-akun produser film.
●	Master Data Viewer: Admin memiliki akses penuh untuk melihat data mentah yang telah di-scrape, termasuk daftar kota, film, bioskop, dan jadwal tayang.
●	Seat Summaries Viewer: Halaman khusus untuk melihat data historis okupansi kursi dengan fitur filter canggih berdasarkan film, kota, bioskop, dan rentang tanggal.
●	Dashboard Admin:
○	Pemantauan Status API: Memantau kesehatan koneksi ke setiap endpoint API eksternal secara real-time.
○	Agregat Performa Film: Visualisasi data performa (total penonton, omzet, grafik harian, performa per kota) untuk semua film yang ada di sistem.
2. Panel Producer
Panel Producer dirancang sebagai dashboard analitik yang fokus pada performa film milik produser yang bersangkutan.
●	Dashboard Performa Film:
○	Movie Switcher: Produser dapat dengan mudah berpindah antar film yang mereka miliki.
○	Key Performance Indicators (KPI): Menampilkan metrik utama seperti Total Penonton dan Total Omzet Bruto.
○	Visualisasi Data: Grafik garis untuk tren penonton dan omzet harian.
○	Tabel Rangkuman: Data performa yang dipecah berdasarkan kota dan tanggal.
Arsitektur Sistem
Sistem ini dibangun di atas tumpukan teknologi Laravel dengan dua pilar utama:
1.	Data Scraper (app/Console/Commands)
○	Serangkaian Artisan Command yang dijadwalkan untuk berjalan secara periodik (via Cron Job).
○	Bertanggung jawab untuk mengambil data dari API Mtix, termasuk daftar kota, film, bioskop, jadwal, dan data okupansi kursi.
○	Data yang berhasil diambil disimpan ke dalam database MySQL.
2.	Platform Web (Laravel App)
○	Aplikasi web monolitik berbasis Laravel 11.
○	Menggunakan Laravel Breeze untuk sistem autentikasi.
○	Tampilan dibangun dengan Blade dan Tailwind CSS.
○	Grafik dan visualisasi data menggunakan Chart.js.
○	Menyediakan antarmuka web untuk peran Admin dan Producer.
Teknologi yang Digunakan
●	Backend: PHP 8.2, Laravel 11
●	Frontend: Blade, Tailwind CSS, Alpine.js, Chart.js
●	Database: MySQL
●	Autentikasi: Laravel Breeze
Panduan Instalasi & Setup Lokal
Berikut adalah langkah-langkah untuk menjalankan proyek ini di lingkungan lokal.
1.	Clone Repository
git clone [URL_REPOSITORY_ANDA]
cd cinema-counter

2.	Install Dependencies
composer install
npm install

3.	Konfigurasi Environment
○	Salin file .env.example menjadi .env.
cp .env.example .env

○	Buat key aplikasi baru.
php artisan key:generate

○	Konfigurasi koneksi database Anda di dalam file .env.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cinema_counter
DB_USERNAME=root
DB_PASSWORD=

○	PENTING: Isi variabel untuk scraper di .env. Anda perlu mendapatkan nilai ini dari sesi browser Anda saat mengakses m.21cineplex.com.
MTIX_DEVICE_UIID=...
MTIX_COOKIE_STRING=...

4.	Migrasi & Seeding Database
○	Jalankan migrasi untuk membuat semua tabel.
php artisan migrate

○	Jalankan seeder untuk membuat akun Admin default.
php artisan db:seed

5.	Compile Aset Frontend
npm run dev

6.	Jalankan Server Lokal
php artisan serve

Aplikasi sekarang dapat diakses di http://127.0.0.1:8000.
Penggunaan
Akun Pengguna
●	Admin:
○	Email: admin@example.com
○	Password: password
●	Producer: Akun producer harus dibuat oleh Admin melalui menu "Producers" di panel admin.
Menjalankan Scraper
Semua scraper dijalankan melalui Artisan command. Contoh:
●	Mengambil daftar kota:
php artisan app:scrape-mtix-cities

●	Mengambil semua jadwal & data kursi (perintah utama):
php artisan app:scrape-all-seats-now

Untuk otomatisasi, command-command ini harus didaftarkan pada scheduler server (Cron Job) untuk berjalan secara periodik.

Diagram Relasi Entitas (ERD)
erDiagram
    USERS {
        int id PK
        string name
        string email
        string role
        string password
    }

    MOVIES {
        int id PK
        string mtix_movie_id UK
        string title
        string poster_url
        string genres
        int duration
    }

    CITIES {
        int id PK
        string mtix_city_id UK
        string name
    }

    THEATERS {
        int id PK
        string mtix_cinema_id UK
        string name
        string city_mtix_id FK
        string city_name
        string address
    }

    SCHEDULES {
        int id PK
        string movie_mtix_id FK
        string theater_mtix_id FK
        string studio_id
        date show_date
        time show_time
        int ticket_price
    }

    SEAT_SUMMARIES {
        int id PK
        int schedule_id FK
        datetime scraped_at
        int total_seats
        int occupied_seats
        int available_seats
    }

    MOVIE_PRODUCER {
        int user_id PK, FK
        int movie_id PK, FK
    }

    API_STATUSES {
        int id PK
        string endpoint_name
        string status
        datetime last_checked_at
    }

    USERS ||--o{ MOVIE_PRODUCER : "has"
    MOVIES ||--o{ MOVIE_PRODUCER : "has"
    MOVIES ||--|{ SCHEDULES : "has"
    THEATERS ||--|{ SCHEDULES : "has"
    CITIES ||--|{ THEATERS : "has"
    SCHEDULES ||--|{ SEAT_SUMMARIES : "has"

Detail Tabel dan Kolom
1. users
Menyimpan data pengguna sistem, baik Admin maupun Producer.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key unik untuk setiap pengguna.	
name	varchar	Nama lengkap pengguna.	
email	varchar, Unique	Alamat email unik untuk login.	
email_verified_at	timestamp	Waktu verifikasi email (opsional).	
password	varchar	Hash dari password pengguna.	
role	varchar	Peran pengguna ('admin' atau 'producer').	
remember_token	varchar(100)	Token untuk fitur "Ingat Saya".	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
2. movies
Menyimpan informasi detail mengenai setiap film.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key internal.	
mtix_movie_id	varchar, Unique	ID unik film dari sumber data (M-Tix). Kunci relasi utama.	
title	varchar	Judul film.	
poster_url	varchar	URL ke gambar poster film.	
genres	varchar	Genre film (bisa lebih dari satu, dipisah koma).	
duration	int	Durasi film dalam menit.	
synopsis	text	Sinopsis atau deskripsi singkat film.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
3. cities
Tabel master untuk data kota.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key internal.	
mtix_city_id	varchar, Unique	ID unik kota dari sumber data (M-Tix). Kunci relasi.	
name	varchar	Nama kota.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
4. theaters
Menyimpan informasi detail mengenai setiap bioskop.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key internal.	
mtix_cinema_id	varchar, Unique	ID unik bioskop dari sumber data (M-Tix). Kunci relasi.	
name	varchar	Nama bioskop (e.g., "AMBARRUKMO XXI").	
city_mtix_id	varchar, FK	Foreign key ke cities.mtix_city_id.	
city_name	varchar	Nama kota (denormalisasi untuk kemudahan query).	
address	text	Alamat lengkap bioskop.	
phone	varchar	Nomor telepon bioskop.	
latitude	decimal	Koordinat latitude untuk pemetaan.	
longitude	decimal	Koordinat longitude untuk pemetaan.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
5. schedules
Tabel inti yang menyimpan setiap jadwal penayangan film di sebuah bioskop.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key unik untuk setiap jadwal.	
movie_mtix_id	varchar, FK	Foreign key ke movies.mtix_movie_id.	
theater_mtix_id	varchar, FK	Foreign key ke theaters.mtix_cinema_id.	
studio_id	varchar	Nomor atau nama studio.	
movie_type_name	varchar	Tipe penayangan (e.g., "Regular 2D", "IMAX").	
show_date	date	Tanggal penayangan.	
show_time	time	Jam penayangan.	
ticket_price	int	Harga tiket untuk jadwal tersebut.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
6. seat_summaries
Tabel transaksional yang merekam data okupansi kursi pada waktu tertentu untuk sebuah jadwal.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key unik.	
schedule_id	bigint, FK	Foreign key ke schedules.id.	
scraped_at	datetime	Waktu pasti data ini diambil (di-scrape).	
total_seats	int	Jumlah total kursi di studio untuk jadwal ini.	
occupied_seats	int	Jumlah kursi yang sudah terisi.	
available_seats	int	Jumlah kursi yang masih tersedia.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
7. movie_producer (Tabel Pivot)
Tabel pivot untuk relasi many-to-many antara users (produser) dan movies.
Nama Kolom	Tipe Data	Keterangan	
user_id	bigint, FK	Foreign key ke users.id.	
movie_id	bigint, FK	Foreign key ke movies.id.	
8. api_statuses
Tabel log untuk memonitor status endpoint API yang digunakan oleh scraper.
Nama Kolom	Tipe Data	Keterangan	
id	bigint, PK, AI	Primary Key unik.	
endpoint_name	varchar	Nama deskriptif dari endpoint API (e.g., "M-Tix Cities").	
status	varchar	Status terakhir ('online' atau 'offline').	
last_checked_at	datetime	Waktu terakhir status diperiksa.	
details	text	Pesan error atau detail tambahan jika status 'offline'.	
created_at	timestamp	Waktu pembuatan record.	
updated_at	timestamp	Waktu pembaruan record terakhir.	
Deskripsi Relasi
●	Users dan Movies (Many-to-Many):
○	Seorang User (dengan peran 'producer') dapat memiliki banyak Movie.
○	Sebuah Movie dapat dimiliki oleh banyak User (produser).
○	Relasi ini dijembatani oleh tabel pivot movie_producer.
●	Movies dan Schedules (One-to-Many):
○	Satu Movie dapat memiliki banyak Schedule penayangan.
○	Relasi: movies.mtix_movie_id -> schedules.movie_mtix_id.
●	Theaters dan Schedules (One-to-Many):
○	Satu Theater dapat memiliki banyak Schedule penayangan.
○	Relasi: theaters.mtix_cinema_id -> schedules.theater_mtix_id.
●	Cities dan Theaters (One-to-Many):
○	Satu City dapat memiliki banyak Theater.
○	Relasi: cities.mtix_city_id -> theaters.city_mtix_id.
●	Schedules dan SeatSummaries (One-to-Many):
○	Satu Schedule memiliki banyak SeatSummary yang direkam pada waktu yang berbeda-beda untuk melacak laju penjualan.
○	Relasi: schedules.id -> seat_summaries.schedule_id.