Bot WhatsApp otomatis untuk sistem reservasi/pendaftaran pasien di Klinik atau Puskesmas. Dibangun dengan Node.js, TypeScript, Baileys MD, Prisma ORM, dan Express.js.
- π« Manajemen Poli - Kelola departemen klinik (Poli Umum, Gigi, KIA, dll)
- π¨ββοΈ Jadwal Poli & Dokter - Tampilkan jadwal praktik poli dan dokter
- π€ Pendaftaran Pasien - Daftar pasien baru langsung via WhatsApp
- π Sistem Reservasi - Buat reservasi dengan pilihan poli, dokter, tanggal & waktu
- π« Nomor Antrian - Generate nomor antrian otomatis per poli
- π Cek Status - Cek status reservasi dan antrian
- β Pembatalan Fleksibel - Batalkan atau kembali ke menu kapan saja dengan BATAL/MENU
- π REST API - Full API endpoints untuk integrasi
- πΎ Database Support - PostgreSQL, MySQL, atau SQLite
- οΏ½ Logging - Structured logging dengan Pino
- β Type-Safe - Full TypeScript dengan strict mode
Sebelum memulai, pastikan sudah terinstall:
- Node.js >= 18.x
- npm atau yarn
- Database: PostgreSQL / MySQL / SQLite
- Git
- Nomor WhatsApp untuk bot
git clone https://github.com/alrescha79-cmd/klinik-reservation-bot.git
cd klinik-reservation-botnpm installcp .env.example .envEdit .env:
PORT=3000
DATABASE_URL="file:./dev.db"
ADMIN_PHONE="628xxxxxxxxx"
SESSION_FOLDER="./config/baileysSession"
NODE_ENV=development# Generate Prisma client
npx prisma generate
# Run migrations
npx prisma migrate dev
# (Optional) Seed initial data
npx prisma db seednpm run devBuka terminal, scan QR Code yang muncul dengan WhatsApp:
- Buka WhatsApp di HP
- Pergi ke Settings > Linked Devices
- Tap Link a Device
- Scan QR code di terminal
β Bot siap digunakan!
| Perintah | Fungsi |
|---|---|
menu, mulai, hi, halo |
Tampilkan menu utama |
daftar |
Pendaftaran pasien baru |
jadwal |
Lihat jadwal poli (departemen klinik) |
jadwal dokter |
Lihat jadwal praktik dokter |
reservasi |
Buat reservasi/janji temu |
cek antrian, cek |
Cek status reservasi |
batal |
Batalkan reservasi |
bantuan, help |
Tampilkan bantuan |
π Tip: Di setiap langkah interaktif, ketik
BATALatauMENUuntuk kembali ke menu utama.
- Kirim pesan:
daftar - Bot akan meminta data dengan format:
Nama#NIK#TanggalLahir - Contoh:
Budi Santoso#1234567890123456#1990-05-15 - Bot konfirmasi pendaftaran berhasil
- Kirim pesan:
reservasi - Pilih dokter (balas dengan angka)
- Pilih tanggal (balas dengan angka)
- Pilih waktu (balas dengan angka)
- Bot berikan nomor antrian (ex:
A-015)
π Cancel: Ketik
BATALatauMENUkapan saja untuk kembali
Server berjalan di http://localhost:3000
GET /api/patients- List semua pasienGET /api/patients/:id- Detail pasien by IDGET /api/patients/phone/:phone- Detail pasien by phonePOST /api/patients- Daftar pasien baruPUT /api/patients/:id- Update data pasienDELETE /api/patients/:id- Hapus pasien
GET /api/doctors- List semua dokterGET /api/doctors/:id- Detail dokter by IDPOST /api/doctors- Tambah dokter baruPUT /api/doctors/:id- Update data dokterDELETE /api/doctors/:id- Hapus dokterPOST /api/doctors/seed- Seed data dokter sample
GET /api/reservations- List semua reservasiGET /api/reservations/:id- Detail reservasiGET /api/reservations/patient/:patientId- Reservasi by patientGET /api/reservations/doctor/:doctorId- Reservasi by doctorGET /api/reservations/date/:date- Reservasi by datePOST /api/reservations- Buat reservasi baruPUT /api/reservations/:id- Update reservasiDELETE /api/reservations/:id- Batalkan reservasi
Lihat dokumentasi lengkap API: docs/API.md
/src
βββ app.ts # Express app configuration
βββ server.ts # Server entry point
βββ bot/
β βββ index.ts # Bot initialization
β βββ baileys.ts # Baileys WhatsApp connection
β βββ handlers/
β βββ messageHandler.ts # Handle incoming messages
β βββ eventHandler.ts # Handle WA events
βββ modules/
β βββ patient/
β β βββ patient.controller.ts # HTTP handlers
β β βββ patient.service.ts # Business logic
β β βββ patient.route.ts # Route definitions
β βββ doctor/
β β βββ doctor.controller.ts
β β βββ doctor.service.ts
β β βββ doctor.route.ts
β βββ reservation/
β βββ reservation.controller.ts
β βββ reservation.service.ts
β βββ reservation.route.ts
βββ prisma/
β βββ schema.prisma # Database schema
β βββ migrations/ # Database migrations
βββ utils/
β βββ logger.ts # Pino logger wrapper
β βββ formatter.ts # Message formatters
β βββ validation.ts # Zod validation schemas
βββ config/
βββ env.ts # Environment configuration
βββ baileysSession/ # WhatsApp session storage
# Run all tests
npm test
# Run tests with coverage
npm test -- --coverage
# Run tests in watch mode
npm test -- --watchLihat panduan testing: docs/TESTING.md
npm run dev # Start development server with hot-reload
npm run build # Build TypeScript to JavaScript
npm start # Start production server
npm test # Run tests
npm run prisma:generate # Generate Prisma client
npm run prisma:migrate # Run database migrations
npm run prisma:studio # Open Prisma Studio (DB GUI)- Gunakan
npx prisma studiountuk GUI database - Log level bisa diubah di
.envβLOG_LEVEL=debug - Restart bot jika ada perubahan di
schema.prisma - Session WhatsApp disimpan di
config/baileysSession/
Lihat panduan development lengkap: docs/DEVELOPMENT.md
# Install dependencies
npm ci --production
# Setup database
npx prisma migrate deploy
# Build
npm run build
# Start with PM2
pm2 start dist/server.js --name wa-bot-klinikdocker-compose up -dLihat panduan deployment lengkap: docs/PRODUCTION.md
Dokumentasi lengkap tersedia di folder /docs:
- π API Documentation - REST API endpoints & WhatsApp commands
- π οΈ Development Guide - Setup development environment
- π Production Deployment - Deploy ke VPS/Cloud/Docker
- ποΈ Architecture - System architecture & design patterns
- π§ͺ Testing Guide - Unit, integration, E2E testing
model Patient {
id Int @id @default(autoincrement())
name String
nik String @unique
phone String @unique
birthDate DateTime
address String?
createdAt DateTime @default(now())
reservations Reservation[]
}
model Poli {
id Int @id @default(autoincrement())
name String @unique
description String?
schedule String // JSON string
isActive Boolean @default(true)
createdAt DateTime @default(now())
reservations Reservation[]
}
model Doctor {
id Int @id @default(autoincrement())
name String
specialty String
schedule String // JSON string
createdAt DateTime @default(now())
reservations Reservation[]
}
model Reservation {
id Int @id @default(autoincrement())
patientId Int
poliId Int
doctorId Int?
reservationDate DateTime
reservationTime String
queueNumber String
status String @default("pending")
createdAt DateTime @default(now())
patient Patient @relation(fields: [patientId], references: [id])
poli Poli @relation(fields: [poliId], references: [id])
doctor Doctor? @relation(fields: [doctorId], references: [id])
}β οΈ Jangan commit.envke repositoryβ οΈ Gunakan environment variables untuk credentialsβ οΈ Untuk production, tambahkan rate limiting dan authenticationβ οΈ Backup database secara berkalaβ οΈ Backup WhatsApp session diconfig/baileysSession/
- Cek logs: Apakah ada error?
- Pastikan
Message handler registeredmuncul di log - Restart bot:
rsdi terminal nodemon - Clear session & scan ulang QR
# Reset database
npx prisma migrate reset
# Generate client ulang
npx prisma generate# Ganti PORT di .env
PORT=3001
# Atau kill process
lsof -ti:3000 | xargs kill -9Contributions are welcome! Please:
- Fork repository
- Create feature branch:
git checkout -b feature/nama-fitur - Commit changes:
git commit -am 'Add feature' - Push to branch:
git push origin feature/nama-fitur - Submit Pull Request
This project is licensed under the ISC License.
- Runtime: Node.js 18+
- Language: TypeScript 5.x
- WhatsApp API: @whiskeysockets/baileys
- Web Framework: Express.js
- ORM: Prisma 6.x
- Database: PostgreSQL / MySQL / SQLite
- Validation: Zod
- Logging: Pino
- Testing: Jest
- Process Manager: PM2 (production)
Jika ada pertanyaan atau masalah:
- Check Documentation
- Review existing issues
- Create new issue
β Star this repo if you find it useful!
Made with β€οΈ for Indonesian Healthcare