Gutschriften: Auszahlungskonto (Bankkonto des Kunden) fuer Ueberweisungen

Bei Geld-Gutschriften kann die Auszahlung auf ein anderes Konto gehen
als das Vertrags-Abbuchkonto:

- CreditNote.payoutBankCardId + Migration (FK ON DELETE SET NULL, damit
  Loeschen einer Bankkarte die Gutschrift nicht mitreisst).
- Formular: Dropdown mit allen Bankkonten des Kunden (Default =
  Vertrags-Abbuchkonto). getCreditNoteDefaults liefert bankCards +
  contractBankCardId.
- Server prueft, dass die gewaehlte Bankkarte dem Kunden des Vertrags
  gehoert (kein Fremdkonto unterschieben).
- PDF: bei Ueberweisung 'Unsere Bankverbindung' (Absender) + darunter
  'an Bankkonto: <Kunden-IBAN> (<Inhaber>)'. Section-Zeile zeigt das
  Auszahlungskonto.

Lokal verifiziert (Anlage + PDF).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-06 13:49:35 +02:00
co-authored by Claude Opus 4.8
parent 642fb05c76
commit f24c4308aa
7 changed files with 151 additions and 10 deletions
+14 -2
View File
@@ -33,6 +33,7 @@ async function loadData(creditNoteId: number) {
address: true,
},
},
payoutBankCard: { select: { iban: true, accountHolder: true, bankName: true } },
},
});
if (!cn) throw new ApiError(404, 'Gutschrift nicht gefunden');
@@ -121,8 +122,19 @@ export async function generateCreditNotePdf(creditNoteId: number): Promise<{ buf
doc.fontSize(10);
if (cn.type === 'SACHWERT') {
doc.text(`Ware erhalten: ${cn.goodsReceived ? 'Ja' : 'Nein'}`);
} else if (company.iban) {
doc.text(`Auszahlung per Überweisung. Bankverbindung: ${company.bankName} · IBAN ${company.iban} · BIC ${company.bic}`.trim());
} else {
doc.text('Auszahlung per Überweisung.');
if (company.iban) {
doc.fontSize(9).fillColor('#333')
.text(`Unsere Bankverbindung: ${[company.bankName, `IBAN ${company.iban}`, company.bic ? `BIC ${company.bic}` : ''].filter(Boolean).join(' · ')}`);
}
// Auszahlungskonto des Kunden (kann vom Abbuchkonto abweichen).
if (cn.payoutBankCard) {
const holder = cn.payoutBankCard.accountHolder ? ` (${cn.payoutBankCard.accountHolder})` : '';
doc.fontSize(9).fillColor('#333')
.text(`an Bankkonto: ${cn.payoutBankCard.iban}${holder}${cn.payoutBankCard.bankName ? ` · ${cn.payoutBankCard.bankName}` : ''}`);
}
doc.fillColor('#000');
}
// ---- Unterschriftsblock ----