Öffentliches Angebot abrufen
Gibt die öffentliche, für den Empfänger bestimmte Ansicht eines Angebots zurück. Der Zugriff erfolgt über den persönlichen Einladungslink, ohne Anmeldung.
Pfadparameter
Offer identifier
Antwort
Offer resource
Stabiler ULID des Angebots ((string) Offer::getId()). Zusammen mit
recipientId bildet es das Composite-Credential {id}-{recipientId}, mit
dem die käuferseitigen POST-Endpoints (click-accept, signature-session,
terms-acceptance, invoice-details, signed-upload, po-upload, delegate)
adressiert werden. Ohne dieses Feld baute offer-view die Adresse als
undefined-{recipientId} und der Server verwarf sie mit „Invalid ULID"
(FYNN-3272). Auch auf dem Dokument-Level-/Preview-Pfad gesetzt — nur
recipientId ist dort null.
Menschenlesbare Angebotsnummer (Offer::getNumber()) — treibt das Eyebrow „Angebot ANG-…“ im Buyer-Header.
Credential des anfragenden Empfängers ((string) OfferRecipient::getId()).
FYNN-3264 — Vertragsbeginn (ISO) für die Detail-Box der Rail (Start-Zeile).
D11 — Zeitpunkt der Signatur/Annahme (Offer::getSignedAt()); serialisiert ISO-8601. Treibt die „Angenommen am …“-Anzeige der Success-Rail. Null, solange keine Signatur erfasst wurde.
"2021-01-01T00:00:00+00:00"
D9 — offer-level acceptance mode (click | esignature | print).
"click"
Offer state machine current step (open | signing | awaiting_invoice_details | signed | archived).
"open"
D20 — true nur auf dem Live-Preview-Pfad (GET /public/offers/{offerId}/preview): gerendert wird der DRAFT-Stand ohne Recipient-Kontext; offer-view zeigt das Preview-Banner.
D7 — offer-expiry timestamp (null if not set); serialises ISO-8601.
"2021-01-01T00:00:00+00:00"
D2 — denormalised deal type (new_business | expansion | renewal | one_off).
"new_business"
D6 — read-time recurring contract value, honouring flat_fee invariant.
D3 — read-time derived contract-term label, du-Form.
Berechnetes Proposal-View-Model: Phasen, Posten, Rabatte, Summen (Euro).
Dokument-Level Unterzeichner — treibt die Signatur-Zeilen bzw.
D13 — der anfragende Empfänger selbst: persönliche signingUrl (Docuseal-Session) und Terms-Gate-Zustand. Null auf dem Dokument-Level-/Preview-Pfad ohne Recipient-Credential.
D13 — Auswahl-Kandidaten für den Zeremonie-Dialog (ohne E-Mail-Adressen
Dritter, ohne Countersigner); isMe markiert den aktuellen Empfänger.
D12 — Zustand der Rechnungsdaten (Parallel-Track): missing | incomplete | complete plus Vorname der erfassenden Person für die first-writer-wins-Anzeige.
Aufgeloeste Platzhalter (name => Wert) fuer den variable-Block. Daten
berechnet das Backend (Datumsformate fertig); die Frontends ersetzen nur.
D15 — absolute URL des bestehenden öffentlichen Document-Endpoints
(GET /public/offers/{offerId}-{recipientId}/document, API-Domain der
Organisation) für genau dieses Credential; treibt den
„PDF herunterladen“-Pfad der Print-Annahme. Ohne Recipient (Preview/
Dokument-Level) wird das Versions-Credential sha1(offerId + number)
verwendet. Null, wenn der Organisation keine API-Domain zugeordnet ist.
B1 FYNN-3243 — absolute URL des versiegelten, vollständig unterschriebenen
Angebots-PDFs (inkl. Abschlusszertifikat). Mappt auf
{@see \Fynn\Core\Domain\Offer\Model\Offer::getSignedDocument()} (Media) und
ist nur gesetzt, sobald ALLE Unterzeichner unterschrieben haben — also ab
Status awaiting_invoice_details (signed/archived eingeschlossen).
FYNN-3264 — Rechnungsempfänger-Sektion der Success-Rail. ≠ null ⇒ vorhandene Zusammenfassung + „Anpassen“; null ⇒ CTA „vervollständigen“.
FYNN-3299 — strukturierte Käuferadresse (Kunde) aus dem parties-Block,
autoritativ vom Backend. Quelle für das Vorbefüllen des Rechnungsdaten-
Formulars (Fallback, wenn „Rechnung an" leer/„Wie Kunde" ist). Null, wenn
der Verkäufer keinen Käufer gepflegt hat.
FYNN-3299 — strukturierte Rechnungsadresse (Rechnung an) aus dem
parties-Block. Das Rechnungsdaten-Formular (InvoiceDetailsForm) wird IMMER
hieraus vorbefüllt; ist „Rechnung an" leer/„Wie Kunde", fällt es auf
{@see self::$buyer} zurück. Trägt addressId ≠ null, wenn der Verkäufer eine
unveränderte Bestandsadresse gewählt hat — dann bietet das offer-view sie zum
Bestätigen an, statt das leere Formular zu zeigen.
FYNN-3299 — abgeleitete Rechnungs-E-Mail aus dem parties-Block (Kontakt der
Rechnungspartei, sonst des Käufers) zum Vorbefüllen des Formulars.
FYNN-3299 — vorbelegte PO-/Bestellnummer aus dem parties-Block (attrs.poNumber).
FYNN-3264 — Organisations-Schalter für die Off-Ramps der Buyer-Shell (allowReject, printFallbackAlways). Sichere Defaults (beide false).
D13/D22 — Link-Ziele der Terms-Checkbox am Signatur-CTA, aus der Tenant-Appearance (conditionsUrl → termsUrl, privacyUrl). Null, wenn die Organisation keine URL gepflegt hat — das Frontend rendert den Begriff dann als reinen Text statt als Link.
FYNN-3294 — autoritatives Brand-Logo der Organisation für genau dieses
Angebot (gespeichertes Appearance-Logo des Offer-Vertriebskanals, Fallback
Default-Channel). Anders als der host-aufgelöste /public/sales-channel/config
trägt das Angebot seinen Tenant immer mit sich — der öffentliche
offer-view-Link hat keinen Tenant-Host, weshalb die Config dort das Logo nicht
zuverlässig auflösen kann. offer-view bevorzugt darum dieses Feld für Header
UND Druck/PDF. NIE leer: ohne gepflegtes Logo greift der App-Logo-Fallback
({@see \Fynn\Core\Domain\Tenant\Model\Appearance::getLogoUrl()} mit Fallback),
damit das Logo „IMMER" erscheint.
FYNN-3421 — autoritative Entscheidung, ob die käuferseitige Ansicht den Digital-Sales-Room-Rahmen rendert oder das Angebot direkt zum Signieren zeigt. true nur, wenn das Angebot tatsächlich DSR-Inhalt trägt (mindestens eine versteckte/„Nur DSR“-Section mit Inhalt). Ohne DSR-Blöcke false — die Frontends fallen dann auf die direkte, signierbare Angebots-Ansicht zurück statt eine leere Raum-Hülle zu zeigen. Die Frontends rendern nur dieses Flag, sie leiten es nicht selbst ab.