Aplikasi web untuk mengatur tempat duduk. Tamu mengetik namanya untuk tahu nomor meja, admin menyusun dan mengosongkan meja lewat grid.
Di acara yang pesertanya sudah dapat meja tertentu, panitia biasanya menempel denah di pintu masuk atau memanggil nama satu per satu. Cara itu membuat antrean menumpuk di depan, dan begitu ada perubahan penempatan, denah cetaknya langsung tidak berlaku. Saya ingin tahu seberapa sederhana masalah ini bisa diselesaikan tanpa aplikasi besar: cukup satu halaman yang bisa dibuka dari ponsel tamu, dan satu panel untuk panitia yang mengatur mejanya.
Tempatin saya bangun sebagai satu halaman PHP yang isinya berubah tergantung siapa yang membukanya. Tamu menekan tombol Cek Meja, mengetik nama lengkap, lalu langsung dapat nomor mejanya dalam bentuk kode seperti A1 atau C4. Setelah nomor meja muncul, sesinya langsung dihapus supaya perangkat yang sama bisa dipakai bergantian oleh tamu berikutnya.
Panitia masuk lewat jalur yang sama, bedanya nama yang diketik adalah "Admin Tempatin". Begitu nama itu cocok, yang tampil bukan lagi banner tamu melainkan panel pengaturan meja.
Masalah pertama datang dari input yang bebas. Nama diketik manual oleh tamu, jadi "Axa Rajandrya", "axa rajandrya", dan "AxaRajandrya" harus dianggap sama. Saya menormalkan kedua sisi sebelum dibandingkan: huruf diturunkan ke kecil dan spasi dibuang, baru dicocokkan. Cara ini jalan, tapi saya ambil jalan pintas dengan menarik seluruh isi tabel lalu membandingkannya di PHP. Untuk daftar sepanjang satu acara itu masih ringan. Untuk ribuan baris jelas tidak, dan normalisasinya seharusnya pindah ke kolom tersendiri di database supaya bisa diindeks.
Kedua, soal cara menyimpan posisi meja. Saya pisah menjadi dua kolom: meja_baris berisi huruf dan meja_kolom berisi angka. Label A1 dibentuk di JavaScript dengan String.fromCharCode(65 + indeks baris), lalu dipecah lagi di sisi server pakai substr saat menyimpan atau menghapus. Pemisahan ini memudahkan pembuatan grid, tapi membatasi jumlah baris sampai 26 karena hurufnya hanya satu karakter.
Yang paling saya sadari kelemahannya adalah identitas admin. Tidak ada tabel user dan tidak ada password. Admin dikenali semata dari nama "Admin Tempatin" yang saya simpan sebagai satu baris di tabel meja dengan posisi Z0, supaya tidak ikut muncul di grid A1 ke atas. Artinya siapa pun yang menebak string itu bisa membuka panel admin. Untuk skala acara kecil yang tautannya hanya disebar ke peserta, risikonya saya terima. Untuk dipakai lebih luas, bagian ini yang pertama harus diganti.
Satu lagi yang belum saya tutup: kolom meja_baris dan meja_kolom belum punya constraint unik. Saya hanya mencegah bentrok lewat tampilan, yaitu tombol yang sudah hijau tidak membuka dialog reservasi. Kalau dua admin menekan meja yang sama hampir bersamaan, database akan menerima keduanya.
Project ini saya kerjakan sendiri dari awal sampai akhir: skema database, seluruh endpoint PHP, logika grid di JavaScript, sampai penyesuaian tampilan. Sisi visualnya saya bangun di atas template HTML SaaS yang sudah ada, lalu saya rombak isinya sesuai kebutuhan aplikasi. Bagian yang murni saya tulis adalah semua alur meja beserta koneksi datanya.
Tempatin belum pernah saya pakai di acara sungguhan. Sampai sekarang statusnya sebagai latihan: saya ingin menguji apakah satu tabel dan enam file PHP cukup untuk menyelesaikan satu kebutuhan kecil secara utuh, dari sisi tamu sampai sisi pengelola. Jawabannya cukup, dengan catatan yang saya tulis di bagian tantangan tadi.
Kalau saya lanjutkan, urutan kerjanya sudah jelas. Autentikasi admin yang benar, constraint unik di posisi meja, pencocokan nama yang dipindah ke query, dan ekspor daftar penempatan supaya panitia punya salinan di luar aplikasi.