RFIs¶
| Status | Shipped |
|---|---|
| Linear | PIN-296 ↗ PIN-458 ↗ PIN-459 ↗ |
| Module | Submittals & RFIs ↗ |
Requests for Information: drafted by the PM, emailed to the GC/architect/engineer as a PDF, answered in-app on their behalf, then closed. Lives next to Submittals under Project Controls. The real lifecycle starts at Draft (the charter's "Open → Submitted → Answered → Closed" is missing the first step).
Prerequisites¶
- Role: PM (full). An Estimating login for the read-only check.
- Project state: a project with at least one organization attached (the Send modal needs an Organization with a contact email on file).
- Test data: PDFs from
docs-pdfs/in the test-app-files Drive folder for draft/response attachments. Sending emails a real address. On staging, only Send to an organization whose contact email is a test inbox you control.
1. Open the RFI log¶
Project detail → Project Controls tab → RFIs sub-tab (count badge; Submittals is the default sub-tab). Deep-link: ?tab=project-controls&subtab=rfis. The Overview tab's Create RFI quick action jumps here with the create modal open.
2. Create a draft¶
New RFI (or empty-state Create RFI). Form fields:
- Subject * and Question * — validated with toasts.
- RFI Number — pre-filled
RFI-NNN, cosmetic; the real number is assigned at submission. - Priority (High/Medium/Low, default Medium), Ball in Court (GC/Architect/Engineer/Pinley, default Architect).
- Trade — marked required in the UI but not actually validated (known quirk — filing optional).
- Due Date — defaults to today + 5 business days (weekend-skipping; verify a Thursday create lands on next Thursday).
- Cost Impact / Schedule Impact — Yes/No/TBD, default TBD.
- Attachments — same drop-zone as submittals.
Only Save as Draft exists — there is no create-and-send. Double-clicking Save must not create two RFIs (idempotency-guarded).
3. Walk the lifecycle¶
Draft → Open → Sent → Answered → Closed. Buttons offered per status:
| Status | Actions |
|---|---|
| Draft | Mark Open, Send, Edit |
| Open | Send, Edit |
| Sent | Log Response |
| Answered | Reopen (→ Sent), Close |
| Closed | Export PDF only (Edit hidden) |
An Overdue chip overrides the status label on Open/Sent RFIs past due date. In the log, ball-in-court and due date render as "—" once Closed.
Concurrency: change status from two tabs — the loser must toast "RFI was changed by another user — reloading".
4. Send (email + PDF)¶
Send opens a modal: Organization * (project organizations), Contact (optional, defaults to org default), Directed To * (General Contractor/Architect/Engineer/Other), optional Message, and a resolved Recipient email preview — the Send RFI button stays disabled if no email is on file.
Sending generates the RFI PDF and emails it; status flips to Sent and the ball moves to the recipient's court. The activity timeline logs "Sent to {name}" with a PDF button that downloads the exact sent artifact.
5. Log the response and close¶
On a Sent RFI, Log Response opens an inline box: Response textarea (required) + response attachments → Submit Response → status Answered, timeline shows "Response received" attributed to the ball-in-court party. Then Close (or Reopen if the answer needs follow-up).
6. Exports and AI draft¶
- Export PDF (detail header) — single RFI.
- Export Log PDF (log header) — the whole register.
- Draft with AI — pick project PDFs (Drawings/Specs/Correspondence) → Generate Suggestions → Accept/Reject each → Apply decisions creates the accepted ones as drafts. Nice-to-cover, not core.
RFI PDFs use the same production-safe renderer as Change Orders and Proposals (PIN-504) — a PDF failure on staging IS a bug across all of them, not a known infra issue. Watch for garbled non-Latin characters in PDFs (known bug class).
Verification Checklist¶
- Draft saves with only Subject+Question; Trade empty is accepted
- Due date defaults to +5 business days (skips weekends)
- Send is blocked until the recipient has an email; after Send the timeline shows the sent copy with a downloadable PDF
- Log Response requires text; Answered → Close and Answered → Reopen both work
- Overdue chip appears on a past-due Open/Sent RFI
- Closed RFI hides Edit and status actions
- Both PDF exports download; text renders cleanly (no mojibake)
- Read-only role sees the log but no New/Send/status buttons
- No console errors throughout
Known Issues / Current Gaps¶
Log ↔ create ↔ detail are internal view switches without their own URLs — browser Back exits the whole sub-tab; charter-known, don't re-file.
There is no Delete button for RFIs by design — only attachment removal.
Related docs¶
- Submittals — the sibling Project Controls flow
- Daily Logs — field-side reporting
Updating this walkthrough
Run the full flow yourself end-to-end. If it passes, bump last_verified: in the frontmatter to today's date. If any step fails, fix the doc or the code in the same PR — drift is the enemy.