Hotel HMS Panduan Penggunaan

Hotel Management System

Sistem manajemen hotel lengkap berbasis Laravel 11 — dirancang untuk hotel butik hingga resort bintang 5 di Indonesia.

🏨

Front Office

Reservasi, check-in/out, folio, night audit

🛒

POS

Kasir F&B, minibar, charge to room

🌐

Channel Manager

Booking.com, Agoda, Traveloka ARI sync

💰

Open Pricing

Dynamic pricing engine, rate overrides

📒

Accounting

Double-entry GL, AR/AP, trial balance

📊

RMS

Yield management, forecast, rate shopper

🧹

Housekeeping

Room status board, task assignment

💆

Spa & Banquet

Treatments, therapists, events, BEO

👥

Guest 360

Loyalty, upsell score, churn risk, LTV

👔

HR & Payroll

Karyawan, absensi, payslip, service charge

🔌

BYOK Integration

AI / Payment / SMS / WA — user konfigurasi sendiri

📡

REST API

OAuth + PAT, webhook, idempotency

Statistik Teknis

MetrikJumlah
PHP source files341+
Database migrations46
Eloquent models130
Blade views141 (100% redesigned)
Routes~430
Pest tests84/84 ✅ 206 assertions
Services38
Queue jobs16
Dokumentasi27 file

Teknologi

  • Backend: Laravel 11, PHP 8.3, Eloquent ORM
  • Database: PostgreSQL (recommended) / MySQL / SQLite (dev)
  • Frontend: Tailwind CSS 3, Alpine.js, Blade templates
  • Queue: Laravel Queues (Redis/database driver)
  • Testing: Pest PHP, 84/84 passing
  • Auth: Laravel Sanctum + Spatie Permission (11 roles)
  • Compliance: PB1, NSFP, WNA reporting, UU PDP

Instalasi

Panduan setup dari nol hingga aplikasi berjalan di server.

Kebutuhan Sistem

KomponenMinimumRekomendasi
PHP8.28.3
DatabaseMySQL 8 / PostgreSQL 15PostgreSQL 16
RAM2 GB4 GB+
Storage20 GB50 GB SSD
Node.js1820 LTS
Composer2.52.7+

Langkah Instalasi

  1. Clone & Install Dependencies
    git clone https://github.com/your-org/hotel.git
    cd hotel
    composer install --optimize-autoloader
    npm install && npm run build
  2. Konfigurasi Environment
    cp .env.example .env
    php artisan key:generate

    Edit .env: set DB_*, APP_URL, APP_MODE (standalone atau saas)

  3. Jalankan Migrasi & Seeder
    php artisan migrate --seed

    Membuat 60+ tabel dan seed data: roles, room types contoh, admin user

  4. Setup Storage & Queue
    php artisan storage:link
    php artisan queue:work --queue=default,notifications,reports &
  5. Setup Wizard
    Buka /setup/wizard di browser → isi nama property, alamat, pajak, dan buat akun admin pertama.
Setelah wizard selesai, akses panel staff di /panel dan portal tamu di / (homepage booking engine).

Akun Demo (setelah DemoDataSeeder)

Semua akun demo memakai password password123. Cukup login di /login dan akses panel staff.

EmailPasswordRoleAkses Utama
superadmin@demohotel.idpassword123super_ownerSemua modul + user management + license
admin@demohotel.idpassword123super_ownerAlias super admin (kompatibilitas)
manager@demohotel.idpassword123managerSemua operasional (tanpa user mgmt)
fo@demohotel.idpassword123front_officeReservasi, check-in/out, folio
cashier@demohotel.idpassword123cashierFolio payment + read folio
housekeeping@demohotel.idpassword123housekeepingStatus kamar, task, lost & found
pos@demohotel.idpassword123pos_cashierPOS order: create, update, settle
accountant@demohotel.idpassword123accountantJournal, AR/AP, reports
auditor@demohotel.idpassword123auditorRead-only semua modul + audit log
sales@demohotel.idpassword123sales_marketingGuest read + report operasional
it@demohotel.idpassword123it_adminSettings, integration, API token
⚠️
Ganti semua password default segera setelah instalasi. Jangan gunakan di production sebelum mengganti kredensial.

Login & Sistem Role

Hotel HMS menggunakan Spatie Laravel Permission dengan 11 role berbeda.

Cara Login

  1. Buka URL Login
    Akses /login langsung atau klik tombol Login di pojok kanan atas homepage.
  2. Masukkan Kredensial
    Email + password. Centang "Remember Me" untuk session persisten.
  3. 2FA (Opsional)
    Jika diaktifkan admin, masukkan kode TOTP dari Google Authenticator / Authy.

Akun Demo Siap Pakai

Password semua akun: password123

EmailRole
superadmin@demohotel.idsuper_owner
manager@demohotel.idmanager
fo@demohotel.idfront_office
cashier@demohotel.idcashier
housekeeping@demohotel.idhousekeeping
pos@demohotel.idpos_cashier
accountant@demohotel.idaccountant
auditor@demohotel.idauditor
sales@demohotel.idsales_marketing
it@demohotel.idit_admin

Daftar Role & Akses

RoleAksesKeterangan
super_ownerSemua modulFull akses + user management + license
managerSemua operasionalTanpa sett.user.*
front_officeFO + folio + guestReservasi, check-in/out, kasir
cashierFolio paymentRead folio + post payment
housekeepingHK board, task, lost & foundUpdate status kamar & tugas HK
pos_serverPOS create + updateInput order tanpa settle
pos_cashierPOS create + update + settlePOS outlet penuh
accountantAccounting + reportsJournal, AR/AP, period close
auditorSemua endpoint .readRead-only + audit log
sales_marketingGuest read + report opsUntuk sales / outlet marketing
it_adminSettings + integration + tokenKonfigurasi sistem & API

Menambah User Baru

Buka Panel → Settings → Users. Klik "Add User", isi nama/email/password, pilih role. User langsung bisa login.

💡
Role super_owner punya akses penuh termasuk license, integrasi, dan user management. Role lain dibatasi sesuai permission di RolesAndPermissionsSeeder.

Reservasi

Kelola semua reservasi — dari booking langsung, OTA, telepon, hingga walk-in.

Membuat Reservasi Baru

  1. Buka Panel → Front Office → Reservasi
    Klik tombol "Reservasi Baru" di pojok kanan atas.
  2. Isi Data Tamu
    Cari tamu existing atau buat tamu baru: nama lengkap, email, telepon, kebangsaan.
  3. Pilih Kamar & Tanggal
    Pilih room type, check-in / check-out, jumlah dewasa & anak. Sistem otomatis cek ketersediaan.
  4. Tentukan Rate Plan
    Pilih rate plan (Room Only, Breakfast, dll). Harga otomatis dihitung termasuk PB1 & service charge.
  5. Simpan & Konfirmasi
    Klik "Buat Reservasi" → sistem generate kode referensi unik (misal: RES-2024-001234).

Status Reservasi

StatusArtiAksi Tersedia
TentativeBelum konfirmasiConfirm / Cancel
ConfirmedBooking confirmedCheck-in / Cancel
Checked InTamu sudah masukCheck-out / Add Charge
Checked OutSelesai menginapView only
CancelledDibatalkanView only
No ShowTidak datang (ditandai saat night audit)View only

Tape Chart

Buka FO → Tape Chart untuk melihat visual ketersediaan kamar per hari. Pilih range tanggal (default 14 hari ke depan). Setiap sel berwarna menunjukkan kamar yang terisi beserta nama tamu.

Check-in & Check-out

Proses check-in dan check-out dari panel Front Office.

Proses Check-in

  1. Buka Daftar Arrivals
    Panel → FO → Arrivals — semua reservasi "Confirmed" hari ini tampil di sini.
  2. Verifikasi Tamu
    Klik reservasi → konfirmasi identitas tamu (KTP/passport). Upload scan KTP jika perlu.
  3. Assign Kamar Fisik
    Pilih nomor kamar spesifik dari dropdown (otomatis filter kamar clean + available).
  4. Klik "Check-in"
    Status berubah ke "Checked In". Folio tamu otomatis dibuat. Kamar berubah status FO = Occupied.

Proses Check-out

  1. Buka Daftar Departures
    Panel → FO → Departures — reservasi "Checked In" dengan checkout hari ini.
  2. Review Folio
    Klik "View Folio" → pastikan semua charge sudah benar (kamar, F&B, minibar, misc).
  3. Proses Pembayaran
    Pilih metode bayar: Cash, Kartu, Transfer, OTA Collect. Masukkan jumlah yang diterima.
  4. Cetak Invoice
    Klik "Print Invoice" → halaman invoice terpisah dengan tombol print otomatis.
  5. Klik "Check-out"
    Status berubah ke "Checked Out". Kamar otomatis Dirty, siap untuk dibersihkan HK.
💡
Tamu bisa melakukan self check-in via portal tamu di /self-checkin/{ref} menggunakan kode booking mereka. Sistem akan kirim link otomatis via email/WhatsApp.

Folio & Billing

Setiap reservasi memiliki folio sebagai wadah semua transaksi selama menginap.

Struktur Folio

  • Room Charges — diposting otomatis setiap malam oleh Night Audit
  • POS Charges — F&B, minibar yang di-charge ke kamar
  • Misc Charges — laundry, transport, dll ditambah manual
  • Payments — pembayaran yang masuk (cash, card, OTA)
  • Balance — saldo tersisa (Total Charges − Total Payments)

Menambah Charge Manual

Buka folio → klik "+ Add Charge" → pilih type (room/fnb/misc), isi deskripsi, amount, tanggal, COA account. Sistem otomatis hitung PB1 sesuai konfigurasi property.

Split Folio

Untuk tamu korporat atau group: buka folio → "Split" → pindahkan charge tertentu ke folio baru (misal F&B ke folio terpisah yang dibayar company).

Transfer Charge

Untuk memindahkan charge dari folio satu ke folio lain (mis. dari kamar A ke kamar B untuk tamu yang pindah kamar).

Night Audit

Proses penutupan hari akuntansi hotel — dijalankan setiap malam setelah pukul 00:00.

Apa yang Dilakukan Night Audit

  • Post room charges ke semua folio tamu yang masih check-in
  • Tandai reservasi "Confirmed" yang tidak check-in sebagai No Show
  • Post jurnal akuntansi otomatis (DR: AR, CR: Room Revenue + Tax)
  • Hitung KPI harian: occupancy, ADR, RevPAR
  • Generate laporan daily revenue
  • Tutup periode akuntansi untuk tanggal tersebut (period lock)

Cara Menjalankan

  1. Buka FO → Night Audit
    Sistem menampilkan summary: kamar terisi, expected charges, catatan khusus.
  2. Verifikasi Data
    Pastikan tidak ada reservasi yang belum diselesaikan (checkout terlambat, dll).
  3. Klik "Run Night Audit"
    Proses berjalan otomatis ±30 detik. Progress bar ditampilkan.
  4. Review Hasil
    Laporan Daily Revenue otomatis tersedia di Reports → Daily Revenue.
⚠️
Night audit bersifat idempotent — aman dijalankan ulang jika ada error. Tidak akan duplikasi charge yang sudah ada untuk tanggal yang sama.

Otomasi via Scheduler

Tambahkan ke crontab server untuk jalankan otomatis pukul 00:05:

* * * * * cd /var/www/hotel && php artisan schedule:run >> /dev/null 2>&1

Konfigurasi di app/Console/Kernel.php: $schedule->job(new RunNightAuditJob)->dailyAt('00:05')

Housekeeping

Manajemen status kebersihan kamar real-time dan penugasan staf HK.

Room Status Board

Buka Panel → Housekeeping → Board. Setiap kamar ditampilkan sebagai card dengan:

  • Clean — siap untuk tamu
  • Dirty — perlu dibersihkan (otomatis setelah checkout)
  • Inspected — sudah diperiksa supervisor HK
  • Cleaning — sedang dibersihkan
  • Out of Order — tidak tersedia (maintenance)

Update Status Kamar

Dari Board: pilih status baru di dropdown bawah card kamar → otomatis tersimpan real-time. Staf HK bisa akses via mobile browser.

HK Tasks

Buka HK → Tasks untuk melihat daftar tugas (cleaning, turndown, amenities replenishment). Supervisor bisa assign task ke staf tertentu.

Out of Order (OOO)

Buka FO → OOO: blokir kamar dari reservasi untuk periode tertentu dengan alasan (maintenance, renovasi, dll). Kamar yang OOO tidak muncul di availability check.

POS (Point of Sale)

Sistem kasir untuk outlet F&B — restaurant, bar, minibar, in-room dining.

Membuka Kasir

  1. Pilih Outlet
    Panel → POS → pilih outlet (Restaurant, Bar, dll)
  2. Pilih Meja
    Klik meja yang akan dilayani. Status meja: Available (hijau) / Occupied (merah).
  3. Input Order
    Pilih item dari menu → tambah ke keranjang. Modifiers dan catatan khusus tersedia per item.
  4. Settle
    Pilih metode bayar atau "Charge to Room" (otomatis masuk ke folio tamu).

Charge to Room

Di POS, pilih "Charge to Room" → masukkan nomor kamar atau nama tamu. Charge langsung masuk ke folio tamu yang bersangkutan. Akan muncul saat proses checkout.

Laporan Shift POS

FO → Shifts → pilih shift → lihat rekap pembayaran, breakdown per metode, dan variance cash.

Banquet & Event

Manajemen event, function rooms, dan BEO (Banquet Event Order).

Membuat Event Baru

  1. Panel → Banquet → Events → Create
    Isi nama event, tipe (wedding/conference/gala/dll)
  2. Jadwal & Setup
    Tanggal, jam mulai-selesai, jumlah pax, layout ruangan (classroom/theatre/banquet)
  3. Assign Function Room
    Pilih function room yang tersedia. Sistem cek konflik jadwal otomatis.
  4. Tambah F&B Menu
    Di halaman detail event, tambah item F&B (catering, beverages, dll) per orang atau paket.

BEO (Banquet Event Order)

Buka event → klik "Print BEO". Sistem generate dokumen formal berisi detail event, F&B, setup, total biaya. Bisa di-print atau save sebagai PDF menggunakan print browser (Ctrl+P).

Banquet Calendar

Panel → Banquet → Calendar: lihat semua event per function room dalam tampilan kalender. Event ditampilkan dengan status dan jumlah pax.

Spa Management

Kelola treatment, therapist, dan appointment spa.

Setup Awal

  • Panel → Spa → Treatments: tambah treatment (nama, kode, durasi menit, harga)
  • Panel → Spa → Therapists: daftarkan therapist (nama, gender, specializations, status aktif)

Appointment

Panel → Spa → Appointments: buat appointment baru — pilih tamu, treatment, therapist, tanggal/jam. Sistem cek konflik jadwal therapist otomatis.

Charge ke Folio

Di halaman appointment: klik "Charge to Folio" → masukkan nomor kamar tamu. Biaya spa langsung masuk ke folio dan terhitung saat checkout.

Channel Manager

Sinkronisasi availability, rate, dan restriction (ARI) ke OTA secara real-time.

Channel yang Didukung

OTAFormatFitur
Booking.comXML / OTA APIARI push + booking pull
AgodaJSON REST (YCS)ARI push + booking pull
TravelokaJSON REST (TPI)ARI push + booking pull
Channel lainGeneric RESTKonfigurasi via BYOK adapter

Konfigurasi Channel

  1. Panel → Channel → Index
    Klik "+ Add Channel" → pilih OTA → masukkan API credentials (Hotel ID, API Key, Secret)
  2. Room Mapping
    Panel → Channel → Mapping: hubungkan room type HMS dengan room type ID di OTA
  3. Rate Mapping
    Panel → Channel → Rates: setup rate plan yang di-push ke masing-masing OTA
  4. Restriction Setup
    Panel → Channel → Restrictions: min stay, stop sell, closed to arrival per tanggal/kamar

Sync Log

Panel → Channel → Sync Log: monitor semua ARI push (status, timestamp, payload, error). Berguna untuk troubleshoot jika ada inkonsistensi di OTA.

Conflict Detection

Panel → Channel → Conflicts: sistem otomatis deteksi double booking dan rate mismatch antar channel. Resolve manual atau otomatis via rule.

Open Pricing

Engine harga terbuka per tanggal, room type, dan channel — dengan dynamic pricing otomatis.

Rate Calendar

Panel → Pricing → Calendar. Pilih room type + channel + range tanggal → klik "Load". Grid menampilkan harga per hari dengan sumber (base/dynamic/override) dan restriction.

Bulk Override

Setelah load grid, isi form Bulk Override di bawah → set harga, min stay, stop sell untuk semua tanggal yang terload sekaligus. Klik "Save Overrides".

Dynamic Pricing Rules

Panel → Pricing → Rules. Buat rule otomatis:

TriggerContohAction
Occupancy %Occupancy ≥ 80%+15% price increase
Days to Arrival≤ 3 days before−10% last-minute discount
Pickup PacePickup ≥ 5/day+10% demand surge

Klik "Apply Now" untuk jalankan semua rule aktif terhadap inventory 30 hari ke depan.

Parity Monitor

Panel → Pricing → Parity. Monitor perbedaan rate antara direct booking vs OTA. Alert otomatis muncul jika gap > threshold yang dikonfigurasi (critical/high/medium/low).

Revenue Management (RMS)

Tools untuk mengoptimalkan pendapatan — forecast, yield, dan competitive intelligence.

RMS Dashboard

Panel → RMS → Dashboard: overview KPI revenue — occupancy, ADR, RevPAR, TRevPAR dibanding periode sebelumnya.

Forecast

Panel → RMS → Forecast: proyeksi occupancy dan revenue 30/60/90 hari ke depan berdasarkan historis dan pickup pace. Export ke Excel tersedia.

Yield Management

Panel → RMS → Yield: tabel yield per room type — room nights sold, ADR, ALOS, variance vs budget. Warna merah/hijau otomatis untuk quick scan.

Rate Shopper

Panel → RMS → Rate Shopper: bandingkan rate kita vs kompetitor. Rate index dihitung (hijau ≥1.05 = premium, merah ≤0.95 = below market). Data diupdate via integrasi rate shopping API (konfigurasi di Integrations).

Akuntansi

Double-entry accounting terintegrasi — semua transaksi hotel otomatis membuat jurnal.

Chart of Accounts (COA)

Panel → Accounting → COA: lihat semua akun dengan kode, nama, tipe (Asset/Liability/Equity/Revenue/Expense). Default seeder sudah include ~50 akun standar hotel Indonesia.

Journal Entries

Sebagian besar jurnal dibuat otomatis (room charge, payment, night audit). Untuk jurnal manual: Panel → Accounting → Journal → Create. Input baris debit/kredit, sistem validasi balance otomatis.

AR (Accounts Receivable)

Panel → Accounting → AR: invoice ke company account atau travel agent. Lihat aging, outstanding balance, dan riwayat pembayaran per invoice.

AP (Accounts Payable)

Panel → Accounting → AP: tagihan dari supplier — laundry, F&B supplier, maintenance. Track outstanding bills dan tanggal jatuh tempo (overdue ditandai merah).

Laporan Keuangan

  • Daily Revenue — breakdown pendapatan per hari per kategori
  • Trial Balance — neraca saldo periode tertentu, warning jika tidak balance
  • P&L Statement — laba rugi dengan margin % dan KPI cards
💡
Laporan bisa diexport ke CSV (kompatibel Accurate, Jurnal.id) dan format Coretax DJP untuk pelaporan e-Faktur.

Laporan

Semua laporan operasional dan keuangan dalam satu tempat.

Laporan Tersedia

LaporanModulFrekuensi
Daily RevenueAccountingHarian (otomatis night audit)
Trial BalanceAccountingBulanan
Profit & LossAccountingBulanan / Tahunan
Flash ReportReportsHarian
Occupancy ReportReportsHarian / Bulanan
Channel ProductionReportsBulanan
Cashier ShiftReportsPer shift
Service ChargeHRBulanan
Payroll SummaryHRBulanan

Flash Report

Panel → Reports → Flash: snapshot KPI hari ini — occupancy %, rooms sold, revenue, ADR, RevPAR. Desain print-friendly untuk morning briefing.

Tamu & Loyalty

Database tamu terpadu dengan profil 360° dan program loyalitas.

Guest Directory

Panel → Guests: cari tamu berdasarkan nama, email, atau telepon. Klik tamu untuk lihat riwayat menginap.

Guest 360 Profile

Untuk setiap tamu, klik "360° Profile" untuk melihat:

  • Loyalty Score — 0–100, semakin tinggi = semakin loyal
  • Upsell Score — potensi tamu untuk upgrade/add-on
  • Churn Risk — risiko tamu tidak kembali (merah = AT RISK)
  • LTV — total nilai lifetime tamu
  • Behavioral Profile — frekuensi kunjungan, preferred room type, lead days
  • Spend Patterns — avg F&B, spa per menginap

Klik "Rebuild Profile" untuk refresh skor berdasarkan data terbaru.

Loyalty Tiers

Panel → Loyalty → Tiers: Bronze / Silver / Gold / Platinum. Set threshold poin dan rate discount per tier.

Vouchers

Panel → Loyalty → Vouchers: issue voucher diskon, complimentary night, atau F&B credit kepada tamu. Set tanggal expired dan nilai nominal.

HR & Payroll

Manajemen karyawan, absensi, dan penggajian terintegrasi.

Data Karyawan

Panel → HR → Employees: kelola data karyawan (nama, posisi, departemen, tanggal bergabung, gaji pokok). Upload dokumen (KTP, BPJS, kontrak).

Absensi

Panel → HR → Attendance: input absensi harian per karyawan atau import dari fingerprint system. Track jam kerja, overtime, cuti.

Payroll

Panel → HR → Payroll: generate payroll bulanan. Otomatis hitung komponen:

  • Gaji pokok + tunjangan
  • Lembur (overtime hours × rate)
  • Service charge share per karyawan
  • Potongan BPJS Kesehatan & Ketenagakerjaan
  • PPh 21 (perhitungan otomatis)

Payslip

Klik nama karyawan → pilih periode → "Print Payslip". Slip gaji formal dalam format SLIP GAJI yang print-friendly.

Service Charge Distribution

Panel → HR → Service Charge: distribusi service charge bulanan ke semua karyawan berdasarkan formula yang dikonfigurasi (equal share, atau per jabatan).

Aset & Maintenance

Tracking aset hotel dan work order maintenance.

Daftar Aset

Panel → Assets: semua aset hotel (furniture, elektronik, A/C, dll). Track cost, depresiasi, nilai buku, dan lokasi.

Work Orders

Panel → Assets → Work Orders: buat work order untuk maintenance. Tipe: Corrective (kerusakan), Preventive (rutin), Inspection. Assign ke teknisi dan set priority.

PPM (Planned Preventive Maintenance)

Panel → Assets → PPM: jadwal maintenance rutin per aset (mis: A/C service setiap 3 bulan). Tampilan visual: Overdue / Due Soon / Scheduled.

Komunikasi & Marketing

Inbox terpusat, template pesan, dan campaign marketing.

Inbox

Panel → Comm → Inbox: semua pesan masuk dari tamu (via email, WhatsApp, SMS) dalam satu tampilan. Balas langsung dari panel.

Thread / Chat View

Klik thread untuk melihat percakapan dalam format chat. Pesan keluar (biru, kanan) dan masuk (abu, kiri) dengan timestamp.

Templates

Panel → Comm → Templates: buat template pesan untuk booking confirmation, check-in reminder, post-stay review request. Tersedia per channel (email/WhatsApp/SMS) dan bahasa.

Campaigns

Panel → Comm → Campaigns: blast pesan ke segment tamu (mis: semua tamu yang menginap 3+ bulan lalu). Set jadwal kirim, track open rate dan sent count.

Referral Program

Panel → Marketing → Referrals: program referral — tamu dapat unique link, earning points setiap ada booking dari link mereka.

Konfigurasi

Semua pengaturan property, pajak, dan sistem.

Property Settings

Panel → Settings → Property: nama hotel, alamat, telepon, NPWP, logo, timezone, mata uang. Pengaturan ini muncul di semua invoice dan dokumen resmi.

Tax Settings

Panel → Settings → Tax: aktifkan/nonaktifkan PB1, set persentase (default 10%), input NSFP prefix, daftar history rate PB1 untuk audit.

Cancellation Policies

Panel → Settings → Cancellation Policies: buat kebijakan pembatalan (nama, grace period, aturan penalty per X hari sebelum checkin). Assign ke rate plan.

Document Templates

Panel → Settings → Doc Templates: kustomisasi template folio, invoice, BEO — header HTML, body, footer. Variabel dinamis tersedia (nama tamu, total, dll).

Users

Panel → Settings → Users: kelola user staff — tambah, edit role, reset password, aktif/nonaktif.

Integrasi BYOK

Bring Your Own Key — semua integrasi dikonfigurasi oleh user sendiri, tidak ada provider yang hardcoded.

Kategori Integrasi

KategoriContoh ProviderFormat Adapter
AI / LLMOpenAI, Claude, DeepSeek, Groq, OllamaOpenAI-compatible / Anthropic / Gemini
PaymentMidtrans, Xendit, Stripe, DokuRedirect / Embed / QR
SMS GatewayTwilio, Zenziva, VonageREST-format
WhatsAppWablas, Fonnte, WA Cloud APIREST-format
EmailMailgun, SendGrid, SES, SMTPSMTP / API
StorageS3, Backblaze, Cloudflare R2, localS3-compatible
Channel OTABooking.com, Agoda, TravelokaXML / JSON REST

Cara Menambah Integrasi

  1. Panel → Settings → Integrations
    Klik "+ Add Integration" → pilih kategori
  2. Pilih Format Adapter
    Misal untuk LLM: pilih "OpenAI-Compatible" jika provider pakai format OpenAI (DeepSeek, Groq, Ollama, dll)
  3. Input Credentials
    Base URL, API Key (dienkripsi AES-256 saat disimpan), model name, extra headers jika perlu
  4. Assign ke Fitur
    Pilih fitur mana yang menggunakan integrasi ini (AI: guest profile / translate / demand forecast)
  5. Test Connection
    Klik "Test" untuk verifikasi koneksi sebelum aktifkan
🔐
Semua API key dienkripsi di database menggunakan AES-256. Key tidak pernah dicatat di log dan tidak pernah muncul di API response.

REST API

Hotel HMS menyediakan REST API v1 untuk integrasi dengan sistem eksternal.

Authentication

Dua metode autentikasi:

  • OAuth 2.0 — untuk aplikasi pihak ketiga
  • Personal Access Token (PAT) — untuk integrasi langsung (webhook, scripts)
Authorization: Bearer {your-token}

Base URL

https://yourdomain.com/api/v1

Endpoint Utama

EndpointMethodDeskripsi
/reservationsGET / POSTList & create reservasi
/reservations/{id}GET / PATCHDetail & update
/reservations/{id}/check-inPOSTProses check-in
/reservations/{id}/check-outPOSTProses check-out
/roomsGETList kamar & availability
/guestsGET / POSTDirectory tamu
/folios/{id}/chargesPOSTTambah charge ke folio
/pricing/calendarGET / POSTRate grid & override
/webhooksPOSTRegister webhook endpoint

Idempotency

Untuk request yang bisa duplikat (pembayaran, dll), gunakan header Idempotency-Key: {uuid}. Sistem menyimpan hasil 24 jam — request sama tidak akan diproses dua kali.

Webhook Events

  • reservation.created
  • reservation.checked_in
  • reservation.checked_out
  • folio.payment_received
  • night_audit.completed

Lihat dokumentasi lengkap di /api/v1/openapi.json (OpenAPI 3.0 spec).

Beli Source Code

Dapatkan source code lengkap Hotel HMS untuk digunakan di hotel Anda.

💎

Hotel HMS — Full Source Code

Laravel 11 · PostgreSQL · Tailwind CSS · Alpine.js · 341 PHP files

Hubungi via WhatsApp

📞 081296052010 · Respon cepat

Yang Termasuk dalam Paket

  • ✅ Source code Laravel 11 lengkap (341+ PHP files)
  • ✅ 141 Blade views — UI modern Tailwind CSS
  • ✅ 46 database migrations + seeder lengkap
  • ✅ 130 Eloquent models dengan relasi lengkap
  • ✅ ~430 routes (panel, portal, API, admin)
  • ✅ Pest test suite 84/84 passing
  • ✅ 27 file dokumentasi teknis (00-24)
  • ✅ BYOK integration system (AI, Payment, SMS, Channel)
  • ✅ pSEO 15+ pattern untuk booking engine
  • ✅ License pairing system (standalone mode)
  • ✅ Indonesia compliance (PB1, NSFP, WNA reporting)
  • ✅ Dukungan setup via WhatsApp

Cocok Untuk

🏨

Pemilik Hotel

Deploy langsung untuk hotel Anda. Customisasi bebas tanpa biaya bulanan.

💻

Developer / Agency

Base yang solid untuk project HMS klien Anda. Hemat ratusan jam development.

🎓

Belajar

Studi kasus nyata Laravel 11 enterprise — ideal untuk portofolio atau tugas akhir.

🚀

SaaS Starter

Infrastruktur SaaS multi-tenant sudah disiapkan (stancl/tenancy ready).

Kontak Pembelian

WhatsApp: 081296052010

Chat sekarang untuk info harga, demo, dan proses pembelian

Alur Kerja End-to-End

Dari user klik tombol → kode jalan → tabel database terisi. Semua relational, satu alur.

📌 Cara baca dokumen ini

Setiap workflow di-decompose jadi langkah. Per langkah ada aksi user → file kode → tabel database yang terisi. Tabel yang masih kosong di DB-mu = fitur belum pernah dipakai (normal kalau fresh install). Kalau sudah ada data, alur sudah dilalui.

1️⃣ Workflow: Reservasi Direct (Booking Engine)

Tamu pesan langsung dari website hotel. Tanpa OTA.

StepAksi UserKodeTabel Terisi
1Buka /booking + isi tanggalBookingEngineController@search(read-only) inventory, rate_plans, rates
2Klik kamar → PilihBookingEngineController@results(read-only)
3Isi data tamu → SubmitBookingEngineController@submit✏️ guests, reservations, reservation_rooms, folios
4Bayar via gatewayWebhook booking.payment-callback✏️ folio_payments, folios.balance
5Email konfirmasi terkirimJob SendReservationConfirmationJob✏️ notifications, email_logs

2️⃣ Workflow: Booking dari OTA (Channel Manager)

Booking masuk dari Booking.com / Agoda / Traveloka / dll. lewat webhook atau polling.

StepAksiKodeTabel Terisi
1Setup OTA channel pertama kalipanel/channelChannelController@store✏️ channels, channel_room_mappings
2OTA push booking via webhookWebhookController@channelBookingComAdapter (atau adapter lain)✏️ reservations, reservation_rooms, guests, folios, ari_sync_log
3PMS push availability ke OTAJob PushAriToChannelJob → adapter✏️ ari_sync_log, inventory (sync timestamp)
4Konflik tarif/availConflictDetectionService✏️ channel_conflicts, channel_parity_alerts
5Resolve konflik (admin)ConflictController@resolve✏️ channel_conflicts.resolved_at

3️⃣ Workflow: Check-In → Stay → Check-Out

Inti operasional Front Office. Semua charge di-track di folio.

StepAksi UserKodeTabel Terisi
1Tamu datang → Receptionist klik Check-inpanel/fo/reservations/{id}/check-in✏️ reservations.status='checked_in', reservation_rooms.actual_arrival, rooms.status='occupied'
2Scan KTP/Paspor (vision LLM)OcrService@extractKtp✏️ guests.ktp_number, guests.id_document_url
3Tamu sign e-registration carde-registration/store✏️ e_registrations, guests.signature_url
4WNA? Auto generate Lapor ImigrasiWnaReporter@queueReport✏️ wna_reports, compliance_jobs
5Tamu order makanan via QR menu di kamarQrMenuController@placeOrder✏️ pos_orders, pos_order_items
6POS settle: charge to roomPosController@settle✏️ folio_charges (linked ke folio reservasi), pos_orders.status='settled'
7Minibar consumption (HK input)HkController@minibarPost✏️ folio_charges, minibar_consumptions
8Tamu check-out → settle foliopanel/fo/folios/{id}/settle✏️ folio_payments, folios.balance=0, reservations.status='checked_out', rooms.status='dirty'
9HK dapat task auto-cleanRoomCheckedOutObserver✏️ hk_tasks, rooms.status='cleaning'
10HK selesai inspeksi → kamar sellable lagiHkController@inspect✏️ hk_inspections, rooms.status='clean', inventory.available++

4️⃣ Workflow: Night Audit (Closing Day)

Auto-post room charge, freeze inventory, generate laporan harian.

StepAksiKodeTabel Terisi
1Click Run Night Audit (atau cron 03:00 WIB)NightAuditController@run
2Auto-post room charge per occupied roomNightAuditService@postRoomCharges✏️ folio_charges (category=room)
3Snapshot occupancy & rateNightAuditService@snapshot✏️ inventory.sold, inventory.adr
4Generate flash reportFlashReportGenerator@generate✏️ daily_flash_reports
5Auto-post journal entries (PSAK + USALI)JournalPostingService@postEod✏️ journal_entries, journal_lines
6Lock period (no edits)AccountingPeriod@close✏️ accounting_periods, audit_logs
7Email digest ke ownerJob SendDailyDigestJob✏️ email_logs

5️⃣ Workflow: Procurement (Inventory)

PR → PO → GR. Auto-update stock card & journal AP.

StepAksi UserKodeTabel Terisi
1HK / Kitchen butuh barang → bikin PRpanel/inventory/pr/create✏️ purchase_requests, purchase_request_lines
2Manager approvepanel/inventory/pr/{id}/approve✏️ purchase_requests.status='approved', approval_requests
3Purchasing convert PR → POpanel/inventory/po/create✏️ purchase_orders, purchase_order_lines
4PO send ke vendor (email/print)PoController@send✏️ purchase_orders.sent_at, email_logs
5Barang datang → input GRpanel/inventory/gr/create✏️ goods_receipts, goods_receipt_lines
6GR accept → stock + AP bill auto-createGrController@accept✏️ inventory_movements, inventory_items.stock_qty, ap_bills, ap_bill_lines
7Pay AP billpanel/accounting/ap/{id}/pay✏️ ap_payments, ap_bills.status='paid', journal_entries

6️⃣ Workflow: AI Concierge (BYOK)

Chatbot tamu yang BYOK ke provider apapun (DeepSeek, Gemini, Anthropic, Self-hosted).

StepAksiKodeTabel Terisi
1Owner setup AI provider di Settings → Integrationspanel/settings/integrations✏️ integrations (kategori 'ai', api_format, encrypted key)
2Tamu chat di guest portal / WhatsAppPOST /api/v1/ai/concierge✏️ ai_conversations, ai_messages
3ConciergeService panggil adapter (OpenAI-compat / Anthropic / Gemini)ConciergeService@chatOpenAICompatibleAdapter (etc)✏️ ai_usage_logs (token count, cost tracking)
4Response streaming ke tamuSSE response✏️ ai_messages

7️⃣ Workflow: Lisensi Pairing (Buyer Activation)

Saat buyer install app pertama kali — pair ke whitelabel.co.id.

StepAksiKodeFile / Tabel
1Buyer buka domain pertama kaliMiddleware RequirePair(read-only) storage/app/.license.lock
2Belum paired → redirect ke /__pair wizardPairController@show
3Buyer paste activation keyLicenseClient@activate → POST whitelabel.co.id
4Server return signed_payload (RSA-signed)📦 storage/app/.license.lock (AES-256-GCM encrypted)
5Heartbeat tiap 24 jamLicenseClient@maybeHeartbeat(cache: license:heartbeat:last)

8️⃣ Workflow: SaaS Onboarding (Vendor Side)

Calon customer signup di marketplace, vendor admin provision tenant.

StepAksiKodeTabel Terisi
1Calon customer signup di /signupTenantSignupController@store✏️ tenants (status='trial')
2Vendor admin provision di /admin/tenants/{id}/provisionTenantProvisioner@provision✏️ tenant_domains, tenant_subscriptions (plan), users (admin tenant)
3Generate tenant invoice pertamaInvoiceGenerator@generate✏️ tenant_invoices (status='unpaid')
4Customer bayar via MidtransWebhook payment.success✏️ tenant_invoices.status='paid', tenants.status='active'
5Vendor impersonate untuk troubleshootpanel/admin/tenants/{id}/impersonate✏️ impersonation_logs
6Vendor suspend (telat bayar)panel/admin/tenants/{id}/suspend✏️ tenants.status='suspended'

✅ Relational Integrity

Setiap tabel anak punya FK ke parent — folio_charges.folio_id → folios.id, folios.reservation_id → reservations.id, reservation_rooms.reservation_id → reservations.id, journal_lines.journal_entry_id → journal_entries.id, dst. Semua di-enforce via migration foreign() constraints. Cascade delete dipakai untuk parent-child wajib (folio_charges ikut hilang kalau folio dihapus); restrict untuk reference master (rooms, guests).

Skema Database

167 tabel total · 24 ada data sekarang · 143 menunggu workflow dilalui

Tabel dengan Data (Sudah Pernah Dipakai)

Tabel yang sudah punya rows di DB-mu — fitur sudah diaktifkan, alur sudah dilalui:

TabelRowsDiisi oleh workflow
folio_charges2,452Setiap charge ke folio (room, F&B, minibar, addon)
rates1,086Setup rate plan + rate calendar
guests1,001Setiap reservasi baru (auto-create kalau guest belum ada)
reservation_rooms801Per kamar dalam reservasi (multi-room booking)
reservations801Booking direct + dari OTA
folios7481 folio per reservasi (auto-create saat reservasi)
inventory543Snapshot per kamar per tanggal (dari Night Audit)
folio_payments370Setiap payment masuk (cash, transfer, gateway)
permissions56Spatie permission seeded
rooms30Master kamar (30 untuk demo hotel)
roles11Spatie role: super_owner, manager, FO, cashier, dll
room_types3Superior, Deluxe, Junior Suite
properties1Demo Hotel Mandala
users1admin@demohotel.id
admin_users1superadmin@hotelhub.id (vendor)

Tabel Kosong (Fitur Belum Dipakai)

143 tabel masih kosong — ini NORMAL. Akan terisi otomatis sesuai alur kerja:

Kategori FiturTabel KosongAkan terisi saat
Channel / OTAchannels, channel_room_mappings, channel_conflicts, channel_parity_alerts, ari_sync_logSetup OTA pertama (Booking.com, Agoda, dll)
POS / F&Bpos_orders, pos_order_items, pos_outlets, pos_menu_items, pos_tablesPertama kali order F&B di restoran
Housekeepinghk_tasks, hk_inspections, linen_audits, lost_found_itemsPertama kali check-out (auto-create cleaning task)
Accountingjournal_entries, journal_lines, ar_invoices, ar_payments, ap_bills, ap_payments, accounting_periodsNight Audit pertama atau manual journal
Inventory / Procurementpurchase_requests, purchase_orders, goods_receipts, inventory_items, inventory_movementsPR pertama dibuat
HR & Payrollemployees, attendance_logs, leave_requests, payrolls, payslipsTambah employee pertama
Banquet / MICEbanquet_events, banquet_function_rooms, banquet_event_menusBooking event pertama
Spaspa_appointments, spa_therapists, spa_treatmentsBooking spa pertama
Asset / Maintenanceassets, work_orders, ppm_schedulesTambah aset pertama
Loyalty / CRMloyalty_members, loyalty_tiers, loyalty_vouchersEnroll member loyalty pertama
Communicationconversations, messages, campaigns, notificationsKirim email/WA pertama
Compliancewna_reports, sipgar_submissions, e_faktur_logsCheck-in tamu WNA pertama / submit pajak
SaaS / Multi-tenanttenants, tenant_domains, tenant_subscriptions, tenant_invoicesCuma kepakai kalau APP_MODE=saas

Relational Integrity Map

Cara tabel terhubung — semua FK enforced di migration:

properties (1)
   ├─ rooms ─── room_types
   ├─ inventory (per room per tanggal)
   ├─ rate_plans ─── rates
   │
   ├─ reservations
   │     ├─ reservation_rooms ─── rooms
   │     ├─ guests (primary_guest)
   │     └─ folios
   │           ├─ folio_charges
   │           ├─ folio_payments
   │           └─ folio_transfers
   │
   ├─ channels (Booking.com, Agoda, …)
   │     ├─ channel_room_mappings ─── room_types
   │     ├─ channel_conflicts
   │     └─ ari_sync_log
   │
   ├─ pos_outlets ─── pos_menu_items, pos_tables
   │     └─ pos_orders ─── pos_order_items
   │           └─ folio_charges (charge to room)
   │
   ├─ hk_tasks ─── rooms, employees
   │     ├─ hk_inspections
   │     ├─ linen_audits
   │     └─ lost_found_items
   │
   ├─ journal_entries ─── journal_lines ─── chart_of_accounts
   │     ├─ ar_invoices ─── ar_invoice_lines, ar_payments
   │     └─ ap_bills ─── ap_bill_lines, ap_payments
   │
   ├─ purchase_requests ── purchase_orders ── goods_receipts
   │     └─ inventory_movements ─── inventory_items
   │
   ├─ employees ── attendance_logs, leave_requests, payrolls, payslips
   │
   └─ users ── roles ── permissions  (Spatie)

admin_users (vendor side, terpisah)
   ├─ tenants ── tenant_domains, tenant_subscriptions, tenant_invoices
   └─ license_events

Cara Cek Relational Integrity Sendiri

# List semua FK constraint:
mysql hotel_main -e "SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY TABLE_NAME;"

# Test cascade — coba delete reservation, lihat folio + folio_charges ikut hilang:
php artisan tinker
> \App\Models\Reservation::find(1)->delete();
> // folios + folio_charges + folio_payments otomatis ikut