# Codex Handoff - 2026-05-21 Dokumen ini menyimpan konteks kerja terbaru setelah rangkaian patch mobile, login publik, global search, locking satuan, dan workflow deploy artifact Linux. ## Status Umum - App aktif dikembangkan di `Next.js + Prisma + PostgreSQL`. - Branch aktif: `main` - Repo remote utama: `https://git.iptek.co/wirabasalamah/AbelBirdNest-Stock.git` - Server target production saat ini: `/var/www/abelbirdnest-web/AbelBirdNest-Stock` ## Ringkasan Perubahan Terbaru ### 1. Flow Mobile Purchase - Menu `Receipt` di mobile sudah dikeluarkan dari bootstrap mobile. - Submit purchase sekarang langsung: - membuat `receipt` - membuat `receipt_lines` - membuat `lot` - membuat alokasi realization terkait - Endpoint utama: - [src/app/api/v1/purchases/[id]/submit/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/purchases/[id]/submit/route.ts) - [src/app/api/v1/mobile/bootstrap/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/mobile/bootstrap/route.ts) - Dokumen mobile sudah disesuaikan: - [docs/mobile-api-blueprint.md](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/docs/mobile-api-blueprint.md) ### 2. Formatting Qty dan Currency - Formatting `kg` sekarang locale-aware. - Angka hasil konversi gram ke kilogram tampil dengan format Indonesia yang benar, misalnya `10,5 kg`. - Currency di beberapa modul tidak lagi hardcoded dan mengikuti `currency_code` sistem. - File sentral: - [src/lib/formatters.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/lib/formatters.ts) ### 3. Dashboard Qty Fix - Dashboard sebelumnya salah menampilkan angka seperti `94.290 kg` untuk data gram yang seharusnya dibaca sebagai `94,29 kg`. - Perbaikan dilakukan dengan konversi qty berbasis `unit.code` sebelum agregasi. - File utama: - [src/lib/dashboard.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/lib/dashboard.ts) ### 4. Login Publik, Contact Admin, dan Halaman Legal - Login sekarang punya link publik yang benar-benar aktif: - `Hubungi Admin` - `Bantuan` - `Kebijakan Privasi` - `Syarat & Ketentuan` - `Hubungi Admin` sekarang menuju halaman publik dengan form kirim email. - Form ini memakai: - CAPTCHA aritmatika server-side - honeypot anti-spam - Halaman publik legal/help tersedia tanpa login: - `/contact-admin` - `/help-public` - `/privacy-policy` - `/terms-and-conditions` - Semua halaman publik ini sudah dua bahasa `ID/EN`. - Email admin tidak lagi ditampilkan langsung di halaman publik; user diarahkan memakai form kontak admin. - File utama: - [src/features/auth/components/login-client.tsx](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/features/auth/components/login-client.tsx) - [src/features/auth/components/contact-admin-client.tsx](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/features/auth/components/contact-admin-client.tsx) - [src/app/api/v1/public/contact-admin/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/public/contact-admin/route.ts) - [src/lib/public-captcha.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/lib/public-captcha.ts) - [middleware.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/middleware.ts) ### 5. Global Search Header - Search di topbar sebelumnya hanya placeholder. - Sekarang search desktop: - full width sampai mendekati switch bahasa - real-time - menampilkan dropdown hasil - bisa klik hasil - bisa Enter untuk fallback ke halaman lot - Search lintas: - `lot` - `purchase` - supplier/agent terkait - Endpoint baru: - [src/app/api/v1/global-search/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/global-search/route.ts) - Komponen utama: - [src/components/layout/topbar-search.tsx](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/components/layout/topbar-search.tsx) - [src/components/layout/topbar.tsx](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/components/layout/topbar.tsx) - Halaman lot sudah membaca query URL `?search=` agar fallback search juga benar-benar terpakai. ### 6. Master Satuan Dikunci - Master `Satuan` sekarang dibuat fixed dan tidak lagi editable. - Hanya dua satuan yang diizinkan: - `gr` - `kg` - `GET /api/v1/units` akan memastikan dua unit itu selalu ada. - `POST`, `PUT`, dan `DELETE` unit sekarang ditolak `403`. - Submenu `Satuan` disembunyikan dari sidebar. - Kalau halaman `/units` dibuka langsung, tampilannya read-only. - File utama: - [src/features/units/lib/fixed-units.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/features/units/lib/fixed-units.ts) - [src/app/api/v1/units/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/units/route.ts) - [src/app/api/v1/units/[id]/route.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/app/api/v1/units/[id]/route.ts) - [src/components/master-data/units-client.tsx](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/components/master-data/units-client.tsx) - [src/config/navigation.ts](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/src/config/navigation.ts) ## Prisma dan Build Cross-Platform - Local Mac sempat rusak karena build Linux menimpa hasil `prisma generate`. - Generator Prisma sekarang mencakup: - `native` - `darwin-arm64` - `debian-openssl-3.0.x` - File: - [prisma/schema.prisma](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/prisma/schema.prisma) ## Workflow Deploy Artifact Linux - Build di server sempat berat dan tidak stabil. - Sekarang ada workflow artifact standalone Linux. - Script: - [deploy/scripts/build-linux-release.sh](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/deploy/scripts/build-linux-release.sh) - Karakteristik workflow ini: - build di Docker `linux/amd64` - install `openssl` di container - pakai `NODE_OPTIONS=--max-old-space-size=4096` - copy source ke `/work` agar tidak menimpa `node_modules` lokal Mac - artifact final: `abelbirdnest-release.tar.gz` - Artifact final tidak membawa `.env.production` lokal. ## Catatan Deploy Server Saat Ini - Path app di server: `/var/www/abelbirdnest-web/AbelBirdNest-Stock` - Struktur release yang dipakai sekarang diasumsikan: - upload artifact ke root repo server - extract ke `releases/` - symlink `current` diarahkan ke release aktif - `systemd` yang benar untuk mode artifact: - `WorkingDirectory=/var/www/abelbirdnest-web/AbelBirdNest-Stock/current` - `EnvironmentFile=/var/www/abelbirdnest-web/AbelBirdNest-Stock/.env.production` - `ExecStart=/usr/bin/node server.js` ## Verifikasi yang Sudah Dilakukan - `npx tsc --noEmit` lolos setelah patch terbaru. - Global search endpoint mengembalikan hasil yang benar untuk sample data lokal. - `GET /api/v1/units` sekarang hanya mengembalikan `gr` dan `kg`. - `POST /api/v1/units` sekarang ditolak dengan pesan lock master. ## Risiko / Catatan yang Masih Relevan - Build standalone lokal tetap menampilkan warning Prisma saat static generation jika DB lokal tidak aktif; warning ini tidak menggagalkan artifact. - Production deploy sekarang punya dua mode historis: - mode lama `repo root + npm run start` - mode baru `artifact standalone + node server.js` Jangan campur keduanya pada instruksi deploy. - Beberapa endpoint `mobile/receipts/**` masih ada untuk kompatibilitas lama, walaupun flow mobile baru tidak lagi menampilkan menu receipt. ## Langkah Lanjutan Paling Masuk Akal 1. Deploy artifact terbaru ke server production. 2. Verifikasi: - search header aktif - halaman publik login aktif - `Satuan` tidak muncul di menu - `GET /api/v1/units` hanya `gr` dan `kg` 3. Jika perlu, lanjut bersihkan endpoint legacy yang sudah tidak dipakai lagi, terutama sekitar receipt mobile lama. ## Catatan Penutup - Handoff sebelumnya: - [docs/codex-handoff-2026-05-19.md](/Users/wirabasalamah/Documents/Codex/abelbirdnest-web/docs/codex-handoff-2026-05-19.md) - Handoff `2026-05-21` ini adalah snapshot terbaru dan seharusnya dipakai sebagai konteks utama lanjutan.