fix(opportunities): Berater als eigenes Feld statt nur in den Notizen
Bei der Uebernahme aus der Akquise verschwand die wichtigste Angabe nach dem Titel: fuer wen das Projekt laeuft. Die Opportunity hatte kein Feld dafuer, also schrieb die Uebernahme den Namen in den Herkunftsvermerk der Notizen - in Pipeline, Liste und Kacheln war er damit nicht zu sehen, und suchen liess sich nur im Notiztext. crm_opportunities.consultant traegt ihn jetzt selbst. Genau ein Name je Opportunity: passt ein Fund zu drei Beratern, entstehen bei der Uebernahme drei Opportunities. Sichtbar in Pipeline-Karte, Kachel, Papierkorb und als sortierbare Spalte direkt hinter dem Titel; die Suche fasst ihn mit ein, und im Dialog kommt die Auswahl aus derselben Liste wie in der Akquise (Einstellungen -> Akquise), damit nicht "Nico" und "Nico N." nebeneinander entstehen. Bestehende Opportunities holt migrateOpportunityConsultant() beim Start aus ihren Notizen nach - nur dort, wo die Spalte leer ist. Damit ist der Lauf wiederholbar und ueberschreibt nichts, was seither von Hand gesetzt wurde; ein Merker in crm_settings ist dafuer nicht noetig. Der Text in den Notizen bleibt stehen: er ist der Herkunftsnachweis samt Anbieter, Kanal und Link. Der Namenszusatz im Titel entfaellt wieder. Er war gestern dazugekommen, damit sich mehrere Opportunities aus einem Fund unterscheiden liessen - mit einer eigenen Spalte ist er nur noch Rauschen. Nebenbei: der Block, der won_at nachzieht, stand zweimal in schema.sql. Idempotent und damit harmlos, aber eine Kopie - jetzt einmal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8403f1c39d
commit
93fe8cfd73
@@ -51,6 +51,7 @@ const VIEW_BUTTONS: { mode: OpportunityViewMode; label: string; icon: string }[]
|
||||
/** Sortierbare Felder in der Reihenfolge des Auswahlmenues. */
|
||||
const SORT_OPTIONS: OpportunitySortKey[] = [
|
||||
'updated_at',
|
||||
'consultant',
|
||||
'last_interaction',
|
||||
'volume',
|
||||
'daily_rate',
|
||||
@@ -69,6 +70,8 @@ function sortValue(opportunity: Opportunity, key: OpportunitySortKey): string |
|
||||
return opportunity.title.toLowerCase();
|
||||
case 'company':
|
||||
return opportunity.company?.toLowerCase() ?? null;
|
||||
case 'consultant':
|
||||
return opportunity.consultant?.toLowerCase() ?? null;
|
||||
case 'stage':
|
||||
return OPPORTUNITY_STAGES.indexOf(opportunity.stage);
|
||||
case 'probability':
|
||||
@@ -128,6 +131,7 @@ export const Opportunities: React.FC<OpportunitiesProps> = ({
|
||||
const haystack = [
|
||||
opportunity.title,
|
||||
opportunity.company,
|
||||
opportunity.consultant,
|
||||
opportunity.description,
|
||||
opportunity.last_interaction_note,
|
||||
opportunity.next_step,
|
||||
@@ -223,7 +227,7 @@ export const Opportunities: React.FC<OpportunitiesProps> = ({
|
||||
type="search"
|
||||
value={searchTerm}
|
||||
onChange={(event) => setSearchTerm(event.target.value)}
|
||||
placeholder="Titel, Firma, Ansprechpartner (Komma = UND)"
|
||||
placeholder="Titel, Firma, Berater, Ansprechpartner (Komma = UND)"
|
||||
className="w-full rounded-xl border border-ink-200 bg-surface py-2.5 pl-10 pr-4 text-sm text-ink-900 outline-none transition focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25"
|
||||
/>
|
||||
<svg
|
||||
|
||||
Reference in New Issue
Block a user