bmc_hub/MDfile/REMINDER_SYSTEM_QUICKSTART.md
Christian a604a3cc44 Add comprehensive test suite for vTiger integration and ticket module
- Implemented test scripts for vTiger account retrieval, contact data, and modules.
- Created a detailed test suite for the ticket module, covering database schema validation, ticket number generation, prepaid card constraints, and service logic.
- Added tests for vTiger field inspection and various queries related to accounts and sales orders.
- Introduced SQL migration scripts for the ALSO Cloud Billing foundation, including import jobs, lines, and mapping tables with necessary constraints and indices.
- Enhanced workflow columns in the import lines table to support matching and validation timestamps.
2026-06-20 03:29:51 +02:00

6.3 KiB

Reminder System Quick Start

1. Apply Database Migration

# Connect to database and run migration
docker-compose exec -T postgres psql -U bmc_hub -d bmc_hub << EOF
$(cat migrations/096_reminder_system.sql)
EOF

Or via psql client:

psql -h localhost -U bmc_hub -d bmc_hub -f migrations/096_reminder_system.sql

Verify tables created:

\d sag_reminders
\d sag_reminder_logs
\d user_notification_preferences
\d sag_reminder_queue

2. Install Dependencies

pip install aiosmtplib==3.0.2
# Or
pip install -r requirements.txt

3. Configure Environment

Edit .env:

# ✅ Keep these disabled for local development
REMINDERS_ENABLED=false
REMINDERS_EMAIL_ENABLED=false
REMINDERS_DRY_RUN=true

# 📧 SMTP Configuration (optional for local testing)
EMAIL_SMTP_HOST=smtp.gmail.com
EMAIL_SMTP_PORT=587
EMAIL_SMTP_USER=your-email@gmail.com
EMAIL_SMTP_PASSWORD=your-app-password

# 💬 Mattermost (optional)
MATTERMOST_ENABLED=true
MATTERMOST_WEBHOOK_URL=https://mattermost.example.com/hooks/xxxxx
MATTERMOST_CHANNEL=reminders

4. Restart Application

docker-compose restart api

Check logs:

docker-compose logs -f api

Should see:

✅ Reminder job scheduled (every 5 minutes)

5. Test Frontend Notification System

  1. Open http://localhost:8000/
  2. Log in
  3. Open browser console (F12)
  4. Should see: ✅ Reminder system initialized
  5. Create a test reminder via database:
INSERT INTO sag_reminders (
    sag_id, title, message, priority,
    trigger_type, trigger_config,
    recipient_user_ids, recipient_emails,
    recurrence_type, is_active, created_by_user_id,
    scheduled_at, next_check_at
) VALUES (
    1,  -- Replace with actual case ID
    'Test Reminder',
    'This is a test reminder',
    'high',
    'time_based',
    '{}',
    '{1}',  -- Replace with actual user ID
    '{}',
    'once',
    true,
    1,  -- Replace with your user ID
    now(),
    now()
);
  1. Wait ~30 seconds or manually call: GET /api/v1/reminders/pending/me?user_id=1
  2. Should see popup toast notification

6. Test API Endpoints

Get User Preferences

curl -X GET http://localhost:8000/api/v1/users/me/notification-preferences?user_id=1

Update User Preferences

curl -X PATCH http://localhost:8000/api/v1/users/me/notification-preferences?user_id=1 \
  -H "Content-Type: application/json" \
  -d {
    "notify_frontend": true,
    "notify_email": false,
    "notify_mattermost": true
  }

Create Reminder

curl -X POST http://localhost:8000/api/v1/sag/1/reminders?user_id=1 \
  -H "Content-Type: application/json" \
  -d {
    "title": "Test Reminder",
    "message": "This is a test",
    "priority": "normal",
    "trigger_type": "time_based",
    "trigger_config": {},
    "recipient_user_ids": [1],
    "recurrence_type": "once"
  }

List Reminders

curl -X GET http://localhost:8000/api/v1/sag/1/reminders

Snooze Reminder

curl -X POST http://localhost:8000/api/v1/sag/reminders/1/snooze?user_id=1 \
  -H "Content-Type: application/json" \
  -d { "duration_minutes": 30 }

Dismiss Reminder

curl -X POST http://localhost:8000/api/v1/sag/reminders/1/dismiss?user_id=1 \
  -H "Content-Type: application/json" \
  -d { "reason": "Already handled" }

7. Test Status Change Trigger

  1. Create a reminder with status_change trigger:
INSERT INTO sag_reminders (
    sag_id, title, message, priority,
    trigger_type, trigger_config,
    recipient_user_ids, recipient_emails,
    recurrence_type, is_active, created_by_user_id
) VALUES (
    1,  -- Your test case
    'Case entered In Progress',
    'Case has been moved to "i_gang" status',
    'high',
    'status_change',
    '{"target_status": "i_gang"}',  -- Trigger when status changes to "i_gang"
    '{1}',
    '{}',
    'once',
    true,
    1
);
  1. Update case status:
UPDATE sag_sager SET status = 'i_gang' WHERE id = 1;
  1. Check queue:
SELECT * FROM sag_reminder_queue WHERE status = 'pending';
  1. Should see pending event. Wait for scheduler to process (next 5-min interval)

  2. Check logs:

SELECT * FROM sag_reminder_logs ORDER BY triggered_at DESC LIMIT 5;

8. Enable Production Features (When Ready)

To actually send reminders:

REMINDERS_ENABLED=true
REMINDERS_DRY_RUN=false

# Enable channels you want
REMINDERS_EMAIL_ENABLED=true
REMINDERS_MATTERMOST_ENABLED=true

Then restart and test again.

9. Monitor Reminder Execution

View Pending Reminders

SELECT * FROM v_pending_reminders LIMIT 5;

View Queue Status

SELECT id, reminder_id, status, error_message 
FROM sag_reminder_queue 
WHERE status IN ('pending', 'failed')
ORDER BY created_at DESC 
LIMIT 10;

View Notification Logs

SELECT id, reminder_id, sag_id, status, triggered_at, channels_used 
FROM sag_reminder_logs 
ORDER BY triggered_at DESC 
LIMIT 20;

Check Rate Limiting

SELECT user_id, COUNT(*) as count, MAX(triggered_at) as last_sent
FROM sag_reminder_logs
WHERE status = 'sent' AND triggered_at > CURRENT_TIMESTAMP - INTERVAL '1 hour'
GROUP BY user_id
ORDER BY count DESC;

Common Issues

"Reminder system not initialized"

  • User not authenticated
  • Check that JWT token is valid
  • Check browser console for auth errors

Reminders not appearing

  • Check REMINDERS_ENABLED=true
  • Check next_check_at <= NOW()
  • Check recipient_user_ids includes current user
  • Verify polling API returns data: GET /api/v1/reminders/pending/me

Email not sending

  • Check REMINDERS_EMAIL_ENABLED=true
  • Check SMTP credentials in .env
  • Check REMINDERS_DRY_RUN=false
  • Review application logs for SMTP errors
  • Try sending with REMINDERS_DRY_RUN=true first (logs only)

Status trigger not firing

  • Verify case ID exists
  • Check trigger_config matches: {"target_status": "expected_status"}
  • Manually check: UPDATE sag_sager SET status = 'target_status'
  • Query sag_reminder_queue for new events

Next Steps

  1. Database migration applied
  2. Environment configured
  3. Frontend notifications working
  4. API endpoints tested
  5. → Configure email/Mattermost credentials
  6. → Enable production features
  7. → Monitor logs and metrics
  8. → Set up alerting for failures

See REMINDER_SYSTEM_IMPLEMENTATION.md for detailed documentation.