Server+Client: REST-API für Kontaktadresse und CallLog, In-Memory vollständig entfernt, CLI-Musterdaten, Route-Param-Fix
- Server: ORM-Modelle Kontaktadresse (kontaktadressen) und CallLog (call_logs) mit FK projekt_id - Server: Geschäftslogik kontaktadresse.py und call_log.py (get/create/update/delete) - Server: DB-Migration V01_03 (kontaktadressen + call_logs Tabellen) - Server: REST-Endpunkte /xhr/kontaktadresse/* und /xhr/calllog/* mit Autorisierung - Server: CLI init-db legt Muster-Kontaktadressen (1-3/Projekt) und Muster-Gesprächsnotizen (2-5/Projekt) an - Client: kontaktadresse.ts auf REST umgestellt, snake_case, In-Memory entfernt - Client: call_log.ts auf REST umgestellt, snake_case, In-Memory entfernt, Submit-Handler implementiert - Client: projekt.ts In-Memory vollständig entfernt (keine weiteren Verbraucher) - Client: Route-Params projektId → projekt_id korrigiert (3 Stellen in projekt.ts) - Client: addCallLog in projekt.ts Route-Params auf snake_case angepasst - AGENTS.md: Erinnerung client-build-Skill nach .ts-Änderungen hinzugefügt Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
e04a52857a
commit
b510c50497
13 files changed
+821
-503
No files matched your search
@@ -35,6 +35,8 @@ def register_cli_commands(app: Flask):
|
||||
crm_checkdb.checkupdates()
|
||||
_seed_muster_kunden()
|
||||
_seed_muster_projekte()
|
||||
_seed_muster_kontaktadressen()
|
||||
_seed_muster_calllogs()
|
||||
|
||||
click.echo("Fertig.")
|
||||
|
||||
@@ -147,6 +149,118 @@ def _seed_muster_projekte():
|
||||
session.commit()
|
||||
|
||||
|
||||
def _seed_muster_kontaktadressen():
|
||||
"""
|
||||
Legt für jedes Muster-Projekt 1 bis 3 Kontaktadressen an, falls die
|
||||
kontaktadressen-Tabelle noch leer ist.
|
||||
"""
|
||||
import random
|
||||
|
||||
from crm.model import Projekt, Kontaktadresse
|
||||
|
||||
session = dbapp.session
|
||||
if session.query(Kontaktadresse).count() > 0:
|
||||
return
|
||||
|
||||
projekte = session.query(Projekt).order_by(Projekt.id).all()
|
||||
vorlagen = [
|
||||
("Herr", "Thomas Becker", "Becker Webdesign GmbH"),
|
||||
("Frau", "Sandra Klein", "Klein Marketing"),
|
||||
("Herr", "Michael Wagner", "Wagner Online Shop"),
|
||||
("Frau", "Julia Hoffmann", "Hoffmann Consulting"),
|
||||
("Herr", "Stefan Roth", "Roth IT Solutions"),
|
||||
]
|
||||
orte = [
|
||||
("Industriestr. 12", "45131", "Essen", "Deutschland"),
|
||||
("Königsallee 5", "40212", "Düsseldorf", "Deutschland"),
|
||||
("Hauptstr. 88", "50667", "Köln", "Deutschland"),
|
||||
("Marienplatz 3", "80331", "München", "Deutschland"),
|
||||
]
|
||||
rng = random.Random(123)
|
||||
vorlagen_idx = 0
|
||||
for projekt in projekte:
|
||||
anzahl = rng.randint(1, 3)
|
||||
for _ in range(anzahl):
|
||||
anrede, name, firma = vorlagen[vorlagen_idx % len(vorlagen)]
|
||||
vorlagen_idx += 1
|
||||
strasse, plz, ort, land = rng.choice(orte)
|
||||
ka = Kontaktadresse()
|
||||
ka.projekt_id = projekt.id
|
||||
ka.anrede = anrede
|
||||
ka.name = name
|
||||
ka.firma = firma
|
||||
ka.telefon = "+49 {vorwahl} {nummer}".format(
|
||||
vorwahl=rng.randint(100, 999),
|
||||
nummer=rng.randint(100000, 999999)
|
||||
)
|
||||
ka.email = name.lower().replace(" ", ".") + "@example.de"
|
||||
ka.strasse = strasse
|
||||
ka.plz = plz
|
||||
ka.ort = ort
|
||||
ka.land = land
|
||||
ka.notiz = ""
|
||||
session.add(ka)
|
||||
session.commit()
|
||||
|
||||
|
||||
def _seed_muster_calllogs():
|
||||
"""
|
||||
Legt für jedes Muster-Projekt 2 bis 5 Gesprächsnotizen an, falls die
|
||||
call_logs-Tabelle noch leer ist.
|
||||
"""
|
||||
import random
|
||||
|
||||
from crm.model import Projekt, CallLog
|
||||
|
||||
session = dbapp.session
|
||||
if session.query(CallLog).count() > 0:
|
||||
return
|
||||
|
||||
projekte = session.query(Projekt).order_by(Projekt.id).all()
|
||||
betreffvorlagen = [
|
||||
"Anforderungen klären",
|
||||
"Feedback zum Design",
|
||||
"Technische Anforderungen",
|
||||
"Schulungstermin",
|
||||
"Feature-Request",
|
||||
"Budgetgespräch",
|
||||
"Projekt-Review",
|
||||
]
|
||||
notizvorlagen = [
|
||||
"Kunde möchte responsive Design und neue Farbgestaltung. Budget noch offen.",
|
||||
"Design-Entwürfe wurden positiv aufgenommen. Kleine Änderungen an der Navigation nötig.",
|
||||
"Payment-Gateway und Versand-Schnittstellen müssen integriert werden.",
|
||||
"Schulung für 10 Mitarbeiter geplant. Raum noch zu buchen.",
|
||||
"Kunde wünscht Push-Benachrichtigungen und Offline-Modus.",
|
||||
"",
|
||||
]
|
||||
ansprechpartner = ["Herr Schmidt", "Frau Müller", "Herr Weber", "Frau Bauer", "Herr König"]
|
||||
rng = random.Random(456)
|
||||
for projekt in projekte:
|
||||
anzahl = rng.randint(2, 5)
|
||||
for _ in range(anzahl):
|
||||
log = CallLog()
|
||||
log.projekt_id = projekt.id
|
||||
monat = rng.randint(1, 9)
|
||||
tag = rng.randint(1, 28)
|
||||
log.datum = "2024-0{m}-{t}".format(m=monat, t=tag) if monat < 10 else "2024-{m}-{t}".format(m=monat, t=tag)
|
||||
log.uhrzeit_beginn = "{h:02d}:{min:02d}".format(
|
||||
h=rng.randint(8, 17), min=rng.randint(0, 59)
|
||||
)
|
||||
log.dauer = str(rng.randint(15, 90))
|
||||
log.betreff = rng.choice(betreffvorlagen)
|
||||
log.name_ansprechpartner = rng.choice(ansprechpartner)
|
||||
log.telefon = "+49 {v} {n}".format(
|
||||
v=rng.randint(100, 999), n=rng.randint(100000, 999999)
|
||||
)
|
||||
log.notiz = rng.choice(notizvorlagen)
|
||||
wiedervorlage_monat = monat + 1 if monat < 12 else 1
|
||||
log.wiedervorlage_datum = "2024-0{m}-{t}".format(m=wiedervorlage_monat, t=tag) if wiedervorlage_monat < 10 else "2024-{m}-{t}".format(m=wiedervorlage_monat, t=tag)
|
||||
log.erledigt = rng.choice([True, False])
|
||||
session.add(log)
|
||||
session.commit()
|
||||
|
||||
|
||||
def _reset_appdb():
|
||||
"""
|
||||
Setzt die CRM-Datenbank zurück: alle Tabellen löschen und neu anlegen
|
||||
|
||||
Reference in new issue
Block a user