VosCMS Toko

Riwayat Perubahan

v2.8.2 2026-10-12 · 7 hari lalu
Layar pembaruan dan riwayat perubahan kini tampil dalam bahasa pengunjung

Yang diperbaiki

  • •Kesalahan pemutakhir: gagal menulis berkas dan version.json, patch dan pratinjau perubahan tidak didukung, repositori tidak dapat diakses, serta koneksi berhasil.
  • •Layar pembaruan: kesalahan respons server, "N berkas berubah · N commit", selesai, sedang diterapkan, tugas terdaftar, waktu habis, dan rollback selesai.
  • •Pemberitahuan pendaftaran tugas: pesan bahwa tugas pembaruan, patch, atau rollback telah diantrekan.
  • •Worker berhak akses (cron) kini meninggalkan pesan kemajuan serta pemberitahuan berhasil dan gagal dalam bahasa yang benar.

Layar riwayat perubahan (`/changelog`)

  • •Waktu relatif seperti "5 months ago" sebelumnya hanya ada dalam bahasa Korea dan Inggris; kini tersedia dalam 13 bahasa.

Pesan daftar kosong, tanda "Terjemahan AI", catatan "tidak ada terjemahan — ditampilkan dalam KO", dan "hanya menampilkan N terbaru" juga diterjemahkan.

  • •Bahasa layar kini mengikuti bahasa yang benar-benar dipakai situs, bukan hanya nilai sesi (?lang=, sesi, cookie, bahasa bawaan).

Sebelumnya kunjungan pertama jatuh ke bahasa Korea, sehingga label berbahasa Korea ikut muncul di situs berbahasa Jepang dan Inggris.

  • •Pengenal dan jalur yang panjang (teks tanpa spasi) tidak lagi meluber keluar dari kartu atau terselip di bawah tombol pemasangan di sisi kanan.

Perlu diketahui

  • •Worker berhak akses tidak memiliki pengguna yang masuk sehingga tidak memiliki bahasa. Ia menulis pesannya dalam bahasa bawaan situs.

(Sebelumnya ia tidak menjalankan sistem terjemahan, sehingga kunci seperti updater.write_failed bisa tercetak apa adanya. Kini worker menjalankannya.)

  • •Log server (error_log) dan log debug untuk pengembang dibaca oleh operator, sehingga dibiarkan seperti semula.
  • •Pada situs yang sudah terpasang, yang menjalankan pembaruan adalah pemutakhir lama yang sudah terpasang, sehingga perbaikan ini baru terlihat pada pembaruan setelah beralih ke 2.8.2.
v2.8.1 2026-10-12 · 7 hari lalu
Dukungan multibahasa lebih baik (nama aplikasi, data pencarian, `?lang=`) · pembaruan melindungi perubahan inti milik situs

Multibahasa

  • •Nama dan deskripsi aplikasi pada "Tambahkan ke layar utama" dan petunjuk pemasangan kini tampil dalam bahasa pengunjung. Sebelumnya nilai yang tersimpan (misalnya bahasa Jepang) ditampilkan apa adanya.

Terjemahan disimpan di bawah kunci seperti pwa.front.name di rzx_translations. manifest.php kini hanya meneruskan ke keluaran resmi.

  • •Data terstruktur (JSON-LD): terjemahan nilai pengaturan dilihat lebih dulu. Kami memperbaiki butir kedua breadcrumb yang juga memuat nama situs, serta "Home" yang tampil dalam bahasa Inggris di semua bahasa.
  • •Widget statistik: angka dan satuan (suffix) kini menerima nilai per bahasa seperti label. Nilai tunggal bekerja persis seperti sebelumnya.
  • •Layar luring dan pesan terakhir service worker kini tersedia dalam bahasa Korea, Jepang, dan Inggris.

Versi cache service worker naik dari v5 ke v6 agar perangkat yang sudah memasang aplikasi menerima layar baru.

  • •"Tidak ada hasil" pada pencarian pesan sebelumnya tertulis langsung dalam bahasa Korea; kini tersedia dalam 13 bahasa.

Mesin pencari dan AI

  • •Kami menghasilkan <meta property="og:locale"> dan bahasa alternatif (og:locale:alternate). Saat dibagikan di media sosial, ini menyampaikan bahasa halaman tersebut.
  • •Halaman sistem publik yang digambar oleh kode kini ikut masuk ke sitemap.xml (sebelumnya terlewat).
  • •Baris pertama llms.txt (deskripsi situs) tampil dalam bahasa pengunjung.
  • •Pengaturan robots per halaman (layar admin punya kolom isiannya, tetapi tidak ada yang membacanya) kini benar-benar diterapkan.

Masalah yang diperbaiki

  • •Nilai ?lang= diterima hanya setelah dicocokkan dengan daftar bahasa yang didukung. Sebelumnya nilai yang tidak didukung tersimpan di cookie selama setahun,

dan saat bahasa itu dibuka kemudian, pengunjung bisa berpindah ke layar tersebut di luar kehendaknya. Pemilih bahasa mengikuti aturan yang sama.

  • •Pembuat widget: terjemahan untuk bahasa yang tidak memiliki kolom isian di layar terhapus setiap kali disimpan.
  • •Pencarian pesan komunitas: nama disimpan terenkripsi sehingga nama apa pun menghasilkan 0 hasil. Kini pencarian mendekripsi lebih dulu lalu mencocokkan.

Pembaruan melindungi perubahan inti milik situs

  • •Jika Anda menuliskan jalur di storage/custom/update-preserve.txt, satu per baris (# untuk komentar, folder diperbolehkan), pembaruan tidak akan menimpa berkas tersebut.

Gunakan untuk melindungi hal yang Anda masukkan langsung ke berkas inti, seperti aturan masuk khusus situs. Jalur absolut dan .. tidak diterima,

dan jika berkas tidak dapat dibaca, pembaruan tidak berhenti, melainkan berlanjut dengan daftar perlindungan bawaan.

  • •Perlu diketahui: pihak yang menjalankan pembaruan harus sudah memiliki fitur ini agar bermanfaat. Fitur ini berlaku mulai pembaruan setelah beralih ke 2.8.1.
v2.8.0 2026-10-12 · 7 hari lalu
Tambahkan penyedia pembayaran (PG) cukup dengan memasukkan folder · dukungan Square

Apa yang berubah

Modul pembayaran sudah memiliki satu berkas untuk tiap penyedia, tetapi "penyedia apa saja yang ada" tertulis di beberapa tempat dalam kode.

Untuk menambahkan penyedia, pengelola pembayaran, layar pengaturan, dan webhook harus diubah semuanya.

  • •Letakkan folder (gateway.json beserta berkas implementasi) di rzxlib/Modules/Payment/Gateways/ dan inti akan mengenalinya sendiri.

Pilihan penyedia, kolom kunci, dan alamat webhook pada layar pengaturan admin dibuat dari spesifikasi tersebut.

  • •Situs tetap memilih satu penyedia di layar pengaturan (seperti sebelumnya). Ini bukan fitur untuk memakai beberapa penyedia sekaligus.
  • •Cara menambahkan penyedia dijelaskan di docs/PAYMENT_GATEWAYS.md.

Square

  • •Mendukung pembayaran kartu, pengembalian dana dan pencarian, kartu tersimpan (untuk penagihan berulang), serta webhook (dengan verifikasi tanda tangan).
  • •Formulir kartu melalui autentikasi pemegang kartu (SCA) dan menampilkan alasannya di layar saat gagal. 13 bahasa.
  • •Layar pengaturan admin memiliki tombol baru "Uji koneksi". Dalam mode uji, tombol ini menjalankan pembayaran kecil, pencarian, dan pengembalian dana

untuk memastikan kunci Anda benar. Tidak ada uang sungguhan yang berpindah, dan uji ini tidak berjalan dalam mode live.

  • •Sebelum Anda memilih Square, tidak ada yang berubah untuk situs mana pun.

Penyedia yang sudah ada (PAY.JP dan Stripe) tetap sama

  • •Berkas implementasi kedua penyedia tidak disentuh. Pengaturan lama (kunci tunggal, v2, v3) tetap dibaca seperti sebelumnya.
  • •Meskipun berkas spesifikasi tidak dapat dibaca karena suatu sebab, jaring pengaman membuat PAY.JP dan Stripe dibuat dengan cara lama.
  • •Dengan pengaturan nyata situs produksi dan banyak pengaturan sintetis, kami membandingkan kode lama dan baru dan memastikan keduanya memilih penyedia, mode, dan kunci yang sama

(scripts/test-payment-parity.php).

Membaca pengaturan pembayaran per situs

Ketika satu basis data menyimpan pengaturan pembayaran terpisah untuk tiap situs, modul pembayaran kini membaca pengaturan situsnya sendiri.

Sebelumnya tidak ditentukan pengaturan situs mana yang terpilih. Jika sebuah situs tidak punya pengaturan sendiri, ia bekerja seperti sebelumnya.

Perlu diketahui

  • •Alamat webhook bersama telah ditambahkan (/api/webhook-payment.php?gateway=…). Alamat webhook PAY.JP dan Stripe yang sudah ada tidak berubah.
  • •Daftar penyedia di layar pengaturan mempertahankan urutan lamanya; penyedia yang masuk melalui spesifikasi ditambahkan setelahnya.
v2.7.17 2026-09-21 · 28 hari lalu
Konten plugin kini terlihat oleh mesin pencari dan AI

Apa masalahnya

Peta situs (sitemap.xml) dan panduan AI (llms.txt) hanya memuat apa yang diketahui inti.

Agar plugin bisa menambahkan halamannya sendiri, satu-satunya cara adalah mengubah berkas inti secara langsung, dan perubahan itu

hilang pada setiap pembaruan. Selain itu, inti menebak cara membaca tabel plugin, sehingga di beberapa tempat terjadi penyimpangan secara diam-diam.

  • •Properti real estat hanya dikeluarkan di alamat terpisah (/properties-sitemap.xml); bila tidak ada yang menunjuk ke alamat itu,

mesin pencari tidak dapat menemukannya.

  • •Item pasar tidak pernah muncul di peta situs karena kueri yang mencari kolom yang tidak ada.

Kesalahannya tertelan sehingga tidak ada yang tahu.

  • •Beberapa situs memuat alamat toko dalam bentuk yang salah, sehingga mesin pencari mengindeks alamat yang mengarah ke halaman yang tidak ada.

Plugin kini menerbitkan halamannya sendiri

  • •Jika plugin menulis seo di plugin.json-nya, inti membacanya dan menggabungkannya ke peta situs dan panduan AI.

Cara kerjanya sama seperti widget, tata letak, dan modul intranet, dan bila alamat bentrok, inti yang menang.

  • •Alamat untuk beberapa bahasa dan penanda bahasa ditambahkan oleh inti. Plugin cukup memberikan alamatnya.
  • •Satu plugin yang rusak tidak lagi menjatuhkan seluruh peta situs. Hanya bagian plugin itu yang terlewat.
  • •Alamat plugin yang dinonaktifkan keluar dengan sendirinya; halaman plugin yang dinonaktifkan memang tidak bisa dibuka.

Alamat alternatif bahasa Mandarin diabaikan

Peta situs menulis penanda bahasa sebagai zh_CN, padahal standarnya zh-CN, sehingga Google mengabaikan seluruh baris itu.

Halamannya sendiri ditulis dengan benar, jadi situs yang sama mengatakan dua hal berbeda di dua tempat.

Alamat alternatif untuk Mandarin Sederhana dan Tradisional kini dikenali dengan benar.

Panduan AI per bahasa

  • •llms.txt sebelumnya hanya ada dalam bahasa bawaan. Kini ia menghasilkan edisi bahasa seperti ?lang=en.

Nama dan deskripsi item keluar dalam bahasa itu, dan bagian awal panduan menyebut edisi bahasa yang mana.

  • •Pada situs multibahasa, mesin jawaban AI kini dapat menyampaikan situs ini kepada pengguna di setiap wilayah bahasa.

Karyawan dapat melihat kartu kepegawaiannya sendiri (intranet)

  • •Kartu kepegawaian yang sebelumnya hanya dilihat staf SDM kini dapat dilihat juga oleh karyawan yang bersangkutan. Aksesnya dari menu profil di bagian atas.
  • •Hanya bisa dilihat. Alur untuk mengajukan perbaikan dan disetujui staf SDM sedang disiapkan.
  • •Penilaian tidak terlihat oleh karyawan. Penghargaan dan sanksi pun demikian. Untuk dokumen lampiran hanya daftarnya yang tampil.
  • •Kartu orang lain tidak dapat dibuka dengan mengubah bilah alamat; milik siapa kartu itu ditentukan hanya oleh informasi login.
  • •Karyawan juga dapat memeriksa siapa yang telah melihat informasi kepegawaiannya.
v2.7.16 2026-09-21 · 28 hari lalu
Alamat dasar tautan papan diskusi dan tata letak plugin

Memakai layar papan diskusi di dalam bungkus lain

Semua tautan pada layar papan diskusi dibuat dari satu nilai ($boardUrl), tetapi inti selalu menimpa nilai itu.

Karena itu, pihak yang memakai papan diskusi di dalam layar admin, seperti intranet, harus mengganti halaman yang sudah selesai dirender karakter demi karakter.

Jika inti mengubah bentuk tautan sedikit saja, semuanya menyimpang secara diam-diam.

  • •Jika pemanggil menetapkan alamat dasar lebih dulu, nilai itu yang dipakai. Jika tidak, semuanya sama seperti sebelumnya.
  • •Tautan roda gigi (pengaturan papan diskusi) juga ditentukan di satu tempat. Sebelumnya daftar, FAQ, Q&A, dan skin tautan masing-masing membuatnya sendiri.

Tata letak dapat berada di dalam plugin

  • •Tata letak dicari terlebih dahulu di skins/layouts/ milik inti, dan jika tidak ada, di plugins/{id}/skins/layouts/ milik plugin.

Aturannya sama dengan widget dan modul intranet, dan bila nama bentrok, inti yang menang.

  • •Tata letak plugin juga muncul di pemilih tata letak admin.
  • •Sampai sekarang, tata letak khusus plugin harus diletakkan di folder inti. Pembaruan tidak menghapusnya,

tetapi bila kelak inti merilis tata letak bernama sama, tata letak itu tertimpa, dan saat memindahkan plugin ke situs lain folder harus dibawa secara manual.

v2.7.15 2026-09-21 · 28 hari lalu
Plugin mendeklarasikan modul intranet · tahun era Jepang pada input tanggal

Plugin mendeklarasikan modul intranet sendiri

Daftar untuk layar intranet (menu kiri dan jalur masuk) sebelumnya hanya ada di satu berkas pengaturan inti.

Agar plugin dapat menambahkan modulnya sendiri, berkas inti harus diubah, dan perubahan itu hilang saat pembaruan.

  • •Jika plugin menulis intranet_module di plugin.json-nya, inti membacanya dan menggabungkannya. Cara kerjanya sama seperti menu dan halaman sistem.
  • •Nilainya boleh berupa larik yang ditulis langsung, atau jalur berkas seperti "data/intranet-module.php".
  • •Bila nama bentrok, inti yang menang. Plugin tidak dapat membajak modul inti untuk mengubah perilaku bawaannya.
  • •Kelima tempat di inti yang membaca daftar ini kini memakai cara baru. Meskipun pembaruan menimpa berkas pengaturan, modul plugin tetap ada.

Tahun era Jepang (和暦) pada input tanggal

  • •Pada layar berbahasa Jepang, jika Anda memilih era (令和, 平成, 昭和, 大正, 明治) dan memasukkan nomor tahun di kolom tanggal, tahun Masehi terisi otomatis.

Nilai yang diingat berdasarkan era, seperti tanggal lahir, tidak perlu dikonversi setiap kali.

  • •Kolom tampilan hari dalam seminggu dibiarkan seperti semula.

Pengaturan tata letak papan diskusi tidak tercermin di layar

  • •Meskipun tata letak dipilih per papan diskusi di admin, layar menampilkan tata letak bawaan situs.

Tempat penyimpanan dan tempat pembacaannya berbeda.

  • •Perbaikan: saat papan diskusi disimpan, pengaturan yang dibaca layar ikut ditulis.

Papan diskusi yang sudah ada tetap tampil seperti sekarang sampai disimpan ulang (tampilannya tidak berubah tiba-tiba).

v2.7.14 2026-09-20 · 29 hari lalu
Penulisan dan pencarian papan diskusi kembali normal

Postingan tidak tersimpan saat ditulis

  • •Penyimpanan postingan melewatkan kolom judul, sehingga di situs yang kolom itu masih ada, penyimpanan gagal.

Layar hanya menampilkan "Unexpected end of JSON input".

  • •Perbaikan: jika kolomnya masih ada, kolom itu ikut diisi. Situs yang telah menghapus kolom itu bekerja seperti sebelumnya.

Pencarian papan diskusi

  • •Pencarian melihat kolom lama, sehingga di situs yang telah menghapusnya, seluruh daftar tidak terbuka begitu kata pencarian dimasukkan.
  • •Situs yang masih menyimpan kolom itu juga bermasalah. Mengedit postingan tidak memperbarui kolom, sehingga pencarian hanya cocok dengan isi sebelum diedit.
  • •Perbaikan: pencarian dilakukan di tabel terjemahan. Kini pencarian menemukan bahasa yang sedang dilihat dan juga isi terjemahan.

Postingan tidak terlihat di daftar, widget, dan Halaman Saya

  • •Widget tab bidang praktik dan widget grid papan diskusi selalu menampilkan daftar kosong (kesalahannya tertelan di dalam).
  • •Pada "Komentar saya" di Halaman Saya, komentar papan diskusi hilang seluruhnya.
  • •Skin papan diskusi tautan selalu berjudul kosong.
  • •Perbaikan: semuanya kini membaca judul dan isi dari tabel terjemahan. Gambar mini juga ditemukan kembali dari isi.

Terjemahan AI dan instalasi baru

  • •Kami memperbaiki terjemahan AI untuk postingan, yang gagal saat membaca teks asli sehingga semua tugas terjemahan gagal.
  • •Kami memperbaiki masalah pada instalasi baru, ketika judul dan isi dalam bahasa asli postingan contoh tidak masuk ke tabel terjemahan sehingga judul tampak kosong.

Lainnya

  • •Kami memperbaiki kasus daftar tidak terbuka ketika urutan papan diskusi diatur "berdasarkan rekomendasi" (merujuk ke kolom yang tidak ada).
v2.7.13 2026-09-20 · 29 hari lalu
Kotak pesan admin lebih aman · Multibahasa

Teks orang lain masuk apa adanya ke kotak pesan

Kotak pesan bersama di layar admin (modal hasil) menempelkan judul menu, nama skin, dan pesan dari server apa adanya ke halaman.

Bila pada nama dituliskan sesuatu seperti <script>, hal itu bisa dijalankan saat admin lain membuka layar tersebut (XSS tersimpan).

  • •Diperbaiki: semua teks di kotak pesan (judul, isi, tombol, kalimat konfirmasi) kini diubah agar tampil sebagai huruf biasa sebelum dimasukkan.
  • •Pesan saat koneksi basis data gagal kini memakai teks terjemahan dan melalui pengubahan yang sama.

Tombol kotak pesan tampil dalam bahasa Korea di semua bahasa

  • •"Konfirmasi" dan "Batal" tertulis tetap dalam bahasa Korea di dalam JavaScript. Kini tampil dalam bahasa yang sedang dilihat.

Server menyiapkan teks bahasa saat ini dan skrip membaca nilainya.

Teks admin dalam 13 bahasa

Teks bahasa Korea yang tertanam di layar desain (skin), menu, dan pengaturan halaman diganti dengan kunci terjemahan dan diisi untuk 13 bahasa.

  • •Skin: hasil ganti nama, duplikasi, dan hapus; konfirmasi "berkas dan pengaturan skin dihapus permanen"; hasil unggah gambar
  • •Menu: pemberitahuan bahwa halaman sistem hanya dilepas dari menu; konfirmasi "halaman tertaut (forum) ikut terhapus"
  • •Pengaturan halaman: pemberitahuan jenis berkas, gagal menyimpan, dan URL ganda
v2.7.12 2026-09-19 · 1 bulan lalu
Perlindungan tulisan privat · Tampilan awal lebih cepat

Tulisan privat bocor lewat daftar

Tulisan yang ditandai privat tetap menampilkan judul, gambar utama, dan ringkasannya di daftar. Yang tersembunyi hanya isinya.

  • •Diperbaiki: di daftar pun, hanya penulis, administrator, atau yang memasukkan kata sandi yang melihat judul dan pratinjau.
  • •Mengintip isi lewat alamat lampiran juga ditutup; lampiran kini memakai pemeriksaan yang sama.
  • •Judul tulisan sebelumnya/berikutnya pada halaman baca ikut disembunyikan.
  • •Widget yang menarik daftar (kartu forum, kisi, tab) kini mengecualikan tulisan privat langsung dari kuerinya.

Tampilan awal lama muncul

Di ponsel, huruf pertama butuh waktu lama. Penyebabnya font.

  • •CSS font (Google Fonts 152KB + Pretendard 29KB) menghentikan penggambaran.

Kini halaman digambar dulu dengan font sistem, lalu font web menggantikan begitu tiba.

  • •Pretendard dimuat hanya pada tampilan bahasa Korea. Pada tampilan Jepang, font Jepang lebih dulu sehingga Pretendard hanya diunduh sebagian lalu dibuang.
  • •Dua berkas gaya kecil (ukuran huruf, isi forum) ditulis langsung di halaman, bukan diminta sebagai berkas.
  • •Pada kunjungan pertama, cache tampilan (service worker) membuat dokumen dibaca dua kali — itu dihapus.
  • •Perhitungan lebar menu gulir mendatar ditunda sampai halaman selesai dimuat (sebelumnya membeku 0,5 detik).

Agar robot pencari dan AI dapat menelusuri halaman tiap bahasa

  • •Tautan bahasa kini mengarah ke alamat sebenarnya (?lang=…). Sebelumnya berupa tautan JavaScript yang tak bisa diikuti perayap.

Layar admin

  • •Di daftar halaman, satu halaman muncul sebanyak jumlah bahasa; baris itu kini digabung menjadi satu.
  • •Mengubah judul menu saja sempat menghapus terjemahan bahasa lain. Kini terjemahan hanya dibersihkan bila halaman tujuan diganti.
  • •Penjadwalan publikasi blog dengan waktu lampau dulu tersimpan begitu saja; sekarang muncul pemberitahuan dan status tidak berubah (13 bahasa).

Notifikasi dan teks

  • •Subjek notifikasi pesan komunitas terkunci dalam bahasa Korea. Kini dikirim dalam bahasa penerima.
  • •Teks tautan pada bilah pemberitahuan cookie terlalu gelap; kini lebih terang.

Pembenahan internal

  • •Menghapus folder tampilan admin yang tersalin ganda (admin/site/site, admin/components/components).

Yang benar-benar dipakai adalah folder aslinya. Build distribusi juga mengecualikan folder ini.

v2.7.11 2026-09-13 · 1 bulan lalu
Papan privat dikeluarkan dari sitemap · Keterkiriman email lebih baik

Papan privat tercantum di sitemap

Bahkan alamat papan yang hanya dapat dilihat administrator (seperti kotak masuk permintaan) ikut masuk ke sitemap.

Robot mesin pencari hanya menerima 403 (akses ditolak) dari alamat tersebut, dan keberadaan papan privat pun terungkap.

  • •Perbaikan: hanya papan yang dapat dilihat oleh non-anggota yang dicantumkan. Kriterianya adalah papan yang izin melihat daftar dan membaca postingannya diatur ke "Semua".
  • •Postingan rahasia dan papan yang dikecualikan dari pencarian (noindex) di pengaturan papan juga tidak dicantumkan.
  • •Halaman yang namanya sama dengan papan dinilai berdasarkan papan, karena papan lebih dulu mengambil alamat tersebut.
  • •Halaman dalam berbagai bahasa juga dicantumkan di sitemap.
  • •Halaman yang tidak ingin dicantumkan di situs tertentu dapat ditulis di pengaturan sitemap_exclude. llms.txt juga mengikuti pengaturan yang sama.

Email yang dikirim masuk ke spam atau dikembalikan

  • •Email tidak memiliki waktu pengiriman (Date) dan nomor unik pesan (Message-ID), sehingga mudah digolongkan sebagai spam oleh penerima.

Keduanya kini disertakan, dan isi email dikirim dalam base64. Ini juga mencegah baris panjang terpotong dan isi terputus karena tanda "." di awal baris.

  • •Jika alamat penerima berada di domain yang sama dengan pengirim (misalnya salinan yang dikirim ke alamat perusahaan), kotak surat domain tersebut menolaknya sebagai pemalsuan.

Hanya dalam kasus itu, email kini dikirim dari alamat akun SMTP, dan balasan tetap datang ke alamat asli.

Penguatan pengaturan SEO dan pencarian AI

  • •Kolom informasi pengelola (data terstruktur Organization) ditambahkan ke pengaturan SEO admin. Item tanpa nilai tidak ditampilkan.
  • •Pengaturan SEO per halaman kini benar-benar digunakan, dan alamat utama (canonical) ditetapkan saat konten yang sama dapat diakses dari beberapa alamat.
  • •Kolom kode verifikasi situs Bing ditambahkan. Pencarian ChatGPT menggunakan indeks Bing.
  • •Deskripsi dipotong sesuai lebar tampilan hasil pencarian, di akhir kalimat, bukan di tengah kalimat.

Perapian tampilan bahasa

  • •Layar 404 selalu tampil dalam bahasa Korea. Kini tampil dalam bahasa yang sedang dilihat (Jepang, Korea, atau Inggris; bahasa lain memakai bahasa Inggris).
  • •Memperbaiki "baru saja" pada lonceng notifikasi yang tertulis tetap dalam bahasa Korea.
  • •Layar berbahasa Jepang kini memakai font Jepang terlebih dahulu. Helper font per bahasa selalu dimuat, sehingga layar yang tidak melalui tata letak (seperti halaman berbagi) tidak lagi berhenti karena font.
  • •Daftar "Bahasa pilihan" di Halaman Saya tidak lagi menampilkan bahasa yang tidak memiliki teks.
  • •Saat mendaftar, bahasa layar yang sedang dilihat disimpan sebagai bahasa pilihan (sebelumnya kosong). Email pengaturan ulang kata sandi juga dikirim dalam bahasa tersebut.

Input dan login

  • •Tanggal seperti tanggal lahir kini diisi dalam tiga kolom: tahun, bulan, dan tanggal. Sebelumnya tampilannya berbeda-beda tergantung bahasa peramban.
  • •Memperbaiki masalah verifikasi reCAPTCHA yang terlewat pada login dan pemulihan kata sandi di beberapa skin.

Pembayaran

  • •Kunci uji coba dan kunci live disimpan terpisah untuk setiap penyedia pembayaran. Mode uji coba cukup dipilih, dan kunci tidak lagi hilang saat bergantian.

Widget

  • •Tombol widget hero kini dapat dibuka di jendela baru.
  • •Item berulang di pembuat widget juga dapat ditulis per bahasa (tombol globe).

Build

  • •File konfigurasi (.env) beserta cadangannya tidak pernah dimasukkan ke paket distribusi, apa pun namanya.
  • •File cadangan yang tertinggal saat mengedit (.bak, termasuk yang namanya diikuti tanggal) juga tidak dimasukkan.
  • •Skrip yang hanya dipakai untuk operasional kantor pusat (sinkronisasi situs, hosting, server email, pembaruan ketentuan, dan sebagainya) serta cron yang hanya dipakai oleh plugin yang tidak ada di paket distribusi telah dikeluarkan dari paket distribusi. Skrip yang dibutuhkan situs pelanggan, seperti worker pembaruan, instalasi, dan terjemahan, tetap disertakan.
  • •Setelah zip dibuat, dilakukan pemeriksaan sekali lagi; jika ada file konfigurasi atau file cadangan di dalamnya, penerbitan dihentikan.
  • •Skrip pengujian tidak lagi menulis kata sandi di file, melainkan membacanya dari pengaturan.
v2.7.10 2026-08-23 · 2 bulan lalu
Nama versi tetap lama setelah pembaruan

Setelah diperbarui, nama dan tanggal rilis versi tidak berubah

Hanya nomornya yang naik, dan judul versi sebelumnya tetap seperti semula.

Layar admin menampilkan hal seperti "2.7.9 · Font Jepang · pemberitahuan perpanjangan kontrak…", dengan nomor dan nama yang tidak cocok.

Dari layar saja tidak bisa diketahui apa yang telah diterima.

  • •Penyebab: version.json adalah berkas yang sengaja tidak ditimpa, demi melindungi pengaturan masing-masing pelanggan.

Karena itu pemutakhir mengisinya sendiri, tetapi ia hanya mengganti nomor dan waktunya dan membiarkan judul serta tanggal rilis.

  • •Perbaikan: judul dan tanggal rilis versi baru kini dibaca dari paket yang diterima dan ikut diterapkan.

Pada pembaruan sebagian yang tidak ada paketnya, keduanya dibaca dari daftar distribusi (manifest.json).

Pengaturan tiap pelanggan (github dan sebagainya) dipertahankan apa adanya.

Perhatian — meski sudah naik ke versi ini, layar mungkin masih menampilkan nama lama. Sebab yang menjalankan pembaruan adalah

pemutakhir dari versi yang sedang terpasang saat ini.

Tampilannya akan benar mulai dari versi setelah versi yang menerima 2.7.10.

Pemeriksaan build

Macetnya pembuat widget pada 2.7.8 (diperbaiki di 2.7.9) lolos begitu saja dari uji regresi.

Sebab pemeriksaan yang ada hanya melihat "apakah berkasnya ada · apakah stringnya termuat".

  • •Kini skrip yang masuk ke pembuat widget benar-benar dibuat lalu diperiksa sintaksnya (node --check).
  • •Jika ada kode yang memasukkan berkas multibaris apa adanya ke dalam string JS, build diblokir dengan menunjuk nomor barisnya.
  • •Kami mencobanya dengan berkas yang mereproduksi 2.7.8 dan memastikan pemeriksaan itu benar-benar menyaringnya.
v2.7.9 2026-08-23 · 2 bulan lalu
Pembuat widget mati total (regresi 2.7.8)

Gejala

  • •Tidak ada satu pun widget yang tampil di palet
  • •Widget yang sudah dipasang tidak tergambar di kanvas — video, gambar, dan sebagainya tampak menghilang
  • •Tidak bisa menyimpan

Penyebab

Pada 2.7.8 kami menghimpun deklarasi font di satu tempat, partials/fonts.php. Namun tempat pembuatan pratinjau pembuat widget berada

di dalam satu baris string JS, dan deklarasi font sepanjang 33 baris masuk ke sana apa adanya.

Begitu baris terpisah, string terputus dan seluruh skrip pembuat widget mati bahkan sebelum terbaca.

Karena ini jenis kegagalan yang mematikan seluruh berkas, yang tampak bukan "sebagian fitur aneh", melainkan pembuat widget tidak melakukan apa pun.

Versi 2.7.5 ke bawah tidak mengalami masalah ini.

Cara memperbaikinya

Definisi font tetap kami simpan di satu tempat itu, fonts.php, dan hanya saat dimasukkan ke pembuat widget keluarannya dilipat menjadi satu baris dan tanda kutipnya ditangani.

Tempat untuk mengubah font tetap hanya satu.

v2.7.8 2026-08-22 · 2 bulan lalu
Font Jepang · pemberitahuan perpanjangan kontrak · 3-D Secure

Font bawaan kini berbasis bahasa Jepang

Selama ini font bawaan berbasis bahasa Korea. Pengguna utama kami ada di Jepang, tetapi tampilan layar terasa janggal,

dan mengganti bahasa tidak mengubah font, sehingga kalimat Jepang dicetak dengan font Korea.

  • •Nilai bawaan kini Mincho untuk judul dan Pretendard JP untuk isi.
  • •Di layar pengaturan bahasa, Anda dapat menentukan font secara terpisah untuk setiap bahasa. Jika tidak ditentukan, bahasa itu mendapat nilai bawaan yang sesuai.
  • •Aturan yang sama berlaku untuk semua layar admin, anggota, dan front serta semua skin (default, modern, minimal, shop).

Pemberitahuan perpanjangan kontrak dan berakhirnya masa gratis

Pernah terjadi kita baru tahu kontrak berakhir setelah lewat. Kini kami memberi tahu lebih dulu saat tanggal perpanjangan mendekat.

  • •Jadwal perpanjangan dan berakhirnya masa gratis ditampilkan sebagai notifikasi sebelum tanggalnya tiba.
  • •Berjalan dengan satu baris cron (cron.d-voscms-contract-notice), dan panduan instalasi memuat cara mendaftarkannya.

Pembayaran kartu

Pembayaran yang melewati autentikasi penerbit kartu Jepang (3-D Secure) lolos autentikasi tetapi penagihannya ditolak.

  • •PAY.jp memblokir token yang dibuat untuk autentikasi bila dibiarkan apa adanya. Setelah autentikasi lolos, server harus melakukan panggilan penutup

barulah token dapat dipakai untuk penagihan, dan satu langkah itu terlewat.

  • •Kami juga membuka jalur untuk memeriksa lebih dulu apakah data pelanggan masih ada di sisi penyedia pembayaran — mencegah kegagalan akibat mencoba menagih pelanggan yang sudah dihapus.

Lonceng notifikasi dan teks aturan pengembalian dana dalam banyak bahasa

  • •Pada lonceng notifikasi di header, teks seperti "Tidak ada notifikasi" dan "menit yang lalu" yang tertanam dalam bahasa Korea kini berganti sesuai bahasa.
  • •Teks tetap yang masih tersisa pada pemberitahuan aturan pengembalian dana kami rapikan.

Akuntansi

Transaksi won ikut tercampur ke dalam buku badan hukum Jepang, sehingga totalnya tidak cocok.

  • •Bukti dalam mata uang yang berbeda dari mata uang buku (yen) tidak membuat jurnal. Catatannya tetap ada tetapi tidak masuk ke buku.

Perapian distribusi

  • •Berkas cadangan yang terbentuk saat pengeditan ikut terkirim dalam distribusi (bentuknya namaberkas.php.bak.angka).

Aturan pengecualian hanya menyaring .bak dan melewatkan nama yang diberi angka. Kini .bak., .orig, dan *~ juga diblokir.

  • •Materi penjualan layanan THEVOS AI (daftar harga, perhitungan paket, cron kecocokan pembayaran) kami keluarkan dari distribusi.

Semua yang membacanya sudah dikeluarkan, sehingga di distribusi itu adalah berkas yang tidak dipakai siapa pun.

v2.7.7 2026-08-10 · 2 bulan lalu
Dua peringatan yang muncul pada instalasi baru

"Migrasi DB diperlukan"

039_ai_knowledge_base membuat tabel untuk AI konsultasi toko NaitoWork X,

tetapi ikut terkirim apa adanya dalam distribusi. Lebih parah lagi, baris terakhir berkas ini berbunyi

ALTER TABLE rzx_shop_inquiries ADD COLUMN IF NOT EXISTS ai_meta ...

rzx_shop_inquiries adalah tabel yang dibuat oleh plugin vos-store.

Distribusi tidak memiliki vos-store — inti mencoba mengubah tabel milik plugin yang tidak ada.

Maka pada setiap instalasi baru: 4 tabel terbuat lalu gagal di baris terakhir → karena tidak sampai akhir,

tidak dicatat sebagai "diterapkan" → banner muncul terus-menerus, dan ditekan pun gagal lagi di tempat yang sama.

AI konsultasi (RAG) kami keluarkan seluruhnya dari distribusi:

039 · rzxlib/Core/AI/{Knowledge,Embedding,Generate} ·

scripts/{ai-kb-ingest,ai-rag-test,cron-ai-consult,hanesbot-ingest}.php

Terjemahan AI (rzxlib/Core/AI/Translation) tetap dipertahankan. Itu adalah mesin plugin berbayar vos-ai
dan mengikuti aturan yang sama dengan akuntansi dan hosting: "mesin berada di inti, dan fiturnya dibuka oleh plugin".

"1 plugin belum terautentikasi (vos

Inti memegang daftar "plugin bawaan yang bisa dipakai tanpa lisensi", dan daftar itu sudah usang.

Yang diketahui kode sebagai bawaan | vos-autoinstall · vos-marketplace |

Yang sebenarnya dikirim sebagai bawaan | vos-autoinstall · vos-community |

vos-marketplace keluar dari distribusi dan vos-community menggantikannya,

tetapi hanya daftar ini yang tidak diperbaiki. Kami menyertakannya lalu menampilkan peringatan karena tidak tahu bahwa itu bawaan.

Agar tidak terulang

Penyebabnya adalah daftar bawaan ditulis di dua tempat —

daftar pengecualian pada skrip build dan LicenseStatus::BUNDLE_PLUGINS.

Kami menambahkan langkah pencocokan pada build. Jika keduanya berbeda, zip tidak dibuat dan proses berhenti.

Ini bukan hal yang seharusnya diingat oleh manusia.

v2.7.6 2026-08-10 · 2 bulan lalu
Tombol menulis di papan · judul multibahasa · migrasi saat instalasi

Tombol menulis tidak terlihat di papan

Di Q&A dan FAQ, bahkan orang yang boleh menulis pun tidak punya tombol. Ada dua penyebab.

  • •Admin terhalang — saat memeriksa izin menulis, yang ditanyakan lebih dulu adalah apakah ia anggota, dan baru setelah itu admin diperiksa.

Admin tidak ada di users, sehingga tertahan di gerbang pertama. Urutannya kami tukar agar admin lolos lebih dulu.

  • •Saat tidak ada satu pun tulisan, tombol ikut hilang — tombol berada di dalam daftar,

jadi ketika halaman beralih ke tampilan "belum ada tulisan", tombol ikut lenyap. Orang pertama yang mau menulis justru tidak bisa menulis.

Tombol kami keluarkan dari daftar.

  • •FAQ bahkan langsung melihat admin_id — mengabaikan izin menulis pada pengaturan papan.

Judul dan subjudul papan tampil dalam bahasa lain

Layar berbahasa Korea tetapi hanya subjudulnya yang tampil dalam bahasa Jepang.

  • •Terjemahan sama sekali tidak dibaca. Judul dan subjudul disimpan di pengaturan skin sebagai satu string,

sedangkan terjemahannya ada terpisah di rzx_translations. Layar hanya mencetak string yang tersimpan.

  • •Tidak ada pembedaan antar papan. Kunci terjemahannya skin_config.subtitle_text, sehingga Q&A dan FAQ

berbagi kolom yang sama. Mengubah salah satunya ikut mengubah yang lain.

Kami pecah menjadi board.{nomor papan}.{butir}.

  • •Isi digambar sebelum bahasa ditentukan. Inti membuat isi lebih dulu lalu menempelkan header belakangan,

padahal bahasa ditentukan di header. Penentuannya kami pindahkan ke sisi isi agar terjadi lebih dulu.

Migrasi inti terlewat saat instalasi

install-core.php sama sekali tidak melihat database/migrations.

Situs yang baru diinstal kekurangan beberapa tabel sejak awal, dan baru crash belakangan ketika fitur itu diaktifkan.

Migrasi yang dilewati diam

Pada 2.7.4 komentar satu baris (--) sudah ditangani, tetapi komentar beberapa baris (/ /) masih tersisa.

Titik koma di dalam blok itu menyatukan berkas menjadi satu gumpalan, sehingga tidak satu baris pun dijalankan

namun tetap dicatat sebagai "diterapkan". Kerugian nyata sudah kami pastikan — ada instalasi yang kehilangan 9 tabel sekaligus.

-- atau /* di dalam string bukanlah komentar. Komentar kami hapus sambil menghitung tanda kutip.

Lain

  • •Header toko — kami menaruh "Semua kategori" di bagian paling atas dropdown kategori.

Orang yang ingin masuk untuk melihat-lihat tidak punya tempat tujuan.

  • •Pembuat widget — pengeditan butir berulang (repeater) dipisahkan ke berkas tersendiri.
  • •Sidebar intranet — teks akuntansi kini dicari di ketiga cabang (salon, toko online, perusahaan umum).

Karena hanya satu yang dilihat, menu menampilkan kunci mentah bila memakai akuntansi lain.

  • •Halaman Saya — perapian dasbor.
  • •Pelaporan plugin berbayar — pemeriksaan lisensi kini turut mengirim plugin berbayar yang sedang aktif.

Yang hanya terpasang tetapi tidak diaktifkan tidak dikirim — uang hanya melekat pada yang aktif.

v2.7.5 2026-08-05 · 3 bulan lalu
Halaman sistem khusus kantor pusat dihapus dari rilis distribusi

Halaman khusus kantor pusat ikut keluar dalam rilis distribusi

config/system-pages.php masuk utuh ke dalam rilis distribusi, sehingga "Halaman sistem" pada admin instalasi pelanggan

memiliki enam menu yang dapat diklik tetapi tidak ada isinya.

DihapusAlasan

📥 downloads | Unduhan rilis distribusi — hanya kantor pusat yang mendistribusikannya |

📋 changelog | Itu adalah riwayat produk kantor pusat |

📧 contact | Pelanggan membuatnya sendiri dengan widget (ini bukan halaman sistem) |

💼 recruit · 💃 casts | Khusus untuk portal bisnis malam (NaitoWork X) |

🎟 coupons | Disediakan oleh plugin pasar |

  • •Langkah build [4e/8] ditambahkan (strip-system-pages.php). Setelah menghapus, sintaks diperiksa dengan php -l —

jika berkas ini rusak, seluruh layar admin mati.

  • •Halaman sistem yang tersisa dalam rilis distribusi ada delapan: home · terms · privacy · data-policy ·

refund-policy · hosting-terms · tokushoho · funds-settlement

Halaman sistem plugin

  • •Teks site.pages.blog ditambahkan ke 13 bahasa.

Meskipun plugin mendaftarkan halaman sistem, jika inti tidak memiliki teksnya, site.pages.blog tampil apa adanya di layar.

  • •(Perbaikan pada plugin.json milik vos-blog sendiri keluar lewat pasar — ini plugin yang tidak termasuk dalam rilis distribusi)

Situs yang sudah terpasang

Jika "Halaman sistem" pada admin menampilkan butir yang tidak Anda pakai, hapus blok yang bersangkutan dari config/system-pages.php.

Isi halaman (rzx_page_contents) tidak dihapus — hanya hilang dari daftar.

v2.7.4 2026-08-05 · 3 bulan lalu
Migrasi yang dilewati secara senyap

① Migrasi yang diawali komentar dilewati seluruhnya

  • •Sebuah komentar di DatabaseMigrator::splitSql() menyatakan "pisahkan setelah menghapus komentar", tetapi

kenyataannya hanya memisahkan berdasarkan titik koma.

  • •Jika baris pertama berkas SQL adalah -- deskripsi, seluruh berkas menjadi satu fragmen,

tersangkut pada str_starts_with($stmt, '--') di bagian eksekusi, dan tidak satu pernyataan pun dijalankan.

  • •Bila 0 pernyataan dijalankan, galatnya juga 0, sehingga diperlakukan sebagai success dan dicatat sebagai sudah diterapkan.

Begitu tercatat, ia tidak pernah dijalankan lagi, sehingga tabel tetap hilang selamanya.

  • •Kerusakannya mencakup semua berkas yang diawali --. Terukur: dari 9 berkas, 6 menjalankan 0 pernyataan dan 2 menjalankan sebagian.
  • •Kini komentar baris -- dan # serta blok / / dihapus sebelum dipisahkan.

-- di dalam string tidak disentuh (jika nilai seperti 'a -- b' terpotong, data akan rusak).

② Instalasi baru sama sekali tidak menjalankan migrasi inkremental

  • •Skrip instalasi hanya menjalankan migrations/core dan migrations/migrations

dan melewatkan tingkat teratas database/migrations/*.sql. Sebaliknya, pemutakhir hanya melacak tingkat teratas.

  • •Akibatnya pada instalasi baru, 034 sampai 042 tidak ada sejak awal dan tetap kosong sampai rilis berikutnya tiba.
  • •Saat instalasi, kini tingkat teratas juga dijalankan dan dicatat sebagai sudah diterapkan (agar pembaruan pertama tidak menjalankan yang sama lagi).

Situs yang sudah terpasang

Silakan tekan Jalankan migrasi sekali di Admin → Pengaturan → Pembaruan.

Entri yang tercatat keliru tidak akan dijalankan lagi, jadi jika sebuah tabel kosong, Anda dapat memeriksanya dengan cara berikut.

SELECT migration FROM rzx_migrations;      -- tercatat
SHOW TABLES LIKE 'rzx_home_notices';       -- sebenarnya
v2.7.3 2026-08-05 · 3 bulan lalu
Penataan plugin rilis distribusi · header belanja · saldo di Halaman Saya

Yang dikeluarkan dari rilis distribusi

  • •vos-cp (panel kontrol layanan) dan vos-shopping (toko daring) ikut terbawa dalam rilis distribusi.

Keduanya adalah plugin yang baru dibuat dan hanya belum masuk daftar pengecualian.

  • •vos-cp adalah panel untuk layanan milik THEVOS sendiri. Tidak ada alasan ia berada di instalasi pelanggan
  • •vos-shopping masih dalam pengembangan (v0.1.0), dan aturannya adalah plugin dibeli dari pasar
  • •vos-review juga dikeluarkan — dengan alasan yang sama (instruksi pemilik).
  • •Plugin yang masuk ke rilis distribusi hanya dua: vos-community dan vos-autoinstall.

Selebihnya semuanya diperoleh dari pasar.

Yang ditambahkan ke inti

  • •Header toko dua tingkat (skins/layouts/shop) — pulldown semua kategori, pencarian, pratinjau keranjang, dan

menu avatar setelah login. Di bagian paling atas pulldown kategori kami menaruh "Semua kategori" agar ada jalan kembali

  • •Poin yang terkumpul, saldo kredit toko, dan tingkat anggota ditampilkan di Halaman Saya. Namanya memakai nilai yang telah Anda atur
  • •Dukungan widget plugin — jika plugin memiliki folder widgets/, pembuat inti mengenalinya secara otomatis
  • •Komponen bersama pencarian alamat dengan kode pos — formulir pesanan dan informasi anggota memakai komponen yang sama
  • •Lonceng notifikasi pada bilah atas admin
  • •Penataan grup menu konsol admin (config/intranet-modules.php)
  • •Dukungan bidang berulang (repeater) pada pembuat widget

Yang diperbaiki

  • •Masalah ketika bidang input multibahasa menimpa data asli
  • •Galat pada pencatatan buku besar saldo kredit toko
  • •Masalah ketika pembaruan rilis distribusi mengubah halaman hosting menjadi 404

Yang perlu diperiksa pada instalasi yang sudah ada

Pada situs yang dipasang dengan rilis distribusi lama dan hanya menerima pembaruan, folder plugin yang tidak dipakai masih tertinggal

(pembaruan tidak menghapus folder plugin). Apa pun yang tampil sebagai belum terpasang di Admin → Plugin

boleh dihapus dari plugins/ beserta foldernya.

v2.7.2 2026-07-26 · 3 bulan lalu
Penataan perutean pengajuan layanan (pembangunan ulang inti)

Changed

  • •Perutean terpadu URL pengajuan layanan — /service/hosting, /service/mail, dan /service/domain → ke /service/order lewat 302 (sampai halaman pengajuan khusus siap, pengunjung diarahkan ke halaman pengajuan terpadu, dan nanti dapat diganti dengan halaman khusus).

Notes

  • •Perbaikan inti pada 2.7.1 (hreflang multibahasa, pencegahan kegagalan senyap pemutakhir, penggabungan tarif /pricing ke /service/order) sudah termasuk dengan benar dalam paket 2.7.1. 2.7.2 adalah pembangunan ulang yang menambahkan penataan perutean pengajuan layanan di atasnya.
  • •Rilis distribusi pada prinsipnya hanya memuat inti murni (plugin berbayar dan vertikal dikecualikan). Situs kantor pusat (voscms.com dan thevos.jp) bukan sasaran pembaruan mandiri rilis distribusi; keduanya disebarkan dari kode sumber/git.
v2.7.1 2026-07-25 · 3 bulan lalu
SEO multibahasa hreflang · stabilisasi pemutakhir · penataan tarif

SEO

  • •hreflang multibahasa — canonical yang merujuk diri sendiri per halaman + hreflang otomatis untuk bahasa yang didukung, pengindeksan per bahasa dengan ?lang=xx, normalisasi 301 dari ?lang bahasa bawaan ke URL polos, dan sitemap yang diperluas.

Fixed

  • •Kegagalan senyap pada pemutakhir diperbaiki — kegagalan menulis berkas inti atau version.json kini ditangani sebagai pengecualian. Jika penerapan gagal karena izin yang tidak cukup dan sebagainya, kini Anda mendapat galat yang jelas dan rollback otomatis, bukan "SUCCESS" yang keliru.
  • •Dicegah kerusakan 500 pada halaman tarif ketika bidang multibahasa diteruskan ke htmlspecialchars sebagai larik.

Changed

  • •Sakelar reCAPTCHA v3 per formulir diperluas (blog_comment dan lainnya).
  • •Tab "Notifikasi konsol pemilik" pada pengaturan hanya ditampilkan jika vos-store aktif.
  • •Halaman tarif /pricing digabung ke /service/order (301), dan paket "Sistem tanpa batas" hanya untuk admin.
v2.7.0 2026-06-27 · 4 bulan lalu
Rilis distribusi dipangkas menjadi inti murni + widget dan pengaturan diperkuat besar-besaran

Isi rilis distribusi

  • •Rilis distribusi dipangkas menjadi inti murni — hanya 3 plugin inti (vos-autoinstall, vos-community, vos-review) yang disertakan. Plugin vertikal (bisnis malam / salon / POS), widget, dan skin (story) semuanya dikecualikan. Fitur umum seperti verifikasi usia dan banner cookie termasuk dalam inti (rzxlib) sehingga ikut disertakan.

Added/Changed (widget inti)

  • •location-map — mendukung penyematan tanpa kunci (map_embed), menghilangkan ketergantungan pada kunci API, dan mengaitkan bahasa peta dengan locale
  • •practice-tabs (tab bidang praktik) — widget bawaan yang baru
  • •Pengaturan lebar halaman global (widget_page_width) — menyeragamkan lebar halaman widget/dokumen
Widget khusus situs yang tidak disertakan (bundled:false) (hero-slideshow, overlap-cards, office-intro, page-hero, content-head, consult-cta, board-grid, clients-logos, skin profil papan diskusi) tidak termasuk dalam rilis distribusi inti.

Removed

  • •Widget prabayar (prepaid-charge, prepaid-pass, prepaid-purchase) — dikecualikan dari distribusi karena vos-prepaid tidak disertakan

Added (pengaturan dan inti)

  • •Gerbang verifikasi usia dinaikkan menjadi pengaturan umum inti
  • •Pengaturan opasitas latar banner persetujuan cookie
  • •Gambar logo per bahasa
  • •Informasi rekening bank pada informasi usaha + pemberitahuan transfer bank
  • •Pemberitahuan "Kartu yang diterima" pada layar pembayaran (ikon merek) + pengaturan admin

Fixed

  • •Lokalisasi judul dan subjudul halaman ke bahasa pengunjung (page-scoped db_trans), serta content_width yang tidak diterapkan
  • •Banyak perbaikan galat pada widget/admin/halaman dan penambahan dalam 13 bahasa
v2.6.24 2026-06-02 · 5 bulan lalu
Pembersihan otomatis orphan (berkas sumber yang sudah dihapus) saat pembaruan

Added

  • •Pembersihan otomatis berkas obsolete — pembaruan yang menimpa dengan zip paket penuh tidak dapat menghapus berkas yang sudah dibuang dari sumber, sehingga sisa (orphan) tertinggal pada versi yang terpasang (misalnya settings.php monolitik yang dipisah dan dihapus dalam refaktor tetap ada di instalasi lama). Kami menambahkan mekanisme berbasis daftar eksplisit untuk membersihkannya.
  • •config/obsolete-files.php — daftar kumulatif jalur yang harus dihapus (instalasi yang melompati beberapa versi pun dibersihkan sekaligus).
  • •Tepat setelah applyUpdate() pada pemutakhir, cleanupObsoleteFiles() melakukan unlink yang aman terhadap berkas pada daftar. Ia tidak pernah menyentuh target yang dilestarikan (.env, storage, dan sebagainya), pelarian jalur, maupun direktori.
  • •Pendaftaran pertama: resources/views/admin/settings.php.
v2.6.23 2026-06-02 · 5 bulan lalu
Koreksi tautan 'Pengaturan sistem' pada dasbor

Fixed

  • •Tautan 'Pengaturan sistem' pada dasbor — tautan pada aksi cepat menunjuk ke jalur lama /settings yang sudah dipisahkan dan dihapus, sehingga mengarah ke halaman yang salah (fallback). Dikoreksi ke pintu masuk pengaturan /settings/general. (Terlewat setelah build 2.6.22.)
v2.6.22 2026-06-02 · 5 bulan lalu
Perbaikan bug CSRF dan pencatatan saat menjalankan migrasi

Fixed

  • •Banner 'Migrasi DB diperlukan' pada dasbor — CSRF token invalid — tombol coba lagi tidak mengirim token CSRF ke /update-api.php (run_migrations) sehingga ditolak dengan 419. Kini $_SESSION['csrf_token'] dipastikan ada dan dikirim lewat header maupun isi permintaan.
  • •Banner tidak hilang meskipun migrasi sudah dijalankan — DatabaseMigrator::recordMigration mengasumsikan kolom batch dan awalan patch_, sehingga pada skema tipe terpasang (migration/version/executed_at) INSERT pencatatan gagal dan awalan itu juga membuat pencocokan nama berkas meleset. Diperbaiki agar mencatat nama berkas apa adanya, sesuai kolom yang sebenarnya. (Inilah penyebab migrasi pada pembaruan 2.6.20 hanya meninggalkan log "OK" tanpa diterapkan.)
v2.6.21 2026-06-02 · 5 bulan lalu
Perbaikan kunci lang mentah yang muncul pada jalur modul intranet yang tidak terpasang

Fixed

  • •Kunci mentah di bilah samping halaman inti seperti pengelolaan izin admin — karena tata letak intranet diaktifkan hanya dari route_prefixes di config/intranet-modules.php, halaman inti /staff/admins pada situs tanpa plugin yang sesuai (misalnya tanpa vos-salon terpasang) dirender dengan bilah samping intranet salon, dan kunci salon.intranet. serta salon.section. muncul sebagai teks mentah. Diperbaiki.
  • •Ditambahkan helper bersama resolve_intranet_module() — intranet hanya diaktifkan jika sumber daya lang modul (plugin) benar-benar terpasang; jika tidak, kembali ke admin-sidebar inti.
  • •Logika deteksi yang duplikat di _head.php / admin-sidebar.php disatukan ke dalam helper. Perilaku tidak berubah pada situs yang plugin-nya terpasang (salon, store, dan sebagainya).
v2.6.20 2026-06-02 · 5 bulan lalu
Penyelarasan skema poin/tingkat/grup (galat penyimpanan tingkat teratasi)

Fixed

  • •Galat penyimpanan tingkat poin — memperbaiki kegagalan dengan galat Unknown column 'group_id' saat menyimpan tingkat di modul poin admin. Penyebabnya adalah konflik skema point_levels/member_points antara core/004 dan migrations/019(v190) (CREATE TABLE IF NOT EXISTS pada 019 tidak dapat menambahkan kolom baru ke tabel yang sudah ada).
  • •migrasi 034_point_system_schema_reconcile (tingkat teratas, diterapkan otomatis saat pembaruan):
  • •point_levels — menambahkan group_id, memberi nilai bawaan pada name, dan indeks unik pada level (agar upsert berfungsi).
  • •member_points — menambahkan point/balance/total_accumulated/level.
  • •Semuanya additive (tanpa kehilangan data), tanpa pengaruh pada kolom yang sudah ada maupun pemakainya (seperti vos-prepaid).
v2.6.19 2026-06-01 · 5 bulan lalu
3 widget pembelian prabayar + nama produk dan gambar multibahasa + perbaikan tinggi palet pembuat widget

Added

  • •3 widget pembelian — satu terpadu (prepaid-purchase, tampilan dapat dipilih: semua / hanya isi ulang / hanya tiket paket) + satu khusus isi ulang (prepaid-charge) + satu khusus tiket paket (prepaid-pass). Satu komponen bersama purchase-widget.php menggerakkan ketiga widget (tanpa duplikasi), bercabang dengan filter $ppOnly.
  • •Gambar latar produk — unggah dengan seret dan lepas (juga bisa dengan klik) pada modal tambah/ubah produk admin, dengan latar yang diterapkan di Halaman Saya dan kartu widget. Migrasi 003 image_url.
  • •Input nama produk multibahasa + terjemahan AI — memakai ulang multilang-modal bersama (tombol bola dunia), disimpan di atas rzx_translations, dan ditampilkan dalam bahasa pengunjung dengan prepaid_name(). Terjemahan AI memakai ulang endpoint inti /api/translations.
  • •Kolom input nama pemegang kartu ditambahkan pada formulir pembayaran (diteruskan ke createToken PAY.jp).
  • •Pemilihan pelanggan pada isi ulang manual — dari mengetik user_id secara langsung beralih ke pencarian dengan pelengkapan otomatis berdasarkan nama/telepon/email (aksi customer_search). Daftar kondisi pelanggan juga menampilkan nama + email pelanggan, bukan hash user_id.
  • •Sakelar aktif — kotak centang produk aktif diganti dengan sakelar.

Changed

  • •Kotak pembelian 4 kolom — grid kartu produk responsif 2→3→4 (lg:grid-cols-4), dan lebar tetap widget max-w-3xl dihapus → menyesuaikan lebar kontainer penempatan.

Fixed

  • •Tinggi palet dan megamenu pembuat widget — tinggi baris pembuat ditetapkan calc(100vh - 88px), sehingga kategori di kiri dan flyout otomatis memakai seluruh tinggi layar dan tumpang tindih item megamenu teratasi.
v2.6.18 2026-05-31 · 5 bulan lalu
Validasi URL pada formulir pengiriman pengumuman + input yang ramah

Added

  • •Validasi link pada api/broadcast.php — jika skema hilang, https:// ditambahkan otomatis di depan (example.com → https://example.com); jika tidak lolos filter_var FILTER_VALIDATE_URL, dikembalikan 400 dengan galat field: 'link'; yang lebih dari 500 karakter ditolak.
  • •Validasi waktu nyata di sisi klien — type="url", inputmode="url", dan langsung saat mengetik:
  • •Skema hilang → garis tepi emerald + ✓ + petunjuk "Akan dilengkapi otomatis saat dikirim: …"
  • •Tidak ada titik (.) pada host atau format rusak → garis tepi red + ⚠ + "Ini bukan format URL yang valid"
  • •Valid → garis tepi emerald + ✓ + "Ini URL yang valid"
  • •Klien juga melengkapinya sebelum mengirim → kesesuaian antara pratinjau dan isi yang benar-benar dikirim dijamin.

Added

  • •Judul bagian: ✉ Menulis pesan / 📡 Kanal pengiriman — pengelompokan visual + teks penjelasan.
  • •Penghitung karakter (judul 0/255, isi 0/2000) — warna otomatis: amber mulai 70%, red mulai 90%.
  • •Kotak pratinjau pesan (tepi bertitik) — menampilkan secara waktu nyata bagaimana judul, isi, dan tautan yang digabung akan terlihat di LINE + penghitung total karakter n/5000 (red di atas 4500).
  • •Teks bantu untuk setiap bidang:
  • •Judul: "Ditampilkan sekaligus di kotak pesan anggota dan notifikasi LINE"
  • •Isi: "Jika Anda menulis URL di isi, URL itu otomatis dipersingkat dan kliknya dilacak"
  • •Tautan: "Ditambahkan otomatis di akhir isi setelah satu baris kosong. Jika Anda juga menulisnya di isi, tautan akan muncul dua kali, jadi berhati-hatilah"
  • •Ikon status di sisi kanan input tautan (absolute) — ✓ / ⚠ langsung ditampilkan.

Added

🔗 Aturan validasi URL (bagian ke-5 yang baru):

  • •Harus diawali http:// / https:// → diubah menjadi token pelacakan klik
  • •Skema yang hilang dilengkapi otomatis
  • •Host tanpa titik atau berformat rusak ditolak
  • •Batas 500 karakter
  • •Kotak contoh: ✓ https://voscms.com/event / ✓ example.com/page → dilengkapi otomatis / ✗ asdfasdf (tidak ada titik pada host)

Notes

  • •Produksi (voscms-com) dan salon telah disinkronkan. API, UI, dan i18n langsung berlaku.
  • •i18n 13 bahasa: community.broadcast.guide_url_, section_message, section_channels*, subject_hint, body_hint, link_hint, link_{invalid,autofixed,valid}, preview_{title,empty}.
v2.6.17 2026-05-30 · 5 bulan lalu
Kotak panduan pengiriman terjadwal di sisi kanan halaman pengiriman pengumuman

Added

  • •Perubahan tata letak /theadmin/community/broadcast — kartu tunggal yang lama dibagi menjadi lg:grid-cols-3. Formulir pengiriman utama menempati 2 kolom di kiri (lg:col-span-2), dan kotak panduan baru menempati 1 kolom di kanan (<aside>, sticky top-4).
  • •Isi panduan dalam 6 bagian:

1. 📅 Apa itu pengiriman terjadwal? — pengiriman otomatis pada waktu di masa depan, dapat dimanfaatkan untuk malam hari, akhir pekan, dan acara

2. 🛠 Cara menggunakannya — 4 langkah (pilih sasaran → centang LINE → centang jadwal → kirim), UI dengan lencana bernomor

3. ⏱ Akurasi pengiriman — penjelasan interval cron 5 menit + kotak contoh (10:00 → 10:00 sampai 10:05)

4. 🆚 Segera vs terjadwal — perbedaan perilaku kedua mode dalam bentuk kartu

5. 📋 Memeriksa antrean — tombol pintasan ke /history?status=queued

6. ⚠ Hal yang perlu diperhatikan — minimal 30 detik di masa depan, dalam aplikasi/push tidak dapat dijadwalkan, tidak berfungsi di hosting tanpa cron, pembatalan dari UI tidak didukung

  • •Latar gradasi indigo (from-indigo-50 to-blue-50) — kotak panduan tampak berbeda secara visual dari kartu utama sekaligus menyatu dengan lembut.
  • •i18n 13 bahasa — sekitar 20 kunci community.broadcast.guide_* (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW).
v2.6.16 2026-05-30 · 5 bulan lalu
UI pengaturan locale di Halaman Saya + kartu ringkasan riwayat pengiriman (CTR/variant/locale)

Added

  • •Kartu "Bahasa pilihan" ditambahkan di /mypage/settings — select dengan 14 opsi (otomatis / 13 bahasa). Saat disimpan, rzx_users.locale di-UPDATE dan $_SESSION['locale'] langsung diterapkan.
  • •Hook Auth::loginUser — saat login, jika $user['locale'] ada dan locale sesi kosong, locale itu diisi otomatis. Jika pengguna mengubahnya secara manual selama sesi, nilai itu diprioritaskan dan dipertahankan.
  • •i18n 13 bahasa — auth.settings.language.{title,description,label,auto,hint,save,success,error_invalid,error_save} (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW).
  • •Setelah perubahan, UI tampil dalam bahasa anggota mulai halaman berikutnya, dan jika admin telah menetapkan messages_by_locale pada aturan pengiriman otomatis, isi yang cocok dikirim ke anggota itu lewat LINE.

Added

3 kartu baru di bagian atas /theadmin/community/broadcast/history (setelah 4 kartu yang sudah ada):

1. Rasio klik keseluruhan (CTR) — SUM(rzx_broadcast_clicks.click_count) / SUM(rzx_line_broadcasts.recipient_count WHERE status='sent') × 100. Teks besar berwarna emerald.

2. Pengujian A/B (30 hari terakhir) — untuk pengiriman dengan variant IS NOT NULL, penerima, klik, dan CTR per variant. Variant dengan CTR lebih tinggi disorot dengan emerald.

3. Sebaran menurut locale (30 hari terakhir) — hanya untuk pengiriman dengan source='auto_rule' AND messages_by_locale IS NOT NULL, locale dicocokkan dengan membandingkan kunci JSON messages_by_locale pada aturan dengan 30 karakter pertama isi broadcast → penerima/klik/CTR per locale. Diurutkan dengan ksort.

  • •i18n 13 bahasa: community.broadcast.stat_{ctr_title,ctr_breakdown,variant_title,variant_hint,locale_title,locale_hint,empty}.

Notes

  • •Pohon berkas voscms-com dan salon telah disinkronkan. Tidak ada kolom DB baru (semuanya sudah termasuk dalam migrasi 008/009/010 pada Step 4).
  • •Logika pencocokan locale membandingkan 30 karakter pertama isi — jika isi cocok setelah substitusi variabel, isi itu dihitung dalam grup locale yang sama. Jika isi terlalu pendek atau seluruhnya terisi oleh substitusi variabel, tingkat kecocokan bisa turun (di masa depan kolom locale dapat ditambahkan langsung ke baris broadcast).
v2.6.15 2026-05-30 · 5 bulan lalu
Perutean multibahasa (Step 4-C) + keempat tahap pengiriman otomatis LINE selesai

Added

  • •migrasi 010 — rzx_auto_broadcast_rules.messages_by_locale JSON NULL + rzx_users.locale VARCHAR(10) NULL + indeks idx_locale.
  • •AutoBroadcaster::lineUserIdsWithLocale — mencari pasangan userId LINE dan locale anggota. Lingkungan tanpa kolom users.locale kembali ke lineUserIds.
  • •AutoBroadcaster::pickLocaleMessage — prioritas: user.locale anggota → locale bawaan situs (rzx_settings.locale) → kunci pertama pada JSON (jika semuanya meleset, null → kembali ke isi A).
  • •AutoBroadcaster::fire — jika ada messages_by_locale, memakai isi yang cocok dengan locale tiap anggota; jika tidak, variant A/B; dan jika itu pun tidak ada, A tunggal. Bila locale, variant, dan default menghasilkan isi yang sama, semuanya dikirim sebagai satu grup lewat multicast (efisiensi).
  • •Modal aturan admin — "Perutean multibahasa aktif" dan input JSON langsung, dapat dibentangkan lewat <details>. Ditampilkan dengan pretty-print. Validasi invalid_locale_json.
  • •i18n 13 bahasa — community.automation.locale_{toggle,placeholder,hint} + fields.messages_by_locale + error.invalid_locale_json (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW).

Notes

  • •Tahap 1 sampai 4 infrastruktur pengiriman LINE selesai (2.6.9 sampai 2.6.15):

1. Step 1 — CTA · utility stack · pengiriman manual · audience per tingkat · multi-pilih (7872c4b, 7c94a55, c4a3325)

2. Step 2 — Klasifikasi otomatis grup anggota (b24979c)

3. Step 3 — Aturan pengiriman otomatis berbasis peristiwa (60d47cd) + cron pengiriman terjadwal (8cf02ad)

4. Step 4 — Pelacakan klik (79c99a84) + pengujian A/B (86e19b0b) + perutean multibahasa (yang ini)

  • •Migrasi 010 diterapkan di produksi (voscms.com). users.locale adalah kolom baru — semua anggota yang sudah ada bernilai NULL (locale bawaan situs dipakai → perilaku sama seperti sebelumnya).
  • •UI Halaman Saya tempat anggota menetapkan sendiri locale pilihannya adalah tonggak berikutnya.
  • •Pendaftaran cron yang disarankan: /5 /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php, 0 3 /usr/bin/php8.3 /var/www/voscms-com/scripts/recalculate-member-grades.php.
v2.6.14 2026-05-30 · 5 bulan lalu
Pengujian A/B (Step 4-B)

Added

  • •migrasi 009 — rzx_auto_broadcast_rules.message_template_b TEXT NULL, rzx_line_broadcasts.variant CHAR(1) NULL, rzx_broadcast_clicks.variant CHAR(1) NULL + indeks (source_rule_id, variant).
  • •AutoBroadcaster::fire — jika message_template_b tidak kosong, userId LINE dibagi 50:50 menjadi A/B dengan crc32 mod 2. Untuk setiap variant, riwayat pengiriman di-INSERT lebih dulu (logQueued) → wrap token → multicast → finalize. Pengguna yang sama selalu menerima variant yang sama pada pengiriman berulang (konsistensi hash).
  • •Modal aturan admin — opsi "Pengujian A/B aktif" dan input variant B, dapat dibentangkan lewat <details>. Bawaannya adalah pengiriman tunggal sederhana, dan A/B adalah opt-in yang eksplisit.
  • •ClickTracker — meneruskan metadata variant. Jika kolom broadcast_clicks.variant ada, kolom itu diisi saat INSERT. Jika tidak, fallback berlaku (kompatibel dengan lingkungan yang belum menerapkan migrasi 009).
  • •Fallback logQueued — berfungsi juga di lingkungan tanpa kolom variant (saat migrasi 009 belum diterapkan).
  • •i18n 13 bahasa — community.automation.ab_{toggle,placeholder,hint} (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW).

Notes

  • •Ketiga pernyataan ALTER pada migrasi 009 dijalankan terpisah di produksi (voscms.com). Aturan yang sudah ada memiliki message_template_b=NULL (perilaku pengiriman tunggal dipertahankan).
  • •Ubah aturan → masukkan variant B pada bagian terbentang "Pengujian A/B aktif" → cukup simpan, dan mulai kejadian berikutnya pembagian A/B berjalan otomatis.
v2.6.13 2026-05-30 · 5 bulan lalu
Pelacakan klik pada URL di pesan yang dikirim (Step 4-A)

Added

  • •migrasi 008 (rzx_broadcast_clicks) — token (8 karakter base62, UNIQUE), broadcast_id, source_rule_id, original_url (2048), click_count, last_clicked_at, last_user_agent. Kombinasi (broadcast_id, original_url) yang sama memakai ulang token.
  • •Kelas ClickTracker — wrap($pdo, $siteId, $body, $meta) mengekstrak URL http/https dari isi dengan ekspresi reguler → INSERT atau pakai ulang → menggantinya dengan /t/{token}. consume($pdo, $token, $ua) mengubah token menjadi URL asli dan menambah click_count.
  • •Rute /t/{token} (index.php:330) — masuk ke router ekspresi reguler. ClickTracker::consume → pengalihan 302 ke URL asli, atau 404 jika tidak ada. Validasi token URL ([A-Za-z0-9]{4,16}).
  • •Integrasi dengan aturan pengiriman otomatis — AutoBroadcaster::fire() bekerja, tepat sebelum pengiriman, dalam urutan logQueued → memperoleh broadcast_id → ClickTracker::wrap → multicast → finalizeBroadcast. Keterkaitan token dan broadcast_id terjamin.
  • •Integrasi dengan pengiriman manual — pada api/broadcast.php, wrap tepat setelah teks pengiriman segera dirakit. Pada scripts/process-scheduled-broadcasts.php, wrap tepat sebelum pengiriman dari antrean (broadcast_id sudah diketahui).
  • •Pengaturan domain pelacakan — rzx_settings.click_track_domain diutamakan, jika tidak ada maka APP_URL. Domain pendek (misalnya s.voscms.com) dimungkinkan.

Notes

  • •Migrasi 008 telah diterapkan di produksi (voscms.com).
  • •Uji integrasi wrap/consume: 2 URL di isi → 2 token 8 karakter di-INSERT → saat consume dipanggil, URL asli dikembalikan dan click_count bertambah dengan benar.
v2.6.12 2026-05-30 · 5 bulan lalu
Penjadwalan pengiriman LINE + pemrosesan antrean dengan cron (Step 3-B)

Added

  • •migrasi 007 (rzx_line_broadcasts): kolom scheduled_at DATETIME NULL dan processed_at DATETIME NULL serta indeks (status, scheduled_at). scheduled_at NULL = kirim segera (seperti sebelumnya), waktu di masa depan = masuk antrean.
  • •scripts/process-scheduled-broadcasts.php — titik masuk cron. Mengambil 50 item dengan status='queued' AND scheduled_at <= NOW() AND processed_at IS NULL → langsung mengunci dengan processed_at = NOW() (transaksi) → menguraikan audience (all / grade_N, sama dengan broadcast.php) → multicast LineMessenger dalam satuan 500 → memperbarui status dengan hasilnya. Interval cron yang disarankan: /5 *.
  • •UI broadcast.php: kotak centang [Jadwalkan pengiriman] + input datetime-local. Saat dicentang, nilai bawaannya adalah waktu sekarang + 1 jam (waktu lokal pengguna). Jika tidak dicentang atau kosong, dikirim segera seperti sebelumnya. Hanya kanal LINE yang dapat dijadwalkan (di dalam aplikasi dan push tetap segera).
  • •api/broadcast.php: memproses parameter POST scheduled_at. Untuk waktu di masa depan (> NOW + 30s) dengan send_line, hanya melakukan INSERT rzx_line_broadcasts (status='queued', scheduled_at) tanpa memanggil API LINE, dan mengembalikan scheduled: true, scheduled_at dalam respons.
  • •i18n 13 bahasa: community.broadcast.schedule_{label,enable,hint,success} (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW).

Fixed

  • •Kolom INSERT dikoreksi agar sesuai dengan skema sebenarnya dari rzx_line_broadcasts (title, body, audience varchar(20), recipient_count, status enum(queued|sent|failed)). Sebelumnya INSERT memakai nama kolom yang tidak ada (message_text, recipients_count, sent_count, failed_count, audience_value, partial), dan bahkan fallback-nya gagal, sehingga riwayat pengiriman otomatis hilang.

Notes

  • •Migrasi 007 telah diterapkan di produksi (voscms.com). Dry-run memastikan pickup bernilai 0 item.
  • •Pohon berkas produksi (voscms-com) dan salon telah disinkronkan. .env dikecualikan.
  • •Pendaftaran cron diserahkan kepada sisi operasi hosting (jika perlu, /5 * /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php).
v2.6.11 2026-05-30 · 5 bulan lalu
Aturan pengiriman otomatis LINE berbasis peristiwa (Step 3-A)

Added

  • •Tabel aturan pengiriman otomatis (rzx_auto_broadcast_rules) — migrasi 005_auto_broadcast_rules.sql. Aturan diisolasi per site_id, dengan kolom trigger_type / trigger_filter (JSON) / audience (all|grade_X|custom) / message_template / is_enabled / fired_count / last_fired_at.
  • •Dispatcher AutoBroadcaster (rzxlib/Core/Notification/AutoBroadcaster.php) — titik masuk statis AutoBroadcaster::fire($triggerType, $ctx). Mencocokkan aturan aktif → mengganti variabel templat ({{title}}, {{url}}, {{author}}, {{board_name}}, {{site_name}}) → menguraikan audience (logika sama dengan broadcast.php; pada tingkat is_default, anggota NULL otomatis disertakan) → mencari userId LINE melalui rzx_user_social_accounts → multicast dalam satuan 500 → mencatat riwayat di rzx_line_broadcasts → memperbarui statistik aturan.
  • •Hook pengiriman otomatis untuk postingan baru di papan diskusi (api-posts.php:184) — tepat setelah INSERT postingan (tidak termasuk postingan privat), memanggil AutoBroadcaster::fire('board_post', [post_id, board_id, title, url, author, board_name]). Meskipun pengiriman gagal, respons postingan tidak terpengaruh.
  • •Halaman pengelolaan aturan admin (/theadmin/community/automation) — UI berupa grid kartu. CRUD aturan + sakelar hidup/mati + lencana warna per pemicu (board_post=blue, review_created=amber, reservation_created=green). Pemicu / filter (JSON) / tingkat sasaran / templat pesan diedit di dalam modal.
  • •Kolom pelacakan asal pada rzx_line_broadcasts — migrasi 006_line_broadcasts_add_source.sql. source ('manual' | 'auto_rule') + source_rule_id (INT) + indeks. Riwayat pengiriman otomatis dapat dibedakan dari pengiriman manual di tabel yang sama.
  • •Rute dan migrasi didaftarkan di plugin.json — rute community/automation, dan migrasi 004/005/006 dinyatakan setelah 003.
  • •i18n 13 bahasa — semua kunci community.automation.* (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW). Label pemicu, bidang, petunjuk, pesan berhasil/galat, dan templat bawaan.

Notes

  • •Migrasi 005/006 telah diterapkan di produksi (voscms.com). Belum ada aturan yang terdaftar.
  • •Pohon berkas produksi (voscms-com) dan salon telah disinkronkan. .env dikecualikan.
  • •Step 3-B (pengiriman terjadwal scheduled_at + cron) adalah tonggak berikutnya.
v2.6.10 2026-05-30 · 5 bulan lalu
Klasifikasi otomatis tingkat anggota + tingkat bawaan saat pendaftaran + tombol hitung ulang admin

Added

  • •Penetapan otomatis tingkat bawaan saat pendaftaran (rzxlib/Core/Auth/Auth.php::register()) — tepat setelah pendaftaran, tingkat dengan is_default=1 dicari di rzx_member_grades dan grade_id anggota baru langsung diisi. Pada situs tanpa tabel member_grades (lawas atau belum dikonfigurasi), dilewati secara diam-diam dengan try-catch. Anggota NULL yang sudah ada diisi dengan skrip hitung ulang atau tombol tersendiri.
  • •Skrip CLI hitung ulang tingkat (scripts/recalculate-member-grades.php) — berdasarkan jumlah pembayaran di rzx_payments dan jumlah reservasi di rzx_reservations (hanya jika tabelnya ada), skrip menelusuri tingkat dengan urutan sort_order DESC dan mencocokkan tingkat tertinggi yang dapat dipenuhi. Tingkat tanpa aturan (min_spent=0 AND min_reservations=0) otomatis dilewati — hanya tingkat dengan aturan eksplisit yang menjadi kandidat kenaikan. Anggota yang tidak memenuhi syarat kembali ke tingkat bawaan.
  • •Opsi: --dry-run (simulasi tanpa UPDATE sungguhan), --user-id=UUID (hanya anggota tertentu).
  • •Contoh cron: 0 3 * /usr/bin/php8.3 /var/www/voscms/scripts/recalculate-member-grades.php
  • •Tombol admin "Hitung ulang sekarang" (/theadmin/members/groups) — ditambahkan tombol bernuansa zamrud pada bilah aksi. Saat diklik: modal konfirmasi → AJAX action=recalculate_grades → pemberitahuan hasil (target/naik/turun/baru) → muat ulang otomatis. Karena memuat logika yang sama dengan skrip secara inline, tombol ini berfungsi bahkan di lingkungan tanpa izin PHP CLI.
  • •i18n 13 bahasa — kunci baru members.groups.recalculate* (ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW): recalculate, recalculate_hint, confirm_recalculate, recalculate_stat.{total,upgraded,downgraded,fallback}, success.recalculated, error.{no_grades,no_default_grade}.

Notes

  • •Di produksi (voscms.com), diverifikasi --dry-run → eksekusi sungguhan → eksekusi ulang setelah aturan diperkuat. Kelima anggota dengan grade_id NULL semuanya ditetapkan dengan benar ke Normal (bawaan). VIP/Gold/Silver belum memiliki aturan sehingga tetap 0 anggota sampai aturan ditambahkan (disengaja).
  • •Pohon berkas produksi (voscms-com) dan salon telah disinkronkan. .env dikecualikan.
v2.6.9 2026-05-30 · 5 bulan lalu
CTA tambah teman LINE + Utility Stack terpadu + pengiriman pengumuman LINE

Added

  • •Komponen CTA tambah teman LINE untuk anggota (resources/views/components/line-friend-cta.php) — 5 variant (card / button / bar / side-tab / bubble) × 6 posisi (bottom-right/bottom-left/bottom-center/top-right/middle-right/middle-left) × 3 ukuran, warna kustom, jeda tampil, dan "ingat saat ditutup" selama 24 jam (localStorage).
  • •UI pengaturan yang dapat diubah — bagian baru "CTA tambah teman LINE" di bagian bawah kartu saluran LINE pada /theadmin/settings/message-api. Basic ID, sakelar aktif, radio variant, pilihan position, ukuran, pemilih warna, dan input delay.
  • •Tampil otomatis pada 5 tata letak — otomatis di-include dari skins/layouts/{default,modern,minimal,modern-copy-260413}/footer.php. Pada halaman pembayaran, pengajuan layanan, dan alur instalasi, otomatis dilewati.

Added

  • •Komponen baru resources/views/components/utility-floating-stack.php — pola desain cameron_plugin dari thevos.jp (stack persegi 80×80 di tepi kanan + jarak 1px + warna aksen untuk tiap ikon). Posisi, ukuran, dan warna dapat disesuaikan operator.
  • •Kedua mode berdampingan — utility_stack_mode = separate (bawaan, tiap CTA tampil sendiri) / unified (PWA + LINE ditampilkan bersama sebagai satu stack). Pada mode terpadu, tampilan otomatis 5 variant CTA LINE dinonaktifkan dan pemicu otomatis modal pemasangan PWA (banner setTimeout/DOMContentLoaded) juga dinonaktifkan; modal hanya terbuka dengan mengeklik ikon PWA pada stack.
  • •Perluasan alami di masa depan — dengan pola pendaftaran item (saluran Kakao, WhatsApp, langganan newsletter, sakelar mode gelap, dan sebagainya), hal lain dapat bergabung ke stack hanya dengan menambahkan kunci pengaturan.
  • •Pembungkusan baris otomatis dijamin — CSS inline word-break: break-all; overflow-wrap: anywhere; max-width: 72px menghindari batas lebar anak flex Tailwind. Label CJK juga membungkus secara alami di dalam kotak.
  • •i18n 13 bahasa — grup line_cta. (22 kunci) dan grup utility_stack. (12 kunci) di resources/lang/{13 locale}/messaging.php. Untuk bahasa Jepang dan Mandarin, spasi pada batas makna (misalnya "アプリとして インストール") menjamin posisi pemisah baris yang alami.

Added

  • •LineMessenger::broadcast(messages) + broadcastText(text) — mengirim sekaligus ke semua teman (maksimal 5 objek pesan; kuota pengiriman LINE dikurangi sebanyak jumlah penerima × jumlah pesan).
  • •LineMessenger::multicast(userIds[], messages) — mengirim ke maksimal 500 userId yang ditentukan (infrastruktur pengiriman per grup).
  • •Penyempurnaan UI /theadmin/community/broadcast — ditambahkan kotak centang "Kirim juga ke teman LINE" (banner hijau). Terpisah dari pengiriman push, otomatis mengirim ke teman LINE lewat multicast/broadcast.
  • •Pengiriman per tingkat anggota — rzx_member_grades dimuat secara dinamis dan opsi radio per tingkat tampil otomatis (titik warna + slug + hitungan langsung). Format audience adalah grade_<id>.
  • •Anggota dengan grade_id IS NULL otomatis disertakan pada tingkat is_default=1 — bahkan di situs yang tidak menetapkan tingkat secara otomatis saat pendaftaran, anggota NULL secara alami ikut dalam hitungan dan pengiriman tingkat bawaan.
  • •Tabel riwayat pengiriman rzx_line_broadcasts — isolasi site_id, method (broadcast/multicast), audience, title/body, recipient_count, line_request_id, api_status/error, status. Saat mengirim, baris di-INSERT secara otomatis.
  • •Untuk audience=all dipilih broadcast, selain itu multicast, secara otomatis — mengumpulkan userId LINE dari pengguna target yang user_social_accounts.line_friend=1 lalu mengirim dalam potongan 500 per panggilan.
  • •Lebar diseragamkan — pada broadcast.php, max-w-3xl → max-w-7xl (sama dengan halaman admin lain).
  • •i18n 13 bahasa — kunci send_line_label/desc dan audience_grade_group ditambahkan.

Changed

  • •resources/views/admin/dashboard.php — komentar header, fallback pageTitle, dan banner pemberitahuan pembaruan RezlyX v... semuanya dikoreksi menjadi "VosCMS".
  • •resources/views/admin/partials/admin-topbar.php — komentar header dikoreksi.

Fixed

  • •storage/.update_cache menyimpan cache lama current: "2.6.4", sehingga bahkan setelah diperbarui ke v2.6.8 dasbor masih menampilkan banner "Ada pembaruan baru" — setelah cache dihapus, dihitung ulang secara otomatis pada permintaan berikutnya.
  • •Perubahan akumulasi dev → produksi belum disinkronkan — selain sesi ini, banyak berkas seperti install-core.php (patch cacat #1 sampai #7) dan version.json tidak pernah disinkronkan ke produksi. dev disinkronkan ke produksi sekaligus dengan rsync (342 berkas berubah + 196 baru, 6,3MB, tidak termasuk data pengguna, .env, storage/, uploads/, vendor/, dan .git/).

Documentation

  • •docs/LINE_FRIEND_CTA_DESIGN_GUIDE.md — ditambahkan Part 3 (implementasi nyata Utility Floating Stack terpadu), Part 4 (implementasi nyata operasi pengiriman Fase 1), Part 5 (skenario pengguna eksternal — analisis nilai pengiriman multi-pilih), dan Part 6 (peta jalan Fase 2 sampai 4). Dari sekitar 631 menjadi 920 baris.

Regression Test

  • •Memverifikasi keberadaan utility-floating-stack.php dan 5 berkas partial variant line-friend-cta.
  • •Memverifikasi keberadaan metode LineMessenger::broadcast/multicast.
  • •Memverifikasi keberadaan berkas migrasi plugins/vos-community/migrations/004_line_broadcasts.sql.
  • •Memverifikasi keberadaan kunci messaging.utility_stack. + community.broadcast.send_line_ dalam 13 bahasa.
  • •Memverifikasi secara otomatis bahwa tidak ada sisa RezlyX di dashboard.php / admin-topbar.php.
v2.6.8 2026-05-29 · 5 bulan lalu
Penyatuan Lisensi Marketplace + Dasbor Deteksi Instalasi Tidak Sah + Koreksi Branding

Fixed

  • •Konsolidasi tabel lisensi vos-market — 6 file API menanyakan tabel {$pfx}vos_licenses yang salah, menyebabkan "Server error" 500 pada setiap pembayaran. Semua verifikasi lisensi sekarang dialihkan ke master tunggal vcs_licenses (dikelola oleh vos-license-server).
  • •Penghapusan lubang keamanan registrasi master tanpa verifikasi di sync.php — Kode sebelumnya UPSERT ke vos_licenses tanpa memverifikasi vos_key, memungkinkan siapa saja mendaftarkan kunci lisensi sewenang-wenang ke master melalui POST sederhana. Pelacakan sekarang ditangani oleh rzx_mkt_sync_reports yang sudah ada (per-item).
  • •migrations/007 usang — Migrasi yang dirancang salah sekarang menjadi no-op (SELECT 1), dengan alasan dan riwayat perubahan dalam komentar.

Added

  • •4 kartu statistik — Situs Terlacak / Situs Perlu Perhatian / Lisensi Multi-Domain / Tidak Aktif 30+ hari.
  • •Tab pelanggaran (tampilan tingkat item) — Lihat sekilas widget berbayar mana yang dipasang tanpa lisensi di domain mana. Harga, versi, vos_key, dan terakhir terlihat ditampilkan.
  • •Tab multi-domain — Kasus di mana satu kunci lisensi dilaporkan dari beberapa domain.
  • •Tab tidak aktif — Situs tanpa sinyal sinkronisasi selama 30+ hari.
  • •Definisi pelanggaran yang disempurnakan — unknown_product dan item gratis dikecualikan. Hanya item berbayar marketplace dalam keadaan tanpa lisensi yang dihitung sebagai pelanggaran.
  • •Daftar putih domain pemilik — Domain operator yang disimpan sebagai array JSON di settings.mkt_owner_domains secara otomatis dikecualikan dari penghitungan.
  • •i18n 13 bahasa — Bilah samping, kartu, tab, dan teks bantuan semuanya diterjemahkan dengan benar.

Changed

  • •settings/system/updates — Kartu versi terpasang dan versi terbaru dikoreksi menjadi "VosCMS vX.Y.Z".
  • •updates/ajax.php — Fallback nama DB dan User-Agent dikoreksi.

Regression Test

  • •Memverifikasi otomatis tidak ada sisa SQL vos_licenses di 6 file vos-market
  • •Mendeteksi regresi lubang keamanan INSERT di sync.php
  • •Memverifikasi status no-op migrations/007 dipertahankan
  • •Memverifikasi otomatis tidak ada sisa RezlyX di 3 file layar pembaruan
v2.6.7 2026-05-29 · 5 bulan lalu
Wizard install yang lebih aman dan pengenalan uji regresi otomatis

Fixed

  • •Pengisian otomatis site_url — Wizard install hanya menulis siteUrl yang dimasukkan pengguna ke APP_URL di .env dan tidak ke rzx_settings.site_url di DB, sehingga semua fitur situs yang baru dipasang yang bergantung pada site_url (instalasi otomatis, SEO, tautan email, dan sebagainya) rusak. Diperbaiki dengan menambahkan site_url ke larik $settings di install-core.php.
  • •Pendaftaran otomatis ke rzx_site_domains — Wizard install tidak menambahkan domain instalasi saat ini ke tabel site_domains, sehingga SiteRouter tidak mengenali domain. Domain yang dipasang kini otomatis di-INSERT sebagai primary site_id=1.
  • •Penulisan otomatis MARKET_API_URL di .env — Pada instalasi baru .env tidak memiliki alamat API pasar, sehingga InstallerService tidak menemukan tujuan panggilan. Kini ditulis otomatis dengan nilai bawaan https://market.voscms.com/api/market (operasi dengan satu master lisensi).
  • •Salah ketik nama tabel pada API install pasar — vos-market/views/api/item/install.php menanyakan tabel yang tidak ada, rzx_vos_licenses, saat memverifikasi lisensi, sehingga semua instalasi otomatis merespons "Server error" (HTTP 500). Diperbaiki ke tabel yang sebenarnya, vcs_licenses (master lisensi, tetap tanpa prefiks).
  • •Pengaturan izin otomatis untuk direktori widgets/plugins/themes — Setelah install, pengguna PHP-FPM tidak dapat menulis ke direktori ini sehingga instalasi otomatis gagal secara diam-diam. Wizard install kini memberikan setgid dan izin tulis grup secara otomatis (grup eksekusi PHP terdeteksi otomatis untuk menghadapi beragam lingkungan eksternal).
  • •Fallback berlapis pada install-handler.php — Di lingkungan multisitus, kueri site_url memakai LIMIT 1 tanpa filter site_id sehingga tidak stabil. Fallback tiga tahap, yaitu SiteRouter → fallback ke site_id=1 → $_SERVER['HTTP_HOST'], menjamin pengenalan domain di lingkungan apa pun.

Added

  • •InstallerService::installTheme() — Membaca theme.json produk type=theme dan menginstal secara rekursif plugin/widget/skin di dalam requires. Menjamin validasi 13 bahasa dan idempotensi (item yang sudah terpasang dilewati).
  • •runPostInstall — Tepat setelah tema dipasang, otomatis menjalankan seed post_install/settings.json / boards.json / pages.json, sehingga halaman, penempatan widget, dan pengaturan bawaan disiapkan sekaligus secara otomatis.
  • •Pemaksaan 13 bahasa (REQUIRED_LOCALES) — Objek multibahasa (name, description, title halaman, config.title widget, dan sebagainya) baru lolos secara resmi jika memiliki seluruh 13 kunci. Peringatan diberikan untuk locale yang hilang.
  • •Master vcs_licenses tunggal — Semua penerbitan dan verifikasi lisensi dikelola melalui pasar produksi (market.voscms.com). Lingkungan dev/test juga memakai master yang sama.

Added

  • •Verifikasi otomatis atas keenam cacat ini — Total 13 butir, termasuk logika seed wizard install, izin direktori, API pasar, keterjangkauan server lisensi, cabang theme pada InstallerService, dan fallback berlapis install-handler.
  • •Hook eksekusi otomatis di build-voscms.sh — Dipanggil otomatis di akhir build. Jika terjadi satu FAIL saja, kode keluar bukan 0 dan distribusi diblokir. Jika cacat yang sama muncul lagi pada build berikutnya, langsung terdeteksi.

Documentation

  • •docs/theme-package/THEME_PACKAGE_SPEC.md — Mendefinisikan standar paket tema VosCMS (theme.json). Memuat contoh tema terintegrasi Salon, skema rinci post_install, dan aturan 13 bahasa.
v2.6.6 2026-05-27 · 5 bulan lalu
Mencegah cadangan pembaruan ganda

Fixed

  • •Cadangan pembaruan: hanya satu per versi yang dipertahankan — Backup::createFull() kini menghapus cadangan yang sudah ada untuk versi yang sama sebelum membuat cadangan baru. Ini menyelesaikan masalah ketika pembaruan atau rollback yang diulang pada versi yang sama menumpuk duplikat versi itu di daftar cadangan (hanya kondisi terbaru tepat sebelum pembaruan yang dipertahankan).
v2.6.5 2026-05-27 · 5 bulan lalu
Penataan sistem pembaruan (satu saluran, sesi/izin, perbaikan rilis distribusi)

Fixed

  • •Memulihkan update-api.php yang hilang pada rilis distribusi — Skrip build salah mengklasifikasikan update-api.php, backend pembaruan, sebagai "berkas dev" dan menghapusnya dari rilis distribusi. Akibatnya tab pembaruan pada semua instalasi distribusi tidak berfungsi dan menampilkan "File not found". Berkas ini tidak lagi dikecualikan dari build dan kini disertakan dengan benar pada rilis distribusi.
  • •Memperbaiki sesi login yang tidak dikenali (Unauthorized) — update-api.php melihat jalur penyimpanan sesi bawaan (/var/lib/php/sessions); kini memakai storage/sessions yang sama dengan index.php. Ini menyelesaikan kesalahan Unauthorized yang muncul meskipun sudah masuk sebagai administrator.

Changed

  • •Pembaruan Core hanya memakai manifest distribusi milik sendiri sebagai satu-satunya saluran — Sisa tag GitHub, token, dan diagnostik di update-api.php dihapus (jalur tempat check menimpa hasil manifest dengan tag GitHub diblokir). Marketplace tidak memiliki Core (khusus plugin).
  • •Keamanan diperkuat — Verifikasi CSRF dan pemeriksaan izin master (pemilik) ditambahkan ke update-api.php.
  • •Penataan daftar pelestarian pembaruan — skins dan config dikeluarkan dari daftar pelestarian. Karena applyUpdate hanya menyalin, skin inti dan config pada zip distribusi diperbarui, sedangkan berkas kustom pelanggan yang tidak ada di zip dipertahankan.

Changed

  • •Tombol "Periksa pembaruan" yang duplikat dihapus — versi terbaru diperiksa otomatis saat halaman dibuka.
  • •Masalah daftar cadangan yang hilang saat terjadi kesalahan sementara diperbaiki → bagian tetap dipertahankan dan ditampilkan kosong.
  • •Saat terjadi kesalahan, yang ditampilkan adalah pemberitahuan "Saat ini Anda menggunakan versi terbaru", bukan pesan mentah seperti Unauthorized.
v2.6.4 2026-05-26 · 5 bulan lalu
i18n menu mention komunitas · Penautan penulis forum + peningkatan rendering & multibahasa /changelog

Added

  • •Bagian um 13 bahasa ditambahkan — semua locale vos-community/lang/{locale}.php (ko·en·ja·de·es·fr·id·mn·ru·tr·vi·zh_CN·zh_TW): follow·following·message·block·unblock·report·report_about·report_reason/detail/placeholder·reason_spam/harassment/inappropriate/other·report_submit/sent/failed·msg_title/placeholder/send/sent/failed·block/unblock_confirm·block/unblock_done·cancel·failed·network_error
  • •i18n penuh user-mention-menu.php — semua bahasa Korea yang di-hardcode di HTML PHP diganti dengan __('community.um.*'); string runtime JS dipancarkan sebagai objek PHP via UM_LANG = <?= json_encode(...) ?>, dengan helper umT(key, name) mengganti placeholder :name
  • •Menu mention diizinkan untuk tamu — struktur penjaga di community-overlays.php dirombak: jalur admin/API diblokir penuh, sedangkan user-mention-menu disertakan bahkan untuk tamu (ikuti/laporkan mengarahkan ke login); penjaga aksi halaman dan username tetap khusus pengguna yang masuk

Changed

  • •boardPreloadUsers(array $rows) ditambahkan (board/_init.php) — memuat daftar user_id secara massal dalam satu kueri IN, dibagikan melalui cache $GLOBALS['_boardUserCache']
  • •boardAuthorMention() diperluas — menambahkan atribut data-user-username·data-user-avatar (menautkan URL story /story/{username} secara tepat, menampilkan gambar avatar). Mengutamakan HIT cache prabaca, beralih ke kueri tunggal lazy saat miss
  • •board/list.php·board/read.php·skins/board/qna/_list-full.php — memanggil boardPreloadUsers() sebelum rendering untuk mencegah kueri N+1

Fixed

  • •Parser tampilan diperluas (resources/views/system/changelog/index.php) — menambahkan rendering untuk code fence (``), tabel (|...|), tautan markdown (text), subjudul ####, dan garis horizontal (---`). Mengatasi versi-versi sebelumnya (2.4.1·2.3.8·2.3.7 dll.) yang menggunakan sintaks ini tampil sebagai markdown mentah
  • •Fallback locale per versi — diubah dari mengambil seluruh daftar dalam satu bahasa menjadi per versi (locale saat ini → en → ko). Kini setiap versi muncul dalam bahasa apa pun, dan versi yang belum diterjemahkan menampilkan lencana bahasa fallback
  • •Penyelarasan batas blok (rzxlib/Core/Changelog/ChangelogParser.php) — mencegah header ## [Unreleased] tanpa tanggal terserap ke versi sebelumnya (mis. 1.5.0) dengan memisahkan blok di setiap ## [
v2.6.3 2026-05-25 · 5 bulan lalu
Statistik unduhan distribusi · Pemisahan widget hero · Pembuat seret-dan-lepas

Added

  • •Migrasi 056 tabel dist_downloads (site_id·version·ip·user_agent·referrer·utm_*·is_bot·created_at)
  • •Endpoint unduhan api/dist-download.php — alih-alih tautan langsung statis /download/*.zip, permintaan melewatinya untuk mencatat statistik per versi / harian / sumber (referrer·UTM) lalu 302-redirect. UA bot dihitung terpisah; whitelist versi (aman dari path-traversal)
  • •Halaman statistik admin resources/views/admin/dist-downloads.php (khusus master, 13 bahasa) — kartu ringkasan (total/hari ini/7h/30h), batang per versi, tren harian (30h), 10 sumber teratas, UTM. Grafik SVG/CSS sendiri (tanpa pustaka eksternal)
  • •Mengubah tautan unduhan widget download-hero ke endpoint penghitung
  • •Menambahkan menu admin "Statistik Unduhan" (config/admin-menu.php, khusus master)

Added

  • •hero-cta-text — area teks atas (mengetik). Nilai default sama dengan konten hero-cta2 yang live (13 bahasa); pengaturan pengguna diutamakan
  • •hero-cta-button — tombol unduh (deteksi otomatis versi terbaru + hitung unduhan, tanpa konfigurasi) plus tombol marketplace opsional (satu tombol jika dikosongkan)
  • •Label dan nilai default formulir pengaturan dalam 13 bahasa (dukungan objek getLabel pembuat)
  • •Menyeragamkan warna/latar tombol unduh dengan hero-cta2 (#2563eb)

Added

  • •Seret kartu palet ke kanvas untuk menambahkan widget (grup pull:'clone' SortableJS + penggantian blok asli di onAdd kanvas). Berjalan bersama penambahan via klik dan pengurutan ↑↓/pegangan yang sudah ada
  • •Flyout tetap terbuka selama menyeret + penyorotan zona jatuh kanvas (wb-drop-active)

Changed

  • •Menghapus jarak pembungkus halaman antar widget (type-widget.php py-2 → 0)
  • •Menstabilkan terjemahan AI komentar sinkron — nginx fastcgi_read_timeout 150s (vhost forum) · PHP-FPM request_terminate_timeout 150 · set_time_limit 150, OllamaProvider keep_alive 30 mnt (model tetap residen, menghilangkan cold load)
  • •Menambahkan tombol salin untuk URL Webhook dan Redirect URI di tab Message API dan Login Sosial (13 bahasa, dengan fallback konteks tidak aman)
v2.6.2 2026-05-14 · 5 bulan lalu
Otomatisasi Pajak Penyelesaian, Percabangan Formulir, dan SSOT Halaman Sistem

Added

  • •Migrasi 036 — kolom withholding_tax · consumption_tax · tax_basis pada partner_earnings / payouts
  • •Migrasi 037 — kolom fx_rate · fx_amount · fx_currency pada payouts (pencatatan transfer yang dikonversi ke USD)
  • •Migrasi 038 — kolom vcs_developers.paypal_email
  • •Helper rzxlib/Core/Helpers/MarketTax::calculate() — model pemotongan standar Jepang

· Harga jual sudah termasuk pajak (税込); marketplace membayar PPN langsung ke NTA

· freelance → pemotongan pajak 10,21% / invoice_eligible → kredit pajak masukan / no_invoice → PPN tidak dibayarkan

· Tanpa kategori atau tanpa data → dipaksa freelance (konservatif: kekurangan pembayaran bisa dikembalikan, kelebihan tidak bisa dipulihkan)

  • •Skrip backfill scripts/market-tax-backfill.php — perhitungan ulang earnings/payouts yang ada (melindungi status='paid', mendukung --dry-run)
  • •Tampilan penyelesaian 5 bagian: pendapatan → komisi → pemotongan PPN → pemotongan pajak (freelance) → pembayaran bersih
  • •Kunci baru di rzx_mkt_settings: min_payout_amount · consumption_tax_rate · default_commission_rate (settings diprioritaskan di semua tempat; fallback hardcoded dihapus)

Added

  • •Modal penyelesaian di /theadmin/market/partners/payouts — prompt() × 2 + alert() → modal tunggal

· JOIN dengan vcs_developers untuk prefill otomatis bank/cabang/pemegang rekening/nomor rekening/jenis usaha/nomor T (prefill; PII enc: dekripsi otomatis)

· Perhitungan otomatis 5 bagian + chip dasar hukum Jepang (freelance_withholding, dll.) + kutipan pasal (§204, sistem faktur)

· Notifikasi toast dalam halaman; tutup modal dan muat ulang otomatis

  • •Konversi otomatis ke USD untuk rekening di luar negara operasi (Migrasi 037)

· Nilai tukar otomatis Frankfurter API (cache storage TTL 24 jam) + penggantian manual administrator (TTS bank)

· Pemilihan otomatis method=paypal

· Untuk warga asing: kartu rekening bank disembunyikan, kartu email PayPal ditampilkan (bank_country == site_country)

  • •Penentuan jumlah penyelesaian oleh developer (/mypage/developer/earnings)

· Saldo penuh → input jumlah + tombol jumlah penuh + validasi jumlah minimum

· Kolom 5 bagian untuk riwayat penjualan, kotak informasi penyelesaian (hukum pajak yang berlaku sesuai jenis usaha)

  • •Konversi USD dan nilai tukar sebagai informasi tambahan di riwayat pembayaran (layar administrator dan developer)
  • •Penggantian grafik tren penjualan dengan grafik batang SVG (mengatasi masalah visibilitas batang div)

Added

  • •Kebijakan penguncian berdasarkan tax_review_status (profil developer)

· not_submitted / rejected → dapat diedit

· pending / approved → penguncian pengeditan (gembok + peringatan)

· rejected → dapat diedit + petunjuk "saat disimpan, masuk ke antrian tinjauan"

· Perlindungan sisi server: HTTP 423 Locked (memblokir bypass antarmuka)

  • •update.php pembaruan parsial yang aman — UPDATE dinamis hanya untuk field yang dikirimkan (sebelumnya: penimpaan penuh dengan risiko NULL pada field yang tidak dikirim)
  • •Tautan ke situs verifikasi resmi (layar verifikasi administrator + profil developer)

· 🇯🇵 Situs publikasi nomor badan hukum NTA (https://www.houjin-bangou.nta.go.jp/)

· 🇯🇵 Situs publikasi penerbit faktur yang memenuhi syarat NTA (https://www.invoice-kohyo.nta.go.jp/regno-search/)

· 🇰🇷 Pemeriksaan status pendaftaran usaha Hometax Korea

· Tombol salin satu klik di sebelah nomor usaha/nomor T

Added

  • •Pendaftaran baru (/mypage/developer) — pemilihan kewarganegaraan dipindahkan ke atas formulir, dengan panduan perbandingan negara operasi

· country == site_country → 🏠 formulir domestik (jenis usaha / rekening bank)

· country != site_country → 🌐 formulir asing (freelance otomatis + email PayPal wajib)

· Getter isDomestic Alpine.js, konstanta global OPERATING_COUNTRY

  • •Edit profil (/mypage/developer/profile) — struktur yang sama (aturan [feedback_admin_user_parity])

· Warga asing: bagian usaha disembunyikan; informasi penyelesaian = hanya email PayPal

· Kewarganegaraan dikunci (hubungi administrator untuk perubahan), chip mode ditampilkan di atas

  • •Validasi sisi server API pendaftaran — email PayPal wajib untuk warga asing, freelance dipaksa, nilai usaha/rekening diabaikan

Added

  • •Penggantian token otomatis di page.php — diterapkan secara global ke semua halaman sistem

· {{COMPANY_NAME}} {{COMPANY_ADDRESS}} {{COMPANY_PHONE}} {{COMPANY_EMAIL}} {{COMPANY_REG_NUMBER}} {{COMPANY_REPRESENTATIVE}}

· {{SITE_NAME}} {{SITE_URL}} {{DOMAIN}}

· Pemetaan otomatis dari settings business_ atau site_ admin

· page_title / page_subtitle kustom juga melalui penggantian token

  • •Prioritas {{DOMAIN}} — official_domain (domain resmi untuk syarat & kebijakan) → host site_url

· Bahkan di server pengembangan vos.21ces.com, isi syarat layanan tetap menampilkan voscms.com

Added

  • •Penggantian penuh terms / privacy di rzx_page_contents (masing-masing 13 baris) — Syarat platform reservasi RezlyX → Syarat perangkat lunak gratis VosCMS
  • •Syarat layanan dengan 18 pasal: tujuan · definisi · publikasi dan revisi · peraturan pelengkap · pembentukan kontrak · privasi · pemberitahuan · kewajiban perusahaan · kewajiban pengguna · penyediaan layanan · perubahan · pembatasan penggunaan · lisensi (penggunaan gratis) · kepemilikan dan penyimpanan data · hak cipta postingan · penafian tanggung jawab (AS-IS) · ganti rugi · penyelesaian sengketa
  • •Kebijakan privasi dengan 10 pasal: tujuan pemrosesan · kategori · masa retensi · transfer dan penugasan ke pihak ketiga · hak subjek data · langkah-langkah keamanan · cookie · penanggung jawab perlindungan · pemulihan pelanggaran (PPC) · perubahan
  • •Hukum Jepang + yurisdiksi eksklusif Pengadilan Negeri Fukuoka, mengutip APPI §33·§34·§35
  • •Informasi perusahaan menggunakan token → satu kali edit di admin secara otomatis menyinkronkan syarat dan kebijakan
  • •Versi bahasa Jepang sebagai teks resmi; terjemahan resmi dalam bahasa asli untuk 13 bahasa
  • •Kartu informasi perusahaan — hanya 3 item: nama resmi, alamat, dan telepon (perwakilan/nama dihapus untuk menghindari revisi syarat saat perubahan pendaftaran)
  • •Skrip penyimpanan: scripts/voscms-terms-update.php · scripts/voscms-privacy-update.php

Fixed

  • •menus-api.php di /theadmin/site/menus tertinggal 99 baris dari vos, menyebabkan validasi dan terjemahan terlewat saat menyimpan/mengedit menu
  • •Sinkronisasi menus-api.php dari vos → market:

· mn_link_target_exists() — menu pintasan (tautan) hanya disimpan setelah memverifikasi keberadaan halaman target (halaman sistem · rzx_page_contents)

· Perlindungan penggunaan ulang ID menu — pembersihan otomatis rzx_translations.menu_item.{id}.* yang basi untuk ID baru

· Metode INSERT untuk terjemahan: INSERT IGNORE → INSERT … ON DUPLICATE KEY UPDATE (mengizinkan penimpaan)

· Saat mengubah title·url: pembersihan total terjemahan lama + pendaftaran ulang otomatis terjemahan saat cocok dengan halaman sistem (config/system-pages.php)

  • •Menambahkan 4 file admin/site/menus*.php ke INCLUDES di sync-to-market.sh

Fixed

  • •Tabel rzx_contact_messages tidak ada → migrasi 041_create_contact_messages.sql ditambahkan (IF NOT EXISTS, tidak berpengaruh pada vos yang sudah ada)
  • •Layout ganda di contact-messages.php — _head.php sudah mengeluarkan sidebar+topbar tetapi view meng-include-nya lagi secara langsung, menghasilkan <body> duplikat dan main bersarang. Dirapikan mengikuti pola vos (header = _head 1 kali, footer = _foot 1 kali)

Added

  • •Migrasi 040 040_create_developer_platform.sql — pembuatan sekaligus 7 tabel: vcs_developers + vcs_developer_earnings/payouts/activity/notes + vcs_review_queue + rzx_mp_items (IF NOT EXISTS, skema final setelah ALTER 030~038 diterapkan)

· vcs_developers di vos.21ces.com hanya ada di dump tanpa migrasi CREATE TABLE — memperbaiki kegagalan ALTER 030 di situs yang dibuat belakangan

  • •Sinkronisasi mypage/profile-sidebar.php — kueri rzx_mkt_partners (lama) → kueri vcs_developers (baru) (integrasi aktivitas developer di halaman profil)
  • •Patch rute index.php market (manual, menghindari sync penuh):

· /developer/ → /mypage/developer/ redirect 301 (pemetaan login/dashboard/my-items/submit/earnings/profile/logout)

· Rute mypage/developer/{register|items|items/new|earnings|profile} + mypage/developer/items/{N} + mypage/developer/items/{N}/edit

  • •Menambahkan migrasi 040 + profile-sidebar.php ke INCLUDES di sync-to-market.sh
  • •Pencadangan otomatis DB market (storage/backups/market-YYYYMMDD-HHMMSS/market_vos.sql) sebelum migrasi 040 diterapkan

Added

  • •Syarat market.21ces.com mengikuti model marketplace yang dioperasikan pihak ketiga, berbeda dari syarat perangkat lunak gratis VosCMS
  • •Syarat dengan 18 pasal (mencerminkan aturan operasi marketplace):

· Pasal 8: kontrak jual beli terbentuk antara pembeli dan developer; perusahaan sebagai perantara pembayaran dan pengiriman

· Pasal 9: empat pengecualian pengembalian dana produk digital (sebelum unduhan · ketidaksesuaian deskripsi 7 hari · konfirmasi malware · kesalahan sistem) — memenuhi persyaratan pengungkapan Pasal 15-2 UU Transaksi Komersial Khusus Jepang

· Pasal 10: tanpa persentase komisi eksplisit (merujuk ke "tarif yang dipublikasikan terpisah"; memungkinkan penyesuaian tanpa revisi syarat)

· Pasal 10: pemotongan pajak Jepang 10,21% sesuai Pasal 204 UU Pajak Penghasilan; untuk pemegang nomor T, PPN dibayarkan langsung ke NTA oleh marketplace; rekening di luar negara operasi → transfer PayPal dalam USD

· Pasal 14: syarat individual developer diprioritaskan — kecuali untuk operasi platform (pembayaran, penyelesaian, prosedur pengembalian dana)

· Pasal 17: batas ganti rugi: total komisi/penyelesaian 6 bulan sebelumnya

· Pasal 18: hukum Jepang + yurisdiksi eksklusif Pengadilan Negeri Fukuoka

  • •Kebijakan privasi dengan 12 pasal (perspektif marketplace tiga pihak):

· Kategori data — umum / pembeli / developer (umum) / penduduk Jepang / penduduk luar negeri / pengiriman: 6 kategori

· Masa retensi — anggota 1 tahun · transaksi 7 tahun · penyelesaian/pemotongan pajak 7 tahun · verifikasi identitas 5 tahun · log 6 bulan · pertanyaan 3 tahun

· Mitra pengolah data — Stripe · KOMOJU · PayPal · Frankfurter · SendGrid · NTA disebutkan secara eksplisit

· Transfer internasional — AS (PayPal/Stripe/SendGrid) · UE (nilai tukar) · negara lain (gateway/bank lokal) disebutkan secara eksplisit

  • •Skrip: scripts/market-terms-update.php · scripts/market-privacy-update.php (UPSERT — UPDATE dulu; INSERT jika baris tidak ada)
  • •DB market diperbarui (terms/privacy, masing-masing 13 baris di rzx_page_contents), judul dan subjudul multibahasa page-i18n juga diterapkan

Added

  • •Perbaikan pemetaan yang hilang untuk pengaturan skin (page_title · page_subtitle) — nilai yang dimasukkan di layar pengaturan tidak tampil di halaman
  • •Pembuatan parsial _page-title-bg.php yang hilang (memperbaiki peringatan include di nginx error log)
  • •Opsi warna ditambahkan ke title_bg_type + field title_bg_color — fallback otomatis ke warna saat gambar/video kosong
  • •Penghapusan fallback kotak putih saat content_bg=transparent (memperbaiki tampilan konten max-w-5xl yang terlihat sempit di dalam kartu)
  • •Variabel CSS --page-content-width digenerate otomatis — komponen yang di-include dari luar seperti action bar "Tentang halaman ini" (vos-community) sejajar dengan lebar content_width halaman

Fixed

  • •PDOException di halaman penyelesaian — referensi ke kolom p.currency yang tidak ada di rzx_mkt_partners dihapus
  • •Grafik tren penjualan tidak terlihat — batang div dengan tinggi % hampir 0px tergantung lingkungan → diganti dengan grafik berbasis SVG viewBox (visibilitas minimum 4px terjamin)
v2.6.1 2026-05-13 · 5 bulan lalu
Perluasan Portal Pengembang · i18n Admin Marketplace · Interaksi Halaman Publik

Added

  • •Layar detail item halaman pengembang (/mypage/developer/items/{id}) — statistik, riwayat rilis, tren unduhan
  • •Layar edit item pengembang (/mypage/developer/items/{id}/edit) — UI 3 tab yang sama dengan items-new, nilai yang ada diisi otomatis, unggah ZIP baru menggunakan alur terpisah
  • •API baru: /api/developer/item-update — memperbarui name(JSON), short/desc(JSON), tags(JSON), price, license, repo/demo URL, dependensi, versi minimum, icon, screenshots
  • •API baru: /api/developer/request-payout — permintaan pencairan
  • •API baru: /api/developer/update-bank — memperbarui rekening penyelesaian sendiri
  • •API baru: /api/developer/issue-reply — memposting jawaban Q&A (saluran respons pengembang sendiri)
  • •Layar detail pengembang admin (/theadmin/developers/show) — kartu bisnis/akun/dokumen + mode tinjauan dokumen (persetujuan/penolakan)
  • •Verifikasi email untuk pendaftaran dan login (/verify-email) ditingkatkan + bidang company disimpan di Auth::register
  • •Kunci terjemahan resmi 13 bahasa ditambahkan (show_edit_btn, items_edit_*, items_back_detail, api_updated, dll.)

Added

  • •Formulir pengiriman ulasan, isu, dan Q&A ditampilkan langsung dalam widget (tanpa navigasi ke halaman terpisah)
  • •Hanya pembeli yang dapat mengirimkan — non-pembeli melihat formulir tetapi menerima pesan pemberitahuan saat pengiriman
  • •Jawaban Q&A mendukung threading (balasan ke balasan) — migrasi DB 035 (parent_reply_id)
  • •API baru: /plugins/vos-market/views/api/item/post-issue.php, post-reply.php, post-review.php
  • •Core rzxlib/Core/Helpers/Notifications.php — helper notifikasi (berpasangan dengan migrasi DB 034)

Added

  • •Dukungan 13 bahasa penuh diterapkan pada semua layar: /theadmin/market/licenses, sync, orders, settings, submissions, partners/payouts, items
  • •Layar pengaturan marketplace — label "Mitra" disatukan menjadi "Pengembang" (teks tampilan saja; nama variabel dipertahankan untuk kompatibilitas)
  • •Input nama item marketplace menggunakan modal input multibahasa bersama — name_json diedit dalam 13 bahasa sekaligus
  • •plugins/vos-market/lang/* — kumpulan bahasa baru di tingkat plugin
  • •resources/lang/*/marketplace.php — 13 bahasa semuanya diterjemahkan dalam bahasa asli masing-masing (mematuhi aturan terjemahan penuh i18n)

Added

  • •033_developer_notes_activity.sql — catatan dan log aktivitas per pengembang
  • •034_notifications.sql — tabel rzx_notifications (notifikasi pengguna)
  • •035_issue_reply_thread.sql — kolom rzx_mkt_issue_replies.parent_reply_id ditambahkan (balasan berulir)

Fixed

  • •/Market?item={slug} slug hilang — diperbaiki di items-show dengan kueri kolom tunggal khusus
  • •Nama kolom icon_url di API pembaruan item dikoreksi ke nama kolom aktual icon
  • •Halaman pengaturan marketplace kosong — migrasi 005 yang hilang untuk rzx_mkt_settings diterapkan
v2.6.0 2026-05-06 · 6 bulan lalu
Nama Pengguna Anggota · Plugin vos-story · Desain Ulang Halaman Saya · Pencerminan Gambar Eksternal · Integrasi Pengaturan Hosting

Added

  • •VARCHAR(12) users.username + UsernameValidator (minimal 6 karakter, pembatasan karakter khusus)
  • •Modal gerbang pada kunjungan pertama setelah login (AJAX /api/username-set)
  • •Terjemahan resmi untuk 13 bahasa (fallback bahasa Inggris dihapus)

Added

  • •/profile/{uuid} → /story/{username} redirect 301
  • •Label menu konteks diubah dari "Lihat Profil" menjadi "Lihat Cerita"

Added

  • •Plugin vos-story dipisahkan dari inti — khusus untuk /story/{username}
  • •Header bergaya Facebook + 5 tab tetap (Semua / Info / Foto / Pengikut / Mengikuti)
  • •CRUD postingan + umpan SNS (vos_story_posts, body_format = text/html)
  • •Sakelar TEXT/EDIT + integrasi Summernote
  • •Lampiran gambar (banyak) + kisi tab Foto
  • •Sistem suka + komentar
  • •Sistem skin Story (skins/story/default) + token per pengguna (/mypage/story)
  • •Halaman kebijakan admin (/admin/vos-story/policy)
  • •Bilah aksi halaman: i18n + posisi (akhir konten utama) + token lebar konten
  • •Kisi 2:1 (hanya area konten) — sisi kanan: iklan + teman (tab Pengikut/Mengikuti)
  • •Tombol aksi header — hanya ikon ([Pengaturan Cerita Saya] / [Edit Profil] / [Ikuti])

Added

  • •D-1: Bilah sisi 4 menu (Dasbor / Cerita / Akun / Pesan)
  • •D-2-A: Dasbor baru — 8 kartu status + navigasi 8 tab + tab info akun
  • •D-2-B: Tab Simpanan / Kotak masuk / Teman (masing-masing dengan tautan "Lihat Semua")
  • •D-2-C: Tab Tersimpan / Postingan Saya / Komentar Saya (papan + Story + halaman terpadu)
  • •D-2-D: Manajemen login otomatis (remember tokens)

Added

  • •Helper umum rzx_mirror_external_images() — cURL + perlindungan SSRF + perubahan ukuran GD
  • •E-1: Pengambilan snapshot simpanan + penyerapan gambar eksternal
  • •E-2: Diserap saat membuat postingan Story (kolom sumber story_attachments)
  • •E-3: Diserap saat membuat postingan papan
  • •E-4: Diserap saat membuat konten halaman
  • •Penandaan gambar: data-source-original, data-source-mirrored

Added

  • •Bilah sisi manajemen hosting — entri terakhir [Pengaturan] menuju ke 4 tab halaman permintaan layanan (general/domain/hosting/addons)
  • •Kebijakan pengembalian dana → Pengaturan Sistem → Umum → kartu terpisah (diisolasi dari pengaturan pajak)
  • •Penyimpanan kunci tunggal rzx_settings.refund_policy
  • •Kunci settings.refund.* untuk 13 bahasa

Added

  • •Migrasi 009: kolom page_contents.created_by / updated_by
  • •Dicatat otomatis di semua layar pengeditan halaman (admin/customer/system)

Added

  • •Hitungan postingan — mengenali struktur terpisah rzx_translations untuk postingan papan (board_post.{id}.title)

Added

  • •Pengaturan admin untuk kuota penyimpanan per hosting / ambang peringatan / kebijakan (block/notify/none)
  • •Diagram donat penggunaan di Halaman Saya
  • •Monitor latar belakang scripts/db-quota-monitor.php

Added

  • •Tombol instal ulang VosCMS — tab hosting admin
  • •Aksi perubahan [Status] hosting + log
  • •Formulir edit "Pengaturan Informasi Koneksi Server" dihapus (mencegah paparan yang tidak perlu)

Fixed

  • •Kesalahan jaringan scrap add_scrap — konflik require file API vos-story
  • •Kartu scrap — garis luar + ikon hapus/edit (tempat sampah)
  • •Ketidaksesuaian antara hitungan postingan dan daftar (filter status hilang)
  • •Pencocokan nick_name dihapus (mencegah salah identifikasi data seed dengan user_id NULL)
  • •Posisi menu Story di Halaman Saya — top → main (pengenalan otomatis plugin)
  • •Ikon menu Story dalam format inti (tag <path> penuh)
  • •Kolom key hilang di settings SELECT tab layanan tambahan (dua bagian tersembunyi)
  • •Aksi hosting_status 500 — lokasi definisi fungsi helper
  • •Bilah aksi halaman — token lebar konten diterapkan
  • •Bug di mana postingan yang ada hilang saat memposting postingan baru (pembaruan umpan segera)
v2.5.0 2026-05-01 · 6 bulan lalu
Modal Tambah Domain + Buku Besar Akuntansi + Penagihan Add-on + Infrastruktur Konsultasi

Added

  • •Detail hosting → Tab domain → Tombol + Tambah Domain → modal
  • •Opsi: subdomain gratis / registrasi baru / hubungkan domain yang dimiliki
  • •Pencarian WHOIS (/api/domain-check.php digunakan ulang) + tampilan harga per TLD
  • •Pembayaran: kartu tersimpan (menggunakan ulang pelanggan PAY.JP hosting) atau kartu baru (PAY.JP Elements)
  • •Pemisahan otomatis pajak konsumsi 10% (subtotal / pajak / total)
  • •Saat pembayaran selesai, tambahkan ke hosting sub metadata.added_domains[] (tidak membuat sub terpisah)
  • •Jaring pengaman pengembalian dana otomatis — jika pemrosesan DB gagal, tagihan PAY.JP otomatis dikembalikan

Added

  • •Tanggal mulai~kadaluarsa + tombol periksa (DNS A/CNAME → cocokkan zona kami atau rentang IP Cloudflare)
  • •Toggle perpanjangan otomatis + tombol permintaan perpanjangan (per domain)
  • •registrar_pending / manual_attach_pending: tombol periksa → lencana "Menunggu"
  • •Lencana ungu "Domain Ditambahkan"

Added

  • •Bilah sisi manajemen hosting: item ke-2 ditambahkan baru
  • •Daftar terpadu: sub type='domain' + hosting sub.added_domains[] semua ditampilkan secara kronologis
  • •Kartu statistik (total/menunggu/selesai) + filter (status/opsi/pencarian)
  • •Aksi: [Tandai Terdaftar] / [Proses Pembatalan] (saat batal: pengembalian dana PAY.JP + INSERT baris pengembalian dana)
  • •Dekripsi otomatis nama pengguna

Added

  • •Bilah sisi manajemen hosting: item ke-3 ditambahkan baru
  • •Buku besar transaksi berbasis rzx_payments — kartu statistik pendapatan/pengembalian dana/pendapatan bersih/pajak
  • •Kalkulasi otomatis jumlah dasar untuk laporan pajak konsumsi Jepang (harga termasuk pajak → dasar = total × 100/110, pajak = total × 10/110)
  • •Tabel tren 12 bulan terakhir + tabel buku besar transaksi + filter/paginasi

Added

  • •Tab add-on halaman saya: bagian "Tersedia untuk daftar" (surat bisnis dikecualikan otomatis)
  • •Aksi per harga:
  • •Gratis (dukungan instalasi): notifikasi admin + order_logs
  • •Penawaran (kustomisasi): "Minta Penawaran"
  • •Harga tetap berulang (dukungan teknis 1 tahun): modal pembayaran kartu (_addon-pay-modal.php)
  • •Saat pembayaran selesai, addon sub dibuat otomatis + entri pembayaran
  • •Label sub yang sudah aktif cocok: tombol daftar dinonaktifkan otomatis
  • •Baris install_info di sebelah kanan: tombol [Ke Admin / Ke Beranda]

Added

  • •Skema DB: UNIQUE uk_payment_order dihapus → UNIQUE uk_payment_key (charge_id) diganti
  • •Beberapa baris pembayaran per pesanan diizinkan (hosting + domain + add-on terakumulasi)
  • •Saat pengembalian dana: baris berbayar tidak diubah, INSERT baris pengembalian dana terpisah (status='refund', integritas akuntansi)
  • •Kewajiban retensi 7 tahun Jepang + standar respons sengketa pedagang PAY.JP terpenuhi

Added

  • •composer require minishlink/web-push
  • •Helper pengiriman push berbasis VAPID untuk admin/supervisor
  • •Pembersihan endpoint kadaluarsa otomatis + pencatatan otomatis di rzx_push_messages
  • •Titik panggil: pay_domain (pembayaran domain selesai), service-order (permintaan registrasi domain), request_addon

Added

  • •Pencocokan otomatis subdomain zona kami (CNAME wildcard dikenali)
  • •Pencocokan 15 rentang CIDR IPv4 Cloudflare (pada respons proxy)
  • •Respons "already_refunded" diperlakukan sebagai sukses (saat PAY.JP sudah mengembalikan dana)

Added

  • •Subquery menjumlahkan total rzx_payments (paid − refunded)
  • •Tampilan terakumulasi pembayaran dasar hosting + penambahan domain + pembayaran add-on

Added

  • •admin_cancel_addon — sub status='cancelled' + pengembalian dana PG + INSERT baris pengembalian dana
  • •Perutean PG: berdasarkan kolom gateway dari baris pembayaran (aman bahkan setelah perubahan PG)

Removed

  • •Sesuai kewajiban retensi 7 tahun Jepang + kebijakan respons sengketa PAY.JP, semua tombol "hapus" di UI admin dihapus
  • •Ikon tempat sampah + adminDeleteAddon JS + admin_delete_addon API + 4 label dalam 13 bahasa semua dihapus
  • •Hanya "Batalkan" — baris data tidak pernah dihapus (DELETE)

Fixed

  • •Konflik awalan titik dua placeholder Translator — [':count' => N] → ['count' => N] diperbaiki massal
  • •metadata[refund_reason] PayjpGateway::refund() ditolak PAY.JP → diubah menjadi refund_reason
  • •Pemeriksaan izin admin service-manage.php — role === 'admin' → role IN ('admin','supervisor') diperbaiki untuk 5 aksi
  • •Tab domain pesanan layanan: setelah pengembalian dana, kartu akuntansi menampilkan negatif → logika SQL dikoreksi (penjumlahan terpisah status='paid' / 'refund')

Added

  • •ssh.21ces.com Cloudflare Tunnel didaftarkan (Public Hostname: SSH → localhost:22)
  • •PC eksternal: cloudflared access ssh --hostname ssh.21ces.com atau ProxyCommand di ~/.ssh/config
  • •Sisi server: PermitRootLogin no, kunci thevos terdaftar
v2.4.3 2026-04-29 · 6 bulan lalu
Instalasi Otomatis VosCMS + Backup Mypage Hosting / phpMyAdmin

Added

HostingProvisioner.php installVoscms() memanggil install-core.php secara sekuensial step 3 → step 4 setelah zip deploy (sebelumnya hanya step 2) :

  • •Method baru runInstallCoreSteps() — bypass sesi menggunakan fallback POST _db + validasi marker .installed
  • •Method baru callInstallCore() — HTTP loopback (port 80, memanfaatkan SSL edge Cloudflare; menangani absennya sertifikat origin saat rate limit)
  • •Method baru appendHostingEnv() — menyuntikkan ulang variabel HOSTING_* setelah install-core.php menimpa .env
  • •Penghapusan otomatis welcome.html setelah instalasi selesai (agar VosCMS index.php diprioritaskan)
  • •Alur pembayaran service-order.php:567-576 — jika instalasi berhasil, install_completed_at dan install_admin_url otomatis dicatat di metadata addon (pemicu tampilan tab mypage)

Added

admin/service-orders/detail.php:175-260 + partials/addon.php :

  • •Addon "Dukungan Instalasi" di tab layanan tambahan kini memiliki dua tombol:
  • •Instal VosCMS (ungu) — tampil jika install_info ada dan install_completed_at belum ada
  • •Halaman Admin (hijau) — membuka URL admin di tab baru setelah instalasi selesai
  • •Aksi API admin_run_voscms_install — memanggil langsung HostingProvisioner.installVoscms(), fallback kredensial DB dari metadata.server.db atau .env pelanggan
  • •Jika berhasil: penulisan metadata addon + catatan voscms_installed di order_log

Added

customer/mypage/service-partials/hosting.php :

  • •🟢 Tombol Backup Situs — service-manage.php?action=request_backup (baru)
  • •mysqldump → dump DB + packaging zip (public_html, .env, sql)
  • •URL unduhan bertanda tangan (HMAC, kedaluwarsa 10 menit) — api/backup-download.php baru
  • •Pembersihan otomatis backup yang lebih dari 7 hari
  • •🟣 Tombol Buka phpMyAdmin — https://pma.voscms.com/?lang=<user_locale> di tab baru
  • •vhost nginx: pma.voscms.com.conf baru (routing otomatis via wildcard Cloudflare Tunnel *.voscms.com)
  • •Login menggunakan kredensial DB milik pengguna sendiri
  • •Tampilan informasi koneksi DB (host / nama DB / user / password dengan toggle)
  • •i18n 13 bahasa: btn_site_backup, btn_open_phpmyadmin, confirm_site_backup, backup_in_progress, backup_ready, f_password, password_notice, f_protocol

Added

customer/mypage/service-partials/_setup-monitor.php :

  • •Pemisahan tahapan: setup hosting → instalasi otomatis VosCMS
  • •Order system_imported (hosting yang didaftarkan sendiri oleh admin, mis. vos.21ces.com) langsung diaktifkan — kotak monitoring tidak ditampilkan
  • •i18n baru 13 bahasa: setup_step_voscms_install

Changed

Penambahan pada rsync exclude :

  • •5 plugin internal (tidak boleh masuk ke situs pelanggan hosting) :
  • •vos-developer, vos-hosting, vos-license-server, vos-market, vos-salon
  • •7 migrasi SQL reservation (pelanggan hosting tidak menginstal sistem reservasi) :
  • •001_create_reservation_tables.sql, 011_seed_service_translations.sql, 012_seed_service_translations_p2.sql, 013_add_source_to_reservations.sql, 014_add_payment_status_to_reservations.sql, 015_create_reservation_core.sql (baru), 016_alter_reservation_services.sql, 024_reservations_bundle_columns.sql

Penambahan pada penghapusan file dev :

  • •Direktori admin/ (sisa offline.html) — direktori kosong menyebabkan 403 akibat indexing nginx, hanya root /offline.html yang direferensikan sw.js
  • •Enkoding dasar → obfuscate.php (ionCube EVAL sebelumnya menyebabkan hang saat runtime; ionCube hanya aktif jika USE_IONCUBE=1)

Changed

Pemisahan struktur di mana 001_create_base_tables.sql sebelumnya membuat tabel base dan reservation dalam satu file :

  • •Dimodifikasi : 001_create_base_tables.sql — hanya 5 tabel inti (rzx_admins, rzx_users, rzx_member_grades, rzx_settings, rzx_migrations) + seed inti (member_grades default, settings default)
  • •Baru : 015_create_reservation_core.sql — 9 tabel reservasi (rzx_categories, rzx_services, rzx_service_options, rzx_reservations, rzx_payments, rzx_point_transactions, rzx_business_hours, rzx_holidays, rzx_staff_positions, rzx_staff) + seed reservasi (business_hours, point_*)

Saat build distribusi hosting, 015 dikecualikan → rzx_reservations tidak dibuat → $hasReservations = false di admin/dashboard.php:25-27 → kalender tidak ditampilkan otomatis.

Situs yang menggunakan sistem reservasi (voscms.com, RezlyX, dll.) menerapkan kedua file SQL → tidak ada perubahan.

Changed

config/templates/nginx-vhost.conf.tpl + HostingProvisioner addHttpsToVhost() :

  • •Sebelumnya: port 80 (redirect HTTPS) + port 443 (konten sebenarnya) → redirect loop tak terbatas dengan Cloudflare Tunnel + redirect 80→443
  • •Sekarang: satu blok server terpadu 80/443, konten yang sama dilayani, tanpa redirect
  • •fastcgi_read_timeout 60s → 300s (mencegah timeout nginx saat INSERT massal)

Changed

  • •provision-hosting.php (alat CLI backfill): pembaruan otomatis metadata langganan hosting (hosting_provisioned, server.{ftp,db,env}) — sebelumnya hanya _autoProvisionHosting dari service-order.php yang dijalankan
  • •Penghapusan otomatis 5 plugin internal + direktori admin/

Added

scripts/install-cli.php baru :

  • •Backfill pemanggilan otomatis install-core.php setelah provisioning hosting
  • •Kredensial DB: prioritas metadata subscription, fallback ke .env docroot pelanggan
  • •Penggunaan: sudo -u www-data php scripts/install-cli.php --order=<ORDER>
  • •Jika berhasil: pencatatan otomatis install_completed_at di metadata addon + aksi voscms_installed di order_logs

Fixed

  • •Panggilan _autoProvisionHosting() yang hilang di cabang pembayaran kartu — ditambahkan
  • •install_info.admin_pw di metadata pembayaran sebelumnya ditampilkan sebagai teks biasa → penyatuan pola toggle (👁) di sisi mypage dan administrasi

Migration Notes

  • •Pelanggan hosting eksternal : tidak ada tindakan yang diperlukan. Build voscms-2.4.3.zip menggunakan zip bersih untuk alur instalasi otomatis.
  • •Situs utama (voscms.com) : tidak ada perubahan (kedua file SQL diterapkan).
  • •Pelanggan hosting lama (dwhahn, dll.) : disarankan deprovision + reprovision untuk instalasi ulang yang bersih (terapkan zip baru setelah pemisahan).
  • •Pembersihan manual : /etc/nginx/sites-available/pma.voscms.com.conf ditambahkan — deploy langsung ke sistem utama (di luar rsync).
v2.4.2 2026-04-29 · 6 bulan lalu
Hook Pembayaran Otomasi Hosting + i18n Log Aktivitas

Added

Dipanggil segera setelah pembayaran selesai di service-order.php:

  • •Fungsi baru _autoProvisionHosting($pdo, $prefix, $orderId, $orderNumber) — berjalan di luar transaksi pembayaran (integritas DB terisolasi; pesanan itu sendiri tidak terpengaruh jika gagal)
  • •Hanya domain_option = 'free' yang langsung disiapkan (subdomain Cloudflare — pendaftaran DNS otomatis sudah selesai)
  • •new (menunggu perubahan NS setelah pembelian domain) / existing (menunggu perubahan NS domain yang dimiliki) dalam status deferred — admin memicu secara terpisah saat aktivasi domain
  • •Jika addon 'install' memiliki install_info, file voscms di-deploy + .env dibuat otomatis (otomasi alur sesi langkah-demi-langkah install-core.php (langkah 2–5) memerlukan perancangan ulang seluruh pipeline instalasi voscms — ditunda ke Fase 5; pengguna mengakses https://<domain>/install.php setelah pembayaran → melanjutkan wizard dengan info DB yang sudah diisi di .env)
  • •Info ftp/db/env disimpan otomatis ke metadata.server langganan hosting → ditampilkan otomatis di tab hosting Halaman Saya (tidak perlu perubahan UI)
  • •Aksi order_logs: hosting_provisioned / hosting_provision_skipped / hosting_provision_deferred / hosting_provision_failed

Urutan panggilan: commit pembayaran → _autoProvisionHosting() → _autoProvisionMailDomain()

Added

$actionLabels di halaman detail pesanan layanan admin (detail.php:498-528) diperluas dari 8 menjadi 31 entri. Memperbaiki kode aksi mentah (mis. mail_account_added) yang tampil di log aktivitas.

Aksi yang baru dipetakan:

  • •Mail: mail_account_added/deleted, mail_address_changed, mail_provisioned/_skipped/_failed, mail_domain_migrated/activated, bizmail_upgrade_request
  • •Hosting: hosting_provisioned, hosting_provision_skipped/deferred/failed, hosting_deprovisioned
  • •Add-on: admin_add_storage_addon, admin_delete_addon, storage_addon_paid/requested
  • •Sistem: customer_notified, setup_email_sent, server_info_updated, bulk_extended, manual_capacity_period_fix

Makna warna per aksi: green (selesai/positif), amber (tertunda/peringatan), red (gagal/dihapus), blue (info/notifikasi), violet (admin/khusus), zinc (netral).

23 kunci i18n — services.admin_orders.act_* — ditambahkan dalam ko/ja/en (halaman operator). 10 bahasa lainnya menggunakan fallback bahasa Inggris.

Changed

Saat provisi otomatis hosting, instalasi otomatis VosCMS hanya melakukan deploy file + pembuatan .env otomatis. Otomasi alur sesi langkah-demi-langkah install-core.php (langkah 2–5) memerlukan perancangan ulang seluruh pipeline instalasi voscms — ditunda ke Fase 5. Setelah pembayaran, pengguna mengakses https://<domain>/install.php → melanjutkan wizard (info DB sudah diisi di .env).

Nilai kembalian installVoscms() diubah — kini mengembalikan install_url + pesan note.

v2.4.1 2026-04-29 · 6 bulan lalu
Provisionisasi Otomatis Virtualisasi Hosting (Fase 1–3)

Added

HostingProvisioner.php — Kelas utama untuk setup otomatis saat pemesanan hosting. Transaksi 9 langkah (rollback urutan terbalik saat gagal):

  • •Pembuatan pengguna Linux (vos_<order_number>, dalam batas 32 karakter, menjaga huruf besar/kecil)
  • •Struktur direktori: /var/www/customers/<order>/{public_html,logs,tmp} (chmod 750/2775/750/1770)
  • •Kuota disk (setquota -u <user> <soft> <hard>, hard = soft × 1.1)
  • •Verifikasi konflik direktori: ditolak jika konflik dengan nginx vhost / reserved_subdomains yang ada
  • •Mount SSD 1,9TB /var/www (ext4 + noatime + usrquota,grpquota)
  • •Sudoers terpusat (/etc/sudoers.d/voscms-hosting-provisioner) — www-data menjalankan perintah root (useradd/setquota/nginx dll.) dengan NOPASSWD
  • •Pembatasan pola argumen per perintah (vos_, /var/www/customers/, *.conf) — lulus validasi visudo

Alat CLI scripts/provision-hosting.php:

php provision-hosting.php SVC260428AE7476 hotel.com 1GB
php provision-hosting.php --order SVC260428AE7476           # pencarian DB otomatis
php provision-hosting.php --deprovision SVC260428AE7476 hotel.com
php provision-hosting.php --install-voscms <order> <domain> <capacity>

Templat config/templates/:

  • •nginx-vhost.conf.tpl — HTTP + lokasi tantangan ACME + socket FPM per pengguna
  • •welcome.html.tpl — halaman sambutan aktivasi

Added

Setiap hosting menjalankan PHP di bawah penggunanya sendiri (mencegah kompromi lintas situs) + SSL otomatis diterbitkan bahkan di belakang proxy Cloudflare.

config/templates/php-fpm-pool.conf.tpl:

  • •user = vos_<order> / group = www-data — isolasi UID
  • •listen = /var/run/php/<order>.sock — socket per pengguna
  • •pm = ondemand — efisien memori untuk hosting lalu lintas rendah
  • •php_admin_value[open_basedir] — akses terbatas ke direktori situs + /tmp + /usr/share/php
  • •disable_functions — exec, passthru, shell_exec, system, proc_open, popen, pcntl_exec
  • •session.save_path / upload_tmp_dir — diisolasi ke direktori pengguna
  • •env: HOSTING_ORDER / HOSTING_USER / HOSTING_DOMAIN

SSL Let's Encrypt — tantangan Cloudflare DNS-01:

  • •Plugin python3-certbot-dns-cloudflare
  • •/etc/letsencrypt/cloudflare/credentials.ini (root 0600, CLOUDFLARE_API_TOKEN dari .env)
  • •Diterbitkan terlepas dari proxy Cloudflare / keterjangkauan eksternal
  • •Blok server HTTPS ditambahkan otomatis (TLS 1.2/1.3, cipher kuat, HSTS, X-Frame-Options, X-Content-Type-Options)
  • •Pengalihan otomatis HTTP → HTTPS 301
  • •certbot.timer memperbarui otomatis dua kali sehari (sudah aktif)

Added

Isolasi DB + pengguna per pesanan hosting.

  • •Akun MySQL hosting_admin (dibuat sekali, ALL PRIVILEGES + GRANT OPTION) — khusus manajemen DB
  • •Nama DB/pengguna = vos_<order> (sama dengan nama pengguna Linux)
  • •Kata sandi: 32 hex acak (bin2hex(random_bytes(16)))
  • •GRANT ALL PRIVILEGES ON vos_<order>.* TO vos_<order>@localhost — akses hanya ke DB sendiri
  • •Verifikasi isolasi: akses ke DB hosting lain / voscms_prod mengembalikan Access denied 1044

Instalasi otomatis VosCMS (installVoscms() — dipicu oleh --install-voscms atau saat addon memiliki install_info):

  • •Mengekstrak voscms-dist/voscms-X.Y.Z.zip terbaru → public_html
  • •Menghasilkan .env secara otomatis: APP_KEY=base64:<32bytes> / info DB / HOSTING_ORDER diinjeksikan
  • •Izin: vos_:www-data, .env chmod 640
  • •Memanggil install-core.php tanpa antarmuka (saat ini ada masalah pengalihan 301, akan diselesaikan di Fase 4)

Verified

provision DEMO260429FULL demo07.21ces.com 1GB --install-voscms:

  • •✅ Pengguna vos_DEMO260429FULL (isolasi UID, grup www-data)
  • •✅ Kuota disk 1GB soft / 1,05GB hard
  • •✅ Pool PHP-FPM dengan socket sendiri
  • •✅ nginx vhost (HTTP + HTTPS, HSTS)
  • •✅ SSL Let's Encrypt (/etc/letsencrypt/live/demo07.21ces.com/)
  • •✅ DB MySQL vos_DEMO260429FULL + pengguna (isolasi terverifikasi)
  • •✅ File VosCMS 2.3.9 + .env dideploy

deprovision: Semua sumber daya dihapus dengan bersih (pengguna/home/DB/pool FPM/nginx/SSL).

v2.4.0 2026-04-29 · 6 bulan lalu
Infrastruktur Otomasi Hosting + Penagihan Kalender + Sistem Mail Selesai

Added

Alih-alih metode penagihan anniversary standar industri (dari tanggal daftar hingga tanggal yang sama setahun kemudian), penagihan kini menggunakan penutupan akhir bulan kalender (dari tanggal 1 bulan berikutnya hingga akhir bulan masa berlaku). Pengguna yang mendaftar di bulan yang sama memiliki tanggal kedaluwarsa yang sama, menyederhanakan pemrosesan batch cron dan penutupan akuntansi. Mengikuti standar hosting Jepang (月末締め翌月1日請求).

  • •DB: kolom rzx_subscriptions.billing_start DATETIME NULL ditambahkan (tanggal mulai penagihan normal)
  • •Helper: _proratedFirstAmount (unit bulanan ÷ 30 × sisa hari), _calendarBillingStart (tanggal 1 bulan berikutnya), _calendarExpires (hari terakhir 23:59:59)
  • •Formulir pesanan: hosting_prorated ditambahkan otomatis ke item pembayaran hosting (mis. daftar 2/4, 12 bulan ¥1.000/bln → bulan pertama ¥967 + 12 bulan normal ¥12.000 = ¥12.967)
  • •Domain tetap menggunakan penagihan anniversary (siklus registrasi 1 tahun); hosting, mail, pemeliharaan, dan add-on menggunakan penagihan kalender
  • •Penanganan -1 second → -1 day di service-order.php juga disamakan
  • •Layanan add-on (penambahan kapasitas web) juga menggunakan proration + jumlah N bulan normal yang sama, disinkronkan otomatis dengan tanggal kedaluwarsa hosting

Added

Konfigurasi Postfix + Dovecot + Rspamd + Roundcube + OpenDKIM + Let's Encrypt di ConoHa VPS (133.117.72.149). mail-tester 10/10, FCRDNS terverifikasi. Setup domain otomatis saat pemesanan.

  • •Pendaftaran DNS otomatis (CloudflareDns.php) — A / MX / SPF / DKIM / DMARC 5 record sekaligus
  • •Pembuatan kunci DKIM — mx1 SSH rspamadm dkim_keygen (kunci ed25519 khusus storage/keys/mailsync_ed25519, pemilik www-data, 0700)
  • •Provisioning 3 mode (MailDomainProvisioner.php): free (subdomain langsung) / new (domain dibeli, aktivasi admin) / existing (panduan ubah NS). Mesin status: existing_pending / new_pending / active
  • •Kata sandi: SHA512-CRYPT ({SHA512-CRYPT}$6$...) — hash satu arah kompatibel Dovecot. Skrip migrasi untuk kata sandi enc: lama (fungsi encrypt): scripts/migrate-mail-passwords.php
  • •Cron sinkronisasi mx1 (scripts/mail-sync-to-mx1.php) — voscms_prod → mx1 mail_lookup virtual_users setiap 5 menit. Pemicu segera (triggerMailSyncToMx1()) untuk sinkronisasi latar belakang tepat setelah aksi mail
  • •Pendaftaran cron otomatis: /etc/cron.d/voscms-mail-sync
  • •Notifikasi: template mail HTML untuk admin (provisioning diperlukan) / pelanggan (mail siap digunakan) (MailNotifier.php)

Added

Mail dasar / mail bisnis dikelola bersama dengan hosting. Memperbaiki masalah tampilan duplikat di mana alamat yang sama tersimpan di mail subscription + metadata hosting (satu sumber kebenaran: mail subscription).

  • •Tombol webmail — parameter GET ?_user=alamat Roundcube untuk mengisi username otomatis, target="_blank". Prioritas URL: metadata.mail_server.webmail_url → env WEBMAIL_URL → default https://mail.voscms.com/
  • •Tombol ubah email — untuk koreksi kesalahan ketik. Domain tetap; hanya bagian lokal yang berubah. Semua metadata mail + hosting untuk pesanan yang sama disinkronkan
  • •Logika dedup (mail.php) — _seenAddresses menampilkan setiap alamat hanya sekali, mail subscription diprioritaskan
  • •Konversi virtual hosting → mail di service-detail.php hanya berjalan ketika tidak ada mail subscription nyata (kompatibilitas data lama)
  • •service-order.php tidak lagi menyimpan hosting metadata.mail_accounts untuk pendaftaran baru (mail subscription adalah satu-satunya sumber)

Added

Pembelian penyimpanan tambahan dengan pembayaran di tab layanan add-on halaman saya. Registrasi pelanggan PAY.JP + chargeCustomer.

  • •Modal: pilihan kapasitas (1 GB / 3 GB / 5 GB) + input informasi kartu (payjp.js v2 Elements)
  • •Daftarkan kartu / bayar dengan kartu lain / kembali ke kartu terdaftar — toggle
  • •Deteksi otomatis kartu kedaluwarsa/ditolak (expired_card, card_declined, invalid_* dll. kode error PAY.JP) → formulir kartu terbuka otomatis + banner panduan
  • •Kolom input nama pemegang kartu ditambahkan (addon-card-holder) — disimpan sebagai metadata pelanggan, tidak diteruskan ke token (PAY.JP v2 Elements tidak mendukung opsi name)
  • •Pola Portal: document.body.appendChild() untuk keluar dari kontainer yang memiliki transform dan menutupi seluruh viewport (z-[9999])
  • •Jika charge gagal setelah membuat pelanggan baru: pengembalian dana otomatis + penghapusan pelanggan (pencegahan orphan)
  • •hosting metadata.extra_storage[] terakumulasi; pengukur kapasitas tab hosting menampilkan total gabungan

Added

14 pasal (definisi, pendaftaran, biaya, perpanjangan otomatis, pembatalan, layanan, backup, penggunaan terlarang, penangguhan, pemeliharaan, privasi, tanggung jawab, perubahan, yurisdiksi) disusun mengacu pada ketentuan standar penyedia hosting Jepang seperti StarServer. Penagihan kalender + proration bulan pertama + pengembalian dana bulan yang tidak digunakan saat pembatalan ditetapkan.

  • •Pendaftaran halaman sistem: config/system-pages.php slug hosting-terms, 🖥️ indigo
  • •Pemetaan editor halaman: pages-document.php — pageMetaMap['hosting-terms']
  • •Seed DB: ja (utama) / ko / en — 3 bahasa (rzx_page_contents)
  • •i18n: site.pages.hosting_terms + hosting_terms_edit (editor_title/desc)

Added

  • •4 tab selalu terlihat (detail.php) — hosting/domain/mail/addon. Pesan status kosong (empty_*) ditampilkan jika tidak ada data
  • •Tab layanan add-on — tombol + Tambah Penyimpanan (modal pemberian gratis admin; pemilihan kapasitas langsung membuat addon subscription aktif, billing_amount=0, expires=tanggal kedaluwarsa hosting) + tombol tempat sampah/hapus per item (soft delete status=cancelled, dihapus dari hosting metadata.extra_storage[])
  • •Daftar — peningkatan tampilan pemohon (index.php) — pesanan dari admin sistem dengan role supervisor/admin ditampilkan sebagai user.name + subjudul ungu Superadmin: [email protected] (menghindari kegagalan dekripsi applicant_name lama yang terenkripsi seperti FKzGx9SE7xG/2)
  • •Tombol buat pesanan (+ New Order) — hanya UI, fungsionalitas menyusul
  • •i18n 13 bahasa: role_supervisor, role_admin, btn_create_order, empty_, btn_add_storage_addon, btn_delete_addon, modal_add_storage_, confirm_, alert_ dan 20+ kunci lainnya

Added

  • •subdomain-check.php — prioritas DB (reserved_subdomains) + fallback API Cloudflare. JS checkSubdomain() memanggil server dan mencerminkan hasilnya
  • •Revalidasi sisi server di service-order.php tepat sebelum pembayaran — mencegah bypass sisi klien
  • •Auto-import reserved_subdomains — 11 record yang ada dari zona Cloudflare (vos/bestatech/bt/dev/ec430/ec431/salon/ssh/test/thevos/ai.21ces.com)
  • •Perbaikan bug INSERT IGNORE menu (menus-api.php):
  • •add_menu_item: bersihkan terjemahan usang segera setelah INSERT + timpa dengan INSERT ... ON DUPLICATE KEY UPDATE
  • •update_menu_item: deteksi perubahan title/url, hapus 13 terjemahan lama + daftarkan ulang jika halaman sistem
  • •rename_menu_item: bersihkan terjemahan lama saat judul berubah
  • •Memperbaiki regresi di mana menu lama (id=38, "Pengenalan VosCMS") menunjuk ke menu ketentuan hosting baru

Added

Alur dibangun: pemesanan layanan → pembayaran selesai → provisioning domain mail otomatis → notifikasi pelanggan.

  • •Panggilan _autoProvisionMailDomain() ditambahkan di service-order.php — berjalan di luar transaksi pembayaran (isolasi integritas DB)
  • •DB: rzx_reserved_subdomains (zone, subdomain, record_type, reserved_by, reason) — cache ketersediaan
  • •Kunci DKIM dibuat otomatis, disimpan di metadata.mail_provision sebagai mode/origin/domain/zone/subdomain/provisioned_at
  • •Percabangan UI berdasarkan mode provisioning (service-detail.php): pending / new_pending / existing_pending — tab disembunyikan, hanya monitoring yang ditampilkan (_setup-monitor.php); tab hanya terlihat saat active

Fixed

$arr['key'] ?? [] di PHP mengembalikan nilai sementara, sehingga &$ref tidak mempengaruhi array asli. change_mail_password / change_mail_address mengembalikan respons sukses tetapi UPDATE metadata tidak berpengaruh — perubahan kata sandi dan alamat gagal secara diam-diam.

  • •Beralih ke pola pembaruan langsung berbasis indeks: foreach ($arr as $i => $item) { $arr[$i]['k'] = ... }
  • •Penyimpanan kata sandi mail baru di service-order.php juga diubah dari encrypt() (dua arah) ke mail_password_hash() (SHA512-CRYPT)

Fixed

  • •Ringkasan pembayaran hijau fluorescent terang → warna lebih bersih: text-green-400 → text-green-600 dark:text-green-400 (7 lokasi)
  • •Kunci i18n hilang pada pesan respons ketersediaan subdomain (pemetaan PHP→JS i18n di order.php + placeholder :fqdn disamakan)
  • •Perhitungan tanggal kedaluwarsa diperbaiki: +N months -1 second (tanggal yang sama) → +N months -1 day (tepat 1 hari sebelumnya) → akhirnya disatukan ke metode kalender

Database

  • •rzx_subscriptions.billing_start DATETIME NULL ditambahkan (dev + prod)
  • •Tabel rzx_reserved_subdomains (cache tabrakan zona Cloudflare)
  • •rzx_page_contents diisi dengan hosting-terms (ja/ko/en)
v2.3.9 2026-04-27 · 6 bulan lalu
i18n Pesanan Layanan + Sistem Menu 3 Zona

Added

Semua teks di 6 area (domain, hosting, add-on, pemohon, pembayaran, ringkasan) dan halaman pembayaran selesai telah diterjemahkan ke 13 bahasa. Teks alert/modal di sisi klien diinjeksikan dari PHP melalui pola var I18N = {...} + t(key, replace).

  • •Lokasi: plugins/vos-hosting/lang/{13 locales}/services.php — services.order.* lebih dari 200 kunci
  • •Detail layanan halaman saya: services.detail.* lebih dari 70 kunci, service-detail.php
  • •Manajemen pesanan admin: services.admin_orders.* lebih dari 115 kunci, admin/service-orders/
  • •Label Korea yang tersimpan di DB (paket hosting, pemeliharaan, add-on) dipetakan berdasarkan ID pengaturan via closure _localizeLabel($sub) dan diterapkan db_trans() → penanganan konsisten di halaman saya dan admin

Added

Saat tombol pembayaran diklik, detail pesanan (domain/paket/add-on/pemohon/syarat) divalidasi dan modal ringkasan ditampilkan → pengguna mengonfirmasi → pembayaran dilanjutkan. Mencegah kesalahan seperti mendaftarkan subdomain kosong.

  • •order.js — showOrderConfirmModal(), closeOrderConfirmModal(), confirmAndPay()
  • •Penghapusan layer modal yang tersisa setelah pembayaran selesai diperkuat (penghapusan DOM + reset overflow body/documentElement)

Added

Saat "Dukungan Instalasi" (_id='install') dicentang di add-on, muncul formulir untuk ID admin/email/kata sandi/nama situs. Kata sandi disamarkan + toggle ikon mata + pemberitahuan "ubah setelah instalasi". Nilai disimpan sebagai install_info dalam metadata langganan, ditampilkan di halaman saya dan admin.

  • •Input: _addons.php
  • •Tampilan: halaman saya/admin partials/addon.php (kotak latar belakang biru + toggle kata sandi)

Added

Memo yang terikat di tab add-on dipindahkan ke level pesanan (rzx_orders.admin_notes). Selalu ditampilkan sebagai textarea 7 baris di atas log aktivitas di sebelah kanan, terlepas dari apakah ada add-on. Aksi AJAX update_order_memo ditambahkan.

Added

Field section (top/main/bottom, default main) diperkenalkan untuk memisahkan menu inti dari menu plugin secara visual. Pemisah disisipkan otomatis antar zona; jika tidak ada menu yang dapat ditampilkan di suatu zona, seluruh zona termasuk pemisah dilewati.

Bilah sisi admin:

  • •top: Dasbor / Manajemen Anggota / Manajemen Situs / Penginstal Otomatis (vos-autoinstall)
  • •main: Lisensi VosCMS (vos-license-manager) / Manajemen Hosting (vos-hosting)
  • •bottom: Plugin / Pengaturan
  • •Perubahan: config/admin-menu.php, admin-sidebar.php

Bilah sisi halaman saya:

  • •top: Dasbor / Profil / Pesan
  • •main: Layanan (vos-hosting ditambahkan otomatis) — terakumulasi otomatis saat plugin lain menambahkan entri
  • •bottom: Pengaturan / Kata Sandi / Penghapusan Akun / Keluar
  • •Perubahan: config/mypage-menu.php, mypage-sidebar.php

Pendaftaran menu plugin: field section + position dalam entri menus.admin / menus.mypage di plugin.json menentukan zona. Menu services telah dipindahkan dari core mypage-menu.php → vos-hosting/plugin.json (pendaftaran otomatis).

Added

API validasi lisensi dan API portal pengembang berada di inti, sehingga akan terekspos di semua situs voscms yang di-deploy. Kedua API telah dipisahkan ke plugin baru khusus kantor pusat.

  • •vos-license-server (scope: hq_only): 7 endpoint lisensi dipindahkan (check, register, verify, stats, updates, register-plugin, _init)
  • •vos-developer (scope: hq_only): 7 endpoint portal pengembang dipindahkan (register, login, submit, my-items, earnings, update-version, _init)
  • •api/_plugin_dispatch.php — wrapper inti memeriksa rzx_plugins.is_active sebelum mendispatch, mengembalikan 404 jika tidak aktif
  • •Inti /api/license/.php dan /api/developer/.php hanya menyimpan wrapper (kompatibilitas eksternal dipertahankan)
  • •/api/notices.php dengan whitelist env HQ_HOSTS ditambahkan (hanya merespons dari domain HQ voscms.com)
  • •Skrip build (build-voscms.sh) sudah mengecualikan api/license, api/developer, api/notices.php, dan vos-license-manager

Fixed

  • •Bug kadaluarsa kontrak hosting +1 hari (+12 months → +12 months -1 second) — diterapkan di 4 tempat: subscription/free/paid/bank
  • •Email bisnis: tidak bisa menambahkan 2 atau lebih (selektor menangkap tombol X)
  • •Ringkasan pesanan: penyimpanan tambahan tidak teragregasi (atribut name pada storage select tidak ada)
  • •Label paket hosting tidak terlokalisasi — diselesaikan dengan mencocokkan service_hosting_plans._id dengan db_trans()
v2.3.8 2026-04-25 · 6 bulan lalu
Pelengkapan multibahasa papan + skin FAQ/Q&A

Added

_init.php kini mengkueri rzx_translations langsung untuk board.{id}.{title|description|header_content|footer_content|seo_keywords|seo_description} (lokal saat ini → en → sumber). Di halaman mana pun — list/read/write/settings — $board[$field] otomatis diisi dengan nilai terjemahan. Tombol "← Kembali" di halaman pengaturan papan juga otomatis diterjemahkan melalui mekanisme yang sama.

Seed 13 bahasa untuk title + header_content papan isu (id=6) — struktur HTML dipertahankan, hanya teks yang diterjemahkan, lencana tahap pemrosesan juga dalam setiap bahasa. Skrip seed: scripts/seed_issue_i18n.php + scripts/seed_issue_i18n_data.php.

Added

Penerjemahan definisi (label/deskripsi/opsi/nilai default) rzx_board_extra_vars ke 13 bahasa. 4 bidang × 13 = 52 baris.

  • •ExtraVarRenderer::renderAll($vars, $values, $mode, $boardId) — argumen boardId ditambahkan, applyDefTranslations() memuat semua terjemahan var secara massal dalam satu kueri.
  • •ExtraVarRenderer::getOptionLabel($boardId, $varName, $value) — pencarian label terjemahan satu opsi untuk tampilan daftar (cache statis).
  • •renderStatusBadge($value, $size, $displayLabel = null) — warna menggunakan pemetaan sumber (ko), hanya teks yang diterjemahkan → warna konsisten di semua bahasa (diterima = mawar, terselesaikan = zamrud).
  • •select/radio/checkbox: pola value=sumber / label=terjemahan. Nilai sumber selalu disimpan saat menyimpan posting, memastikan kompatibilitas data.
  • •Pembaruan pemanggil: read.php, write.php, _list-row.php, _list-card/_list-webzine/_list-gallery skin default.

Seed 13 bahasa untuk variabel ekstra status papan isu: scripts/seed_ev_status_i18n.php.

Added

API extra_var_get mengembalikan nilai terjemahan untuk lokal saat ini sebagai objek localized melalui db_trans(). Modal JS menampilkan localized.title || ev.title sebagai prioritas → dalam mode Jepang, membuka modal secara otomatis menampilkan "処理ステージ".

extra_var_update bercabang berdasarkan lokal:

  • •Lokal sumber (ko) → perbarui seluruh baris sumber (perilaku yang ada)
  • •Lokal non-sumber (ja/en/…) → hanya simpan meta (var_type/izin/3 kotak centang) ke sumber; simpan 4 bidang terjemahan (title/description/options/default_value) ke rzx_translations dalam lokal saat ini → integritas sumber terjamin

Nama tampilan dalam daftar variabel ekstra juga menggunakan db_trans('board_ev.{boardId}.{varName}.title').

Added

Bagian "Izin edit" (label/opsi dropdown/teks bantuan) dari modal edit variabel ekstra dipisahkan ke file lang 13 bahasa. Kunci baru: site.boards.ev_permission, ev_perm_all, ev_perm_member, ev_perm_admin, ev_permission_help.

Added

Normalisasi dua arah untuk bidang "Opsi" di modal edit variabel ekstra:

  • •Pemuatan modal: mengubah array JSON DB (["a","b","c"]) ke format baris baru untuk tampilan textarea (sesuai petunjuk)
  • •API penyimpanan: helper ev_normalize_options() menerima input baris baru atau JSON dan secara konsisten menyimpan sebagai array JSON. Memperbaiki bug di mana input baris baru sebelumnya disimpan sebagai NULL.

Added

Dua skin baru untuk pola konten di luar isu/pengumuman.

FAQ (skins/board/faq/) — posting = pertanyaan, isi = jawaban. Mencakup bilah pencarian, filter kategori, dan paginasi. Toggle tampilan area judul, judul/subjudul multibahasa, dukungan latar belakang (gambar/video/tidak ada), penyesuaian opasitas overlay. v1.0.1.

Q&A (skins/board/qna/) — posting = pertanyaan (judul+isi), komentar = jawaban. Lencana belum dijawab, item pertama otomatis diperluas, tampilan komentar terurut pohon (parent_id/depth). Balasan ke balasan diindentasi + berlabel "↳ Balas" (tingkat atas = "A."). Formulir edit/balas inline (hanya penulis/admin yang dapat mengedit, izin perm_comment untuk membalas). v1.0.0.

Kedua skin berbagi: ikon roda gigi pengaturan admin ditempatkan di kanan bawah bilah pencarian (terpisah dari area judul). boardSkinFile() beroperasi dengan prioritas _list-full.php.

Added

Aksi update ditambahkan ke api-comments.php. Hanya comment.user_id == pengguna saat ini atau admin yang dapat mengedit. Setelah validasi jumlah karakter, memperbarui content + updated_at.

Added

Token {year} dalam bidang copyright pengaturan layout secara otomatis diganti dengan tahun saat ini pada waktu render. DB menyimpan aslinya (dengan {year}) sehingga tidak perlu diperbarui secara manual. Diterapkan pada: default/minimal/modern/base-footer.php. Deskripsi hak cipta dalam 4 file layout.json diperluas ke 13 bahasa, dengan petunjuk penggunaan {year} ditampilkan dalam setiap bahasa asli.

Juga memperbaiki bug di mana $_lc['copyright'] diabaikan di footer default/minimal — nilai pengaturan layout sekarang benar-benar dirender.

Added

Seed 13 bahasa untuk menu_item.38.title (Pengenalan VosCMS / About VosCMS / VosCMSについて / Über VosCMS / Acerca de VosCMS / À propos de VosCMS / Tentang VosCMS / VosCMS-ийн тухай / О VosCMS / VosCMS Hakkında / Giới thiệu VosCMS / 关于 VosCMS / 關於 VosCMS).

Added

Satu sampel per tahap pemrosesan + 1 yang sudah terselesaikan = total 4. Terjemahan judul/isi setiap posting ke 13 bahasa (104 baris).

TahapJudul (ko)Status
Diterima[Bug] Tombol X menu hamburger mobile tidak berfungsiBaru
Sedang ditinjau[Permintaan fitur] Notifikasi email ke penulis posting saat komentar ditulisBaru
Sedang diproses[Kinerja] Meningkatkan kecepatan muat awal halaman detail marketplaceBaru
TerselesaikanGambar yang dilampirkan di posting papan disisipkan ke isi...Ada

Posting 34 yang ada (posting uji gaya inline Tailwind yang menumpuk) dihapus.

Fixed

customer/board/list.php melakukan require helper rzx_admin_icons di baris 167, tetapi include file skin di baris 161 keluar dengan return — menyebabkan error 500 saat rzx_admin_icons() dipanggil di skin FAQ/Q&A. require_once dipindahkan ke atas include skin.

v2.3.7 2026-04-25 · 6 bulan lalu
AutoInstall UX Integrated Overhaul

Changed

Menghapus referensi yang tersisa terhadap nama lama /marketplace. Memperbaiki bug di mana formulir pencarian mengirimkan GET ke /marketplace, menyebabkan pengalihan ke dashboard (navigasi keluar halaman saat mengubah pencarian/urutan/filter). Menyatukan semua browse.php, item-detail.php, item-submit.php, purchases.php, dan assets/js/marketplace.js ke /autoinstall.

Added

Di Langkah 4 install.php, menambahkan petunjuk kuning di bawah kolom input jalur admin, pratinjau URL secara langsung, dan panduan yang dapat diperluas "Mengapa harus diubah?". Tiga alasan dijelaskan dalam bahasa yang mudah dipahami siapa saja: upaya peretasan otomatis (brute force), pemindaian kerentanan, dan keterbatasan kata sandi yang kuat. Diterapkan ke semua 13 bahasa.

Added

Pada langkah penyelesaian instalasi install.php, plugin vos-autoinstall secara otomatis terdaftar dan diaktifkan (dengan memanggil PluginManager::install() langsung). Pengguna dapat mengakses marketplace segera setelah memasuki panel admin tanpa langkah instalasi terpisah.

Added

Menambahkan dukungan parameter ?locale=xx ke market.21ces.com/api/market/catalog dan /item. JSON multibahasa untuk name, description, short_description, cat_name dikembalikan sebagai satu string dari server (fallback: locale yang diminta → en → nilai pertama). Menghapus semua logika json_decode + locale fallback duplikat di sisi VosCMS (browse.php, item-detail.php, _components/item-card.php).

Added

Mengintegrasikan pengelolaan TTL cache respons API marketplace berbasis file ke dalam pengaturan PluginManager. Hard-code 30 menit → default 5 menit, opsi 1/5/10/30/60 menit. Bagian cache marketplace di https://vos.21ces.com/theadmin/settings/general dan /theadmin/autoinstall/settings membaca dan menulis pengaturan yang sama, sinkronisasi otomatis. Tombol refresh cache segera ditambahkan di header halaman AutoInstall dan halaman pengaturan umum. Cache yang ada otomatis dibatalkan saat TTL diubah.

Added

Menampilkan tabel yang sama dengan admin marketplace (jenis data / deskripsi singkat / slug / Product Key / versi minimum VosCMS & PHP / mitra / harga / lisensi) langsung setelah header. Rasio konten kiri:kanan diubah dari 2:1 menjadi 3:1 untuk memperluas area konten.

Added

Tombol "Tulis Ulasan" di pojok kanan atas tab ulasan halaman detail. Modal input bintang / nama pengguna / isi → API VosCMS → diteruskan ke marketplace POST /api/market/item/review. Kunci lisensi VosCMS + domain dilampirkan otomatis, batasan satu pengiriman per domain, pembeli mendapatkan is_verified=1 secara otomatis. Ulasan disimpan di DB marketplace (rzx_mkt_reviews) sebagai status='pending' dan dipublikasikan setelah persetujuan operator. Endpoint baru GET /api/market/item/reviews?slug=... mengembalikan hanya ulasan yang disetujui. Domain ditampilkan dengan sebagian disembunyikan (mys***.com).

Added

Kotak centang Hanya Gratis sebelumnya → diperluas menjadi toggle 3 arah Semua / Gratis / Berbayar. Parameter paid=1 ditambahkan ke API katalog pasar (i.price>0). Dipindahkan dari bilah pencarian ke depan area toggle tampilan, diintegrasikan dengan pilihan urutan menjadi toolbar header.

Changed

Border input pencarian border-2 border-emerald-300, kotak latar hijau pada ikon pencarian kiri, tombol pencarian bg-emerald-500. Bilah pencarian disederhanakan hanya menyisakan input kata kunci; fungsi urutan dan filter dipindahkan ke header isi.

Changed

StatusTampilan
GratisPasang + Unduh
Berbayar (belum dibeli)Beli (modal pembayaran PAY.JP marketplace)
Berbayar (sudah dibeli)Pasang + Unduh
Sudah terpasang"Terpasang"

Percabangan yang sama diterapkan pada 4 tampilan halaman daftar (list/webzine/card/grid). Kumpulan slug yang dibeli ditanyakan satu kali saat masuk halaman dan digunakan ulang. Pembayaran ditangani oleh marketplace POST /api/market/item/purchase, yang melakukan penagihan PAY.JP + penerbitan lisensi.

Changed

  • •Toggle gaya tampilan: label teks dihapus → ikon saja + title / aria-label (aksesibilitas terjaga)
  • •Badge tipe: latar terang bg-<color>-100 → gelap transparan bg-zinc-900/85 backdrop-blur-sm + teks berwarna (keterbacaan lebih baik di atas gambar)
  • •Bagian tangkapan layar: dari setelah header → dipindahkan ke bawah konten tab, jumlah ditampilkan seperti marketplace sebagai (n)
  • •dark:prose-invert di halaman detail tidak berfungsi → plugin tipografi ditambahkan ke CDN Tailwind
  • •Area deskripsi halaman detail: pendekatan yang sama dengan admin marketplace — merender markup HTML apa adanya, hanya menghapus elemen berbahaya seperti <script>/<iframe>/<style>/onXX

Fixed

  • •Formulir kartu PAY.JP tidak menerima input: dipasang dalam keadaan tersembunyi terlebih dahulu sehingga iframe dirender pada 0px. Diselesaikan dengan inisialisasi malas + pemasangan requestAnimationFrame
  • •Thumbnail widget hilang: 28 widget terdaftar di DB marketplace tetapi hanya 12 widget gratis yang disalin ke /var/www/market/widgets/. Menyinkronkan 14 yang hilang. Menambahkan konversi URL absolut untuk screenshots + filter otomatis file yang tidak ada ke API catalog/item
  • •Peringatan plugin bundle tidak sah: vos-autoinstall terdeteksi sebagai unauthorizedPlugins. Konstanta BUNDLE_PLUGINS = ['vos-autoinstall', 'vos-marketplace'] ditambahkan ke LicenseStatus.php, penyaringan diterapkan di active()/fromCache()/canUsePlugin(). Perlakuan yang sama diterapkan ke server lisensi verify.php
  • •Kemungkinan penambahan widget duplikat: seeding install.php hanya menggunakan INSERT IGNORE, tetapi rzx_page_widgets tidak memiliki batasan UNIQUE sehingga duplikat dimungkinkan. Diubah menjadi DELETE FROM page_widgets WHERE page_slug='home' sebelum INSERT (batasan UNIQUE DB tidak ditambahkan karena ada duplikat yang disengaja untuk kasus seperti widget forum)

Migration Notes

  • •Menu/rute/migrasi plugin vos-autoinstall diaktifkan secara otomatis pada instalasi baru (instalasi yang ada perlu diaktifkan sekali dari panel admin)
  • •TTL default cache API marketplace: 30 menit → 5 menit (agar perubahan harga/konten lebih cepat tercermin)
  • •Pengaturan plugin vos-autoinstall.cache_ttl adalah baru
v2.3.6 2026-04-21 · 6 bulan lalu
Integrasi API Marketplace Langsung

Changed

  • •browse.php: beralih dari kueri DB lokal ke panggilan API langsung ke market.21ces.com/api/market/catalog
  • •item-detail.php: beralih dari DB lokal ke panggilan API /api/market/item dan /api/market/item/versions
  • •CatalogClient.php: URL dasar API diubah dari /api/v1 → /api/market, field respons items[] → data[] diselaraskan

Fixed

Masalah: Blok penerapan tata letak di market.21ces.com/index.php tidak menangani kasus $__noLayout = true, menyebabkan semua rute API plugin (api/market/*) mengembalikan HTTP 200 + respons kosong.

Perbaikan: Menambahkan elseif ($__pageFile && $__noLayout) { include $__pageFile; } di akhir index.php. api/market/catalog, api/market/item, api/market/updates/check, dll. kini berjalan normal.

Added

Menambahkan parameter sort, free, dan featured ke plugins/vos-market/views/api/catalog.php, dengan field respons yang diperluas (sale_price, rating_avg, is_featured, dll.).

Added

Helper mpApiFetch(): meminimalkan permintaan ke server marketplace dengan cache file TTL 30 menit. Menampilkan banner kesalahan jika respons API gagal.

v2.3.5 2026-04-21 · 6 bulan lalu
Logika registrasi lisensi otomatis selesai

Fixed

Masalah: Di AdminRouter, setelah membuat instans $licenseClient = new LicenseClient() dan mencoba registrasi otomatis, pembaruan $_ENV['LICENSE_KEY'] tidak tercermin di $this->licenseKey internal instans — sehingga panggilan check() dalam permintaan yang sama masih mengembalikan unregistered.

Changed

  • •Saat memasuki check(), jika $this->licenseKey kosong, segera panggil /api/license/register
  • •Jika berhasil: perbarui $this->licenseKey + perbarui $_ENV['LICENSE_KEY'] + simpan file .env, lalu lanjut ke tahap verify
  • •Hanya kembalikan unregistered jika gagal (tidak ada respons server)
  • •Metode saveKeyToEnv() baru: mengganti baris LICENSE_KEY= yang kosong (kasus kegagalan install.php) dengan kunci aktual; dilewati jika kunci valid sudah ada

Efek

  • •Pengguna yang menginstal secara manual tanpa install.php → lisensi didaftarkan secara otomatis pada akses admin pertama kali
  • •Pengguna yang memperbarui dari versi lama (tanpa LICENSE_KEY) → didaftarkan secara otomatis pada akses admin pertama kali setelah pembaruan
  • •Pesan dasbor "Lisensi tidak terdaftar" kini hanya muncul ketika server lisensi itu sendiri tidak dapat dijangkau
v2.3.4 2026-04-20 · 6 bulan lalu
Pembersihan Polusi Konten + Penghapusan CSS Kartu

Fixed

File seed database/seeds/legal_pages.php memiliki variabel CSS Tailwind (--tw-scale-x, --tw-pan-x, dll., 400+) yang tertanam secara inline di atribut style="" setiap tag <h1>/<h2>/<p>. Setiap instalasi menyebarkan polusi ini ke DB, membuat halaman terms dan privacy membengkak (khususnya privacy/ko mencapai 128KB; normal hanya 2KB).

  • •database/seeds/legal_pages.php: 442KB → 131KB (pengurangan 70%, sintaks valid)
  • •Membersihkan 26 baris yang sudah terpolusi di DB pengembangan: 1,04MB → 56KB (988KB dihapus, −95%)
  • •scripts/clean-inline-styles.php baru — alat pembersihan massal untuk style="... --tw-* ..." (dapat digunakan kembali jika masalah berulang)

Changed

CSS .board-content mengandung aturan yang memaksa setiap halaman dokumen dikonversi dengan memperlakukan "h2 sebagai header kartu dan h2+p sebagai isi kartu". Hal ini merusak struktur hero halaman yang didesain langsung dengan Tailwind (mis., Brand).

  • •Menghapus 103 baris aturan blok kartu (149 → 45 baris)
  • •Aturan yang tersisa: tipografi dasar (p/h·/blockquote/code/ul/ol/table), kartu tautan OG, override teks dark-mode
  • •Hasil: desain asli halaman Brand dipulihkan (h2 garis biru kiri, hero rata tengah, dll.)
  • •Dokumen hukum (terms/privacy, dll.) sudah cukup ditangani dengan tipografi standar <h1><h2><p> — gaya kartu adalah dekorasi berlebihan
v2.3.3 2026-04-20 · 6 bulan lalu
Rollback Struktur Terjemahan Halaman (Kembali ke Tabel Tunggal)

Changed

Latar belakang: Di versi 2.3.1 konten halaman dipisah menjadi rzx_page_contents untuk sumber bahasa Korea dan rzx_translations untuk bahasa lainnya, lalu di 2.3.2 ditambahkan jalur simpan terpisah di editor. Namun setelah tinjauan ulang desain, ditemukan bahwa dua tabel tersebut memiliki struktur yang pada dasarnya identik (slug/key + locale + content) namun menimbulkan biaya berikut:

  • •Teks sumber Korea disimpan ganda di kedua tabel (untuk pencerminan rantai fallback db_trans)
  • •Logika simpan editor memerlukan percabangan ko vs. non-ko
  • •Tampilan status locale di UI manajemen halaman memerlukan JOIN dua tabel
  • •Alasan awal ("antrian pipeline terjemahan AI terpadu") pun tidak bernilai dalam praktik, karena badan halaman panjang HTML (10 KB) dan string UI pendek (20 byte) memerlukan alur kerja berbeda (pemisahan potongan, pelestarian tag, dll.)

Struktur yang dipulihkan: satu tabel rzx_page_contents, satu baris per locale (desain awal)

Migration

  • •rzx_translations.page.{slug}.title/content × 7 slug × 12 locale non-ko (168 baris) → dipulihkan ke rzx_page_contents
  • •Semua kunci page.* dihapus dari rzx_translations (234 baris)
  • •Target: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy
  • •Diterapkan ke database pengembangan dan produksi

Changed

  • •resources/views/admin/site/pages-edit-content.php — percabangan ko/non-ko dihapus, UPSERT sederhana
  • •resources/views/admin/site/pages-document.php — sama
  • •resources/views/customer/page.php — db_trans('page.*.title/content') dihapus, membaca langsung dari page_contents (rantai fallback locale → en → ko tetap dipertahankan)
  • •resources/views/admin/site/pages.php — judul daftar halaman juga dibaca langsung dari page_contents.title

Kept

rzx_translations itu sendiri dipertahankan — terus digunakan untuk:

  • •Papan tulis (board_post.{id}.title/content)
  • •String UI (menu.*, label pengaturan)
  • •Meta SEO halaman (page.{slug}.browser_title|meta_keywords|meta_description) — string pendek, tepat di sini

Prinsip: string UI/meta pendek → rzx_translations; konten badan halaman panjang → rzx_page_contents, penyimpanan terpisah sesuai karakteristik tiap tipe data.

v2.3.2 2026-04-20 · 6 bulan lalu
Penyelarasan logika penyimpanan terjemahan DB di editor halaman

Changed

Setelah memigrasikan struktur penyimpanan konten halaman di 2.3.1 ke ko asli (rzx_page_contents) + DB terjemahan (rzx_translations), editor admin masih melakukan INSERT/UPDATE semua lokal hanya ke rzx_page_contents — menyebabkan ketidakcocokan dengan format migrasi dan kegagalan kueri dari db_trans() di sisi render. Rilis ini memperbaikinya.

Aturan percabangan (lokal sumber = $_ENV['DEFAULT_LOCALE'] ?? 'ko'):

localetujuan penyimpanan
ko (sumber)rzx_page_contents + pencerminan ke rzx_translations (cadangan untuk db_trans())
en/ja/zh_CN/...hanya rzx_translations (page.{slug}.title, page.{slug}.content)

Saat menyimpan lokal non-sumber, jika tidak ada baris sumber di rzx_page_contents, baris stub dibuat secara otomatis (untuk menjaga koneksi menu/pengaturan). is_active diterapkan secara seragam ke baris sumber.

Changed

Saat membuka halaman edit lokal non-sumber:

1. Pertama cari page.{slug}.title/content + locale dari rzx_translations

2. Kembali ke baris rzx_page_contents lama jika tidak ditemukan (kompatibilitas dengan halaman yang terlewat saat migrasi)

Untuk lokal sumber, hanya rzx_page_contents yang digunakan seperti sebelumnya.

Changed

  • •Penghapusan halaman: juga hapus rzx_translations WHERE lang_key LIKE 'page.{slug}.%'
  • •Perubahan slug: UPDATE massal page.{old_slug}. → page.{new_slug}. di rzx_translations.lang_key
v2.3.1 2026-04-20 · 6 bulan lalu
Page Translation DB Migration + UI Cleanup + Logo Assets

Changed

Metode sebelumnya yang menyimpan baris konten penuh per locale di rzx_page_contents telah disatukan ke metode ko asli + DB terjemahan (rzx_translations). Memastikan konsistensi struktural dengan format penyimpanan papan (board_post.*).

7 halaman target: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy

Before:

rzx_page_contents
├── Brand / ko  (konten penuh)
├── Brand / en  (konten penuh)
├── ... (13 baris locale)

After:

rzx_page_contents
└── Brand / ko  (1 baris asli)

rzx_translations
├── page.Brand.title   × 13 locale (termasuk ko)
└── page.Brand.content × 13 locale

Hasil migrasi:

  • •rzx_page_contents: 7 slug × 12 baris non-ko = 84 baris dihapus
  • •rzx_translations: 7 slug × 13 locale × (title + content) = 182 baris dipindahkan
  • •Diterapkan ke DB pengembangan dan produksi, validasi render berhasil (tampilan per locale normal untuk ko/en, dll.)

Changed

  • •Tombol header "Halaman Baru" dihapus — adalah placeholder yang tidak berfungsi. Halaman dibuat dari manajemen menu sebagai satu-satunya sumber kebenaran.
  • •Ikon tempat sampah 🗑 + handler AJAX + JS deleteUserPage() dihapus — halaman dibersihkan saat menu dihapus, sehingga jalur penghapusan halaman mandiri tidak diperlukan. Mencegah menu rusak akibat penghapusan yang salah.
  • •Dipertahankan: ikon pengaturan ⚙ · edit ✏ · pratinjau 👁

Fixed

  • •Kegagalan upload gambar di Pengaturan > Situs > Gambar Logo: move_uploaded_file() gagal tanpa suara karena subdirektori storage/logos/ tidak ada. Penambahan pembuatan subdirektori otomatis ke handler upload + pembuatan direktori di server pengembangan dan produksi (www-data:www-data, 775).
  • •Prioritas logo tata letak dipulihkan: sempat dibalik menjadi "pengaturan situs lebih dulu", lalu dipulihkan ke tata letak > situs sebagai fallback sesuai kebutuhan "logo khas tata letak". Jika tidak ada logo yang ditetapkan di tata letak, logo situs digunakan secara otomatis.
  • •Target: skins/layouts/{default, minimal, modern, modern-copy-260413}/header.php dan footer.php

Fixed

  • •Hanya mempertahankan baris yang pertama kali dibuat untuk duplikat slug bi-guide / logo-guide (id=186, 187), duplikat id=193, 194 dihapus
  • •Diterapkan ke pengembangan dan produksi. Bug INSERT duplikat di API menu sudah diperbaiki di v2.3.0

Added

Aset logo dibuat di /var/www/_upload/ — unggah ke produksi sesuai kebutuhan:

Ikon (hanya tanda)

  • •voscms-logo-color-{256,512,1024}.png · warna (deep·ocean·sky·ocean + tengah deep)
  • •voscms-logo-mono-{256,512,1024}.png · sky satu warna + gradien opacity 1/0.7/0.48/0.7

Wordmark horizontal (untuk header) — rasio 820×256

  • •voscms-wordmark-{128h,256h,512h}.png · terang (Vos deep + CMS abu-abu)
  • •voscms-wordmark-dark-{128h,256h,512h}.png · gelap (Vos sky + CMS slate-300)

Wordmark vertikal (untuk ikon aplikasi / gambar OG) — rasio 360×420

  • •voscms-stacked-light-{256h,512h,1024h}.png
  • •voscms-stacked-dark-{256h,512h,1024h}.png

Semua SVG asli disimpan. librsvg2-bin terinstal menyediakan CLI rsvg-convert. Masalah dukungan warna OKLCH diselesaikan dengan versi yang dikonversi ke hex (voscms-logo-mono-hex.svg).

v2.3.0 2026-04-20 · 6 bulan lalu
Refaktorisasi Tab Pengaturan Halaman + Sistem Changelog

Added

  • •Tabel DB rzx_changelog baru — catatan independen per versi × locale, pelacakan translation_source (original/ai/manual) + source_hash
  • •Parser RzxLib\Core\Changelog\ChangelogParser — standar Keep a Changelog + daftar putih bagian internal (Infrastructure/Internal/Refactor/Chore/Docs/Test bersifat privat)
  • •Importer ChangelogImporter — penggabungan idempoten, perlindungan terjemahan manual, deteksi perubahan melalui content_hash
  • •Skrip CLI scripts/import-changelog.php — opsi --file --locale --dry-run --silent, dukungan SemVer pre-release (2.1.1-hotfix)
  • •Antarmuka terjemahan RzxLib\Core\Translate\{TranslatorInterface, NullTranslator, TranslatorFactory} — diaktifkan hanya dengan mengganti driver di config/translator.php setelah GPU Gemma 4 (ai.21ces.com) siap
  • •Halaman sistem /changelog didaftarkan (config/system-pages.php), tampilan front-end resources/views/system/changelog/index.php
  • •Skin khusus skins/page/changelog/skin.json — gaya kartu (filled/outlined/flat), warna per bagian, lencana versi, format tanggal, tampilan waktu relatif, sakelar visibilitas bagian internal
  • •Halaman edit /changelog/edit dipisahkan — pratinjau unggah MD, matriks cakupan multibahasa, sakelar dan hapus per versi, tombol terjemahan AI (segera hadir)
  • •Otomasi deployment — langkah 1.5/5 Changelog import ditambahkan ke deploy-voscms.sh: deteksi dan penggabungan otomatis file .md ko + 12 locale
  • •Kunci terjemahan site.pages.changelog ditambahkan untuk 13 locale

Changed

  • •Urutan tab diatur ulang: [Info Dasar] [Izin] [Lanjutan] [Skin] — halaman sistem dapat menambahkan tab sendiri di akhir
  • •Skema settings_tabs diperkenalkan (config/system-pages.php) — halaman sistem mendeklarasikan array tab tingkat atas; setiap entri dirender secara dinamis via key/label/icon/view. Legacy include bawah settings_view dihapus
  • •Prinsip ditetapkan: Pengaturan = tampilan + fungsi / Edit = data — UI manajemen data seperti unggah, versi, dan terjemahan dipisahkan ke /changelog/edit
  • •Strategi penyimpanan MERGE — handler save_settings menggabungkan dengan pengaturan yang ada. Data tab lain tidak terhapus meskipun tab dipisahkan
  • •JS saveSettings() — hanya mengirim field yang ada di DOM. Aman saat beberapa field tidak dirender dalam lingkungan tab terpisah
  • •Posisi kartu layout/skin — dikembalikan ke tab Info Dasar (sesuai umpan balik pengguna). Tab Skin hanya mengelola variabel skin.json
  • •Duplikasi lebar halaman dihapus — field page_width dihapus dari tab Info Dasar (dikonsolidasikan ke content_width skin)
  • •Perataan sub-tab sekunder di service/order — general/domain/hosting/addons dari config/service-settings-tabs.php dipindahkan ke settings_tabs dan dipromosikan sebagai tab tingkat atas

Changed

  • •/{slug}/settings dan /{slug}/edit kini mengenali config/system-pages.php — sebelumnya hanya menanyakan BD rzx_page_contents, menyebabkan halaman sistem mengembalikan 404. Sekarang mengikuti urutan: BD → config
  • •Field edit_view ditambahkan — menentukan langsung jalur file tampilan edit untuk halaman sistem. Klik pada /{slug}/edit langsung menyertakan tampilan tersebut (menghapus hop redirect admin)
  • •Fallback pages-settings.php — halaman sistem tanpa catatan BD kini membangun $pageData dari config, mencegah redirect ke daftar manajemen halaman
  • •URL ikon admin disatukan — /{slug}/settings dan /{slug}/edit menggunakan URL standar front-end

Fixed

  • •menus-api.php: memperbaiki kurangnya pemeriksaan duplikat sebelum INSERT untuk tipe halaman external — mencegah baris duplikat di rzx_page_contents saat menyimpan menu dua kali
  • •Memperbaiki kelalaian pembersihan page_contents tipe external + widget saat menghapus menu — mencegah catatan yatim piatu

Fixed

  • •Latar belakang judul (title_bg_type, title_bg_image, title_bg_video, title_bg_overlay, title_text_color), show_title, show_breadcrumb, custom_css, custom_header_html, custom_footer_html — semua variabel skin halaman standar kini tercermin dalam tampilan publik
  • •Partial _page-title-bg.php kini menerima variabel $_contentWidth — area judul mengikuti lebar konten
  • •Ikon admin dipisahkan dari judul — ditempatkan secara mandiri di kanan atas area konten; selalu terlihat meskipun show_title=0
  • •Menambahkan margin atas 20px di atas area judul (keseimbangan tata letak latar belakang)

Added

  • •Kunci terjemahan site.pages.contact ditambahkan untuk 13 locale (ko/en/ja/zh_CN/zh_TW/de/es/fr/id/mn/ru/tr/vi) — menyelesaikan kelalaian sebelumnya
  • •Panduan sistem manajemen halaman docs/PAGE_ADMIN_GUIDE.md baru — mendokumentasikan struktur tab, skema, routing, izin, dan metode ekstensi
v2.2.2 2026-04-19 · 6 bulan lalu
Peningkatan Widget Stats + Perbaikan Header Admin

Added

  • •Field per item: angka, sufiks, label (multibahasa), ikon, dan warna
  • •Admin widget builder mendukung tambah/edit/hapus item (UI pengeditan tipe stat_items baru)
  • •16 jenis ikon (users, chart, star, heart, check-circle, clock, calendar, globe, shield, lightning, trophy, cart, dollar, building, chat) + 10 pilihan warna
  • •Animasi count-up saat masuk viewport — IntersectionObserver + easeOutCubic 1.4s
  • •Hanya nilai numerik yang dihitung (string seperti 24/7 ditampilkan apa adanya), format koma dan desimal tetap dipertahankan
  • •widget.json v1.1.0 → v1.2.0

Fixed

  • •Diperbaiki masalah admin_name yang tersimpan dengan awalan enc: dan ditampilkan tanpa dekripsi
  • •Diperbaiki masalah pencarian avatar yang salah melakukan LEFT JOIN ke tabel staff yang tidak ada — kini langsung mengambil rzx_users.profile_image sesuai struktur terpadu admin_id = users.id
  • •Awalan baseUrl ditambahkan otomatis ke avatar dengan jalur relatif
v2.2.1 2026-04-19 · 6 bulan lalu
Penangkapan URL (Thumbnail / Screenshot)

Added

  • •Tombol [Ambil Thumbnail] [Ambil Screenshot] disisipkan otomatis di samping setiap field <input type="url"> (termasuk variabel lanjutan tipe url) di semua papan
  • •Thumbnail: render native 1280×960 → output 800×600 (viewport layar pertama)
  • •Screenshot: render native 1280×halaman_penuh → output 800×diperkecil (halaman scroll penuh, tinggi halaman aktual)
  • •UI progress bar bertahap — Menghubungkan ke server → Memuat halaman → Menangkap layar → Membuat gambar → Menyimpan file → Menunggu respons
  • •Thumbnail yang ditangkap otomatis ditetapkan sebagai gambar utama — ditandai board_files.is_primary=1, diprioritaskan oleh widget board-showcase
  • •Rute baru /board/api/url-capture?type={thumbnail|screenshot}&url=... + proxy api-url-capture.php
  • •Aksi set_primary ditambahkan ke /board/api/files — menetapkan salah satu lampiran yang ada sebagai gambar utama

Changed

  • •Kueri gambar lampiran ORDER BY is_primary DESC, id ASC — thumbnail yang ditangkap ditampilkan lebih dulu
  • •Parameter primary_file_pos dikirim ke server saat membuat postingan untuk menentukan indeks file utama
v2.2.0 2026-04-18 · 6 bulan lalu
Pemisahan Marketplace

Changed

  • •Pemisahan produk Marketplace: fungsionalitas yang sebelumnya dibagikan oleh plugin plugins/vos-marketplace/ dipisahkan sebagai produk mandiri → github.com/THEVOSjp/Marketplace repositori baru, deployment independen di market.21ces.com
  • •Plugin hanya mempertahankan "UI sisi pelanggan (menjelajah, membeli, menginstal, lisensi)" — data, penjual, dan penyelesaian ditangani secara eksklusif oleh server marketplace
  • •Titik integrasi API sisi Core diperbarui

Added

  • •Modal setelah pemilihan bahasa — peringatan perlunya backup .env + DB + storage/uploads/, dan peringatan bahwa kehilangan APP_KEY membuat dekripsi tidak mungkin
  • •Konfirmasi dua langkah: checkbox + tombol konfirmasi (instalasi tanpa syarat dilarang)
  • •Terjemahan lengkap ditambahkan untuk 13 bahasa (backup_title/body/item_env/db/uploads/warn/check/confirm/cancel)

Added

  • •scripts/register-widgets-to-marketplace.php — mendaftarkan 28 widget berbasis file ke rzx_mp_items secara massal

Changed

  • •plugins/vos-marketplace/src/CatalogClient.php — URL API default diubah ke https://market.21ces.com/api/v1, path fetchItem() diperbarui, format kueri checkUpdates() diperbarui
  • •plugins/vos-marketplace/plugin.json — nilai default marketplace_api_url diperbarui
  • •rzxlib/Core/Modules/WidgetLoader.php — URL thumbnail kini menyertakan cache-buster ?v={mtime} (untuk menangani cache immutable Cloudflare)

Fixed

  • •widgets/feature-tour/widget.json — pembersihan field
  • •Thumbnail beberapa widget diperbarui (staff, testimonials, feature-tour, shop-map, shop-ranking, stylebook)
v2.1.5 2026-04-17 · 6 bulan lalu

Added

  • •contact-info (v0.1.0) — kartu kontak (alamat/telepon/email/jam buka + gambar + peta kecil)
  • •location-map (v0.1.0) — peta horizontal (Google Maps + info 3 kolom di bawah, lebar dapat disesuaikan)

Added

  • •Refactor penuh halaman pengiriman item — 3 tab (informasi dasar / rilis / penjualan)
  • •Lisensi (GPL/LGPL/BSD/MIT/CC/PD/komersial), URL repositori, URL demo, plugin dependen, gambar banner
  • •Riwayat rilis, informasi penjualan (toggle publik/berbayar, harga diskon/tanggal berakhir), peningkatan UX

Added

  • •Menu Developer (ID:20) dalam 13 bahasa, description/typing_words Hero CTA dilengkapi dalam 12 bahasa

Changed

  • •Perbedaan nama widget diklarifikasi (peta / kartu kontak), fullWidthTypes ditambahkan ke page.php
  • •contact-form kategori → hanya label (kode dihapus, pengaturan widget dapat diedit)

Fixed

  • •board-contents/board-showcase: file_type → mime_type
  • •boards-api: is_shown_in_list tidak ada + batasan JSON options
  • •contact-form POST: pengosongan buffer ob penuh
  • •Hero CTA: escape ganda \n di typing_words/description

DB Changes

  • •rzx_mp_items: license, repo_url, demo_url ditambahkan
  • •rzx_board_extra_vars: is_shown_in_list ditambahkan
  • •rzx_contact_messages: tabel baru
v2.1.4 2026-04-17 · 6 bulan lalu

Added

  • •Widget download-hero — halaman unduhan perangkat lunak (integrasi langsung dengan version.json, 4 bahasa bawaan, fitur utama / persyaratan sistem / riwayat versi)
  • •Halaman /downloads — halaman sistem tipe widget, terjemahan menu 13 bahasa, is_system=1
  • •Widget contact-form (v0.1.0) — widget formulir pertanyaan privat 1:1 (tersedia untuk tamu, pemilihan kategori, perlindungan spam honeypot, pengiriman AJAX)
  • •Widget contact-info — widget tampilan informasi kontak
  • •Widget location-map — widget peta lokasi
  • •Helper bersama rzx_send_mail() — fungsi pengiriman email SMTP baru di rzxlib/Core/Helpers/mail.php
  • •Tabel rzx_contact_messages — tabel DB untuk menyimpan pertanyaan
  • •Halaman /contact — halaman sistem tipe widget, terjemahan menu 13 bahasa

Fixed

  • •Perlindungan penghapusan halaman sistem — konten halaman/widget dipertahankan saat halaman sistem dihapus dari menu (hanya entri menu yang dihapus)
  • •menus-api.php: pemeriksaan ganda via DB is_system + slug config/system-pages.php
  • •menus-js.php: menampilkan pemberitahuan "Hanya akan dihapus dari menu" saat menghapus halaman sistem
  • •Menu halaman sistem multibahasa — saat menambahkan halaman sistem ke menu, label 13 bahasa otomatis terdaftar dari kunci terjemahan site.pages.*
  • •Terjemahan halaman unduhan — terjemahan site.pages.downloads untuk 13 bahasa ditambahkan

Changed

  • •Hero halaman utama — tombol Download → unduhan langsung di /download/voscms-latest.zip, versi diperbarui ke v2.1.1
  • •Auth.php — memanggil helper bersama rzx_send_mail() terlebih dahulu sebelum fallback ke sendSmtpMail
  • •index.php — penambahan pemuatan otomatis helper mail.php
v2.1.3 2026-04-17 · 6 bulan lalu

Changed

  • •Tab Hosting — kartu ringkasan + progress bar penggunaan + tabel info koneksi FTP/DB (ditampilkan otomatis saat dikonfigurasi admin)
  • •Tab Domain — kartu domain + pengaturan utama + tabel info nameserver (ditampilkan otomatis saat dikonfigurasi admin)
  • •Tab Mail — info server mail (IMAP/SMTP) + kartu per akun + perubahan kata sandi inline
  • •Tab Maintenance — kartu info + tanggal terjadwal + riwayat pekerjaan (ditampilkan otomatis saat admin mencatatnya)
  • •Tab Layanan Tambahan — tata letak kartu terpadu
  • •Struktur informasi terpadu sesuai admin partial (admin memasukkan di metadata → otomatis tercermin di halaman saya)

Changed

  • •Area log aktivitas dikurangi dari rasio 1/3 menjadi 1/5
  • •Penghapusan nilai default NS yang di-hardcode di tab domain admin (persiapan integrasi API Cloudflare)

Changed

  • •Alur kerja provisioning direvisi total: subdomain dulu → domain yang dibeli dihubungkan kemudian
  • •Aturan ID provisioning: nama subdomain atau SLD domain yang dibeli
  • •Memanfaatkan tunnel wildcard Cloudflare (tidak perlu menambahkan A record subdomain)
  • •Konfigurasi disk Server 2 diubah: NVMe 256 GB + SSD 2 TB + HDD 8 TB (konfigurasi 3 disk)
v2.1.2 2026-04-16 · 6 bulan lalu

Added

  • •Sistem klasifikasi layanan — kolom service_class ditambahkan (recurring/one_time/free), completed_at tanggal selesai untuk layanan sekali pakai
  • •Detail layanan halaman Saya — /mypage/services/{order} manajemen tab berdasarkan tipe (hosting/domain/mail/pemeliharaan/layanan tambahan)
  • •API manajemen layanan — api/service-manage.php (sakelar perpanjangan otomatis, permintaan perpanjangan, pengaturan domain utama, perubahan kata sandi mail)
  • •Manajemen pesanan admin — /admin/service-orders daftar pesanan + halaman detail, modal status sekali pakai (diterima/sedang diproses/ditahan/dibatalkan/selesai)
  • •Menu admin — menu "Pesanan Layanan" ditambahkan ke sidebar (position: 65)

Added

  • •phone-display — komponen tampilan nomor telepon (helper format_phone() sisi server), tanpa dependensi JS
  • •format_phone() — fungsi PHP pemformatan nomor telepon internasional (Korea/Jepang/AS/Cina/Inggris/Prancis/Jerman/Australia dll.)
  • •Pengaturan domain gratis — manajemen daftar subdomain gratis di pengaturan admin (service_free_domains), dukungan pemilihan beberapa domain

Fixed

  • •Langganan layanan gratis hilang — pesanan gratis tidak membuat catatan langganan untuk domain/tambahan/pemeliharaan dll. → direfaktorisasi untuk membuat semua layanan sekaligus
  • •Persetujuan syarat di bagian pembayaran — kotak centang syarat tersembunyi bersama bagian pembayaran pada pesanan gratis → dipisahkan di luar bagian
  • •Deteksi isFree updateSubmitButton — btn.closest('form') NULL → diperbaiki dengan document.querySelector
  • •Indikator aktif sidebar admin — $adminPath tidak terdefinisi menyebabkan semua menu tidak aktif → deklarasi variabel ditambahkan
  • •Avatar halaman Saya — use Auth + $user = Auth::user() hilang di services.php/service-detail.php
  • •Cek sekali pakai layanan tambahan — bendera one_time di pengaturan admin sekarang tercermin dengan benar di service_class saat memesan
  • •Status awal layanan sekali pakai — diubah untuk dibuat sebagai pending (diterima) bukan active

Changed

  • •Refaktorisasi API pesanan — kode pembuatan langganan dari 3 jalur pembayaran (gratis/kartu/transfer bank) dikonsolidasikan ke fungsi bersama $subscriptionData + _insertSubscriptions()
  • •UI daftar layanan — perluasan inline → tautan kartu + halaman detail terpisah
  • •Tampilan nomor telepon — format_phone() diterapkan ke profil/daftar anggota/daftar staf
  • •Dinamikasi domain gratis — .21ces.net hardcode → merujuk nilai pengaturan admin
v2.1.1-hotfix 2026-04-16 · 6 bulan lalu

Fixed

  • •Kesalahan 404 menu footer — data halaman legal yang hilang (terms, privacy, refund-policy, data-policy, tokushoho, funds-settlement) di tabel rzx_page_contents → dipulihkan dari DB uji coba
  • •Kegagalan unggah gambar/video pada widget builder — memperbaiki masalah di mana POST FormData dari wrapper front-end (page-widget-builder.php) tidak diteruskan ke handler AJAX (kondisi unggah file ditambahkan + penanganan ob_end_clean/exit)
  • •Izin direktori unggahan — pemilik storage/uploads/widgets/ diubah menjadi www-data untuk memberikan akses tulis bagi PHP-FPM

Added

  • •Menu permintaan layanan multibahasa — terjemahan menu_item.19.title untuk 13 bahasa ditambahkan ke tabel rzx_translations
  • •Widget Hero CTA multibahasa — terjemahan 13 bahasa diterapkan pada judul, subjudul, dan teks tombol banner hero halaman Dev
  • •Pratinjau status unggahan — umpan balik visual ditambahkan saat mengunggah gambar/video: sedang diproses (spinner), berhasil (centang), dan gagal (pesan kesalahan)
v2.1.1 2026-04-12 · 6 bulan lalu

Added

  • •Layar pemilihan bahasa Langkah 0 — pilih dari 13 bahasa sebelum instalasi dimulai; seluruh UI tampil dalam bahasa yang dipilih sejak saat itu
  • •File terjemahan instalasi dipisahkan — resources/lang/install.php (13 bahasa × 45 string)
  • •Tingkat anggota multibahasa — Normal/Silver/Gold/VIP dibuat otomatis dalam 13 bahasa

Added

  • •config/admin-menu.php — menu admin inti dipisahkan ke file konfigurasi (dipertahankan saat pembaruan Core)
  • •admin-sidebar.php direfaktor — 731 baris hardcoded → ~200 baris renderer dinamis (berbasis config + plugin.json)
  • •vos-shop plugin.json — menu hardcoded dimigrasikan ke format menus.admin

Added

  • •Menu slide-in — mobile: bilah toggle avatar+nama → overlay slide-in kiri (300ms ease-out)
  • •Latar belakang fade dim — tutup dengan mengklik latar belakang atau tombol X; scroll body dikunci

Added

  • •force_locale — paksa penerapan bahasa default (parameter ?lang=xx memungkinkan pengguna menggantinya)
  • •default_language — kunci konfigurasi install.php ↔ Translator disatukan
  • •Parameter URL — ?lang=xx dideteksi pertama, disimpan ke sesi/cookie

Fixed

  • •Skin FAQ tidak diterapkan — SQL migrasi menjalankan INSERT polos untuk papan default sebelum install.php, menyebabkan INSERT IGNORE diam-diam diabaikan; diperbaiki
  • •source_locale hilang dari tabel translations — kolom tidak ada di migrasi inti → db_trans() gagal sepenuhnya → info pengguna/menu/i18n tidak ditampilkan; diperbaiki
  • •Indikator aktif bilah sisi tab pengaturan — atribut route_prefix ditambahkan agar menu pengaturan tetap aktif di semua sub-rute pengaturan
  • •Bug sisa sesi instalasi — pada instalasi baru tanpa .env, sesi PHP lama menyebabkan Langkah 0 dilewati; diperbaiki
  • •nginx 403 — konflik antara direktori fisik admin/ dan rute diperbaiki (menghapus try_files $uri/)
  • •Versi hardcoded di skrip obfuskasi — obfuscate.php sekarang membaca versi secara dinamis dari version.json

Changed

  • •Tampilan multibahasa widget grid/board-contents — pencarian rzx_translations ditambahkan (locale saat ini → fallback Bahasa Inggris)
  • •Kategori industri situs — diperluas dari 15 menjadi 26 (ditambahkan: korporat, mal belanja, hukum, akuntansi, IT, media, dll.; 13 bahasa)
  • •Pengaturan widget grid — render.php grid-section diubah ke tipe sel native (board-list); judul 13 bahasa
  • •Pemilihan bahasa Langkah 4 — diperluas dari 5 menjadi 13 bahasa; diisi awal dengan bahasa instalasi
  • •Pemilihan zona waktu — diperluas ke 12 zona waktu yang mencakup wilayah pengguna 13 bahasa
v1.26.0 2026-04-01 · 7 bulan lalu

Added

  • •Layanan bundel (set) ditampilkan dalam 3 kolom di bagian atas pemilihan layanan — tema warna amber untuk membedakan secara visual dari layanan individual
  • •Lencana SET, label diskon acara, nama layanan yang disertakan, harga bundel, harga asli dicoret, tampilan tingkat diskon
  • •Memilih bundel secara otomatis memilih semua layanan yang disertakan (harga dihitung sebagai harga bundel)
  • •Layanan yang termasuk dalam bundel tidak dapat di-toggle secara individual (mencegah perhitungan harga yang salah)
  • •Mode penunjukan: tabel rzx_staff_bundles untuk pemfilteran bundel per staf
  • •Parameter bundles diteruskan ke halaman konfirmasi
  • •Dukungan multibahasa: kunci terjemahan kios terkait bundel ditambahkan untuk 13 bahasa

Added

  • •Tombol pergantian tampilan — toggle [Bulan] [Minggu] [Hari] di bilah atas (status aktif: biru)
  • •Tampilan mingguan — sumbu vertikal kiri = hari dalam seminggu, sumbu horizontal atas = sumbu waktu
  • •Gulir horizontal, blok reservasi ditampilkan sebagai bilah waktu
  • •Algoritma jalur: mendeteksi tumpang tindih waktu dan menempatkan secara otomatis di bawah, tinggi baris variabel
  • •Bilah sisi kiri ↔ gulir vertikal kisi disinkronkan
  • •Tampilan harian — horizontal = sumbu waktu, vertikal = jalur (metode yang sama dengan tampilan mingguan)
  • •Rentang waktu berbasis jam operasional — berdasarkan pengaturan business_hour_start/business_hour_end; otomatis diperluas untuk reservasi di luar rentang
  • •Penerusan waktu klik sel kosong — dalam tampilan mingguan/harian: koordinat X klik → perhitungan waktu satuan 15 menit → waktu mulai modal reservasi terisi otomatis
  • •Bilah navigasi atas tetap — overflow-x-hidden + sticky diterapkan; tetap di dalam viewport saat menggulir secara horizontal

Added

  • •Admin > Pengaturan > Umum — UI pengaturan jam mulai/akhir bisnis ditambahkan
  • •Kunci pengaturan DB business_hour_start, business_hour_end
  • •Diterapkan pada rentang waktu default dalam tampilan mingguan/harian kalender

Fixed

  • •Kolom yang hilang di POS add-service — menambahkan penerusan start_time, end_time, staff_id, designation_fee, notes (sebelumnya: waktu sisi server hardcoded, staf/catatan tidak ada)
  • •Pencegahan end_time melewati tengah malam — batas % 24 → min(23:59) diterapkan di ReservationHelper, API start-service, dan calcEnd() formulir pemesanan
  • •Penanganan end_time melewati tengah malam di POS — CustomerBasedAdapter menangani end_time < start_time sebagai melewati tengah malam
  • •Validasi bundel reservasi — diperbaiki agar pembuatan reservasi memungkinkan saat hanya bundel yang dipilih

Changed

  • •Perubahan nama tab: Penerimaan / Daftar Penerimaan / Reservasi
  • •Daftar Penerimaan: sumber walk_in, pos, kiosk, admin — semua status ditampilkan
  • •Reservasi: sumber phone, online — semua status ditampilkan
  • •Urutan pengurutan: Menunggu → Dikonfirmasi → Sedang Digunakan → Selesai → Tidak Hadir → Dibatalkan; dalam status yang sama diurutkan berdasarkan waktu
  • •Baris selesai/dibatalkan/tidak hadir: ditampilkan dengan opacity-50, lencana tidak ditugaskan terlihat

Changed

  • •Lencana selesai: diubah dari abu-abu → hijau
  • •Lencana dibatalkan/tidak hadir ditambahkan (disembunyikan jika jumlah 0)

Added

  • •Bagian bawah kartu: tombol tidak hadir ditambahkan untuk kartu status menunggu (ikon larangan), tombol batal diubah menjadi merah
  • •Modal detail: tombol aksi tidak hadir ditampilkan untuk status pending dan confirmed
  • •Tidak hadir massal grup: fungsi POS.noShowAllServices() ditambahkan

Fixed

  • •Navigasi kembali detail reservasi — <a href="/reservations"> → history.back(), kembali ke halaman sebelumnya
  • •Multibahasa: kunci terkait pergantian tampilan kalender (bulan/minggu/hari), bundel, jam operasional ditambahkan untuk 13 bahasa
v1.25.0 2026-04-01 · 7 bulan lalu

Architecture

  • •POS dipisah menjadi struktur plugin mandiri
  • •resources/views/admin/reservations/pos-*.php → dipindah ke direktori resources/views/admin/pos/
  • •Fitur POS diaktifkan/dinonaktifkan otomatis berdasarkan keberadaan direktori pos/ (pemeriksaan is_dir())
  • •Menu sidebar: menu POS otomatis disembunyikan jika direktori pos/ tidak ada
  • •Perutean index.php: rute POS dinonaktifkan jika direktori pos/ tidak ada
  • •pos/_init.php → mendelegasikan ke _init.php umum reservasi (berbagi DB, autentikasi, i18n)
  • •Endpoint API tetap berada di reservations/_api.php (kompatibilitas mundur terjamin)

Added

  • •Modal pembayaran terpadu — penggunaan simultan poin + tunai + kartu (pembayaran gabungan)
  • •Poin: cek saldo, input manual atau gunakan seluruh saldo
  • •Tunai: input jumlah
  • •Kartu: input jumlah + tombol isi otomatis "gunakan sisa saldo"
  • •Cicilan: pembayaran sekaligus / pilihan 2–12 bulan
  • •Kalkulasi otomatis total, kembalian, dan kekurangan secara real-time
  • •Untuk pembayaran kartu Stripe, tunai/poin diproses hanya setelah pembayaran kartu berhasil (aman saat dibatalkan)
  • •Modal detail layanan — tampilan poin
  • •Saldo poin anggota selalu ditampilkan di area header (tetap ditampilkan meski saldo 0)
  • •Modal detail layanan — perbaikan lencana staf
  • •Lencana ditugaskan/ditunjuk ditampilkan sebelum nama staf (sebelumnya: di bawah nama)
  • •Pemindahan tombol struk/cetak
  • •Dipindah ke atas bagian detail pelanggan, struk (kiri) + cetak (kanan)
  • •Peningkatan fungsi cetak
  • •Mencetak konten modal detail layanan saat ini, bukan membuka halaman eksternal

Changed

  • •Tata letak kartu — berbasis grid → kartu ukuran tetap dengan flex-wrap
  • •Ukuran kartu tetap: default 320×240px (small: 260×200, large: 380×280)
  • •Ukuran kartu tidak berubah mengikuti lebar layar; otomatis membungkus baris baru
  • •Modal pembayaran kartu — diperluas ke lebar 1030px, tinggi 800px

Fixed

  • •Kesalahan cross-origin API teratasi
  • •$baseUrl dikodekan keras ke APP_URL di .env, menyebabkan kegagalan fetch dari host/HTTPS lain
  • •Dashboard: URL fetch diubah ke jalur relatif (/update-api.php)
  • •_init.php reservasi: $baseUrl diubah ke string kosong agar semua fetch menggunakan jalur relatif
  • •Masalah mixed-content di lingkungan proxy HTTPS Cloudflare sepenuhnya teratasi
  • •Kesalahan eksekusi migrasi DB — "Failed to fetch" teratasi (masalah cross-origin)
  • •Bug pra-proses tunai saat batal pembayaran gabungan Stripe
  • •Sebelum: tunai diproses lebih dulu → tunai sudah diproses saat pembayaran kartu dibatalkan
  • •Sesudah: tunai/poin diproses hanya setelah pembayaran kartu Stripe berhasil

i18n

  • •pos_pay_after_points — jumlah setelah poin diterapkan
  • •pos_pay_proceed — lanjutkan pembayaran
  • •pos_pay_remainder — gunakan seluruh sisa saldo
  • •pos_pay_installment — cicilan
  • •pos_pay_lump_sum — pembayaran sekaligus
  • •pos_pay_months — bulan
  • •pos_pay_total_pay — total
  • •pos_pay_short — kekurangan
  • •show_receipt — struk
  • •show_print — cetak
v1.18.0 2026-03-29 · 7 bulan lalu

Added

  • •Fungsi format tanggal multibahasa — formatReservationDate($dateString, $locale)
  • •Mendukung 13 bahasa (ko, en, ja, zh_CN, zh_TW, de, es, fr, id, mn, ru, tr, vi)
  • •Melokalisasi tanggal dan hari secara otomatis di halaman detail reservasi
  • •Fallback: locale yang tidak didukung → format bahasa Inggris

Changed

  • •Pemrosesan multibahasa halaman detail reservasi
  • •Nama layanan, nama staf, dan nama bundel dilokalisasi (berdasarkan tabel translations di DB)
  • •Mengintegrasikan fungsi format tanggal
  • •Label status pembayaran dilokalisasi (field payment_status)
  • •Dukungan multibahasa untuk status pembayaran
  • •Menambahkan bagian payment ke semua file bahasa (11 bahasa)
  • •Terjemahan untuk: belum dibayar, lunas, pembayaran sebagian, dikembalikan

Fixed

  • •Halaman detail reservasi: nama staf dan layanan yang sebelumnya tidak dilokalisasi kini tampil dengan benar
  • •Label status pembayaran: memperbaiki masalah yang hanya tampil dalam bahasa Korea
  • •Pemrosesan multibahasa disatukan berbasis fungsi _tr()

Layout & UI

  • •Lebar halaman disamakan (max-w-5xl → max-w-7xl)
  • •Halaman papan (daftar, baca, tulis): max-w-5xl → max-w-7xl
  • •Halaman eksternal (page.php): nilai default dan nilai pengaturan DB diperbarui
  • •Detail reservasi / pencarian reservasi / halaman staf: nilai pengaturan DB diperbarui
  • •Hasil: semua lebar halaman kini seragam dengan halaman pemesanan

Documentation

  • •Menambahkan dokumentasi rinci untuk formatReservationDate() di COMPONENT_MANUAL.md
  • •Bahasa yang didukung dan tabel format
  • •Contoh penggunaan dan struktur internal
  • •Catatan dan fungsi terkait
v1.16.0 2026-03-23 · 7 bulan lalu

Added

  • •Bilah menu bawah mobile — Staf / Reservasi / Beranda / Login (atau Saya) / Daftar / Lainnya, dengan sorotan halaman aktif
  • •Panel mobile "Lainnya" — menu utama + Halaman Saya / Keluar
  • •Pengaturan tata letak/skin benar-benar diterapkan — site_layout, site_page_skin, site_board_skin, site_member_skin → tercermin dalam rendering
  • •Parameter no_layout — hanya konten tanpa tata letak (untuk pratinjau)
  • •Kunci terjemahan ditambahkan — common.nav.staff, common.nav.more (13 bahasa)

Fixed

  • •Menerapkan tata letak pada halaman anggota (login/register/forgot/reset): menghapus header duplikat dengan mengekstrak <main> skin
  • •Memperbaiki kesalahan deklarasi duplikat ImageCropper/ProfilePhotoCropper pada skin anggota
  • •Memperbaiki masalah include_once pemuat menu: menu base-header hilang saat dimuat pertama dalam closure skin
  • •apple-mobile-web-app-capable deprecated → mobile-web-app-capable (8 file)
  • •Menyembunyikan tombol login/daftar di header pada mobile (digantikan oleh bilah menu bawah)
  • •Dukungan iOS safe-area untuk bilah menu bawah

Changed

  • •Halaman anggota digabungkan dari tata letak mandiri ke tata letak default (login/register/forgot/reset)
  • •Margin bawah footer dihapus (bilah menu mobile menggunakan posisi fixed)
v1.15.3 2026-03-22 · 7 bulan lalu

Added

  • •Panel pengaturan detail layout — pemuatan AJAX formulir pengaturan berbasis SkinConfigRenderer
  • •Pengaturan menu layout — bagian menus pada layout.json → pembuatan dropdown sitemaps DB secara otomatis
  • •Dukungan tab SkinConfigRenderer — menambahkan properti tab ke vars secara otomatis menghasilkan UI tab
  • •Refaktorisasi SkinConfigRenderer — metode tunggal renderVar() yang terpadu, pemisahan renderFormFlat/renderFormWithTabs, renderDependsOnJs bersama
  • •Ekstensi layout.json — menus (GNB/FNB), 14 vars (header/logo/warna/footer/custom), 13 bahasa
  • •Integrasi pratinjau layout — memilih "Nonaktifkan" menampilkan pratinjau dengan ?no_layout=1

Fixed

  • •Kueri menu manajemen layout: koreksi nama tabel rzx_menus → rzx_sitemaps
  • •Penyesuaian lebar panel tengah + whitespace-nowrap pada tautan aksi

Pending

  • •Penerapan nilai pengaturan layout/skin ke rendering halaman sesungguhnya (sesi berikutnya)
v1.15.2 2026-03-22 · 7 bulan lalu

Added

  • •Halaman manajemen tata letak — struktur 3 panel: kiri pratinjau+menu, kanan daftar skin, panel pengaturan detail
  • •Per item skin: thumbnail + tautan aksi pengaturan detail/buat salinan/hapus
  • •Opsi "Nonaktifkan" / "Pasang skin lain"
  • •Penyimpanan 4 kategori: tata letak, halaman, papan, anggota (site_layout, site_page_skin, site_board_skin, site_member_skin)

Changed

  • •"Manajemen desain" → diubah nama menjadi "Manajemen tata letak" (13 bahasa: admin.php + site.php)
v1.15.1 2026-03-22 · 7 bulan lalu

Changed

  • •15 halaman manajemen situs → header bersama _head.php diterapkan
  • •Papan: boards, boards-create, boards-edit, boards-trash
  • •Menu: menus
  • •Desain: design
  • •Halaman: pages, pages-settings, pages-edit-content, pages-document, pages-compliance, pages-widget-builder
  • •Widget: widgets, widgets-create, widgets-marketplace
  • •Halaman mode embed (boards-edit, pages-settings, pages-edit-content) hanya menerapkan _head.php saat tidak dalam mode embed
  • •Unifikasi header/tata letak seluruh halaman admin selesai
v1.15.0 2026-03-22 · 7 bulan lalu

Added

  • •Modul widget sistem — 4 widget: staff (perkenalan staf), booking (buat reservasi), lookup (cari reservasi), cta001 (banner ajakan reservasi)
  • •Halaman sistem — staff, booking, lookup didaftarkan di DB (is_system=1) + routing (/staff, /booking, /lookup)
  • •Rendering halaman berbasis widget — halaman staff/booking/lookup merender widget saat dipasang, kembali ke rendering lama jika tidak ada widget
  • •Pendaftaran widget otomatis ke DB — memanggil syncToDatabase() otomatis mendaftarkan widget saat direktori widget ditambahkan
  • •Kategori widget system — diterjemahkan ke 13 bahasa (widgets.categories + widget_builder.cat)
  • •Penyatuan daftar halaman — rendering loop halaman sistem + set ikon gear/edit/pratinjau yang seragam
  • •Penyatuan header halaman admin — $pageSubTitle + $pageSubDesc (output bersama melalui _head.php)
  • •Kunci terjemahan ditambahkan — staff.admins, staff.attendance.report/stats, points.description, dll.

Fixed

  • •page_slug = 'home' hardcoded di widget builder → penanganan dinamis $_GET['slug']
  • •AJAX save/preview widget builder home hardcoded → $pageSlug dinamis
  • •URL pratinjau widget builder → $pageSlug dinamis (home tetap → per halaman)
  • •require WidgetLoader yang hilang di widget preview_widget — diperbaiki
  • •Jalur gambar tampilan kartu layanan (awalan /storage/)
  • •Lebar pengaturan kios max-w-3xl → 100% diseragamkan
  • •Header POS "Manajemen Reservasi" → diubah menjadi "POS"

Changed

  • •10 halaman manajemen staf + 4 halaman manajemen anggota → header umum _head.php diterapkan
  • •Halaman kios/bundle dengan _head.php diterapkan
  • •Pengaturan bahasa kios grid → flex-wrap responsif
  • •Daftar halaman: halaman sistem dirender melalui loop berbasis data
v1.14.1 2026-03-22 · 7 bulan lalu

Added

  • •Tab skin halaman — informasi dasar skin + pengaturan variabel diperluas (berbasis SkinConfigRenderer)
  • •Skin diterapkan ke semua tipe halaman — pengaturan skin berlaku untuk document/widget/external sekaligus
  • •Sistem latar belakang judul — latar belakang gambar/video + overlay + warna teks (partial umum _page-title-bg.php)
  • •Sistem depends_on — deklarasi ketergantungan antar field di skin.json, renderer menghasilkan JS secara otomatis (dukungan checkbox/radio)
  • •Upload file skin — upload gambar/video via multipart (storage/skins/page/{skin}/)
  • •Pemilih tata letak/skin berbentuk kartu — diubah ke UI kartu thumbnail di tab informasi modul
  • •Sistem SEO — helper SEO, pola judul, meta tag OG/Twitter, ekstraksi konten
  • •Upload OG Image — input URL + upload file + pratinjau
  • •Modal hasil umum — UI modal simpan berhasil/gagal terpadu (dukungan 13 bahasa)
  • •Tampilan kartu layanan — kartu latar belakang gambar penuh + tombol beralih tabel/kartu
  • •Pengurutan layanan drag-and-drop — mengubah urutan + menyimpan ke DB di kedua tampilan
  • •Penugasan/penunjukan staf reservasi — 2 tombol (tugaskan/tunjuk) di detail reservasi
  • •UI jalur reservasi — pilihan reservasi telepon / kunjungan langsung / online
  • •Pengaturan reservasi telepon — toggle aktif/nonaktif di pengaturan dasar layanan
  • •Header keamanan — X-Frame-Options + CSP frame-ancestors
  • •PAGE_SYSTEM.md — dokumentasi pengembangan sistem halaman
  • •PRD_OrderSystem.md — dokumen perencanaan sistem pemesanan meja
  • •PRD_KioskSystem.md — dokumen perencanaan sistem kiosk

Fixed

  • •Pengaturan favicon DB diterapkan (front / admin / skin layout — 4 tempat)
  • •URL migrasi dashboard window.location.origin → $baseUrl (lingkungan subdirektori)
  • •URL API mode embed pengaturan halaman → path admin ditentukan langsung
  • •Modal hasil i18n: menggunakan pesan locale saat render halaman, bukan respons API
  • •Fallback nilai skin kosong di tab skin ("" → default)
  • •Masalah konsumsi ganda php://input di pages-settings.php terselesaikan

Changed

  • •Kiosk / pengaturan kiosk / halaman bundle → header bersama _head.php diterapkan
  • •Penyimpanan pengaturan skin JSON → transfer FormData (multipart) (dukungan upload file)
  • •Parameter $baseUrl ditambahkan ke SkinConfigRenderer (pratinjau gambar/video)
  • •Terjemahan skin 13 bahasa (skin.json + site.php + common.php)
v1.13.0 2026-03-21 · 7 bulan lalu

Added

  • •Sistem halaman selesai — pembuatan halaman otomatis saat membuat halaman dokumen/widget/eksternal dari menu
  • •Renderer halaman dinamis — page.php (dokumen→HTML, widget→WidgetRenderer, eksternal→iframe/include)
  • •Pengaturan lingkungan halaman — 3 tab (dasar / tata letak & skin / SEO), disimpan sebagai JSON page_config_{slug}
  • •Pengeditan konten halaman — pengeditan judul & konten per bahasa, perubahan slug, perubahan tipe, hapus
  • •Daftar manajemen halaman dinamis — memuat halaman pengguna secara otomatis dari DB, ikon & badge berdasarkan tipe
  • •Ikon admin front-end — ikon roda gigi (pengaturan) + edit (konten) ditampilkan terpisah
  • •iframe halaman eksternal — panduan "buka di jendela baru" ditampilkan saat gagal memuat
  • •File PHP/HTML internal — dirender di dalam tata letak RezlyX via include

Fixed

  • •URL pintasan menu #menu_{id} → menyimpan URL menu yang sebenarnya
  • •Pengeditan menu menampilkan struktur UI pintasan yang sama seperti saat pembuatan
  • •Penyimpanan menu mencerminkan URL pintasan (formMenuType → dasar visibilitas panel)
  • •Terjemahan menu ditambahkan untuk 13 bahasa (12 item menu × 13 bahasa)
  • •Jalur kunci terjemahan editor dokumen halaman diperbaiki (admin.site.pages. → site.pages.)

Changed

  • •Kolom page_type ditambahkan ke DB rzx_page_contents (document/widget/external)
  • •Penghapusan menu kini juga menghapus halaman terkait + data terjemahan sekaligus
v1.12.5 2026-03-21 · 7 bulan lalu

Fixed

  • •Memperbaiki URL pintasan menu — sekarang menyimpan URL menu yang sebenarnya, bukan #menu_{id}
v1.12.4 2026-03-21 · 7 bulan lalu

Fixed

  • •Jenis daftar pengaturan skin tidak diterapkan — memperbaiki masalah di mana cache localStorage menimpa pengaturan skin
  • •Saat pergantian gaya dinonaktifkan, hanya pengaturan skin yang digunakan; saat diaktifkan, localStorage diprioritaskan
  • •Menghapus pengiriman duplikat field hidden checkbox (status tidak dicentang kini ditangani di JS)
v1.12.3 2026-03-20 · 7 bulan lalu

Fixed

  • •Kunci terjemahan papan tulis yang hilang untuk bahasa Inggris/Jepang (source_locale, reply, style, board_settings, dll.)
  • •Menerapkan fallback multibahasa untuk nama kategori (locale → en → asli)
  • •Dukungan multibahasa untuk isi daftar papan tulis (pratinjau webzine/kartu/galeri)
v1.12.2 2026-03-20 · 7 bulan lalu

Fixed

  • •Fallback multibahasa isi daftar papan — isi terjemahan diterapkan pada pratinjau webzine/kartu/galeri (lokal → en → asli)
  • •File skin produksi yang hilang — direktori skins/default/board/ dibuat via FTP dan skin.json/thumbnail diunggah
v1.12.1 2026-03-20 · 7 bulan lalu

Fixed

  • •Pengaturan skin tidak ditampilkan di produksi — sinkronisasi file lengkap diatur ulang
  • •Struktur file CLAUDE.md + BOARD_SYSTEM.md diperbarui sepenuhnya
v1.12.0 2026-03-20 · 7 bulan lalu

Added

  • •Sistem pengaturan skin selesai — pembuatan formulir dinamis berbasis skin.json + diterapkan pada papan nyata
  • •Pengelompokan bagian (dasar / daftar / tautan / desain / latar belakang judul / kustom)
  • •Menambahkan tipe input radio dan video
  • •Upload file gambar/video (FormData multipart)
  • •Fitur penghapusan gambar/video
  • •Tabel informasi skin (pembuat / URL / email / tanggal / versi / thumbnail)
  • •Gambar/video latar belakang judul — pengaturan jenis latar belakang, tinggi, opasitas overlay, dan warna teks
  • •4 gaya tata letak daftar — daftar / webzine / galeri / kartu; file skin dipisah + dukungan override
  • •Galeri: cover gambar penuh + animasi slide saat hover
  • •Webzine: thumbnail + judul + pratinjau + kartu meta-info
  • •Kiriman pengumuman dipisahkan ke daftar bagian atas (_list-notices.php)
  • •Pengaturan skin diterapkan — primary_color, border_radius, posts_per_row, allow_style_switch, show_category, papan tertaut, Font Awesome, CSS/HTML kustom
  • •Auto-merge nilai default skin.json — nilai default skin.json diterapkan meskipun tanpa penyimpanan DB

Fixed

  • •skin_config tidak tersimpan ke DB (aksi update boards-api.php tidak menyertakan skin_config)
  • •Penyimpanan skin diubah dari URLSearchParams → FormData (multipart) untuk mendukung upload file
  • •Dukungan parsing otomatis untuk array $_POST['skin_config']
v1.11.3 2026-03-20 · 7 bulan lalu

Fixed

  • •Menerapkan fallback multibahasa untuk judul postingan sebelumnya/berikutnya pada halaman detail postingan (locale → en → asli)
v1.11.2 2026-03-20 · 7 bulan lalu

Fixed

  • •Fallback multibahasa judul daftar papan — memuat terjemahan di semua lokal (pembatasan bahasa Korea dihapus), fallback bahasa Inggris dengan mempertimbangkan bahasa sumber
v1.11.1 2026-03-20 · 7 bulan lalu

Fixed

  • •Peningkatan deteksi URL mandiri untuk kartu OG — sekarang menelusuri ke atas hingga elemen blok induk, sehingga URL yang dibungkus dalam tag inline seperti <font> / <span> ditangani dengan benar
v1.11.0 2026-03-20 · 7 bulan lalu

Added

  • •Tautan otomatis URL — mendeteksi URL secara otomatis di isi/editor papan → mengonversinya menjadi tag <a>
  • •Kartu pratinjau tautan OG — kartu format banner SNS (thumbnail + judul + deskripsi + domain) dibuat otomatis
  • •Editor: masukkan/tempel URL + Enter → memanggil OG API → menyisipkan kartu
  • •Isi: tautan URL mandiri → dikonversi otomatis menjadi kartu OG
  • •Modul OgFetcher — ekstraksi metadata OG/Twitter Card, favicon, penanganan encoding otomatis
  • •OG API — endpoint /board/api/og
  • •board-autolink.js — JS terpadu auto-link + kartu OG (dimuat secara global dari base-header)
v1.10.2 2026-03-20 · 7 bulan lalu

Fixed

  • •Perataan gambar editor/konten — menimpa img { display: block } dari Tailwind preflight
  • •Membuat CSS bersama board-content.css (menyatukan tampilan editor + konten)
  • •Dimuat secara global dari base-header.php (semua halaman frontend)
  • •Menambahkan gaya editor global ke multilang-modal.php (semua instans Summernote di admin)
  • •Menghapus kelas prose dari konten papan; gaya inline dari editor kini dipertahankan 100%

Changed

  • •Mendokumentasikan aturan gaya konten papan di CLAUDE.md (kelas board-content wajib digunakan)
v1.10.1 2026-03-20 · 7 bulan lalu

Fixed

  • •Memperbaiki bug di mana data kategori sebelumnya dimuat di modal multibahasa saat menambahkan kategori papan (menghasilkan langKey sementara yang unik)
  • •Menambahkan nilai default comment_max_depth sebesar 3 pada migrasi 021
v1.10.0 2026-03-20 · 7 bulan lalu

Added

  • •Variabel perluasan papan — modul komponen ExtraVarRenderer (15 jenis: rendering input/display per jenis)
  • •Internasionalisasi variabel perluasan — penyimpanan mandiri nilai variabel perluasan per bahasa (integrasi rzx_translations, rantai fallback)
  • •Penyimpanan terpisah multibahasa posting papan — saat diedit dalam bahasa asli disimpan langsung ke board_posts; bahasa lain menyimpan terjemahan ke rzx_translations
  • •Rantai fallback baca posting papan — menampilkan judul/isi/variabel perluasan secara berurutan: locale saat ini → en → asli
  • •Balasan bersarang — dukungan komentar bersarang 3 level, pengurutan pohon rekursif, formulir balasan inline
  • •Suka/Tidak suka komentar — tombol like per komentar + API
  • •Akses frontend ke pengaturan papan — ikon roda gigi admin → /board/{slug}/settings tata letak frontend
  • •Tautan judul admin papan — mengklik judul di daftar papan admin berpindah ke papan tersebut

Fixed

  • •Pemeriksaan izin admin API papan: $currentUser['role'] → $_SESSION['admin_id'] (4 file diperbarui)
  • •Pesan pemberitahuan bahasa asli hanya ditampilkan ke penulis/admin
  • •Tautan tab mode embed pengaturan papan mendukung URL frontend

Changed

  • •Menambahkan kolom JSON extra_vars ke DB rzx_board_posts
  • •Nilai default comment_max_depth diubah dari 0 → 3
  • •Bilah aksi komentar disatukan (ikon suka/tidak suka/balas/hapus)
v1.9.4 2026-03-20 · 7 bulan lalu

Added

  • •Data papan default — migrasi papan pengumuman, tanya jawab, FAQ, dan papan bebas (020_default_boards_v193.sql)
v1.9.3 2026-03-20 · 7 bulan lalu

Added

  • •Reset grup anggota — inisialisasi dengan data default (7 grup + terjemahan dalam 13 bahasa)
  • •Reset pengaturan poin — kembalikan nilai konfigurasi / poin level / tautan grup ke default (saldo anggota tidak terpengaruh)
  • •Grup anggota multibahasa — komponen umum rzx_multilang_input() diterapkan pada nama grup / deskripsi manfaat
  • •Drag-and-drop grup anggota — pengurutan kartu dengan SortableJS + simpan otomatis

Fixed

  • •Tampilan terjemahan kartu grup anggota per locale (tampilan kartu + modal edit)
  • •Kerusakan data terjemahan multibahasa grup anggota diperbaiki (re-simpan UTF-8 di PHP)
  • •Nama kolom papan pengaturan modul poin dikoreksi (board_name → title)
  • •Konflik collation di daftar anggota poin diselesaikan (diseragamkan ke utf8mb4_unicode_ci)
  • •Migrasi DB produksi (019_point_system_v190.sql)
v1.9.0 2026-03-20 · 7 bulan lalu

Added

  • •Sistem manajemen poin (kredit) — struktur 3 tab (Pengaturan Dasar / Pengaturan Per-Modul / Daftar Poin Anggota)
  • •Struktur 3 field poin — point (poin aktivitas), balance (kredit pembayaran), total_accumulated (poin kumulatif, dasar perhitungan level)
  • •Pembobotan poin kumulatif — bobot pembayaran / bobot aktivitas terpisah, kenaikan level preferensial untuk pelanggan yang membayar
  • •Penukaran poin — konversi poin → kredit (rasio, satuan, minimum poin dapat dikonfigurasi)
  • •17 kategori pemberian/pengurangan poin — struktur sama dengan Rhymix (ditarik kembali saat dihapus, batas waktu, pengumuman dikecualikan)
  • •Pengaturan per-modul — konfigurasi individual 15 item poin per papan
  • •Daftar poin anggota — 4 kolom (poin/kredit/kumulatif/level), pencarian, pengeditan individual
  • •Poin level — perhitungan berbasis rumus, penyesuaian level tertinggi dinamis, tautan grup
  • •Dokumentasi sistem poin — POINT_SYSTEM.md dokumen desain terperinci
  • •Drag-and-drop grup anggota — ubah urutan kartu dengan SortableJS + simpan otomatis
  • •Multibahasa grup anggota — komponen umum rzx_multilang_input() diterapkan pada nama grup/deskripsi manfaat
  • •Data seed grup anggota — 7 grup × 13 bahasa data terjemahan multibahasa

Changed

  • •Menambahkan kolom balance, total_accumulated ke DB rzx_member_points
  • •Mengubah rzx_point_levels.group_id dari INT ke CHAR(36) di DB (kompatibel UUID)
  • •Menyatukan kolasi rzx_point_levels, rzx_member_points ke utf8mb4_unicode_ci
  • •Memperbarui tata letak halaman bundle (sidebar-main-content → pola dasbor flex-1 ml-64)
  • •Memperbaiki satuan mata uang halaman bundle $config['currency'] → $siteSettings['service_currency']
  • •Mengubah durasi layanan dari select → input number + datalist
  • •Mendokumentasikan aturan UI input multibahasa di CLAUDE.md (penggunaan wajib rzx_multilang_input)
v1.8.3 2026-03-20 · 7 bulan lalu

Added

  • •Halaman manajemen detail bundle — edit info dasar bundle, upload gambar sampul, edit komposisi layanan, tautkan staf, toggle aktif/nonaktif
  • •Diskon event — harga event per bundle, periode (mulai/selesai), pengaturan label; diaktifkan otomatis dalam periode
  • •Desain kartu daftar bundle — tata letak kartu grid, header gambar, lencana event/diskon, bilah aksi yang ditetapkan di bawah
  • •Gambar latar paket yang direkomendasikan — latar gambar sampul + overlay gradien pada kartu bundle di halaman detail staf pelanggan
  • •Input langsung durasi layanan — select → input angka (5–480 menit, langkah 5 menit) + daftar rekomendasi datalist

Changed

  • •DB rzx_service_bundles kolom ditambahkan: event_price, event_start, event_end, event_label
  • •API daftar bundle: total_duration dan kolom event ditambahkan
  • •File terjemahan (ko, en, ja): kunci manajemen detail bundle + diskon event ditambahkan
v1.8.1 2026-03-19 · 7 bulan lalu

Added

  • •Halaman pengaturan POS — ukuran kartu, tampilan gambar/harga/telepon, opasitas, tab default, auto-refresh, suara notifikasi, penugasan staf wajib, penugasan otomatis
  • •Pengaturan POS diterapkan — ukuran kartu/gambar/harga/telepon/opasitas/auto-refresh/tab default semua tercermin di POS
  • •Penugasan staf otomatis — saat diaktifkan di pengaturan POS, otomatis menugaskan staf saat check-in kios (mampu melayani + reservasi hari ini paling sedikit)
  • •Lencana staf kartu POS — indikator ditugaskan/belum ditugaskan; tombol lanjutkan dinonaktifkan jika belum ditugaskan
  • •Latar belakang gambar layanan POS — gambar layanan utama sebagai latar belakang pada header + area pelanggan modal detail layanan
  • •Staf is_visible — mengontrol visibilitas daftar; staf tersembunyi dikecualikan dari reservasi/POS/kios
  • •Banner kartu staf — gambar banner + lencana status pada kartu staf admin
  • •Penugasan otomatis kios — check-in dengan staff_id=NULL; penugasan dilakukan oleh admin di POS

Fixed

  • •Penugasan staf POS: daftar layanan segera diperbarui setelah penugasan (pencegahan cache)
  • •Perbaikan parameter API penugasan staf (reservation_id → reservation_ids[])
  • •Banyak tabel/kolom yang hilang diperbaiki di produksi (migrasi 018 diperkuat)
  • •Rute logout admin ditambahkan
  • •Penempatan rute pra-autentikasi kios
v1.7.0 2026-03-18 · 7 bulan lalu

Added

  • •Sistem tata letak dasar — layouts/base-header.php + base-footer.php, ob_start otomatis diterapkan di index.php, header/footer bersama untuk semua halaman pelanggan
  • •Front-end papan pengumuman — halaman daftar, detail, tulis/edit, editor Summernote, lampiran file drag & drop
  • •URL singkat papan pengumuman — akses /free, /notice/3, dll. tanpa awalan /board/; pencocokan slug DB otomatis
  • •Halaman pencarian reservasi — URL singkat /lookup, pencarian berdasarkan nomor reservasi / email / telepon
  • •Halaman detail reservasi — /booking/detail/{nomor}, gelembung salam staf, info layanan/pembayaran/pembatalan
  • •Halaman pembatalan reservasi — /booking/cancel/{nomor}, input alasan pembatalan
  • •Detail reservasi di halaman saya — /mypage/reservations/{id}, bilah sisi + informasi detail
  • •Papan pengumuman multibahasa — original_locale (bahasa draf pertama) + source_locale (bahasa konten saat ini), rantai fallback (source → en → original)
  • •Salam staf — greeting_before (sebelum perawatan) + greeting_after (setelah perawatan), multibahasa, ditampilkan sesuai status reservasi
  • •Dropdown profil admin — foto profil/inisial + nama + tautan ke beranda / halaman saya / keluar
  • •Tautan admin di header pelanggan — saat login sebagai admin, dropdown menampilkan tautan ke panel admin

Changed

  • •Tata letak terpadu untuk semua halaman pelanggan (struktur HTML individual dihapus, LayoutManager diterapkan otomatis)
  • •Kondisi tampilan kategori papan berubah dari show_category menjadi hide_categories
  • •URL papan berubah dari /board/free menjadi URL singkat /free secara default
  • •"Admin" di topbar admin diganti dengan nama login sebenarnya + foto profil

Fixed

  • •Kolom rzx_users.role tidak ada → deteksi admin kini berdasarkan $_SESSION['admin_id']
  • •Kolom rzx_users.nick_name tidak ada → menggunakan name + dekripsi Encryption
  • •rzx_staff.profile_image → dikoreksi ke nama kolom avatar
  • •Konversi tipe int→string pada category_id di model Service
  • •Pencarian reservasi berdasarkan email/telepon menggunakan pencarian teks biasa (data tidak terenkripsi)
v1.6.1 2026-03-18 · 7 bulan lalu

Added

  • •6 tab admin papan — Pengaturan dasar, Manajemen kategori, Variabel tambahan, Izin, Pengaturan tambahan, Skin
  • •Konsolidasi tab pengaturan dasar — Info dasar + SEO + Pemilihan layout + Pemilihan skin + Tampilan + Daftar + Lanjutan (dapat dilipat/dibuka)
  • •Komponen umum — 8 file components/board/section-*.php (basic, seo, layout-select, skin-select, display, list, advanced, js), dapat digunakan ulang di halaman buat/edit
  • •Komponen input multibahasa — fungsi rzx_multilang_input(), mode teks/editor, tombol bola dunia inline
  • •Manajemen kategori yang ditingkatkan — struktur pohon (parent_id), modal edit (nama/warna font/deskripsi/grup yang diizinkan/perluas/kategori default), pengurutan drag SortableJS, pemuatan dinamis grade anggota dari DB
  • •Tab variabel tambahan — tabel rzx_board_extra_vars, 15 tipe input (termasuk text_multilang, textarea_multilang, textarea_editor), dukungan multibahasa, pengurutan drag
  • •Tab izin — Izin akses (all/member/grade:*/admin_staff/admin), admin modul (pencarian pengguna bersama, foto profil, cakupan izin), info surel notifikasi
  • •Tab pengaturan tambahan — Papan terintegrasi, dokumen (riwayat/rekomendasi/laporan), komentar (jumlah/kedalaman/persetujuan/rekomendasi/laporan), editor WYSIWYG (matriks izin), berkas (grup unduhan), umpan (RSS publik/hak cipta)
  • •Sistem skin — format skin.json, SkinConfigRenderer, dukungan "multilang": true, kartu info skin
  • •Sistem layout — format layout.json, pemilihan kartu di pengaturan dasar
  • •Pencarian pengguna bersama — komponen user-search.php, enkripsi/dekripsi, foto profil, dapat digunakan di mana saja
  • •Admin modul — tabel rzx_board_admins, izin posting/komentar/pengaturan, langganan notifikasi
  • •Perluasan pengaturan lanjutan — kecualikan admin dari anonim, pembatasan Data URL, penyalahgunaan Unicode, perlindungan posting/komentar (jumlah komentar/balasan/periode), perlindungan super-admin, alamat surel pengirim
  • •UI sakelar toggle — semua item ya/tidak dikonversi ke toggle (pengaturan dasar + tambahan)
  • •Kunci terjemahan — sekitar 300 kunci, 13 bahasa

Fixed

  • •Kesalahan SQL tempat sampah — pengikatan LIMIT ? string → literal integer
  • •Summernote tidak dirender — memuat jQuery/Summernote JS + inisialisasi setelah modal ditampilkan
  • •Kesalahan collation — COLLATE utf8mb4_unicode_ci dinyatakan secara eksplisit saat JOIN board_admins
  • •Lipat/buka tidak berfungsi — fungsi toggleSection didefinisikan terlebih dahulu di <head>

Changed

  • •Tab mandiri (daftar/lanjutan) → digabungkan ke tab pengaturan dasar dengan lipat/buka
  • •Pemilihan skin → dipindahkan ke tab pengaturan dasar; tab skin hanya menampilkan pengaturan
  • •Surel admin → diubah menjadi "Alamat surel pengirim" di pengaturan lanjutan
  • •Admin modul → dipindahkan ke tab izin
  • •"Tampilkan kategori di daftar" → dihapus dari pengaturan kategori, didelegasikan ke pengaturan per-skin
  • •"Tampilkan kategori di daftar" → dihapus dari pengaturan kategori, didelegasikan ke pengaturan per-skin
  • •Grup yang diizinkan menulis → dimuat secara dinamis dari tabel rzx_member_grades alih-alih dikodekan keras
v1.6.0 2026-03-17 · 7 bulan lalu

Added

  • •Sistem fallback multibahasa: rantai fallback bawaan di db_trans() (bahasa yang dikonfigurasi → en → bahasa default → source_locale → terjemahan mana saja)
  • •Tombol multibahasa pengaturan papan: tombol multibahasa (globe) ditambahkan ke 6 field di tab pengaturan dasar
  • •Fallback multibahasa tampilan depan papan: judul, deskripsi, SEO, header/footer multibahasa diterapkan di _init.php
  • •Fallback multibahasa widget: penanganan string kosong pada WidgetRenderer::t(), tBtn() ditingkatkan
  • •Kunci terjemahan PWA ditambahkan (13 bahasa: admin.pwa.update_available, update, later)

Fixed

  • •Masalah kartu kosong widget Features: operator ?? memperlakukan string kosong "" sebagai nilai valid → diperbaiki dengan fallback berbasis !empty()
  • •Kesalahan Mixed Content di produksi: APP_URL http→https diperbaiki + koreksi protokol JS otomatis
v1.5.2 2026-03-17 · 7 bulan lalu

Added

  • •Penghapusan layanan dari riwayat layanan POS (tombol hapus + API + pembaruan DOM segera)
  • •Menambahkan kunci terjemahan penghapusan layanan untuk 13 bahasa
v1.5.0 2026-03-17 · 7 bulan lalu

Added

  • •Sistem check-in kios: konfirmasi layanan → informasi pelanggan → pembuatan reservasi → penerbitan nomor antrean
  • •Lencana ketersediaan staf: menampilkan sibuk/tersedia secara real-time pada pemilihan staf di kios
  • •Modul nomor telepon internasional: komponen phone-input diterapkan pada formulir check-in kios
  • •Seed data contoh reservasi: database/seed_reservations.php (10 entri di POS/kios/online)
  • •Memisahkan berkas umum kios (_styles.php, _bg.php, _scripts.php)
  • •Menambahkan 11 kunci terjemahan kios dalam 13 bahasa

Changed

  • •Pemilihan layanan kios: pemfilteran berdasarkan keahlian staf (mode penunjukan)
  • •Tab kategori kios diratakan ke tengah

Fixed

  • •Admin tidak dapat masuk di produksi (hash kata sandi rusak — masalah substitusi variabel $ bash)
  • •Stabilisasi sistem pembaruan: daftar penyimpanan diperluas, pemeriksaan kesehatan, sinkronisasi versi DB
  • •Penyatuan sumber tunggal versi (version.json → index.php, sinkronisasi DB otomatis)
VosCMS Toko
Beranda Home 마켓플레이스 개발자 포털 Notice Free Board Q&A FAQ
Masuk Daftar
Bahasa Indonesia
한국어 English 日本語 中文(中国) 中文(臺灣) Deutsch Español Français Монгол Русский Türkçe Tiếng Việt Bahasa Indonesia