Email workspaceReport generation failed contract
Purpose/audience: $report->user, the requesting user.
Implementation: App\Mail\ReportGenerationFailed. Baseline view: resources/views/emails/management-reports/generation-failed.blade.php. Usage evidence: app/Jobs/CFOAIReport/ReportGenerationFailedJob.php:52. These are static references, not proof of current production delivery.
Suggested subject: Report Generation Failed. HTML title alone does not set the mail header.
Suggested preheader: Your report could not be generated. You can try again.
Portable placeholder contract
| Token | Existing source / derivation | Requirement |
|---|---|---|
| {{logo_url}} | Existing Built app_name PNG | Optional deployment override; the concrete project HTTPS PNG is the default. Approved HTTPS or matching CID only. |
| {{preheader}} | Suggested text above, assembled only from already available values | Required escaped text; not a new backend record or processing guarantee. |
| {{first_name}} | $report->user->first_name | Required escaped name of the report requester. |
| {{business_name}} | $report->business_name | Required escaped report business identity. |
| {{report_name}} | $report->name | Required escaped report title; preserve long values. |
| {{period_from}} | $report->from->format('d-m-Y') | Required formatted source date; no inferred timezone or altered reporting period. |
| {{period_to}} | $report->to->format('d-m-Y') | Required formatted source date; no invented expiry or completion time. |
Content, states and integration decisions
- Preserve requester, report business/title and both formatted dates. Keep the instruction to try again or reach out if the issue persists. Vague shortly wording is removed; no retry deadline or automatic-retry promise replaces it.
- The source provides no failure reason, retry URL, support address or attached report. Do not add these or reuse report-completed’s PDF instruction/action. This draft has no button.
- ReportGenerationFailed implements ShouldQueue and is queued by ReportGenerationFailedJob. Preserve the CFO AI From name and current subject. States: standard and long identity/title values.
- This API owns the report outcome email even though its product is CFO AI. It is distinct from externally authored CRM customer campaigns.
Portable HTML/text and safe handling
ready/report-failed.html and ready/report-failed.txt provide the portable extracts. Every populated state has matching .html and .txt files under previews/. All sample links are local design explanations; no real invitation, report or account action is executed. Placeholder {{names}} are not automatically Laravel Blade syntax. Convert each mapping explicitly using existing data and server-side URL generation; retain all required values and do not insert untrusted raw HTML.
Escape text and attribute values. Validate any application/CFO AI URL separately against approved HTTPS hosts before escaping it; preserve complete generated links and encrypted/signed parameters. Use the provided concrete public PNG or an approved HTTPS/CID override. There are no hidden optional content sections to populate here; required identities/counts should not be silently omitted. Unsupported data has not been invented.
All drafts use the approved compact transactional shell with 16px body text, a minimal Built footer and native light/dark CSS. Email-client rendering and blocked-image behavior remain separate tests. See integration-notes.html for shared provider/image limitations, and easy-wins-batch.md for the whole batch. No production template, sender, transport or application behavior is changed.