# `assets/` Server-side runtime assets bundled by Next.js (via `outputFileTracingIncludes` in `next.config.ts`). These files are read with `fs.readFile` from `process.cwd()` at runtime, so they are NOT served as public URLs — use `public/` for that. ## `eoi-template.pdf` The source PDF used by the in-app EOI generation pathway (`src/lib/pdf/fill-eoi-form.ts`). It must be the **same** PDF that the Documenso EOI template uploads, so both pathways produce equivalent documents. The PDF must contain AcroForm fields with these exact names (mirroring the Documenso template's `formValues` keys — see `docs/eoi-documenso-field-mapping.md`): | Field name | Type | Filled with | | -------------- | -------- | ----------------------------------------------------- | | `Name` | Text | `EoiContext.client.fullName` | | `Email` | Text | `EoiContext.client.primaryEmail` | | `Address` | Text | `street, city, country` | | `Yacht Name` | Text | `EoiContext.yacht.name` | | `Length` | Text | `EoiContext.yacht.lengthFt` | | `Width` | Text | `EoiContext.yacht.widthFt` | | `Draft` | Text | `EoiContext.yacht.draftFt` | | `Berth Number` | Text | `EoiContext.berth.mooringNumber` | | `Lease_10` | Checkbox | always `false` (legacy default — Purchase, not Lease) | | `Purchase` | Checkbox | always `true` | The fill path **flattens** the AcroForm after writing values, so the recipient can't edit pre-filled values (yacht dimensions, address, berth number) after the fact. Documenso pathway flattens server-side; the in-app pathway brings the artifact to parity. ### Expected sha256 The source PDF's sha256 is pinned to guard against silent template swaps (an unreviewed asset swap would change legal output without a code diff): ``` ba495fd88d99ebe4b7f61acbe397fb2f1cd116e1e1f1b217de93106915c7c44b ``` `scripts/check-eoi-template-sha.ts` verifies this at boot of the in-app pathway; the function exposes the expected hash via `EXPECTED_EOI_SHA256` so tests can re-check after a deliberate template revision. To intentionally update the template: 1. Drop the new PDF as `eoi-template.pdf`. 2. Run `shasum -a 256 assets/eoi-template.pdf`. 3. Update the hash in this README **and** in `src/lib/pdf/fill-eoi-form.ts` (search for `EXPECTED_EOI_SHA256`). ### Override path In dev/test, set `EOI_TEMPLATE_PDF_PATH=/abs/path/to/your/template.pdf` to point at a different file (e.g. a fixture). ### How to extract this PDF The legacy flow uploads this PDF to Documenso template ID 8. To get the exact bytes: 1. In Documenso, open the EOI template. 2. Download the source PDF. 3. Drop it here as `eoi-template.pdf`. ### Known asset issue: Email field clipped at top The current `eoi-template.pdf` has the `Email` AcroForm field box positioned slightly too low — long email addresses render with the top pixel row clipped. **Fix is asset-side, not code-side**: pdf-lib only fills field boxes, it can't move them. To resolve: 1. Open `eoi-template.pdf` in any PDF form editor (Acrobat, PDFescape, PDF Studio, or Documenso's own template editor). 2. Select the `Email` field box; nudge its `y` origin down by ~3 pt (or increase its height by ~3 pt) so the rendered text has visual margin from the top edge. 3. Save → re-upload to Documenso (so both pathways stay in sync) → bump the sha256 in this README + `EXPECTED_EOI_SHA256` per the steps above. Affects both the in-app pathway (renders via pdf-lib AcroForm fill) and the Documenso pathway (Documenso's own renderer respects the same field geometry).