feat(akquise): Uebernahme landet in Erstgespraech Berater

Wer eine Bewerbung uebernimmt, hat den Berater bereits gesprochen. Die
Opportunity in der Phase "Neu" anzulegen bedeutete, sie sofort von Hand
weiterzuschieben. Sie startet jetzt direkt in "Erstgespraech Berater";
Toast, Knopf-Hinweis und Benutzeranleitung nennen dieselbe Phase.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-02 09:50:53 +02:00
co-authored by Claude Opus 5
parent 5d095e55ac
commit ea886e4d1b
4 changed files with 7 additions and 6 deletions
+2 -2
View File
@@ -182,7 +182,7 @@ wird geleert - für das nächste Projekt aus derselben Quelle.
| **Anbieter**, **Kanal** | woher es kam |
| **Projekttitel** | mit Link anklickbar (neuer Tab); darunter klein Endkunde, Tagessatz bzw. Festpreis und Personentage |
| **Berater** | für wen |
| **Opportunity** | ein Klick macht daraus eine Opportunity in der Phase *Neu* |
| **Opportunity** | ein Klick macht daraus eine Opportunity in der Phase *Erstgespräch Berater* |
| Stift / Papierkorb | bearbeiten (füllt das Formular oben) und löschen |
Die Spaltenköpfe sortieren, die Suche geht über Titel, Anbieter, Berater,
@@ -209,7 +209,7 @@ dem Funddatum geteilt. Es gibt also keinen Zustand, der klemmen kann.
### Aus dem Eintrag wird eine Opportunity
Der Knopf **Opportunity** legt sie sofort an: Phase *Neu*, 10 % Wahrscheinlichkeit,
Der Knopf **Opportunity** legt sie sofort an: Phase *Erstgespräch Berater*, 10 % Wahrscheinlichkeit,
zuständig ist der angemeldete Benutzer. Mit übernommen werden Titel, Endkunde,
Beschreibung, Tagessatz, Laufzeit, Projektpreis, Zeitraum und nächster Schritt.
Anbieter, Von, Kanal, Berater und Link haben in der Opportunity kein Feld - sie
+3 -2
View File
@@ -634,7 +634,8 @@ router.delete('/:id', async (req, res, next) => {
/*
* POST /api/acquisitions/:id/opportunity
*
* Aus dem Eintrag wird eine Opportunity in der Phase "Neu". Beides in einer
* Aus dem Eintrag wird eine Opportunity in der Phase "Erstgespraech Berater":
* wer eine Bewerbung uebernimmt, hat den Berater schon gesprochen. Beides in einer
* Transaktion: entweder die Opportunity steht und der Eintrag ist als
* uebernommen vermerkt, oder es bleibt alles wie es war. Sonst koennte eine
* Opportunity entstehen, die der Eingang weiterhin anbietet.
@@ -683,7 +684,7 @@ router.post('/:id/opportunity', async (req, res, next) => {
`INSERT INTO crm_opportunities
(title, company, description, stage, probability, daily_rate, duration_days,
fixed_price, start_date, end_date, next_step, tags, notes, owner_id, created_by)
VALUES (?, ?, ?, 'Neu', 10, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
VALUES (?, ?, ?, 'Erstgespraech Berater', 10, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
entry.title,
entry.company,
@@ -215,7 +215,7 @@ export const AcquisitionTable: React.FC<AcquisitionTableProps> = ({
<button
onClick={() => onConvert(entry)}
disabled={isBusy}
title="Als neue Opportunity in der Phase „Neu“ anlegen. Der Eintrag verschwindet danach aus dieser Liste."
title="Als neue Opportunity in der Phase „Erstgespräch Berater“ anlegen. Der Eintrag verschwindet danach aus dieser Liste."
className="flex items-center gap-1.5 whitespace-nowrap rounded-xl bg-brand-500 px-3 py-1.5 text-xs font-bold text-white shadow-card transition hover:bg-brand-600 disabled:opacity-50"
>
<svg className="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+1 -1
View File
@@ -128,7 +128,7 @@ export const Acquisitions: React.FC<AcquisitionsProps> = ({ view = 'eingang', re
setBusyId(entry.id);
try {
await acquisitionsApi.toOpportunity(entry.id);
addToast(`Opportunity „${entry.title}" angelegt - Phase „Neu".`, 'success');
addToast(`Opportunity „${entry.title}" angelegt - Phase „Erstgespräch Berater".`, 'success');
if (editing?.id === entry.id) setEditing(null);
await load(true);
// Die Opportunity-Liste der App kennt den neuen Eintrag noch nicht.