Posts

Showing posts from April, 2026

Fase 4 — Billing & Admin Panel

  Fase 4 — Billing & Admin Panel ✅ Backend ( backend/ ) New files: backend/src/lib/midtrans.ts  — Midtrans Snap API helper ( createSnapToken ,  verifyMidtransSignature ) backend/src/routes/billing.ts  — tenant billing routes: GET /billing/subscriptions  — per-outlet subscription status GET /billing/invoices  — invoice history POST /billing/invoices/:id/snap  — creates Midtrans Snap token, records pending payment row POST /billing/midtrans/notify  — webhook: verifies signature, marks invoice paid, extends subscription period backend/src/routes/admin.ts  —  saas_owner -only routes: GET /admin/dashboard  — MRR, active/trialing/past_due counts, unpaid invoices GET /admin/tenants  — paginated tenant list with subscription summary GET /admin/tenants/:id  — tenant detail with outlets, subscriptions, invoices POST /admin/tenants/:id/extend  — manual 1-month extension (marks any pending invoice paid) POST /admin/invoices/g...

Fase 3 — Web (Nuxt 4) + landing + signup

Fase 3 selesai. Build sukses. Berikut ringkasan apa yang dibangun: Web Nuxt 4 ( web/ ) — fully built and compiles clean Structure: nuxt.config.ts  — Nuxt 4, Tailwind, VueUse, API base config tailwind.config.ts  — warna brand custom, animasi float/slide-up/fade-in, font Inter + Sora assets/css/tailwind.css  — utility classes:  btn-primary ,  card ,  input-field ,  sidebar-link , dll Composables: composables/useApi.ts  — wrapper  $fetch  dengan auto-inject Bearer token composables/useAuth.ts  — login tenant/outlet/signup, state user,  fetchMe() , logout Layouts & Middleware: default  → landing page (nav + footer) auth  → centered card dengan logo dashboard  → sidebar nav adaptif (tenant vs outlet), top bar, mobile hamburger middleware/auth.ts  — guard semua halaman  /tenant  dan  /outlet Landing page ( pages/index.vue ): Hero animasi floating dashboard mock, stats, fitur 6 card, 3 testimoni...

tahap 2

Phase 2 is complete. Here's what was built: New files: src/db/schema.ts — added orderItems, orderStatusHistory, orderPayments, whatsappNotificationLogs tables src/lib/wa.ts — invoice + status-update message builder, buildDeepLink() src/lib/orderCode.ts — ORD-YYMMDD-XXXXX generator with collision retry src/routes/orders.ts — 6 endpoints src/routes/reports.ts — revenue report with client_created_at fallback Verified: POST /orders creates order + items in one transaction (3.5 kg × Rp7000 = Rp24.500) ✓ Status chain masuk → proses → selesai with history recorded ✓ Invalid transition selesai → proses correctly rejected ✓ Cash payment auto-marks paymentStatus=paid when fully covered ✓ WA deep-link generates https://wa.me/628...?text=*NOTA LAUNDRY...* with formatted nota ✓ Revenue report returns order_count: 1, total_rupiah: 24500 for today ✓  

roadmap / tahapan pembuatan aplikasi

# Roadmap — laundrai.id Tahapan dari kondisi saat ini menuju produksi. Disusun berurutan, bukan paralel — kritikal path adalah Fase 1. ## Status saat ini - ✅ Konsep produk final ([app-concept.md](app-concept.md)) - ✅ Skema SQL live di Postgres lokal (`laundrai_id`) — lihat [db/](db/) dan [CLAUDE.md](CLAUDE.md) - ❌ Backend, web, mobile, landing page, deployment — belum ada Rekomendasi titik mulai: **Fase 1 (backend)**. Web dan mobile sama-sama bergantung padanya; kalau API belum stabil, dua klien akan dibangun di atas pasir. --- ## Fase 1 — Backend spine (~1–2 minggu) Fondasi yang semua fase berikutnya bergantung padanya. - Scaffold `backend/` dengan Hono + Bun + Drizzle - Drizzle schema yang match dengan SQL: `drizzle-kit introspect` lalu rapikan manual - Auth phone+password untuk 3 principal (`saas_owner`, `tenant`, `outlet`) — pilih salah satu: JWT atau session cookie, jangan dua-duanya - **Idempotency middleware**: baca header `Idempotency-Key` → isi ke `client_request_id` di tabel ...

prompt pertama

  Saya ingin membuat aplikasi saas atau aplikasi multi tenant untuk aplikasi laundry.  di mana di sini sistemnya satu database untuk semua tenan jadi tidak pakai multi database, dan nanti aplikasi terdapat dua jenis yaitu aplikasi web dan aplikasi Android    jadi sistemnya nanti Saat input data maka otomatis ada notifikasi WhatsApp ke pelanggan laundry dan ini tetap menggunakan WhatsApp dari laundry yang ada di handphone atau tablet jadi tidak menggunakan WhatsApp API.  Dan untuk sistem pembayaran ada beberapa pilihan pertama bayar cash ke pemilik laundry ke pemilik laundry atau bisa juga menggunakan pihak ketiga seperti Midtrans atau xendit Atau aplikasi pihak ketiga untuk pembayaran perantara Aplikasi dimulai dari landing web page dan ada fitur pendaftaran dan terdapat pilihan paket berlangganan beserta fiturnya dan ada pilihan free gratis 1 bulan   Buatkan website dan aplikasi yang menarik responsif penuh dengan animasi dan card warna-warni dan...