# ADR 0012: Approval Signature Strategy ## Status Accepted ## Context Quotation PDF templates already contain the signature placeholders `app1`, `app2`, `app3` and their position fields, but earlier tasks only seeded safe fallback values. The production document flow now needs a deterministic rule for: - who is shown as `Prepared By` - who is shown as `Approved By` - who is shown as `Authorized By` - how each person’s position is resolved - how approved documents stay immutable after approval ## Decision ### Prepared By - resolve from `crm_quotations.salesman_id` - fallback to `crm_quotations.created_by` - always render the user display name, never a raw id - use quotation `created_at` as the available timestamp for the prepared block ### Approved By - resolve from live approval history in `crm_approval_actions` - consider only `approve` actions - choose the latest approved action whose workflow role is one of: - `sales_manager` - `department_manager` - exclude the workflow’s final approval role from this slot ### Authorized By - resolve from the latest approved action for the workflow’s final step - in the standard workflow this is expected to be `top_manager` ### Position Resolution - primary source is `memberships.business_role` - display label should come from active `ms_options` in category `crm_job_title` when available - if the master option is missing, fallback labels are: - `sales` -> `Sales Engineer` - `sales_support` -> `Sales Support` - `sales_manager` -> `Sales Manager` - `department_manager` -> `Department Manager` - `top_manager` -> `General Manager` ### Snapshot Immutability - preview PDF resolves signatures from live quotation and approval data - approved snapshot stores the resolved signature block and resolved template input - approved PDF generation prefers snapshot signature input when a snapshot already exists - locked approved artifacts remain the immutable historical source ## Consequences - signature placeholder mapping is now explicit and organization-aware - template output no longer depends on hardcoded placeholder text in the PDFME template - position labels can be governed centrally through master options without changing generator code - approved documents preserve approval identity even if user names, memberships, or master options change later