316 lines
7.8 KiB
Markdown
316 lines
7.8 KiB
Markdown
|
|
# Perfect Template Creation Flow - BMC Hub
|
|||
|
|
|
|||
|
|
## 🎯 Workflow Overview
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Upload Invoice
|
|||
|
|
↓
|
|||
|
|
No Template Match? → AI Extracts (10s)
|
|||
|
|
↓
|
|||
|
|
"Opret Template" knap vises
|
|||
|
|
↓
|
|||
|
|
Click → Auto-creates template
|
|||
|
|
↓
|
|||
|
|
Next invoice: 0.1s (100x faster!)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📋 Step-by-Step Guide
|
|||
|
|
|
|||
|
|
### Method 1: From Upload (Recommended for First-Time)
|
|||
|
|
|
|||
|
|
1. **Upload faktura** via `/billing/supplier-invoices`
|
|||
|
|
2. If no template matches:
|
|||
|
|
- AI extracts data (10s)
|
|||
|
|
- **"🪄 Opret Template" knap** vises
|
|||
|
|
3. Click "Opret Template"
|
|||
|
|
- System AI-analyzes PDF
|
|||
|
|
- Converts to template format
|
|||
|
|
- Creates template automatically
|
|||
|
|
4. **Redirect to Template Builder** for fine-tuning (optional)
|
|||
|
|
|
|||
|
|
**Benefits:**
|
|||
|
|
- ✅ One-click from upload success
|
|||
|
|
- ✅ Uses real invoice data
|
|||
|
|
- ✅ Automatic field mapping
|
|||
|
|
- ✅ Ready to use immediately
|
|||
|
|
|
|||
|
|
### Method 2: Template Builder Manual
|
|||
|
|
|
|||
|
|
1. Go to `/billing/template-builder`
|
|||
|
|
2. **Step 1:** Select PDF file
|
|||
|
|
3. **Step 2:** Choose vendor + name template
|
|||
|
|
4. **Step 3:** Click **"🤖 AI Auto-generer Template"**
|
|||
|
|
- AI analyzes PDF
|
|||
|
|
- Auto-fills all patterns
|
|||
|
|
- Shows detection confidence
|
|||
|
|
5. **Step 4:** Test & Save
|
|||
|
|
|
|||
|
|
**Benefits:**
|
|||
|
|
- ✅ More control
|
|||
|
|
- ✅ Preview before saving
|
|||
|
|
- ✅ Can edit patterns manually
|
|||
|
|
- ✅ Test against PDF first
|
|||
|
|
|
|||
|
|
### Method 3: Templates List (Batch)
|
|||
|
|
|
|||
|
|
1. Go to `/billing/templates`
|
|||
|
|
2. View existing templates
|
|||
|
|
3. Click "Test" to validate
|
|||
|
|
4. Create new from scratch
|
|||
|
|
|
|||
|
|
## 🔄 Complete User Journey
|
|||
|
|
|
|||
|
|
### First Invoice from New Vendor
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
User uploads ALSO invoice #1
|
|||
|
|
↓
|
|||
|
|
System: "Ingen template match"
|
|||
|
|
↓
|
|||
|
|
AI extracts in 10s
|
|||
|
|
↓
|
|||
|
|
Shows: "✅ Faktura uploadet!"
|
|||
|
|
"⚠️ Ingen template - næste gang vil være langsom"
|
|||
|
|
[🪄 Opret Template knap]
|
|||
|
|
↓
|
|||
|
|
User clicks "Opret Template"
|
|||
|
|
↓
|
|||
|
|
System creates template automatically
|
|||
|
|
↓
|
|||
|
|
"✅ Template oprettet! Næste faktura vil være 100x hurtigere"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Second Invoice from Same Vendor
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
User uploads ALSO invoice #2
|
|||
|
|
↓
|
|||
|
|
Template matches (0.1s) ⚡
|
|||
|
|
↓
|
|||
|
|
"✅ Faktura uploadet - auto-matched template!"
|
|||
|
|
NO template creation button (already exists)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎨 UI/UX Details
|
|||
|
|
|
|||
|
|
### Upload Success Message (No Template Match)
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
✅ Faktura Uploadet & Analyseret!
|
|||
|
|
|
|||
|
|
AI Udtrækning: [Vendor Badge] [Confidence Badge]
|
|||
|
|
Leverandør: ALSO A/S
|
|||
|
|
CVR: 17630903
|
|||
|
|
Fakturanr: 974733485
|
|||
|
|
Beløb: 5.165,61 DKK
|
|||
|
|
|
|||
|
|
⚠️ Ingen template match - fremtidige uploads vil være langsomme
|
|||
|
|
|
|||
|
|
[👁️ Vis Faktura] [🪄 Opret Template] [✅ Luk]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### After Template Creation
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
✅ Template Oprettet!
|
|||
|
|
|
|||
|
|
Næste gang en faktura fra denne leverandør uploades, vil den blive
|
|||
|
|
behandlet automatisk på 0.1 sekunder i stedet for 10 sekunder!
|
|||
|
|
|
|||
|
|
Template ID: 42
|
|||
|
|
Fields: vendor_cvr, invoice_number, invoice_date, total_amount
|
|||
|
|
Detection patterns: 3
|
|||
|
|
|
|||
|
|
[✏️ Rediger Template] [📋 Se Alle Templates] [✅ Luk]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 Performance Metrics
|
|||
|
|
|
|||
|
|
| Scenario | Processing Time | User Action |
|
|||
|
|
|----------|----------------|-------------|
|
|||
|
|
| **No Template** | 10s (AI) | Manual → "Opret Template" |
|
|||
|
|
| **Template Match** | 0.1s (Regex) | None - automatic |
|
|||
|
|
| **Template Creation** | 15s total | One-click |
|
|||
|
|
|
|||
|
|
**ROI Example:**
|
|||
|
|
- 100 invoices from same vendor
|
|||
|
|
- Without template: 100 × 10s = **16.7 minutes**
|
|||
|
|
- With template: 1 × 15s + 99 × 0.1s = **~25 seconds**
|
|||
|
|
- **Time saved: 16 minutes!**
|
|||
|
|
|
|||
|
|
## 🧠 AI Auto-Generate Details
|
|||
|
|
|
|||
|
|
### Input
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
pdf_text: "ALSO A/S\nNummer 974733485\n...",
|
|||
|
|
vendor_id: 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### AI Output (qwen2.5:3b - 10s)
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"vendor_cvr": "17630903",
|
|||
|
|
"invoice_number": "974733485",
|
|||
|
|
"invoice_date": "30.06.2025",
|
|||
|
|
"total_amount": "5165.61",
|
|||
|
|
"detection_patterns": ["ALSO A/S", "Mårkærvej 2", "Faktura"],
|
|||
|
|
"lines_start": "Position Varenr. Beskrivelse",
|
|||
|
|
"lines_end": "Subtotal"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Converted to Template Format
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"vendor_id": 1,
|
|||
|
|
"template_name": "Auto-generated 2025-12-07",
|
|||
|
|
"detection_patterns": [
|
|||
|
|
{"type": "text", "pattern": "ALSO A/S", "weight": 0.5},
|
|||
|
|
{"type": "text", "pattern": "Mårkærvej 2", "weight": 0.3}
|
|||
|
|
],
|
|||
|
|
"field_mappings": {
|
|||
|
|
"vendor_cvr": {"pattern": "DK\\s*(\\d{8})", "group": 1},
|
|||
|
|
"invoice_number": {"pattern": "Nummer\\s*(\\d+)", "group": 1},
|
|||
|
|
"invoice_date": {"pattern": "Dato\\s*(\\d{1,2}[\\/.-]\\d{1,2}[\\/.-]\\d{4})", "group": 1},
|
|||
|
|
"total_amount": {"pattern": "Total\\s*([\\d.,]+)", "group": 1},
|
|||
|
|
"lines_start": {"pattern": "Position Varenr\\. Beskrivelse"},
|
|||
|
|
"lines_end": {"pattern": "Subtotal"}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ✨ Smart Features
|
|||
|
|
|
|||
|
|
### 1. Auto-Detection of Template Need
|
|||
|
|
```javascript
|
|||
|
|
if (!result.template_matched && result.vendor_id) {
|
|||
|
|
showButton("Opret Template"); // Only if vendor exists
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. One-Click Creation
|
|||
|
|
- Fetches PDF text
|
|||
|
|
- AI analyzes
|
|||
|
|
- Converts format
|
|||
|
|
- Saves template
|
|||
|
|
- Shows success with edit link
|
|||
|
|
|
|||
|
|
### 3. Field Mapping Intelligence
|
|||
|
|
```javascript
|
|||
|
|
// Handles both nested and flat AI responses
|
|||
|
|
const cvrValue = aiData.vendor_cvr?.value || aiData.vendor_cvr || aiData.cvr;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Multi-line Item Support
|
|||
|
|
- NO line_pattern in template
|
|||
|
|
- Uses smart multi-line extraction
|
|||
|
|
- Combines description + price lines automatically
|
|||
|
|
|
|||
|
|
## 🔧 Technical Implementation
|
|||
|
|
|
|||
|
|
### Frontend Flow
|
|||
|
|
```javascript
|
|||
|
|
async function createTemplateFromInvoice(invoiceId, vendorId) {
|
|||
|
|
// 1. Get PDF text
|
|||
|
|
const pdfData = await reprocess(invoiceId);
|
|||
|
|
|
|||
|
|
// 2. AI analyze
|
|||
|
|
const aiData = await aiAnalyze(pdfData.pdf_text, vendorId);
|
|||
|
|
|
|||
|
|
// 3. Convert to template format
|
|||
|
|
const template = convertAiToTemplate(aiData, vendorId);
|
|||
|
|
|
|||
|
|
// 4. Save
|
|||
|
|
await createTemplate(template);
|
|||
|
|
|
|||
|
|
// 5. Show success + edit link
|
|||
|
|
showSuccess(template.template_id);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Backend Endpoints
|
|||
|
|
```
|
|||
|
|
POST /api/v1/supplier-invoices/reprocess/{id}
|
|||
|
|
→ Returns: {pdf_text, ...}
|
|||
|
|
|
|||
|
|
POST /api/v1/supplier-invoices/ai-analyze
|
|||
|
|
→ Input: {pdf_text, vendor_id}
|
|||
|
|
→ Returns: AI extracted fields
|
|||
|
|
|
|||
|
|
POST /api/v1/supplier-invoices/templates
|
|||
|
|
→ Input: {vendor_id, template_name, detection_patterns, field_mappings}
|
|||
|
|
→ Returns: {template_id, ...}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 Success Metrics
|
|||
|
|
|
|||
|
|
Track these in template_usage_log:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
template_id,
|
|||
|
|
COUNT(*) as uses,
|
|||
|
|
AVG(CASE WHEN matched THEN 1 ELSE 0 END) as success_rate,
|
|||
|
|
AVG(confidence) as avg_confidence
|
|||
|
|
FROM template_usage_log
|
|||
|
|
GROUP BY template_id
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 Best Practices
|
|||
|
|
|
|||
|
|
### For Users
|
|||
|
|
1. **Always create template** after first invoice from new vendor
|
|||
|
|
2. **Test template** with 2-3 invoices before trusting
|
|||
|
|
3. **Edit patterns** if confidence < 80%
|
|||
|
|
4. **Use descriptive names**: "ALSO Standard", "ALSO Email Format"
|
|||
|
|
|
|||
|
|
### For Admins
|
|||
|
|
1. Review auto-generated templates weekly
|
|||
|
|
2. Merge duplicate templates (same vendor, similar patterns)
|
|||
|
|
3. Disable low-performing templates (success_rate < 0.7)
|
|||
|
|
4. Keep AI model updated (qwen2.5:3b or better)
|
|||
|
|
|
|||
|
|
## 🚨 Edge Cases Handled
|
|||
|
|
|
|||
|
|
### Vendor Not Found
|
|||
|
|
- AI extracts CVR but vendor doesn't exist in DB
|
|||
|
|
- Shows warning: "Du skal oprette leverandør først"
|
|||
|
|
- No template creation button (needs vendor_id)
|
|||
|
|
|
|||
|
|
### AI Returns Incomplete Data
|
|||
|
|
- Template created with available fields only
|
|||
|
|
- Missing fields can be added manually later
|
|||
|
|
- Template still speeds up future processing
|
|||
|
|
|
|||
|
|
### Duplicate Templates
|
|||
|
|
- System allows multiple templates per vendor
|
|||
|
|
- Each can target different invoice formats
|
|||
|
|
- Detection patterns differentiate them
|
|||
|
|
|
|||
|
|
## 🎓 Training Users
|
|||
|
|
|
|||
|
|
### Quick Start Tutorial
|
|||
|
|
```
|
|||
|
|
1. Upload en faktura
|
|||
|
|
2. Klik "Opret Template" når den vises
|
|||
|
|
3. Næste gang = automatisk!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Power User Tips
|
|||
|
|
```
|
|||
|
|
- Brug Template Builder for bedre kontrol
|
|||
|
|
- Test templates før production
|
|||
|
|
- Kombiner AI + manual editing
|
|||
|
|
- Gennemgå templates månedligt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📈 Future Enhancements
|
|||
|
|
|
|||
|
|
1. **Batch Template Creation**: Upload 10 PDFs → Create 10 templates
|
|||
|
|
2. **Template Suggestions**: "Found similar template - use this instead?"
|
|||
|
|
3. **Auto-Merge**: Detect duplicate templates and suggest merge
|
|||
|
|
4. **Confidence Tracking**: Dashboard showing template performance
|
|||
|
|
5. **A/B Testing**: Test pattern variations automatically
|