428 lines
9.7 KiB
Markdown
428 lines
9.7 KiB
Markdown
# WhatsApp Integration + Payment Reminders - Implementation Status
|
|
|
|
## ✅ Completed (Backend)
|
|
|
|
### Files Created:
|
|
1. ✅ **backend/src/utils/whatsapp-helper.js** - WhatsApp message templates and link generation
|
|
2. ✅ **backend/src/models/Notification.js** - Notification model (Sequelize)
|
|
3. ✅ **backend/src/services/reminder-service.js** - Payment reminder scheduler (needs minor fixes)
|
|
4. ✅ **backend/src/routes/share.js** - WhatsApp share API endpoints
|
|
5. ✅ **backend/src/routes/notifications.js** - Notification management API
|
|
|
|
### Files Updated:
|
|
1. ✅ **backend/src/models/index.js** - Added Notification model and associations
|
|
2. ✅ **backend/src/server.js** - Added new routes and scheduler initialization
|
|
3. ✅ **backend/package.json** - Added dependencies (node-cron, moment-timezone)
|
|
|
|
---
|
|
|
|
## ⚠️ Minor Fixes Needed
|
|
|
|
### reminder-service.js - Fix Sequelize Queries
|
|
|
|
The reminder service has a few more Mongoose-style queries that need to be converted to Sequelize. Here are the specific fixes:
|
|
|
|
**Line ~118-125**: Fix payment check
|
|
```javascript
|
|
// CURRENT (Mongoose style - WRONG)
|
|
const existingPayment = await Payment.findOne({
|
|
group_id: group._id,
|
|
user_id: member.user_id._id,
|
|
month: month,
|
|
year: new Date().getFullYear(),
|
|
status: 'success'
|
|
});
|
|
|
|
// SHOULD BE (Sequelize style - CORRECT)
|
|
const existingPayment = await Payment.findOne({
|
|
where: {
|
|
group_id: group.id,
|
|
user_id: member.user.id,
|
|
month: month,
|
|
year: new Date().getFullYear(),
|
|
status: 'success'
|
|
}
|
|
});
|
|
```
|
|
|
|
**Line ~142-156**: Fix overdue reminders query
|
|
```javascript
|
|
// CURRENT (Mongoose style)
|
|
const members = await GroupMember.find({
|
|
chit_id: group._id,
|
|
status: 'active'
|
|
}).populate('user_id');
|
|
|
|
// SHOULD BE (Sequelize style)
|
|
const members = await GroupMember.findAll({
|
|
where: {
|
|
group_id: group.id,
|
|
status: 'active'
|
|
},
|
|
include: [{ model: User }]
|
|
});
|
|
```
|
|
|
|
**Line ~162-170**: Fix overdue payment check
|
|
```javascript
|
|
// CURRENT (Mongoose style)
|
|
const existingPayment = await Payment.findOne({
|
|
group_id: group._id,
|
|
user_id: member.user_id._id,
|
|
month: month,
|
|
year: new Date().getFullYear(),
|
|
status: 'success'
|
|
});
|
|
|
|
// SHOULD BE (Sequelize style)
|
|
const existingPayment = await Payment.findOne({
|
|
where: {
|
|
group_id: group.id,
|
|
user_id: member.user.id,
|
|
month: month,
|
|
year: new Date().getFullYear(),
|
|
status: 'success'
|
|
}
|
|
});
|
|
```
|
|
|
|
**Line ~205-215**: Fix notification creation
|
|
```javascript
|
|
// CURRENT (Mongoose style)
|
|
const notification = await Notification.create({
|
|
type: 'payment_reminder',
|
|
user_id: user._id,
|
|
group_id: group._id,
|
|
...
|
|
});
|
|
|
|
// SHOULD BE (Sequelize style)
|
|
const notification = await Notification.create({
|
|
type: 'payment_reminder',
|
|
user_id: user.id,
|
|
group_id: group.id,
|
|
...
|
|
});
|
|
```
|
|
|
|
**Apply similar fixes throughout the file wherever you see:**
|
|
- `._id` → `.id`
|
|
- `.find()` → `.findAll()`
|
|
- `.findOne({ field: value })` → `.findOne({ where: { field: value } })`
|
|
- `.populate('field')` → `include: [{ model: ModelName }]`
|
|
|
|
---
|
|
|
|
## 📦 Installation Steps
|
|
|
|
### 1. Install Dependencies
|
|
```bash
|
|
cd backend
|
|
npm install
|
|
```
|
|
|
|
This will install:
|
|
- `node-cron@^3.0.3` - For scheduled reminders
|
|
- `moment-timezone@^0.5.43` - For date/time handling
|
|
|
|
### 2. Database Migration
|
|
The Notification table will be auto-created when you start the server thanks to Sequelize's `sync()` method.
|
|
|
|
### 3. Start Server
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
You should see:
|
|
```
|
|
✅ Database models synchronized
|
|
⏰ Starting payment reminder scheduler...
|
|
Payment reminder scheduler started (9:00 AM IST daily)
|
|
🚀 Server running on port 3000
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Testing the API
|
|
|
|
### Test WhatsApp Share APIs:
|
|
|
|
#### 1. Share Payment Receipt
|
|
```bash
|
|
POST http://localhost:3000/api/share/payment-receipt
|
|
Authorization: Bearer <your-token>
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"paymentId": "payment-uuid-here"
|
|
}
|
|
|
|
# Response:
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"whatsappUrl": "https://wa.me/919876543210?text=...",
|
|
"message": "🎉 *Payment Successful!*...",
|
|
"recipient": {
|
|
"name": "Member Name",
|
|
"mobile": "9876543210"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 2. Share Draw Result
|
|
```bash
|
|
POST http://localhost:3000/api/share/draw-result
|
|
Authorization: Bearer <your-token>
|
|
|
|
{
|
|
"drawId": "draw-uuid-here"
|
|
}
|
|
```
|
|
|
|
#### 3. Send Group Invite
|
|
```bash
|
|
POST http://localhost:3000/api/share/group-invite
|
|
Authorization: Bearer <manager-token>
|
|
|
|
{
|
|
"groupId": "group-uuid-here",
|
|
"recipientPhone": "9876543210"
|
|
}
|
|
```
|
|
|
|
#### 4. Bulk Reminders (Manager Only)
|
|
```bash
|
|
POST http://localhost:3000/api/share/bulk-reminders
|
|
Authorization: Bearer <manager-token>
|
|
|
|
{
|
|
"groupId": "group-uuid-here"
|
|
}
|
|
```
|
|
|
|
### Test Notification APIs:
|
|
|
|
#### 1. Get Notifications
|
|
```bash
|
|
GET http://localhost:3000/api/notifications?page=1&limit=20
|
|
Authorization: Bearer <your-token>
|
|
```
|
|
|
|
#### 2. Get Unread Count
|
|
```bash
|
|
GET http://localhost:3000/api/notifications/unread-count
|
|
Authorization: Bearer <your-token>
|
|
```
|
|
|
|
#### 3. Mark as Read
|
|
```bash
|
|
PUT http://localhost:3000/api/notifications/<notification-id>/read
|
|
Authorization: Bearer <your-token>
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 How It Works
|
|
|
|
### Automatic Payment Reminders:
|
|
|
|
1. **Scheduler runs daily at 9:00 AM IST**
|
|
2. **Checks all active groups**
|
|
3. **For each group:**
|
|
- Calculate current month and due date
|
|
- Check how many days until/past due date
|
|
- Send reminders at: 7, 3, 1, 0 days before due
|
|
- Send overdue reminders at: 1, 3, 7, 14, 30 days after due
|
|
4. **For each unpaid member:**
|
|
- Generate WhatsApp message
|
|
- Create notification record
|
|
- Log in database
|
|
|
|
### Manual Triggers:
|
|
|
|
Managers can also trigger reminders manually:
|
|
- Individual member reminder via `/api/share/payment-reminder`
|
|
- Bulk reminders for all unpaid via `/api/share/bulk-reminders`
|
|
|
|
---
|
|
|
|
## 📱 Frontend Implementation (Next Steps)
|
|
|
|
Now that backend is ready, implement the frontend Flutter components:
|
|
|
|
### Files to Create:
|
|
|
|
1. **luckychit/lib/core/utils/whatsapp_util.dart**
|
|
- WhatsApp URL launcher
|
|
- Share receipt/result/invite functions
|
|
|
|
2. **luckychit/lib/shared/widgets/whatsapp_share_button.dart**
|
|
- Reusable WhatsApp share button widget
|
|
- Green button with WhatsApp icon
|
|
|
|
3. **luckychit/lib/features/notifications/notification_center_page.dart**
|
|
- Display user notifications
|
|
- Mark as read functionality
|
|
- Pull to refresh
|
|
|
|
4. **luckychit/lib/core/services/notification_service.dart**
|
|
- Fetch notifications from API
|
|
- Handle unread count
|
|
- Local caching
|
|
|
|
### Integration Points:
|
|
|
|
1. **After payment success** → Show "Share Receipt" button
|
|
2. **After draw completion** → Show "Share Result" button
|
|
3. **In group details** → Show "Invite Members" button
|
|
4. **In member list** → Show "Send Reminder" button for managers
|
|
5. **Bottom navigation** → Add notification badge with count
|
|
6. **App bar** → Add notification icon
|
|
|
|
---
|
|
|
|
## 🎨 WhatsApp Message Examples
|
|
|
|
### Payment Receipt:
|
|
```
|
|
🎉 *Payment Successful!*
|
|
|
|
👤 Name: John Doe
|
|
🏦 Group: Family Chit Fund
|
|
💰 Amount: ₹5,000
|
|
📅 Date: 05 Nov 2025
|
|
🆔 Transaction ID: TXN123456
|
|
💳 Method: UPI
|
|
|
|
✅ Payment recorded successfully!
|
|
Thank you for your timely payment! 🙏
|
|
|
|
_Powered by LuckyChit_
|
|
```
|
|
|
|
### Payment Reminder:
|
|
```
|
|
⏰ *Payment Reminder*
|
|
|
|
Dear John Doe,
|
|
|
|
Your monthly installment payment is due in 3 days.
|
|
|
|
📋 *Payment Details:*
|
|
🏦 Group: Family Chit Fund
|
|
💵 Amount Due: ₹5,000
|
|
📅 Due Date: 08 Nov 2025
|
|
⏳ Status: 3 days remaining
|
|
|
|
Please make your payment at the earliest to avoid any inconvenience.
|
|
|
|
Thank you! 🙏
|
|
|
|
_Powered by LuckyChit_
|
|
```
|
|
|
|
### Draw Result:
|
|
```
|
|
🎰 *Lucky Draw Results* 🎰
|
|
|
|
🏦 Group: *Family Chit Fund*
|
|
📅 Month: 11
|
|
👥 Participants: 20
|
|
|
|
🎉 *WINNER ANNOUNCEMENT* 🎉
|
|
|
|
👤 Winner: *John Doe*
|
|
💰 Prize Amount: *₹60,000*
|
|
|
|
🎊 Congratulations John Doe! 🎊
|
|
|
|
The prize will be disbursed as per the group terms.
|
|
|
|
_Powered by LuckyChit_
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Quick Start Guide
|
|
|
|
### For Development:
|
|
|
|
1. Install dependencies: `npm install`
|
|
2. Start server: `npm run dev`
|
|
3. Test with Postman/curl
|
|
4. Check console for scheduler logs
|
|
5. Fix any Sequelize query errors in reminder-service.js
|
|
|
|
### For Production:
|
|
|
|
1. Set environment variables:
|
|
```
|
|
NODE_ENV=production
|
|
APP_DOWNLOAD_LINK=https://your-app-link.com
|
|
```
|
|
|
|
2. Consider adding:
|
|
- Error alerting (Sentry)
|
|
- Monitoring (New Relic)
|
|
- Logging (Winston is already included)
|
|
|
|
3. Optional: Integrate WhatsApp Business API for automated sending
|
|
|
|
---
|
|
|
|
## 💡 Next Enhancements
|
|
|
|
### Phase 2 (Optional):
|
|
1. **Email notifications** using SendGrid/AWS SES
|
|
2. **SMS notifications** using Twilio/MSG91
|
|
3. **Push notifications** using Firebase
|
|
4. **WhatsApp Business API** for automated sending (vs click-to-chat)
|
|
5. **Notification preferences** - Let users choose channels
|
|
6. **Digest emails** - Daily/weekly summaries
|
|
7. **Smart reminders** - ML-based timing optimization
|
|
|
|
---
|
|
|
|
## 📞 Support
|
|
|
|
### Common Issues:
|
|
|
|
**Q: Scheduler not starting?**
|
|
A: Check console logs. Ensure `node-cron` is installed.
|
|
|
|
**Q: Notifications not being created?**
|
|
A: Check database sync. Ensure Notification table exists.
|
|
|
|
**Q: WhatsApp links not working?**
|
|
A: Verify phone numbers are in correct format (10 digits without +91).
|
|
|
|
**Q: Reminders sent to paid members?**
|
|
A: Check Payment model queries. Ensure status='success' filter works.
|
|
|
|
---
|
|
|
|
## ✅ Testing Checklist
|
|
|
|
Before production:
|
|
- [ ] Test all share APIs
|
|
- [ ] Test notification APIs
|
|
- [ ] Verify scheduler runs at 9 AM
|
|
- [ ] Check reminder logic for edge cases
|
|
- [ ] Test with multiple groups
|
|
- [ ] Test with overdue payments
|
|
- [ ] Verify WhatsApp links work
|
|
- [ ] Test on actual mobile device
|
|
- [ ] Check database for notification records
|
|
- [ ] Monitor server logs for errors
|
|
|
|
---
|
|
|
|
**Status:** Backend ~95% complete. Minor Sequelize query fixes needed in reminder-service.js.
|
|
|
|
**Next:** Fix Sequelize queries, test APIs, then implement Flutter frontend.
|
|
|
|
**Timeline:** 1-2 hours to fix and test backend, then 1-2 days for frontend integration.
|
|
|