259 lines
6.2 KiB
Markdown
259 lines
6.2 KiB
Markdown
|
|
# Email Rules → Workflows Migration Guide
|
||
|
|
|
||
|
|
## 🎯 Formål
|
||
|
|
|
||
|
|
BMC Hub er ved at phase out det gamle **Rules** system til fordel for det nyere og mere kraftfulde **Workflows** system.
|
||
|
|
|
||
|
|
**Status:**
|
||
|
|
- ✅ Workflows er default aktiveret (`EMAIL_WORKFLOWS_ENABLED=true`)
|
||
|
|
- ⚠️ Rules er nu disabled by default (`EMAIL_RULES_ENABLED=false`)
|
||
|
|
|
||
|
|
## 🔄 Hvad Er Ændret?
|
||
|
|
|
||
|
|
### I koden:
|
||
|
|
1. **Koordinering tilføjet**: Workflows kører først, rules kun hvis workflow ikke har processed emailen
|
||
|
|
2. **Deduplication**: Samme action køres ikke 2 gange
|
||
|
|
3. **Config ændring**: `EMAIL_RULES_ENABLED` er nu `false` by default
|
||
|
|
4. **Silent failures fixet**: extract_invoice_data fejler nu synligt hvis fil mangler
|
||
|
|
|
||
|
|
### I `.env`:
|
||
|
|
```bash
|
||
|
|
# Gammelt (deprecated):
|
||
|
|
EMAIL_RULES_ENABLED=true
|
||
|
|
EMAIL_RULES_AUTO_PROCESS=false
|
||
|
|
|
||
|
|
# Nyt (anbefalet):
|
||
|
|
EMAIL_WORKFLOWS_ENABLED=true
|
||
|
|
EMAIL_RULES_ENABLED=false
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📋 Migration Steps
|
||
|
|
|
||
|
|
### Trin 1: Identificer Aktive Rules
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Se alle aktive rules
|
||
|
|
SELECT id, name, action_type, conditions, priority, match_count
|
||
|
|
FROM email_rules
|
||
|
|
WHERE enabled = true
|
||
|
|
ORDER BY priority ASC;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trin 2: Opret Tilsvarende Workflows
|
||
|
|
|
||
|
|
For hver rule, opret en workflow:
|
||
|
|
|
||
|
|
**Eksempel: Rule → Workflow**
|
||
|
|
|
||
|
|
**Gammel Rule:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "Link Supplier Invoices",
|
||
|
|
"conditions": {
|
||
|
|
"classification": "invoice",
|
||
|
|
"sender_domain": ["example.com", "vendor.dk"]
|
||
|
|
},
|
||
|
|
"action_type": "link_supplier",
|
||
|
|
"priority": 10
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Ny Workflow:**
|
||
|
|
```sql
|
||
|
|
INSERT INTO email_workflows (
|
||
|
|
name,
|
||
|
|
description,
|
||
|
|
classification_trigger,
|
||
|
|
sender_pattern,
|
||
|
|
confidence_threshold,
|
||
|
|
workflow_steps,
|
||
|
|
priority,
|
||
|
|
enabled
|
||
|
|
) VALUES (
|
||
|
|
'Link Supplier Invoices',
|
||
|
|
'Automatically link invoice emails from known suppliers',
|
||
|
|
'invoice',
|
||
|
|
'(example\\.com|vendor\\.dk)$', -- Regex pattern
|
||
|
|
0.70,
|
||
|
|
'[
|
||
|
|
{"action": "link_to_vendor", "params": {"match_by": "email"}},
|
||
|
|
{"action": "extract_invoice_data", "params": {}},
|
||
|
|
{"action": "mark_as_processed", "params": {}}
|
||
|
|
]'::jsonb,
|
||
|
|
10,
|
||
|
|
true
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trin 3: Test Workflows
|
||
|
|
|
||
|
|
1. Send test email der matcher classification
|
||
|
|
2. Check `email_workflow_executions` tabel for results
|
||
|
|
3. Verificer at email blev processed korrekt
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Se workflow executions
|
||
|
|
SELECT
|
||
|
|
e.id,
|
||
|
|
w.name as workflow_name,
|
||
|
|
em.subject,
|
||
|
|
e.status,
|
||
|
|
e.steps_completed,
|
||
|
|
e.execution_time_ms,
|
||
|
|
e.started_at
|
||
|
|
FROM email_workflow_executions e
|
||
|
|
JOIN email_workflows w ON w.id = e.workflow_id
|
||
|
|
JOIN email_messages em ON em.id = e.email_id
|
||
|
|
ORDER BY e.started_at DESC
|
||
|
|
LIMIT 20;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trin 4: Disable Rules
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Disable alle rules
|
||
|
|
UPDATE email_rules SET enabled = false;
|
||
|
|
```
|
||
|
|
|
||
|
|
Eller i `.env`:
|
||
|
|
```bash
|
||
|
|
EMAIL_RULES_ENABLED=false
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trin 5: Monitor
|
||
|
|
|
||
|
|
I de første dage efter migration:
|
||
|
|
- Check logs for fejl
|
||
|
|
- Verificer at workflows kører som forventet
|
||
|
|
- Check at ingen emails falder igennem
|
||
|
|
|
||
|
|
## 🗂️ Mapping: Rules → Workflows
|
||
|
|
|
||
|
|
### Action Mapping
|
||
|
|
|
||
|
|
| Rule Action | Workflow Action | Notes |
|
||
|
|
|-------------|-----------------|-------|
|
||
|
|
| `link_supplier` | `link_to_vendor` | ✅ Direct replacement |
|
||
|
|
| `link_customer` | `link_to_customer` | ⚠️ Not fully implemented yet |
|
||
|
|
| `link_case` | `create_ticket` | ✅ Creates ticket from email |
|
||
|
|
| `mark_spam` | *(none)* | ⚠️ Needs workflow action |
|
||
|
|
| `create_purchase` | *(none)* | ⚠️ Not implemented |
|
||
|
|
|
||
|
|
### Condition Mapping
|
||
|
|
|
||
|
|
| Rule Condition | Workflow Equivalent |
|
||
|
|
|----------------|---------------------|
|
||
|
|
| `classification` | `classification_trigger` |
|
||
|
|
| `sender_email` | `sender_pattern` (exact match regex) |
|
||
|
|
| `sender_domain` | `sender_pattern` (domain regex) |
|
||
|
|
| `subject_contains` | `subject_pattern` (contains regex) |
|
||
|
|
| `subject_regex` | `subject_pattern` (direct) |
|
||
|
|
| `confidence_score` | `confidence_threshold` |
|
||
|
|
|
||
|
|
## 🆕 Workflow-Only Features
|
||
|
|
|
||
|
|
Workflows kan mere end rules:
|
||
|
|
|
||
|
|
1. **Multi-step execution**: Chain multiple actions
|
||
|
|
2. **Better error handling**: Each step tracked separately
|
||
|
|
3. **Execution history**: Full audit trail
|
||
|
|
4. **Regex patterns**: More flexible matching
|
||
|
|
5. **Stop on match**: Control workflow chaining
|
||
|
|
6. **Statistics**: Success/failure rates
|
||
|
|
|
||
|
|
## ⚠️ Backward Compatibility
|
||
|
|
|
||
|
|
**Hvis du MÅ beholde rules:**
|
||
|
|
|
||
|
|
Set i `.env`:
|
||
|
|
```bash
|
||
|
|
EMAIL_RULES_ENABLED=true
|
||
|
|
EMAIL_WORKFLOWS_ENABLED=true
|
||
|
|
```
|
||
|
|
|
||
|
|
**Systemet vil:**
|
||
|
|
- Køre workflows først
|
||
|
|
- Kun køre rules hvis workflow ikke processede emailen
|
||
|
|
- Undgå duplicate actions
|
||
|
|
|
||
|
|
**Men dette er ikke anbefalet** - rules vil blive fjernet i fremtiden.
|
||
|
|
|
||
|
|
## 📊 Status Dashboard
|
||
|
|
|
||
|
|
Tilføj til admin UI:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Workflow statistics
|
||
|
|
SELECT
|
||
|
|
w.name,
|
||
|
|
w.classification_trigger,
|
||
|
|
w.execution_count,
|
||
|
|
w.success_count,
|
||
|
|
w.failure_count,
|
||
|
|
ROUND(100.0 * w.success_count / NULLIF(w.execution_count, 0), 1) as success_rate,
|
||
|
|
w.last_executed_at
|
||
|
|
FROM email_workflows w
|
||
|
|
WHERE w.enabled = true
|
||
|
|
ORDER BY w.execution_count DESC;
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🐛 Troubleshooting
|
||
|
|
|
||
|
|
### "Workflow ikke executed"
|
||
|
|
|
||
|
|
**Check:**
|
||
|
|
1. Er `EMAIL_WORKFLOWS_ENABLED=true` i .env?
|
||
|
|
2. Er workflow enabled i database?
|
||
|
|
3. Matcher classification_trigger?
|
||
|
|
4. Er confidence over threshold?
|
||
|
|
5. Matcher sender/subject patterns?
|
||
|
|
|
||
|
|
**Debug:**
|
||
|
|
```python
|
||
|
|
# I logs se:
|
||
|
|
# "🔄 Finding workflows for classification: invoice (confidence: 0.95)"
|
||
|
|
# "📋 Found X matching workflow(s)"
|
||
|
|
```
|
||
|
|
|
||
|
|
### "Email processed 2 gange"
|
||
|
|
|
||
|
|
**Check:**
|
||
|
|
1. Er både workflows OG rules enabled?
|
||
|
|
2. Har de samme actions?
|
||
|
|
|
||
|
|
**Fix:**
|
||
|
|
Disable rules: `EMAIL_RULES_ENABLED=false`
|
||
|
|
|
||
|
|
### "Workflow fejler stille"
|
||
|
|
|
||
|
|
**Efter fix:**
|
||
|
|
- extract_invoice_data raiser nu FileNotFoundError hvis PDF mangler
|
||
|
|
- Check `email_workflow_executions.status = 'failed'`
|
||
|
|
- Check `error_message` column
|
||
|
|
|
||
|
|
## ✅ Success Criteria
|
||
|
|
|
||
|
|
Migration er komplet når:
|
||
|
|
|
||
|
|
1. ✅ Alle rules er migrated til workflows
|
||
|
|
2. ✅ Workflows tested og virker
|
||
|
|
3. ✅ `EMAIL_RULES_ENABLED=false` i produktion
|
||
|
|
4. ✅ Ingen emails falder igennem
|
||
|
|
5. ✅ email_workflow_executions viser success
|
||
|
|
|
||
|
|
## 📞 Support
|
||
|
|
|
||
|
|
Hvis problemer:
|
||
|
|
1. Check logs: `docker-compose logs -f api | grep "🔄\|❌\|✅"`
|
||
|
|
2. Check database: `SELECT * FROM email_workflow_executions ORDER BY started_at DESC LIMIT 10;`
|
||
|
|
3. Revert: Set `EMAIL_RULES_ENABLED=true` midlertidigt
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Tidslinje:**
|
||
|
|
- ✅ Nu: Workflows aktiveret, rules disabled by default
|
||
|
|
- 🔜 Næste sprint: Fjern rule UI fra admin
|
||
|
|
- 🔜 Om 1 måned: Drop email_rules tabel helt
|
||
|
|
|
||
|
|
**Anbefaling:** Migrer nu, imens begge systemer er tilgængelige som fallback.
|