Ontwerp een Custom Workflow Automatisering voor Mijn Project
description
Met deze prompt kan de gebruiker een op maat gemaakte automatisering ontwerpen die repetitieve taken en processen binnen zijn project efficiënter maakt. Dit bespaart tijd, vermindert fouten en verhoogt de productiviteit. Het is een unieke aanpak die zich richt op workflow automatisering, wat nog niet eerder in deze categorie is behandeld.
prompt
Help me een custom workflow automatisering te ontwerpen die de volgende processen in mijn project optimaliseert: <beschrijf de processen>.
Beschrijf de a ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van een custom workflow automatisering voor factuurverwerking en automatische e-mailnotificaties, inclusief architectuur, technologieën en een stapsgewijze voorbeeldimplementatie in Python.
---
**Architectuur en gebruikte technologieën**
1. **Architectuur:**
- **Trigger:** Nieuwe factuur wordt geüpload of toegevoegd aan een specifieke map of database.
- **Verwerking:** Extractie van factuurgegevens (bijvoorbeeld factuurnummer, bedrag, leverancier).
- **Opslag:** Gegevens worden opgeslagen in een database voor verdere verwerking en rapportage.
- **Notificaties:** Automatische e-mails worden gestuurd naar betrokken partijen (bijvoorbeeld leverancier, administratie).
- **Monitoring:** Log en foutafhandeling voor betrouwbaarheid.
2. **Technologieën:**
- **Python** voor scripting en automatisering.
- **Watchdog** of **inotify** (Linux) / **watchdog** Python module voor bestandsmonitoring.
- **PDF parsing:** `PyPDF2`, `pdfplumber`, of `Tesseract OCR` (bij gescande documenten).
- **Database:** SQLite voor eenvoudige opslag of een andere relationele database.
- **E-mail:** `smtplib` en `email` modules voor het versturen van notificaties.
- **Scheduling:** `cron` of `APScheduler` voor periodieke taken.
---
**Stapsgewijze workflow**
1. **Factuur uploaden:** Een gebruiker plaatst een factuur in een specifieke map.
2. **Detectie en extractie:**
- De script detecteert nieuwe bestanden.
- Het script leest de factuur en haalt relevante gegevens uit.
3. **Opslag gegevens:**
- Gegevens worden opgeslagen in een database.
4. **Automatische notificatie:**
- Op basis van bepaalde voorwaarden (bijvoorbeeld betaalstatus) wordt een e-mail gestuurd.
5. **Logging en foutafhandeling:**
- Alle acties worden gelogd, fouten worden gemeld.
---
**Voorbeeldimplementatie in Python**
```python
import os
import time
import sqlite3
import smtplib
from email.mime.text import MIMEText
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import pdfplumber
# Configuratie
FACTUUR_MAP = "/pad/naar/factuurs"
DB_PATH = "facturen.db"
SMTP_SERVER = "smtp.example.com"
SMTP_PORT = 587
EMAIL_SENDER = "automatisering@example.com"
EMAIL_PASSWORD = "jouw_wachtwoord"
# Database setup
def init_db():
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS facturen (
id INTEGER PRIMARY KEY AUTOINCREMENT,
factuurnummer TEXT,
leverancier TEXT,
bedrag REAL,
datum TEXT,
status TEXT
)
''')
conn.commit()
conn.close()
# Factuurgegevens extraheren
def extract_factuurgegevens(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
text = ''
for page in pdf.pages:
text += page.extract_text()
# Simpele regex of string zoeken voor gegevens
import re
factuurnummer = re.search(r'Factuurnummer[:\s]*(\w+)', text)
leverancier = re.search(r'Leverancier[:\s]*(.+)', text)
bedrag = re.search(r'Bedrag[:\s]*€?([\d,]+)', text)
datum = re.search(r'Datum[:\s]*(\d{2}/\d{2}/\d{4})', text)
return {
'factuurnummer': factuurnummer.group(1) if factuurnummer else '',
'leverancier': leverancier.group(1) if leverancier else '',
'bedrag': float(bedrag.group(1).replace(',', '.')) if bedrag else 0.0,
'datum': datum.group(1) if datum else ''
}
# E-mail verzenden
def send_email(to_address, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = EMAIL_SENDER
msg['To'] = to_address
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_SENDER, EMAIL_PASSWORD)
server.send_message(msg)
# Bestandsdetectie
class FactuurHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory and event.src_path.endswith('.pdf'):
print(f"Nieuwe factuur gedetecteerd: {event.src_path}")
try:
data = extract_factuurgegevens(event.src_path)
# Opslaan in database
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('''
INSERT INTO facturen (factuurnummer, leverancier, bedrag, datum, status)
VALUES (?, ?, ?, ?, ?)''',
(data['factuurnummer'], data['leverancier'], data['bedrag'], data['datum'], 'Geprocessed'))
conn.commit()
conn.close()
# Verstuur notificatie
body = f"Factuur {data['factuurnummer']} van {data['leverancier']} is verwerkt.\nBedrag: €{data['bedrag']}"
send_email("admin@example.com", "Nieuwe factuur verwerkt", body)
print("E-mail notificatie verzonden.")
except Exception as e:
print(f"Fout bij verwerking: {e}")
# Main script
if __name__ == "__main__":
init_db()
event_handler = FactuurHandler()
observer = Observer()
observer.schedule(event_handler, path=FACTUUR_MAP, recursive=False)
observer.start()
print("Monitoring gestart...")
try:
while True:
time.sleep(10)
except KeyboardInterrupt:
observer.stop()
observer.join()
```
---
**Samengevat:**
- Monitor de map voor nieuwe PDF-facturen.
- Extracteer relevante gegevens met `pdfplumber`.
- Sla gegevens op in een SQLite database.
- Verstuur automatische e-mailnotificaties.
- Log alle acties en fouten voor troubleshooting.
Deze aanpak kan verder worden uitgebreid met bijvoorbeeld OCR voor gescande documenten, uitgebreide foutafhandeling, rapportages, of integratie met andere systemen.
provider: deepseek
model: deepseek-chat
Zeker, ik help u graag een geautomatiseerde workflow te ontwerpen voor factuurverwerking en e-mailnotificaties. Hier is een complete architectuur, technologie-overzicht en Python-implementatie.
## 🏗 Architectuur Overzicht
```
Input (Facturen) → Verwerkingslaag → Database → Notificatielaag → Output (E-mails)
```
## 🔧 Gebruikte Technologieën
- **Python 3.8+** - Hoofdprogrammeertaal
- **FastAPI** - REST API voor factuur-invoer
- **Celery** - Taakwachtrij voor async verwerking
- **PostgreSQL** - Database voor factuurgegevens
- **SMTPLib** - E-mail verzending
- **Pandas** - Dataverwerking facturen
- **Redis** - Message broker voor Celery
- **Docker** - Containerisatie
## 📋 Stapsgewijze Workflow
1. **Factuur Ontvangst** - PDF/XML facturen geüpload via API
2. **Data Extractie** - Parsen van factuurgegevens
3. **Validatie** - Controle op compleetheid en juistheid
4. **Database Opslag** - Opslaan in PostgreSQL
5. **Status Update** - Factuurstatus bijwerken
6. **E-mail Notificatie** - Automatische verzending
7. **Logging** - Uitgebreide logging van processen
## 💻 Voorbeeldimplementatie Python
```python
import smtplib
import pandas as pd
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import datetime
import json
import logging
from celery import Celery
from sqlalchemy import create_engine, Column, String, DateTime, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Configuratie
DATABASE_URL = "postgresql://user:password@localhost/facturen_db"
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL_USER = "uw.email@bedrijf.nl"
EMAIL_PASSWORD = "uw_wachtwoord"
# Database setup
Base = declarative_base()
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class Factuur(Base):
__tablename__ = "facturen"
id = Column(String, primary_key=True)
factuurnummer = Column(String, unique=True)
bedrag = Column(Float)
klant_email = Column(String)
status = Column(String, default="verwerkt")
datum_ontvangen = Column(DateTime, default=datetime.utcnow)
datum_verzonden = Column(DateTime, nullable=True)
# Celery setup voor async verwerking
app = Celery('factuur_worker', broker='redis://localhost:6379/0')
@app.task
def verwerk_factuur(factuur_data):
"""Asynchrone factuurverwerkingstaak"""
try:
session = SessionLocal()
# Maak nieuwe factuur aan
nieuwe_factuur = Factuur(
id=factuur_data['factuur_id'],
factuurnummer=factuur_data['factuurnummer'],
bedrag=factuur_data['bedrag'],
klant_email=factuur_data['klant_email'],
status="in_verwerking"
)
session.add(nieuwe_factuur)
session.commit()
# Valideer factuurgegevens
if valideer_factuur(factuur_data):
nieuwe_factuur.status = "goedgekeurd"
stuur_bevestigingsmail.delay(factuur_data)
else:
nieuwe_factuur.status = "afgekeurd"
stuur_foutmelding.delay(factuur_data)
session.commit()
logging.info(f"Factuur {factuur_data['factuurnummer']} verwerkt")
except Exception as e:
logging.error(f"Fout bij verwerken factuur: {str(e)}")
finally:
session.close()
def valideer_factuur(factuur_data):
"""Valideer factuurgegevens"""
required_fields = ['factuurnummer', 'bedrag', 'klant_email']
return all(field in factuur_data for field in required_fields)
@app.task
def stuur_bevestigingsmail(factuur_data):
"""Verzend bevestigingsmail naar klant"""
try:
msg = MIMEMultipart()
msg['From'] = EMAIL_USER
msg['To'] = factuur_data['klant_email']
msg['Subject'] = f"Factuur {factuur_data['factuurnummer']} Ontvangen"
body = f"""
Beste Klant,
Uw factuur {factuur_data['factuurnummer']} is succesvol ontvangen.
Details:
- Factuurnummer: {factuur_data['factuurnummer']}
- Bedrag: €{factuur_data['bedrag']:,.2f}
- Datum: {datetime.now().strftime('%d-%m-%Y')}
Met vriendelijke groet,
Uw Factuurteam
"""
msg.attach(MIMEText(body, 'plain'))
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USER, EMAIL_PASSWORD)
server.send_message(msg)
logging.info(f"Bevestigingsmail verzonden naar {factuur_data['klant_email']}")
except Exception as e:
logging.error(f"Fout bij verzenden mail: {str(e)}")
# FastAPI endpoint voor factuur upload
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
class FactuurUpload(BaseModel):
factuur_id: str
factuurnummer: str
bedrag: float
klant_email: str
extra_data: dict = {}
api = FastAPI()
@api.post("/upload-factuur")
async def upload_factuur(factuur: FactuurUpload):
"""Endpoint voor factuur upload"""
try:
# Start async verwerking
verwerk_factuur.delay(factuur.dict())
return {"status": "success", "message": "Factuur in verwerking"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
# Maak database tabellen aan
Base.metadata.create_all(bind=engine)
logging.basicConfig(level=logging.INFO)
```
## 🐳 Docker Compose Configuratie
```yaml
version: '3.8'
services:
postgres:
image: postgres:13
environment:
POSTGRES_DB: facturen_db
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
redis:
image: redis:alpine
ports:
- "6379:6379"
api:
build: .
ports:
- "8000:8000"
depends_on:
- postgres
- redis
worker:
build: .
command: celery -A main.app worker --loglevel=info
depends_on:
- redis
- postgres
```
## 🚀 Gebruiksvoorbeeld
```python
# Factuur uploaden via API
import requests
factuur_data = {
"factuur_id": "inv_001",
"factuurnummer": "2024-001",
"bedrag": 249.99,
"klant_email": "klant@bedrijf.nl"
}
response = requests.post(
"http://localhost:8000/upload-factuur",
json=factuur_data
)
print(response.json())
```
## 📊 Monitoring en Logging
Voeg monitoring toe met:
- **Prometheus** voor metrics
- **Grafana** voor visualisatie
- **ELK Stack** voor logging
Deze architectuur biedt schaalbaarheid, betrouwbaarheid en onderhoudbaarheid voor uw factuurverwerkingssysteem.
error: Generation failed [deepseek] prompt_id=3556 locale=fr err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=3556 locale=pt err=DeepSeek connection/timeout