Pencatatan Transaksi Rutin & Pengingat Harian
Mencatat tagihan rutin bulanan seperti listrik atau langganan secara otomatis sesuai jadwal, disertai pengingat lewat email agar tidak ada pembayaran yang terlewat.
Mencatat tagihan rutin bulanan seperti listrik atau langganan secara otomatis sesuai jadwal, disertai pengingat lewat email agar tidak ada pembayaran yang terlewat.
Tantangan & Kebutuhan Pengguna
Tagihan rutin (seperti internet, listrik, kos) dan pemasukan tetap (seperti gaji bulanan) berulang pada pola waktu yang pasti. Namun ketika membangun worker otomatis di lingkungan server Node.js, penggunaan `new Date().toISOString().slice(0, 10)` selalu mengacu pada waktu UTC. Jika cron dieksekusi antara pukul 00:00 hingga 06:59 WIB (UTC+7), waktu UTC masih berada di tanggal hari sebelumnya (bug H-1), yang berisiko membuat jadwal tanggal 1 gagal dieksekusi atau tercatat di bulan yang salah.
Jangan pernah mempercayai toISOString() untuk logika pergantian tanggal lokal; selalu kunci zona waktu secara eksplisit sebelum mengevaluasi jadwal.
Solusi & Cara Kerja
Worker penjadwal mengevaluasi seluruh baris `planningincome` dan `planningexpense` yang memiliki flag `isrepeat = 1`. Untuk menghindari bug H-1, tanggal lokal diekstrak menggunakan `Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Jakarta' })` yang secara native menghasilkan format standar ISO `YYYY-MM-DD` sesuai waktu WIB. Fungsi evaluator `shouldGenerate()` kemudian membandingkan tanggal hari ini dengan kolom `lastgenerated` di database untuk menjamin sifat *idempotent*—meskipun endpoint dipicu berulang kali di hari yang sama, transaksi hanya akan disisipkan tepat satu kali per siklus.
Berikut adalah implementasi helper tanggal lokal anti bug H-1 dan evaluator idempotensi jadwal harian/bulanan:
Detail & Hal yang Diperhatikan
- Idempotensi Eksekusi Ganda: Segera setelah transaksi otomatis dimasukkan ke `cashflowincome` atau `cashflowexpense`, kolom `lastgenerated` langsung diperbarui dengan `todayStr` (`YYYY-MM-DD`) sehingga pemanggilan ulang di hari/bulan yang sama otomatis dilewati.
- Pengingat Email Harian Pintar: Setelah mengeksekusi jadwal rutin, worker memeriksa setiap pengguna aktif (`isnotify = 1`) menggunakan `Promise.all` untuk mengecek apakah hari ini sudah ada transaksi pemasukan dan pengeluaran. Email pengingat hanya dikirimkan untuk pos yang masih kosong.
- Pencegahan Static Caching: Route handler dideklarasikan dengan `export const dynamic = 'force-dynamic'` agar Next.js tidak pernah menyajikan respons cache statis saat dipanggil oleh penjadwal eksternal.