fix(akquise): Berater-Mail ohne Link ins CRM

Die Berater haben keinen Zugang zum CRM. Die Mail verlinkt nur noch die
Ausschreibung, falls hinterlegt; der Hinweis auf die Einstellungen in der
Fusszeile entfaellt ebenso. CRM_PUBLIC_URL wird nicht mehr gebraucht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-10-21 11:04:23 +02:00
co-authored by Claude Opus 5.5
parent 6772f34b4e
commit 019fa1a251
5 changed files with 16 additions and 10 deletions
+3 -1
View File
@@ -989,7 +989,9 @@ crm@perinco.de, sobald er in der Akquise einem Projekt zugeordnet wird - beim
Anlegen und auch, wenn er später beim Bearbeiten dazukommt. Wer schon
zugeordnet war, bekommt beim erneuten Speichern keine zweite Mail. Die Mail
sagt, dass der Berater auf das Projekt beworben wurde, und enthält die
Projektdaten samt ausgeschriebenem Link zum Projekt; eine Antwort darauf
Projektdaten samt ausgeschriebenem Link zum Projekt, sofern einer hinterlegt
ist. Ins CRM verlinkt sie nicht, die Berater haben dort keinen Zugang. Eine
Antwort darauf
geht an den, der das Projekt eingetragen hat. Ohne hinterlegte Adresse geht
nichts heraus, der Haken zeigt dann einen Hinweis.
+3 -1
View File
@@ -396,7 +396,9 @@ der Akquise ein Projekt eingetragen und dabei ein Berater ausgewählt, bekommt
dieser eine Mail: Betreff „Du wurdest beworben: ‹Titel›", im Text „wir haben
dich auf folgendes Projekt beworben", dazu Titel, Endkunde, Anbieter, Kanal,
Tagessatz, Zeitraum, der **Link zum Projekt** ausgeschrieben, wer beworben hat
und die Beschreibung (gekürzt auf 1500 Zeichen).
und die Beschreibung (gekürzt auf 1500 Zeichen). Ist kein Link hinterlegt,
fehlt die Zeile. **Einen Link ins CRM enthält die Mail bewusst nicht** - die
Berater haben keinen Zugang zum CRM.
```mermaid
sequenceDiagram
+2 -3
View File
@@ -46,9 +46,8 @@ MS_CLIENT_ID=
MS_CLIENT_SECRET=
MS_MAILBOX=crm@perinco.de
# Adresse des CRM fuer den Link in der Berater-Mail bei neuem Projekt
# (braucht zusaetzlich die Anwendungsberechtigung Mail.Send).
# CRM_PUBLIC_URL=https://crm.perinco.de
# Die Berater-Mail bei neuem Projekt braucht zusaetzlich die
# Anwendungsberechtigung Mail.Send (siehe docs/11-postfach.md).
# Ordner im Postfach. "inbox" ist ein von Graph vorgegebener Name.
# MS_MAIL_FOLDER=inbox
+4 -5
View File
@@ -14,12 +14,13 @@ import { splitConsultants } from './acquisitionRules.js';
* App hat dafuer die Anwendungsberechtigung Mail.Send. Antworten gehen per
* Reply-To an den Benutzer, der das Projekt eingetragen hat.
*
* Die Berater haben keinen Zugang zum CRM - die Mail verlinkt deshalb nur die
* Ausschreibung (falls hinterlegt) und nie das CRM selbst.
*
* Der Versand laeuft nach der Antwort an den Browser und darf das Speichern nie
* scheitern lassen: ein Fehler landet im Log, der Eintrag ist trotzdem da.
*/
const PUBLIC_URL = (process.env.CRM_PUBLIC_URL || 'https://crm.perinco.de').replace(/\/+$/, '');
/** Beschreibung in der Mail kuerzen - der volle Text steht im CRM. */
const MAX_DESCRIPTION_CHARS = 1500;
@@ -96,9 +97,7 @@ export function buildMessage(acquisition, consultantName) {
description
? `<p style="white-space:pre-wrap;border-left:3px solid #ddd;padding-left:12px;color:#444">${escapeHtml(description)}</p>`
: '',
`<p><a href="${PUBLIC_URL}/">Im perinco CRM öffnen</a></p>`,
'<p style="color:#888;font-size:12px">Automatische Nachricht aus dem perinco CRM. ',
'Die Benachrichtigung lässt sich unter Einstellungen → Akquise je Berater abschalten.</p>',
'<p style="color:#888;font-size:12px">Automatische Nachricht von perinco.</p>',
'</div>',
].join('');
+4
View File
@@ -54,6 +54,10 @@ check(
message.html.includes('<a href="https://example.com/p?a=1&amp;b=2">https://example.com/p?a=1&amp;b=2</a>')
);
check('Leere Felder fehlen', !message.html.includes('Projektpreis'));
check('Kein Link ins CRM', !/crm\.perinco|CRM/.test(message.html));
const withoutLink = buildMessage({ id: 2, title: 'Ohne Link', link: null }, 'Nico');
check('Ohne Link: kein <a>', !withoutLink.html.includes('<a ') && !withoutLink.html.includes('Link zum Projekt'));
console.log(
failures === 0 ? '\nAlle Pruefungen bestanden.' : `\n${failures} Pruefung(en) fehlgeschlagen.`