mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
master
0.0.1
0.0.2
0.0.3
0.0.4
0.0.5
1.0.0
1.0.1
1.0.2
1.0.3
1.0.4
1.0.5
1.0.6
1.0.7
1.0.8
1.1.0
1.1.1
1.1.10
1.1.11
1.1.2
1.1.3
1.1.4
1.1.5
1.1.6
1.1.7
1.1.8
1.1.9
1.2.0
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.2.8
1.2.9
1.3.0
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7
1.3.8
1.4.0
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
1.4.7
1.4.8
1.4.9
1.5.0
1.5.1
1.5.2
1.5.3
1.5.4
1.5.5
1.5.6
1.5.7
1.5.8
1.5.9
1.6.0
1.6.1
1.6.2
1.6.3
1.6.4
1.6.5
1.6.6
1.6.7
1.6.8
1.6.9
1.7.0
1.7.1
1.7.2
1.7.3
1.7.4
1.7.5
1.7.6
1.7.7
1.7.8
1.7.9
1.8.0
1.8.1
1.8.2
1.8.3
1.8.4
1.8.5
1.8.6
1.8.7
1.8.8
1.8.9
1.9.0
1.9.1
1.9.10
1.9.2
1.9.3
1.9.4
1.9.5
1.9.6
1.9.7
1.9.8
1.9.9
2.0.0
2.0.1
2.0.2
2.0.3
2.0.4
2.0.5
2.0.6
2.0.7
2.0.8
2.0.9
2.1.0
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5
2.1.6
2.1.7
2.1.8
2.2.0
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.2.6
2.2.7
2.2.8
2.2.9
2.3.0
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
2.3.7
2.4.0
2.4.1
2.4.2
2.4.3
2.4.4
2.5.0
2.5.1
2.5.2
2.5.3
3.0.0
3.0.1
3.0.2
3.0.3
3.1.0
${ noResults }
Adds a DocuSign-style void to DocuSeal: a user with destroy permission on a submission can void it as long as it hasn't been fully completed. Voiding requires a reason, halts further signing, notifies every already-invited recipient with the reason, stamps a hollow-outline "VOIDED" watermark on each page of the document, and writes an audit event. Voided is a new terminal status — distinct from archived. ## Schema - submissions.voided_at — nullable timestamp + partial index - New SubmissionEvent.event_type value void_submission. Reason + voided_by_user_id stored in the event's data JSON (mirrors decline_form's reason storage) - SubmissionEvent#set_submission_id and set_account_id changed from unconditional = to ||= so an event can be created with a submission directly (no submitter, since void is account-level) - New WebhookUrl::EVENTS value submission.voided ## Domain - Submission#voided? / #voidable? / #void_event / #void_reason / #voided_by_user - Submission.scope :voided; :active and :pending updated to exclude voided - Submitter#status returns 'voided' (highest priority) when the parent submission is voided. #status_event_at returns voided_at first if set - Submission#has_many_attached :voided_documents — watermarked PDFs ## Service Submissions::Void.call(submission, user:, reason:, request:) validates the reason and voidable? invariant, writes the audit event and timestamp in a transaction, fires submission.voided webhook, notifies every recipient with sent_at set (matches DocuSign — only parties who had received the document are notified; sequential-order submitters who hadn't been reached yet are skipped), and enqueues GenerateVoidedDocumentsJob. Submissions::GenerateVoidedDocuments opens each source PDF with HexaPDF, dedupes by content checksum, and stamps a diagonal red "VOIDED" outline (text rendering mode :stroke, 85% stroke alpha, size 150, line width 2.2) plus a footer bar with date / voider / reason on every page. Uses submission.with_lock + a count-based short-circuit so a Sidekiq retry can't produce duplicate attachments. ## Routing - POST /api/submissions/:submission_id/void — JSON - POST /submissions/:submission_id/void — admin form - GET /submissions/:submission_id/void/new — modal reason form start_form_controller, submit_form_controller, and submit_form_decline_controller reject voided submissions on every signing path so a stale email link can't sneak through. SubmissionsUnarchiveController refuses to unarchive a voided submission. ## UI - Submission detail page: red banner with reason / voider / timestamp + download list for the watermarked PDFs. Red Void button in the header opens a turbo-modal that requires a reason. Send- email / send-SMS / sign-in-person / copy-share-link / unarchive controls hidden when voided - Submission list partial: red VOIDED badge takes priority over expired/completed; per-submitter actions hidden when voided - New submit_form/voided.html.erb — branded landing page rendered to anyone clicking a stale signing link - New submitter_mailer#voided_email and template — surfaces reason ## API Submissions::SerializeForApi reports status: 'voided' and includes void_reason plus voided document URLs. voided_at is serialized alongside archived_at. Submissions::Filter accepts ?status=voided. ## Not included - RSpec specs - Locale parity beyond English - Account-level toggle for the watermark - Distinct :void CanCanCan ability (uses :destroy) |
1 month ago | |
|---|---|---|
| .. | ||
| application_mailer.rb | remove premailer | 3 months ago |
| settings_mailer.rb | smtp settings | 2 years ago |
| submitter_mailer.rb | Add Void action for in-flight submissions | 1 month ago |
| template_mailer.rb | fix template 2fa email | 11 months ago |
| user_mailer.rb | add I18n invitation email | 2 years ago |