feat(opportunities): Link zur Ausschreibung als eigenes Feld

Die Uebernahme aus der Akquise schrieb den Link bisher nur in die Notizen.
Jetzt hat die Opportunity eine Spalte `link`, gefuellt bei Uebernahme und
Kopie; im Dialog steht sie rechts neben der Phase mit Knopf "Oeffnen".
schema.sql traegt den Link fuer aeltere Uebernahmen nach. Die Pruefung liegt
in server/src/link.js und gilt fuer Akquise und Opportunities gleich.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-23 08:56:39 +02:00
co-authored by Claude Opus 5.5
parent 3e76a73f2e
commit 8cb5cbc7cc
9 changed files with 144 additions and 40 deletions
+7
View File
@@ -68,6 +68,7 @@ erDiagram
varchar title
varchar consultant "fuer welchen Berater"
int acquisition_id "Herkunft in der Akquise, ohne FK"
varchar link "Ausschreibung, http(s)"
enum stage "Neu .. Beauftragt | Absage"
tinyint probability "0-100"
decimal daily_rate
@@ -214,6 +215,12 @@ Acht Eigenheiten, die man kennen muss:
den Papierkorb und leert beim Eintrag `converted_at` und `opportunity_id`;
`found_at` bleibt. Wird eine davon wiederhergestellt, setzt `/restore` den
Verweis wieder, sofern der Eintrag frei ist.
- **Der Link zur Ausschreibung** steht seit 23.09.2026 auch in
`crm_opportunities.link` (VARCHAR 1024). Die Übernahme kopiert ihn aus
`crm_acquisitions.link`, `/copy` von der Quelle. Beide Seiten prüfen mit
derselben Regel (`server/src/link.js`: nur http/https, ohne Schema wird
`https://` ergänzt). `schema.sql` trägt den Link für ältere Übernahmen über
`acquisition_id` nach - nur in leere Felder.
- **Der Papierkorb ist die Ausnahme davon.** Löschen von Hand ist eine
Entscheidung und kein Ablauf, deshalb steht sie in `deleted_at` (plus
`deleted_by`, ohne Fremdschlüssel - siehe `schema.sql`). Vorher war das