Files
alla-allaos-fullstack/docs/adr/0012-approval-signature-strategy.md
phaichayon a85d24235c task-h.4
2026-06-19 12:30:26 +07:00

64 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 persons 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 workflows final approval role from this slot
### Authorized By
- resolve from the latest approved action for the workflows 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