This commit is contained in:
phaichayon
2026-06-19 12:30:26 +07:00
parent 721653f692
commit a85d24235c
14 changed files with 1250 additions and 102 deletions

View File

@@ -0,0 +1,63 @@
# 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