TagihBot — Bot WA Pengingat Tagihan & Konfirmasi Bayar
Bot WhatsApp otomatis untuk UMKM yang mengirim pengingat tagihan sopan, menerima bukti pembayaran dari pelanggan, dan memungkinkan pemilik mengonfirmasi pembayaran serta mengontrol bot via perintah chat.
Bot Penagihan WhatsApp UMKM
Bot WhatsApp otomatis untuk UMKM yang mengirim pengingat tagihan sopan, menerima bukti pembayaran dari pelanggan, dan memungkinkan pemilik mengonfirmasi pembayaran serta mengontrol bot via perintah chat.
Problem
Pemilik UMKM sering kesulitan menagih pelanggan secara manual, menghabiskan waktu, dan berisiko lupa atau mengirim pengingat berulang. Proses konfirmasi pembayaran juga sering tidak efisien, membutuhkan pengecekan manual dan komunikasi bolak-balik.
Goals
- Mengurangi waktu penagihan manual hingga 90% untuk pemilik UMKM.
- Memastikan 100% tagihan jatuh tempo dikirimkan pengingatnya secara otomatis.
- Memproses konfirmasi pembayaran dalam waktu kurang dari 5 menit setelah bukti diterima owner.
- Mencegah pengiriman pengingat ganda untuk tagihan yang sama.
Non-Goals
- Integrasi dengan sistem akuntansi atau POS pihak ketiga.
- Fitur multi-bahasa untuk pengingat tagihan.
- Dashboard atau antarmuka web untuk pemilik UMKM.
- Manajemen pelanggan atau tagihan melalui antarmuka web.
- Fitur pembayaran langsung melalui bot (misalnya, integrasi payment gateway).
- Dukungan untuk platform chat selain WhatsApp.
Target Users
- Pemilik UMKM — Otomatisasi penagihan, konfirmasi pembayaran yang efisien, dan kontrol bot yang mudah.
- Pelanggan UMKM — Menerima pengingat yang jelas, mudah mengirim bukti pembayaran, dan tidak ditagih berulang.
User Stories
- must-haveSebagai Pemilik UMKM, saya ingin Bot mengirim pengingat tagihan otomatis ke pelanggan saya setiap pagi, agar Saya tidak perlu menagih secara manual dan tagihan tidak terlewat..
- must-haveSebagai Pelanggan UMKM, saya ingin Saya bisa membalas pengingat dengan foto bukti transfer, agar Pembayaran saya segera tercatat dan saya tidak ditagih lagi..
- must-haveSebagai Pemilik UMKM, saya ingin Saya bisa mengonfirmasi pembayaran pelanggan melalui perintah chat, agar Status tagihan diperbarui dengan cepat dan bot berhenti menagih pelanggan tersebut..
- must-haveSebagai Pemilik UMKM, saya ingin Saya bisa mematikan atau menyalakan bot penagihan sementara, agar Saya memiliki kontrol penuh atas operasional bot sesuai kebutuhan bisnis saya..
User Flow
- Pemilik UMKM menyiapkan bot dengan mengonfigurasi environment variables dan menjalankan aplikasi.
- Pemilik UMKM menambahkan data pelanggan dan tagihan secara manual ke database (untuk MVP).
- Setiap pagi pukul 09:00 WIB, bot secara otomatis mengambil daftar tagihan jatuh tempo.
- Bot mengirim pengingat tagihan ke setiap pelanggan yang memiliki tagihan jatuh tempo, dengan jeda aman antar pesan.
- Pelanggan menerima pengingat dan membalas dengan foto bukti transfer.
- Bot menerima foto, mengunggahnya ke Cloudinary, dan meneruskan URL serta detail ke nomor WhatsApp pemilik UMKM.
- Bot membalas pelanggan dengan konfirmasi penerimaan bukti pembayaran.
- Pemilik UMKM melihat bukti pembayaran dan mengirim perintah `/lunas <invoice_id>` ke bot.
- Bot memperbarui status invoice menjadi 'PAID' di database dan membalas pemilik UMKM dengan konfirmasi.
- Setiap hari pukul 18:00 WIB, bot mengirim laporan ringkas aktivitas harian ke pemilik UMKM.
- Pemilik UMKM dapat mengirim perintah `/tagihan` untuk melihat daftar tagihan pending.
- Pemilik UMKM dapat mengirim perintah `/stop` untuk menghentikan pengingat otomatis, dan `/start` untuk melanjutkannya.
Features
Pengingat Tagihan Otomatis
Bot akan membaca daftar tagihan jatuh tempo dari database setiap pagi dan mengirim pengingat ke pelanggan satu per satu dengan jeda aman untuk menghindari banned WhatsApp.
- Bot mengirim pengingat tagihan untuk semua invoice dengan status 'PENDING' dan due_date <= hari ini, setiap hari pukul 09:00 WIB.
- Setiap pengingat dikirim dengan jeda minimal 5 detik antar pesan ke nomor berbeda.
- Pengingat berisi nomor invoice, jumlah, tanggal jatuh tempo, dan instruksi untuk membalas dengan bukti bayar.
- Bot tidak mengirim pengingat ke pelanggan yang nomor WhatsApp-nya tidak valid atau tidak terdaftar.
- Bot tidak mengirim pengingat untuk invoice yang sudah berstatus 'PAID' atau 'CANCELLED'.
Kasus tepi yang ditangani
- Tidak ada tagihan jatuh tempo pada hari itu.
- Nomor WhatsApp pelanggan tidak valid atau tidak terdaftar.
- WhatsApp API mengalami kegagalan saat mengirim pesan.
Penerimaan Bukti Pembayaran
Pelanggan dapat membalas pesan bot dengan foto bukti transfer. Bot akan menerima foto tersebut, menyimpannya, dan meneruskannya ke pemilik UMKM untuk konfirmasi.
- Bot dapat menerima pesan masuk berupa gambar dari pelanggan.
- Gambar bukti pembayaran disimpan ke penyimpanan cloud dan URL-nya dicatat di database.
- Bot meneruskan gambar bukti pembayaran beserta nomor invoice terkait ke nomor WhatsApp pemilik UMKM.
- Bot membalas pelanggan dengan pesan konfirmasi bahwa bukti pembayaran telah diterima dan akan segera diproses.
- Bot mencatat ID pesan WhatsApp yang masuk untuk mencegah pemrosesan ganda.
Kasus tepi yang ditangani
- Pelanggan mengirim pesan teks biasa, bukan gambar.
- Pelanggan mengirim beberapa gambar dalam satu pesan.
- Penyimpanan cloud gagal menyimpan gambar.
Konfirmasi Pembayaran via Chat Owner
Pemilik UMKM dapat menggunakan perintah chat `/lunas <invoice_id>` untuk mengonfirmasi pembayaran. Bot akan memperbarui status tagihan dan berhenti menagih pelanggan tersebut.
- Pemilik UMKM dapat mengirim perintah `/lunas <invoice_id>` ke bot.
- Jika `invoice_id` valid dan statusnya 'PENDING', bot mengubah status invoice menjadi 'PAID' dan mencatat tanggal pembayaran.
- Bot membalas pemilik UMKM dengan konfirmasi bahwa invoice telah lunas.
- Jika `invoice_id` tidak valid atau sudah lunas, bot membalas dengan pesan error yang informatif.
- Bot tidak akan lagi mengirim pengingat untuk invoice yang sudah lunas.
Kasus tepi yang ditangani
- Pemilik mengirim perintah dengan format yang salah.
- Invoice ID yang diberikan tidak ditemukan di database.
- Invoice ID yang diberikan sudah berstatus 'PAID'.
Kontrol Bot via Chat Owner
Pemilik UMKM dapat menggunakan perintah chat seperti `/tagihan`, `/stop`, dan `/start` untuk mengelola bot.
- Pemilik UMKM dapat mengirim perintah `/tagihan` untuk mendapatkan daftar ringkas invoice 'PENDING' yang jatuh tempo.
- Pemilik UMKM dapat mengirim perintah `/stop` untuk menghentikan sementara pengiriman pengingat tagihan otomatis.
- Setelah `/stop`, bot tidak akan mengirim pengingat otomatis sampai perintah `/start` diberikan.
- Pemilik UMKM dapat mengirim perintah `/start` untuk melanjutkan pengiriman pengingat tagihan otomatis.
- Bot hanya merespons perintah dari nomor WhatsApp yang terdaftar sebagai pemilik.
- Bot membalas dengan pesan error jika perintah tidak dikenal.
Kasus tepi yang ditangani
- Pemilik mengirim perintah yang tidak dikenal.
- Pemilik mencoba `/stop` saat bot sudah berhenti, atau `/start` saat bot sudah berjalan.
Laporan Harian ke Owner
Bot mengirimkan laporan ringkas aktivitas harian (jumlah pengingat terkirim, bukti bayar diterima) ke pemilik UMKM.
- Bot mengirim laporan ringkas ke pemilik UMKM setiap hari pukul 18:00 WIB.
- Laporan berisi jumlah pengingat yang berhasil terkirim hari itu.
- Laporan berisi jumlah bukti pembayaran yang diterima dari pelanggan hari itu.
- Laporan berisi daftar invoice yang dikonfirmasi lunas oleh owner hari itu.
Tech Stack
Akan menggunakan library untuk interaksi WhatsApp API (misalnya, whatsapp-web.js atau library resmi jika tersedia dan sesuai budget). Penyimpanan bukti pembayaran akan menggunakan layanan cloud storage.
Architecture
Sistem ini adalah bot WhatsApp berbasis Node.js yang berinteraksi dengan pelanggan dan pemilik UMKM melalui pesan WhatsApp. Bot menerima webhook dari WhatsApp untuk pesan masuk, memprosesnya, berinteraksi dengan database PostgreSQL untuk data tagihan dan status bot, serta mengirim pesan keluar melalui WhatsApp API.
WhatsApp API Client
Mengirim dan menerima pesan ke/dari WhatsApp.
Webhook Handler
Menerima dan memvalidasi payload webhook dari WhatsApp.
Message Processor
Menganalisis jenis pesan (teks/gambar), mem-parse perintah chat, dan mengorkestrasi respons.
Database Service
Mengelola operasi CRUD pada database PostgreSQL (tagihan, pelanggan, pembayaran, status bot).
Scheduler (Cron Job)
Memicu tugas terjadwal seperti pengiriman pengingat tagihan dan laporan harian.
Cloud Storage Service
Menyimpan gambar bukti pembayaran dan mengembalikan URL-nya.
Alur data
- Pelanggan mengirim pesan/gambar ke bot WhatsApp.
- WhatsApp mengirim webhook ke endpoint `/webhook/whatsapp` bot.
- Webhook Handler menerima, memvalidasi, dan meneruskan pesan ke Message Processor.
- Message Processor: Jika gambar, unggah ke Cloud Storage, simpan URL di DB, teruskan ke Owner. Jika teks, parse perintah (misal: `/lunas`, `/tagihan`, `/stop`, `/start`).
- Untuk perintah owner: Message Processor memanggil Database Service untuk memperbarui/mengambil data.
- Database Service berinteraksi dengan PostgreSQL.
- Message Processor/Database Service memanggil WhatsApp API Client untuk mengirim balasan ke pelanggan atau owner.
- Setiap pagi, Scheduler memicu `send-reminders` job.
- Job `send-reminders` memanggil Database Service untuk mengambil invoice jatuh tempo.
- Job `send-reminders` memanggil WhatsApp API Client untuk mengirim pengingat ke pelanggan dengan jeda aman.
Database Schema
Ini struktur data aplikasimu. Kamu tidak perlu paham semuanya — AI yang akan membuatnya. Kolom created_at/updated_at ditambahkan otomatis tiap tabel.
Relasi
- customers.owner_id → users.id (many-to-one)
- invoices.owner_id → users.id (many-to-one)
- invoices.customer_id → customers.id (many-to-one)
- payments.owner_id → users.id (many-to-one)
- payments.invoice_id → invoices.id (many-to-one)
- bot_messages_log.owner_id → users.id (many-to-one)
- bot_messages_log.related_invoice_id → invoices.id (many-to-one)
- bot_state.owner_id → users.id (one-to-one)
Struktur Folder
Struktur ini dikunci agar AI agent membangun dengan susunan file yang sama.
- src/
- src/app.ts — entry point aplikasi
- src/config/ — konfigurasi aplikasi dan env vars
- src/db/ — skema database, koneksi, dan migrasi
- src/controllers/ — logika pemrosesan request/pesan
- src/services/ — logika bisnis inti dan interaksi dengan layanan eksternal
- src/routes/ — definisi endpoint API (webhook)
- src/jobs/ — definisi cron jobs
- src/utils/ — fungsi utilitas (validasi, error handling)
- src/tests/ — unit dan integrasi tests
- drizzle/ — folder untuk migrasi Drizzle Kit
API Endpoints
Enum
Environment Variables
Library Inti
Tasks (siap kirim ke AI agent)
Pasang Jest atau Vitest sebagai test runner. Tulis unit test untuk fungsi-fungsi inti seperti validasi nomor WhatsApp, parsing perintah chat, dan logika penentuan invoice jatuh tempo.
Lihat isi perintah
Instal Jest/Vitest. Buat file `src/utils/validation.ts` untuk fungsi `isValidWhatsappNumber(number: string)` dan `src/utils/invoice.ts` untuk `getDueInvoices(invoices: Invoice[], today: Date)`. Tulis unit test untuk kedua fungsi ini di `src/tests/`.
Buat struktur proyek dasar Node.js dengan Express.js, termasuk konfigurasi TypeScript dan ESLint.
Lihat isi perintah
Inisialisasi proyek Node.js dengan `npm init -y`. Tambahkan TypeScript, Express.js, dan ESLint. Buat `src/app.ts` sebagai entry point.
Siapkan koneksi database PostgreSQL menggunakan Drizzle ORM atau `pg` client, termasuk migrasi awal untuk tabel `users` dan `bot_state`.
Lihat isi perintah
Instal `pg` dan `drizzle-orm` (atau `knex` untuk migrasi). Buat `src/db/schema.ts` untuk definisi tabel `users` dan `bot_state`. Buat `src/db/index.ts` untuk koneksi database. Buat migrasi awal untuk tabel `users` dan `bot_state`.
Definisikan semua tabel, kolom, enum, dan relasi yang diperlukan sesuai `databaseSchema`.
Lihat isi perintah
Lengkapi `src/db/schema.ts` dengan definisi tabel `customers`, `invoices`, `payments`, dan `bot_messages_log` beserta semua kolom, tipe, default, dan relasi yang ditentukan di PRD. Tambahkan definisi enum `InvoiceStatus`, `PaymentStatus`, `BotStatus`.
Buat script migrasi untuk menerapkan skema database yang telah didefinisikan.
Lihat isi perintah
Buat script migrasi menggunakan Drizzle Kit atau Knex.js untuk membuat semua tabel dan enum yang didefinisikan di `src/db/schema.ts`. Pastikan migrasi bisa dijalankan dan di-rollback.
Integrasikan library WhatsApp API (misal: `whatsapp-web.js`) dan siapkan inisialisasi client.
Lihat isi perintah
Instal `whatsapp-web.js`. Buat `src/services/whatsapp.ts` untuk inisialisasi `Client` dan fungsi `sendMessage(to: string, message: string)` serta `sendMedia(to: string, media: Media)`.
Buat endpoint API untuk menerima webhook dari WhatsApp (pesan masuk dari pelanggan).
Lihat isi perintah
Buat `src/routes/webhook.ts` dengan endpoint `POST /webhook/whatsapp`. Endpoint ini harus mem-parse payload dari WhatsApp dan meneruskannya ke `src/controllers/messageController.ts`.
Implementasikan logika untuk membedakan jenis pesan (teks, gambar) dan mencatatnya ke `bot_messages_log`.
Lihat isi perintah
Di `src/controllers/messageController.ts`, buat fungsi untuk memproses pesan masuk. Jika pesan adalah gambar, simpan URL-nya. Catat setiap pesan masuk ke tabel `bot_messages_log` dengan `whatsapp_message_id` sebagai kunci unik untuk mencegah duplikasi.
Implementasikan fungsi untuk mengunggah gambar bukti pembayaran ke Cloudinary dan mendapatkan URL-nya.
Lihat isi perintah
Instal `cloudinary`. Buat `src/services/cloudinary.ts` dengan fungsi `uploadImage(base64Image: string)` yang mengembalikan URL. Integrasikan ini ke `src/controllers/messageController.ts` saat menerima gambar.
Setelah menerima bukti pembayaran, bot harus meneruskannya ke nomor WhatsApp pemilik UMKM.
Lihat isi perintah
Di `src/controllers/messageController.ts`, setelah gambar diunggah, gunakan `whatsappService.sendMedia()` untuk meneruskan gambar ke `OWNER_WHATSAPP_NUMBER` beserta nomor invoice yang terdeteksi (jika ada) atau pesan default.
Bot membalas pelanggan setelah bukti pembayaran diterima.
Lihat isi perintah
Di `src/controllers/messageController.ts`, setelah memproses pesan masuk (baik teks atau gambar), kirim balasan ke pelanggan menggunakan `whatsappService.sendMessage()` dengan pesan 'Bukti pembayaran Anda telah diterima dan akan segera diproses. Terima kasih!'
Siapkan cron job menggunakan `node-cron` untuk menjalankan logika pengingat tagihan setiap pagi.
Lihat isi perintah
Instal `node-cron`. Buat `src/jobs/reminderJob.ts` yang berisi logika penjadwalan cron untuk berjalan setiap hari pukul 09:00 WIB. Panggil fungsi `sendDailyReminders()` dari `src/services/invoiceService.ts`.
Implementasikan fungsi untuk mengambil semua invoice yang jatuh tempo dan berstatus 'PENDING'.
Lihat isi perintah
Di `src/services/invoiceService.ts`, buat fungsi `getDuePendingInvoices()` yang mengambil data dari tabel `invoices` dengan `status = 'PENDING'` dan `due_date <= hari ini`.
Implementasikan pengiriman pesan pengingat satu per satu dengan jeda yang dapat dikonfigurasi.
Lihat isi perintah
Di `src/services/invoiceService.ts`, buat fungsi `sendDailyReminders()`. Iterasi melalui invoice yang jatuh tempo, panggil `whatsappService.sendMessage()` untuk setiap pelanggan, dan gunakan `await new Promise(resolve => setTimeout(resolve, BOT_RATE_LIMIT_MS))` untuk jeda antar pesan. Pastikan pesan berisi detail invoice.
Implementasikan parsing perintah `/lunas <invoice_id>` dan logika pembaruan status invoice.
Lihat isi perintah
Di `src/controllers/messageController.ts`, tambahkan logika untuk mendeteksi perintah `/lunas` dari `OWNER_WHATSAPP_NUMBER`. Parse `invoice_id`. Panggil `src/services/invoiceService.ts` untuk fungsi `markInvoiceAsPaid(invoiceId: string, ownerId: string)`. Kirim balasan konfirmasi atau error ke owner.
Buat fungsi di service layer untuk mengubah status invoice menjadi 'PAID'.
Lihat isi perintah
Di `src/services/invoiceService.ts`, buat fungsi `markInvoiceAsPaid(invoiceId: string, ownerId: string)`. Fungsi ini harus mencari invoice berdasarkan ID dan `owner_id`, memverifikasi statusnya 'PENDING', lalu memperbarui `status` menjadi 'PAID' dan `paid_at` menjadi `now()`.
Pastikan bot memberikan pesan error yang jelas saat owner mencoba `/lunas` untuk invoice yang tidak ada atau sudah lunas.
Lihat isi perintah
Modifikasi `markInvoiceAsPaid` di `src/services/invoiceService.ts` untuk melempar error jika invoice tidak ditemukan atau statusnya bukan 'PENDING'. Tangani error ini di `src/controllers/messageController.ts` dan kirim pesan error yang sesuai ke owner.
Pastikan pengingat hanya dikirim sekali per invoice per hari.
Lihat isi perintah
Modifikasi `sendDailyReminders()` di `src/services/invoiceService.ts`. Sebelum mengirim pesan, cek apakah `bot_messages_log` sudah memiliki entri pengingat untuk invoice ini pada hari yang sama. Jika sudah, lewati. Setelah berhasil mengirim, catat ke `bot_messages_log`.
Implementasikan mekanisme retry dengan backoff eksponensial untuk pengiriman pesan WhatsApp yang gagal.
Lihat isi perintah
Modifikasi `whatsappService.sendMessage()` dan `sendMedia()` untuk menyertakan logika retry (misal, 3 kali percobaan) dengan jeda backoff (misal, 1s, 2s, 4s) jika terjadi error dari WhatsApp API. Catat kegagalan permanen ke log.
Kirim notifikasi ke owner jika ada error kritis pada bot (misal, koneksi DB putus, WhatsApp API gagal terus-menerus).
Lihat isi perintah
Buat `src/utils/errorHandler.ts` untuk menangani error global. Jika terjadi error kritis, kirim pesan notifikasi ke `OWNER_WHATSAPP_NUMBER` menggunakan `whatsappService.sendMessage()`.
Daftarkan semua environment variable yang dibutuhkan dan buat file `.env.example`.
Lihat isi perintah
Buat file `.env.example` dan daftarkan `DATABASE_URL`, `WHATSAPP_API_TOKEN`, `OWNER_WHATSAPP_NUMBER`, `CLOUDINARY_CLOUD_NAME`, `CLOUDINARY_API_KEY`, `CLOUDINARY_API_SECRET`, `BOT_RATE_LIMIT_MS`.
Konfigurasi PM2 atau systemd untuk memastikan bot tetap berjalan dan restart otomatis jika crash.
Lihat isi perintah
Buat file konfigurasi `ecosystem.config.js` untuk PM2 atau unit file systemd untuk menjalankan aplikasi Node.js `src/app.ts` secara persisten dan otomatis restart.
Implementasikan parsing perintah `/tagihan` dan logika untuk menampilkan daftar invoice 'PENDING' yang jatuh tempo.
Lihat isi perintah
Di `src/controllers/messageController.ts`, tambahkan logika untuk mendeteksi perintah `/tagihan` dari `OWNER_WHATSAPP_NUMBER`. Panggil `src/services/invoiceService.ts` untuk fungsi `getDuePendingInvoices()`. Format hasilnya menjadi pesan teks ringkas dan kirim ke owner.
Implementasikan parsing perintah `/stop` dan logika untuk mengubah status bot menjadi 'STOPPED'.
Lihat isi perintah
Di `src/controllers/messageController.ts`, tambahkan logika untuk mendeteksi perintah `/stop` dari `OWNER_WHATSAPP_NUMBER`. Panggil `src/services/botStateService.ts` untuk fungsi `setBotStatus('STOPPED', ownerId)`. Kirim balasan konfirmasi ke owner.Implementasikan parsing perintah `/start` dan logika untuk mengubah status bot menjadi 'ACTIVE'.
Lihat isi perintah
Di `src/controllers/messageController.ts`, tambahkan logika untuk mendeteksi perintah `/start` dari `OWNER_WHATSAPP_NUMBER`. Panggil `src/services/botStateService.ts` untuk fungsi `setBotStatus('ACTIVE', ownerId)`. Kirim balasan konfirmasi ke owner.Buat fungsi di service layer untuk mengubah status bot di tabel `bot_state`.
Lihat isi perintah
Buat `src/services/botStateService.ts` dengan fungsi `setBotStatus(status: BotStatus, ownerId: string)`. Fungsi ini harus memperbarui kolom `status` di tabel `bot_state` untuk `owner_id` yang sesuai. Jika belum ada entri, buat baru.
Modifikasi job pengingat agar hanya berjalan jika status bot adalah 'ACTIVE'.
Lihat isi perintah
Modifikasi `sendDailyReminders()` di `src/services/invoiceService.ts`. Sebelum memulai proses pengiriman, panggil `botStateService.getBotStatus(ownerId)`. Jika statusnya 'STOPPED', log dan keluar tanpa mengirim pesan.
Siapkan cron job untuk mengirim laporan harian ke owner.
Lihat isi perintah
Di `src/jobs/dailyReportJob.ts`, buat penjadwalan cron untuk berjalan setiap hari pukul 18:00 WIB. Panggil fungsi `sendDailyReport()` dari `src/services/reportService.ts`.
Implementasikan fungsi untuk mengumpulkan data laporan harian (pengingat terkirim, bukti bayar diterima, invoice lunas).
Lihat isi perintah
Buat `src/services/reportService.ts` dengan fungsi `sendDailyReport(ownerId: string)`. Fungsi ini harus mengambil data dari `bot_messages_log` (untuk pengingat terkirim dan bukti bayar diterima) dan `invoices` (untuk invoice lunas) untuk hari sebelumnya. Format data menjadi pesan teks ringkas.
Kirim laporan harian yang telah dibuat ke nomor WhatsApp pemilik UMKM.
Lihat isi perintah
Di `src/services/reportService.ts`, setelah laporan dibuat, gunakan `whatsappService.sendMessage()` untuk mengirim laporan ke `OWNER_WHATSAPP_NUMBER`.
Bot harus merespons dengan pesan error yang jelas jika owner mengirim perintah yang tidak dikenal.
Lihat isi perintah
Di `src/controllers/messageController.ts`, setelah mencoba mem-parse semua perintah yang dikenal, jika tidak ada yang cocok, kirim balasan ke owner dengan pesan 'Perintah tidak dikenal. Gunakan /tagihan, /lunas <id>, /stop, atau /start.'.
Bot harus memberikan pesan informatif jika owner mencoba `/stop` saat bot sudah berhenti, atau `/start` saat bot sudah berjalan.
Lihat isi perintah
Modifikasi logika di `src/controllers/messageController.ts` untuk perintah `/stop` dan `/start`. Sebelum mengubah status, cek status bot saat ini. Jika perintah yang diberikan sama dengan status saat ini, kirim balasan seperti 'Bot sudah dalam mode berhenti.' atau 'Bot sudah berjalan.'.
Risks
- Perubahan API WhatsApp dapat memutus fungsionalitas bot.
- Pembatasan rate limit dari WhatsApp API dapat menyebabkan pesan tertunda atau gagal terkirim.
- Kesalahan parsing pesan pelanggan (misalnya, nomor invoice tidak terdeteksi) dapat menyebabkan proses manual.
- Ketergantungan pada Cloudinary untuk penyimpanan gambar, jika layanan down atau kuota habis.
- Potensi duplikasi pengiriman pesan jika ada masalah koneksi atau retry yang tidak tepat.