# WhatsApp Shared Account Implementation - Summary

## What Was Implemented

A **simplified WhatsApp notification system** using a **shared master account** model, perfect for your 10-bakery pilot program. This eliminates the need for non-technical bakery owners to configure Meta credentials.

---

## Key Changes Made

### ✅ Backend Changes

1. **Tenant Settings Model** - Removed per-tenant credentials, added display phone number
   - File: [tenant_settings.py](services/tenant/app/models/tenant_settings.py)
   - File: [tenant_settings.py](services/tenant/app/schemas/tenant_settings.py)

2. **Notification Service** - Always uses shared master credentials with tenant-specific phone numbers
   - File: [whatsapp_business_service.py](services/notification/app/services/whatsapp_business_service.py)

3. **Phone Number Management API** - New admin endpoints for assigning phone numbers
   - File: [whatsapp_admin.py](services/tenant/app/api/whatsapp_admin.py)
   - Registered in: [main.py](services/tenant/app/main.py)

### ✅ Frontend Changes

4. **Simplified Settings UI** - Removed credential inputs, shows assigned phone number only
   - File: [NotificationSettingsCard.tsx](frontend/src/pages/app/database/ajustes/cards/NotificationSettingsCard.tsx)
   - Types: [settings.ts](frontend/src/api/types/settings.ts)

5. **Admin Interface** - New page for assigning phone numbers to tenants
   - File: [WhatsAppAdminPage.tsx](frontend/src/pages/app/admin/WhatsAppAdminPage.tsx)

### ✅ Documentation

6. **Comprehensive Guides**
   - [WHATSAPP_SHARED_ACCOUNT_GUIDE.md](WHATSAPP_SHARED_ACCOUNT_GUIDE.md) - Full implementation details
   - [WHATSAPP_MASTER_ACCOUNT_SETUP.md](WHATSAPP_MASTER_ACCOUNT_SETUP.md) - Step-by-step setup

---

## Quick Start (For You - Platform Admin)

### Step 1: Set Up Master WhatsApp Account (One-Time)

Follow the detailed guide: [WHATSAPP_MASTER_ACCOUNT_SETUP.md](WHATSAPP_MASTER_ACCOUNT_SETUP.md)

**Summary:**
1. Create Meta Business Account
2. Add WhatsApp product
3. Verify business (1-3 days wait)
4. Add 10 phone numbers
5. Create message templates
6. Get credentials (WABA ID, Access Token, Phone Number IDs)

**Time:** 2-3 hours + verification wait

### Step 2: Configure Environment Variables

Edit `services/notification/.env`:

```bash
WHATSAPP_BUSINESS_ACCOUNT_ID=your-waba-id-here
WHATSAPP_ACCESS_TOKEN=your-access-token-here
WHATSAPP_PHONE_NUMBER_ID=default-phone-id-here
WHATSAPP_API_VERSION=v18.0
ENABLE_WHATSAPP_NOTIFICATIONS=true
WHATSAPP_WEBHOOK_VERIFY_TOKEN=your-secret-token-here
```

### Step 3: Restart Services

```bash
docker-compose restart notification-service tenant-service
```

### Step 4: Assign Phone Numbers to Bakeries

**Option A: Via Admin UI (Recommended)**

1. Open: `http://localhost:5173/app/admin/whatsapp`
2. For each bakery:
   - Select phone number from dropdown
   - Click assign

**Option B: Via API**

```bash
curl -X POST http://localhost:8001/api/v1/admin/whatsapp/tenants/{tenant_id}/assign-phone \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number_id": "123456789012345",
    "display_phone_number": "+34 612 345 678"
  }'
```

### Step 5: Test

1. Login as a bakery owner
2. Go to Settings → Notifications
3. Toggle WhatsApp ON
4. Verify phone number is displayed
5. Create a test purchase order
6. Supplier should receive WhatsApp message!

---

## For Bakery Owners (What They Need to Do)

### Before:
❌ Navigate Meta Business Suite
❌ Create WhatsApp Business Account
❌ Get 3 different credential IDs
❌ Copy/paste into settings
**Time:** 1-2 hours, high error rate

### After:
✅ Go to Settings → Notifications
✅ Toggle WhatsApp ON
✅ Done!
**Time:** 30 seconds

**No configuration needed - phone number is already assigned by you (admin)!**

---

## Architecture Overview

```
┌─────────────────────────────────────────────┐
│   Master WhatsApp Business Account          │
│   - Admin manages centrally                 │
│   - Single set of credentials               │
│   - 10 phone numbers (one per bakery)       │
└─────────────────────────────────────────────┘
                      │
        ┌─────────────┼─────────────┐
        │             │             │
   Phone #1       Phone #2      Phone #3
    +34 612       +34 612       +34 612
    345 678       345 679       345 680
        │             │             │
   Bakery A       Bakery B      Bakery C
```

---

## API Endpoints Created

### Admin Endpoints (New)

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/api/v1/admin/whatsapp/phone-numbers` | List available phone numbers |
| GET | `/api/v1/admin/whatsapp/tenants` | List tenants with WhatsApp status |
| POST | `/api/v1/admin/whatsapp/tenants/{id}/assign-phone` | Assign phone to tenant |
| DELETE | `/api/v1/admin/whatsapp/tenants/{id}/unassign-phone` | Unassign phone from tenant |

### Test Commands

```bash
# View available phone numbers
curl http://localhost:8001/api/v1/admin/whatsapp/phone-numbers | jq

# View tenant WhatsApp status
curl http://localhost:8001/api/v1/admin/whatsapp/tenants | jq

# Assign phone to tenant
curl -X POST http://localhost:8001/api/v1/admin/whatsapp/tenants/{tenant_id}/assign-phone \
  -H "Content-Type: application/json" \
  -d '{"phone_number_id": "XXX", "display_phone_number": "+34 612 345 678"}'
```

---

## Database Changes

### Tenant Settings Schema

**Before:**
```json
{
  "notification_settings": {
    "whatsapp_enabled": false,
    "whatsapp_phone_number_id": "",
    "whatsapp_access_token": "",           // REMOVED
    "whatsapp_business_account_id": "",    // REMOVED
    "whatsapp_api_version": "v18.0",       // REMOVED
    "whatsapp_default_language": "es"
  }
}
```

**After:**
```json
{
  "notification_settings": {
    "whatsapp_enabled": false,
    "whatsapp_phone_number_id": "",            // Phone from shared account
    "whatsapp_display_phone_number": "",       // NEW: Display format
    "whatsapp_default_language": "es"
  }
}
```

**Migration:** No SQL migration needed (JSONB is schema-less). Existing data will work with defaults.

---

## Cost Estimate

### WhatsApp Messaging Costs (Spain)

- **Per conversation:** €0.0319 - €0.0699
- **Conversation window:** 24 hours
- **User-initiated:** Free

### Monthly Estimate (10 Bakeries)

```
5 POs per bakery per day × 10 bakeries × 30 days = 1,500 messages/month
1,500 × €0.05 (avg) = €75/month
```

### Setup Cost Savings

**Old Model (Per-Tenant):**
- 10 bakeries × 1.5 hours × €50/hr = **€750 in setup time**

**New Model (Shared Account):**
- Admin: 2 hours setup (one time)
- Per bakery: 5 minutes × 10 = **€0 in bakery time**

**Savings:** €750 in bakery owner time + reduced support tickets

---

## Monitoring & Maintenance

### Check Quality Rating (Weekly)

```bash
curl -X GET "https://graph.facebook.com/v18.0/{PHONE_NUMBER_ID}" \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  | jq '.quality_rating'
```

**Quality Ratings:**
- **GREEN** ✅ - All good
- **YELLOW** ⚠️ - Review messaging patterns
- **RED** ❌ - Fix immediately

### View Message Logs

```bash
# Docker logs
docker logs -f notification-service | grep whatsapp

# Database query
SELECT tenant_id, recipient_phone, status, created_at, error_message
FROM whatsapp_messages
WHERE created_at > NOW() - INTERVAL '24 hours'
ORDER BY created_at DESC;
```

### Rotate Access Token (Every 60 Days)

1. Generate new token in Meta Business Manager
2. Update `WHATSAPP_ACCESS_TOKEN` in `.env`
3. Restart notification service
4. Revoke old token

---

## Troubleshooting

### Bakery doesn't receive WhatsApp messages

**Checklist:**
1. ✅ WhatsApp enabled in tenant settings?
2. ✅ Phone number assigned to tenant?
3. ✅ Master credentials in environment variables?
4. ✅ Template approved by Meta?
5. ✅ Recipient phone in E.164 format (+34612345678)?

**Check logs:**
```bash
docker logs -f notification-service | grep -i "whatsapp\|error"
```

### Phone assignment fails: "Already assigned"

Find which tenant has it:
```bash
curl http://localhost:8001/api/v1/admin/whatsapp/tenants | \
  jq '.[] | select(.phone_number_id == "YOUR_PHONE_ID")'
```

Unassign first:
```bash
curl -X DELETE http://localhost:8001/api/v1/admin/whatsapp/tenants/{tenant_id}/unassign-phone
```

### "WhatsApp master account not configured"

Ensure environment variables are set:
```bash
docker exec notification-service env | grep WHATSAPP
```

Should show all variables (WABA ID, Access Token, Phone Number ID).

---

## Next Steps

### Immediate (Before Pilot)

- [ ] Complete master account setup (follow [WHATSAPP_MASTER_ACCOUNT_SETUP.md](WHATSAPP_MASTER_ACCOUNT_SETUP.md))
- [ ] Assign phone numbers to all 10 pilot bakeries
- [ ] Send email to bakeries: "WhatsApp notifications are ready - just toggle ON in settings"
- [ ] Test with 2-3 bakeries first
- [ ] Monitor for first week

### Short-term (During Pilot)

- [ ] Collect bakery feedback
- [ ] Monitor quality rating daily
- [ ] Track message costs
- [ ] Document common support questions

### Long-term (After Pilot)

- [ ] Consider WhatsApp Embedded Signup for self-service (if scaling beyond 10)
- [ ] Create additional templates (inventory alerts, production alerts)
- [ ] Implement rich media messages (images, documents)
- [ ] Add interactive buttons (approve/reject PO via WhatsApp)

---

## Files Modified/Created

### Backend

**Modified:**
- `services/tenant/app/models/tenant_settings.py`
- `services/tenant/app/schemas/tenant_settings.py`
- `services/notification/app/services/whatsapp_business_service.py`
- `services/tenant/app/main.py`

**Created:**
- `services/tenant/app/api/whatsapp_admin.py`

### Frontend

**Modified:**
- `frontend/src/pages/app/database/ajustes/cards/NotificationSettingsCard.tsx`
- `frontend/src/api/types/settings.ts`

**Created:**
- `frontend/src/pages/app/admin/WhatsAppAdminPage.tsx`

### Documentation

**Created:**
- `WHATSAPP_SHARED_ACCOUNT_GUIDE.md` - Full implementation guide
- `WHATSAPP_MASTER_ACCOUNT_SETUP.md` - Admin setup instructions
- `WHATSAPP_IMPLEMENTATION_SUMMARY.md` - This file

---

## Support

**Questions?**
- Technical implementation: Review [WHATSAPP_SHARED_ACCOUNT_GUIDE.md](WHATSAPP_SHARED_ACCOUNT_GUIDE.md)
- Setup help: Follow [WHATSAPP_MASTER_ACCOUNT_SETUP.md](WHATSAPP_MASTER_ACCOUNT_SETUP.md)
- Meta documentation: https://developers.facebook.com/docs/whatsapp

**Common Issues:**
- Most problems are due to missing/incorrect environment variables
- Check logs: `docker logs -f notification-service`
- Verify Meta credentials haven't expired
- Ensure templates are APPROVED (not PENDING)

---

## Summary

✅ **Zero configuration** for bakery users
✅ **5-minute setup** per bakery (admin)
✅ **€750 saved** in setup costs
✅ **Lower support burden**
✅ **Perfect for 10-bakery pilot**
✅ **Can scale** to 120 bakeries with same model

**Next:** Set up your master WhatsApp account following [WHATSAPP_MASTER_ACCOUNT_SETUP.md](WHATSAPP_MASTER_ACCOUNT_SETUP.md)

---

**Implementation Date:** 2025-01-17
**Status:** ✅ Complete and Ready for Pilot
**Estimated Setup Time:** 2-3 hours (one-time)
**Per-Bakery Time:** 5 minutes
