Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Aplikasi tracking penjualan (Meta Ads online + offline). Sedang dipindahkan dari satu file index.html ke aplikasi Next.js dengan database Supabase. Dua bug ditemukan & diperbaiki saat verifikasi pertama (detail di riwayat commit fix: perbaiki tipe database & versi @supabase/ssr): versi @supabase/ssr yang tidak cocok dengan @supabase/supabase-js, dan interface di src/types/database.ts yang seharusnya type alias (TypeScript gotcha — interface tidak punya index signature tersirat, dibutuhkan @supabase/postgrest-js untuk menurunkan tipe insert/update).檢視完整 README ↗
Aplikasi tracking penjualan (Meta Ads online + offline). Sedang dipindahkan dari
satu file index.html ke aplikasi Next.js dengan database Supabase.
Live saat ini: https://kasirkiojay.vercel.app
| Bagian | Status |
|---|---|
| Skema database (role, biaya operasional, target, mesin stok, view keuangan) | Ditulis, belum dijalankan ke Supabase — perlu izin eksplisit karena ini database produksi |
| Frontend Next.js (dashboard, transaksi, produk, keuangan, pelanggan, akun) | typecheck, lint, build lulus. Halaman /login diuji langsung di browser (desktop & mobile) dan berhasil memanggil Supabase Auth asli. Halaman lain (dashboard dll) belum bisa diuji — butuh tabel/view dari migrasi di atas |
| Repo Git | Sudah (git init, beberapa commit) |
| Auto-deploy Vercel | Belum |
Dua bug ditemukan & diperbaiki saat verifikasi pertama (detail di riwayat
commit fix: perbaiki tipe database & versi @supabase/ssr): versi
@supabase/ssr yang tidak cocok dengan @supabase/supabase-js, dan
interface di src/types/database.ts yang seharusnya type alias (TypeScript
gotcha — interface tidak punya index signature tersirat, dibutuhkan
@supabase/postgrest-js untuk menurunkan tipe insert/update).
Node.js sempat gagal terpasang lewat winget di sesi otomatis (macet
menunggu prompt izin admin/UAC yang tidak ada desktop interaktif untuk
mengkliknya). Diatasi dengan memasang Node.js portable (zip, tanpa
installer/tanpa admin) dari nodejs.org, diekstrak ke
%LOCALAPPDATA%\nodejs-portable, dan ditambahkan ke PATH level-user lewat
[Environment]::SetEnvironmentVariable(...,"User") — tidak menyentuh
pengaturan admin/mesin sama sekali.
Kalau kamu buka terminal baru dan node -v belum ketemu, tutup lalu buka
lagi terminalnya (PATH level-user baru kebaca di proses baru). Kalau masih
belum ketemu juga, pasang manual:
winget install OpenJS.NodeJS.LTS
atau unduh installer .msi versi LTS dari https://nodejs.org.
Setelah node -v dan npm -v jalan:
npm install
npm run dev
Buka http://localhost:3000 — akan redirect ke /login. Login pakai akun
Supabase yang sama dengan kasirkiojay.vercel.app. Halaman setelah login baru
akan berfungsi penuh setelah migrasi SQL di bawah dijalankan.
Jalankan berurutan di Supabase Dashboard → SQL Editor, satu file satu kali jalan, periksa hasilnya sebelum lanjut ke berikutnya.
| Urutan | File | Isi |
|---|---|---|
| 1 | supabase/migrations/0001_roles_and_profiles.sql | Tabel profiles, role admin/staff, RLS semua tabel |
| 2 | supabase/migrations/0002_stock_engine.sql | Stok pindah ke trigger database, kolom affects_stock |
| 3 | supabase/migrations/0003_expenses_and_targets.sql | Biaya operasional + target bulanan |
| 4 | supabase/migrations/0004_financial_views.sql | View omset/profit/laba rugi |
Backup dulu sebelum menjalankan (Supabase → Database → Backups), karena ini menyentuh data produksi.
Semua akun yang sudah ada otomatis jadi admin supaya tidak ada yang terkunci. Turunkan yang perlu jadi staff:
update public.profiles set role = 'staff' where email = '[email protected]';
select email, role from public.profiles order by role, email;
Frontend lama (index.html) masih mengurangi stok sendiri dari browser.
Begitu trigger aktif, stok akan berkurang dua kali lipat. Pilih salah satu:
index.html (di submitTransaction, updateTxStatus, dan deleteTx).| Admin | Staff | |
|---|---|---|
| Lihat transaksi | ya | ya |
| Input transaksi | ya | ya |
| Ubah transaksi | semua | hanya miliknya sendiri |
| Hapus transaksi | ya | tidak |
| Ubah produk & HPP | ya | tidak |
| Input spend iklan | ya | tidak |
| Biaya operasional (termasuk gaji) | ya | tidak bisa lihat |
| Target bulanan | ubah | lihat saja |
Dijaga oleh RLS di database, bukan oleh tampilan — jadi tidak bisa ditembus lewat browser.
Transaksi berapa pun tanggalnya boleh diinput. Yang perlu diperhatikan: jangan biarkan transaksi historis mengurangi stok fisik yang ada di rak sekarang.
Alur yang benar:
affects_stock = false.affects_stock = true (default).Untuk setiap transaksi historis, isi HPP yang berlaku saat itu, bukan HPP sekarang. HPP disimpan per transaksi, jadi profit historis tetap akurat tanpa perlu tabel riwayat harga terpisah.
| Route | Isi | Akses |
|---|---|---|
/login | Login email/password | semua |
/dashboard | Omset, profit, tren, produk terlaris, RTS, target bulan ini | semua (target & iklan hanya tampil untuk admin) |
/dashboard/iklan | Input spend iklan & chat masuk harian | admin |
/transaksi | Daftar transaksi + filter + ubah status + hapus | semua (hapus & ubah status transaksi orang lain: admin) |
/transaksi/tambah | Input transaksi baru, boleh tanggal mundur, toggle "data historis" | semua |
/produk | Daftar produk + stok | semua (ubah HPP/stok: admin) |
/keuangan | Biaya operasional + target bulanan + ringkasan laba rugi | admin |
/pelanggan | Database pelanggan agregat dari transaksi + tombol WA | semua |
/akun | Info akun, role, logout | semua |
src/lib/*.ts (kecuali format.ts dan dashboard.ts) berisi Server Actions
— jalan di server, dipanggil langsung dari Client Component. RLS di database
tetap jadi pertahanan utama; pengecekan role di situ hanya untuk pesan error
yang lebih ramah.
salin_biaya_berulang(date) menyalin biaya bertanda berulang dari bulan
sebelumnya. Kalau ada biaya bertanggal 29–31, cek hasilnya di bulan yang
lebih pendek.