feat: map Adobe STAMP field to DocuSign stampTabs

Adobe STAMP (hanko/seal) has a direct DocuSign equivalent via
stampTabs. Previously marked as skipped with no equivalent.

- compose_docusign_template.py: emit stampTabs for STAMP input type;
  PARTICIPATION_STAMP remains skipped (still no equivalent)
- field-mapping.md: update STAMP row, add stampTabs to multi-location
  non-merging list, add account feature prerequisite to Known Gaps

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul Huliganga 2026-04-16 10:10:22 -04:00
parent 9c6c01d619
commit e2e47f2662
2 changed files with 16 additions and 6 deletions

View File

@ -23,7 +23,7 @@ Source: Adobe Sign UI "Change field type" dropdown (all 15 types) + API field da
| Image | INLINE_IMAGE | DATA | — | (skipped) | No DocuSign equivalent | | Image | INLINE_IMAGE | DATA | — | (skipped) | No DocuSign equivalent |
| Company | TEXT_FIELD | COMPANY or SIGNER_COMPANY | — | companyTabs | Auto-populated from signer profile. API returns `SIGNER_COMPANY` when set via UI. | | Company | TEXT_FIELD | COMPANY or SIGNER_COMPANY | — | companyTabs | Auto-populated from signer profile. API returns `SIGNER_COMPANY` when set via UI. |
| Title | TEXT_FIELD | TITLE or SIGNER_TITLE | — | titleTabs | Auto-populated from signer profile. API returns `SIGNER_TITLE` when set via UI. | | Title | TEXT_FIELD | TITLE or SIGNER_TITLE | — | titleTabs | Auto-populated from signer profile. API returns `SIGNER_TITLE` when set via UI. |
| Stamp | STAMP | — | — | (skipped) | No DocuSign equivalent | | Stamp | STAMP | — | — | stampTabs | DocuSign stampTabs — signer uploads/selects a stamp image (hanko/seal). Requires stamp feature enabled on account. |
| Signature block | BLOCK | SIGNATURE_BLOCK | — | signHereTabs | Composite block — mapped to sign-here | | Signature block | BLOCK | SIGNATURE_BLOCK | — | signHereTabs | Composite block — mapped to sign-here |
## Role/Recipient Mapping ## Role/Recipient Mapping
@ -76,7 +76,7 @@ Tab types that support merging (one tab emitted per location):
`emailAddressTabs`, `companyTabs`, `titleTabs`, `listTabs`, `checkboxTabs` `emailAddressTabs`, `companyTabs`, `titleTabs`, `listTabs`, `checkboxTabs`
Tab types that do not merge (only first location used or handled specially): Tab types that do not merge (only first location used or handled specially):
`signHereTabs`, `initialHereTabs` — each location is an independent signing action `signHereTabs`, `initialHereTabs`, `stampTabs` — each location is an independent signing/stamping action
`radioGroupTabs` — each location is one radio button within the group `radioGroupTabs` — each location is one radio button within the group
`signerAttachmentTabs` — each location is an independent attachment request `signerAttachmentTabs` — each location is an independent attachment request
@ -90,6 +90,9 @@ Tab types that do not merge (only first location used or handled specially):
best-effort via standard DocuSign validation types only. best-effort via standard DocuSign validation types only.
- **Radio group flattening**: Adobe radios with `radioGroup` are merged into a single - **Radio group flattening**: Adobe radios with `radioGroup` are merged into a single
DocuSign `radioGroupTabs` entry with per-location radio button coordinates. DocuSign `radioGroupTabs` entry with per-location radio button coordinates.
- **Stamp tab account feature**: `stampTabs` requires the stamp/hanko feature to be
enabled on the DocuSign account. Verify before migrating templates that contain
Adobe Sign STAMP fields.
## To Do ## To Do
- Add conditional logic/rule mapping table - Add conditional logic/rule mapping table

View File

@ -19,9 +19,10 @@ Key rules applied:
- No top-level "status" field (belongs on envelope sends, not templates) - No top-level "status" field (belongs on envelope sends, not templates)
Field type coverage: Field type coverage:
Mapped: TEXT_FIELD, SIGNATURE, CHECKBOX, DATE, DROP_DOWN, RADIO, BLOCK Mapped: TEXT_FIELD, SIGNATURE, CHECKBOX, DATE, DROP_DOWN, RADIO, BLOCK, STAMP
Partial: FILE_CHOOSER signerAttachmentTabs (with warning) Partial: FILE_CHOOSER signerAttachmentTabs (with warning)
Skipped: INLINE_IMAGE (no DocuSign equivalent warning logged) STAMP stampTabs (requires stamp feature enabled on DocuSign account warning logged)
Skipped: INLINE_IMAGE, PARTICIPATION_STAMP (no DocuSign equivalent warning logged)
""" """
import base64 import base64
@ -229,8 +230,14 @@ def build_tabs_for_field(field: dict, warnings: list) -> dict:
warnings.append(f"INLINE_IMAGE '{label}' → skipped (no DocuSign equivalent)") warnings.append(f"INLINE_IMAGE '{label}' → skipped (no DocuSign equivalent)")
return {} return {}
elif input_type in ("STAMP", "PARTICIPATION_STAMP"): elif input_type == "STAMP":
warnings.append(f"{input_type} '{label}' → skipped (no DocuSign equivalent)") # DocuSign stampTabs — signer uploads or selects a hanko/seal stamp image.
# Requires the stamp feature to be enabled on the DocuSign account.
warnings.append(f"STAMP '{label}' → stampTabs (verify stamp feature is enabled on your DocuSign account)")
return {"stampTabs": [_make_base_tab(loc, label) for loc in locations]}
elif input_type == "PARTICIPATION_STAMP":
warnings.append(f"PARTICIPATION_STAMP '{label}' → skipped (no DocuSign equivalent)")
return {} return {}
else: else: