feat: signature rejection (#1472)

## Description

Adds support for rejecting a given document informing the document
owner.

Flows for resolving a rejection don't currently exist so it's up to the
document owner to reach out to the recipient and work out a way to move
forward via a new document or offline agreement.

## Related Issue


## Changes Made

- Added new rejection properties to the recipient schema
- Added API endpoints to support rejection
- Added email templates for notifying the document owner and recipient
- Added a dialog on the signing page to start the rejection flow.

## Testing Performed

- Manually tested the flow end to end
- Automated tests are planned
This commit is contained in:
Lucas Smith
2024-11-14 21:37:42 +11:00
committed by GitHub
parent f2439abbc9
commit 5398026b80
44 changed files with 1595 additions and 226 deletions

View File

@ -39,26 +39,26 @@ msgstr "\"{email}\" en nombre de \"{teamName}\" te ha invitado a firmar \"ejempl
#~ "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example\n"
#~ "document\"."
#~ msgstr ""
#~ "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example\n"
#~ "document\"."
#~ "\"{placeholderEmail}\" en nombre de \"{0}\" te ha invitado a firmar \"ejemplo\n"
#~ "documento\"."
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:209
msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"."
msgstr "\"{placeholderEmail}\" en nombre de \"{0}\" te ha invitado a firmar \"documento de ejemplo\"."
msgstr ""
#: apps/web/src/components/(teams)/forms/update-team-form.tsx:241
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" te ha invitado a firmar \"ejemplo de documento\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:78
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
msgid "({0}) has invited you to approve this document"
msgstr "({0}) te ha invitado a aprobar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:75
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
msgid "({0}) has invited you to sign this document"
msgstr "({0}) te ha invitado a firmar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:72
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
msgid "({0}) has invited you to view this document"
msgstr "({0}) te ha invitado a ver este documento"
@ -658,7 +658,7 @@ msgstr "Aprobar"
msgid "Approve Document"
msgstr "Aprobar Documento"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:85
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:94
msgid "Approved"
msgstr "Aprobado"
@ -666,6 +666,10 @@ msgstr "Aprobado"
msgid "Are you sure you want to delete this token?"
msgstr "¿Estás seguro de que deseas eliminar este token?"
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:120
msgid "Are you sure you want to reject this document? This action cannot be undone."
msgstr ""
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:188
msgid "Are you sure you want to remove the <0>{passkeyName}</0> passkey."
msgstr "¿Está seguro de que desea eliminar la clave de acceso <0>{passkeyName}</0>?"
@ -814,6 +818,7 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
@ -946,7 +951,7 @@ msgid "Complete Viewing"
msgstr "Completar Visualización"
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:62
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77
#: apps/web/src/components/formatter/document-status.tsx:28
msgid "Completed"
msgstr "Completado"
@ -1043,7 +1048,7 @@ msgstr "Controla el formato del mensaje que se enviará al invitar a un destinat
msgid "Copied"
msgstr "Copiado"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:133
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162
#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77
#: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163
@ -1517,6 +1522,10 @@ msgstr "Preferencias del documento actualizadas"
msgid "Document re-sent"
msgstr "Documento reenviado"
#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:83
msgid "Document Rejected"
msgstr ""
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:36
msgid "Document resealed"
msgstr "Documento sellado nuevamente"
@ -2300,7 +2309,7 @@ msgstr "Miembro desde"
msgid "Members"
msgstr "Miembros"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:46
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:55
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:35
msgid "Modify recipients"
msgstr "Modificar destinatarios"
@ -2394,6 +2403,10 @@ msgstr "Siguiente campo"
msgid "No active drafts"
msgstr "No hay borradores activos"
#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:99
msgid "No further action is required from you at this time."
msgstr ""
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:42
msgid "No payment required"
msgstr "No se requiere pago"
@ -2410,7 +2423,7 @@ msgstr "No hay actividad reciente"
msgid "No recent documents"
msgstr "No hay documentos recientes"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:61
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:70
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:49
#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:96
msgid "No recipients"
@ -2500,7 +2513,7 @@ msgstr "Solo los gerentes y superiores pueden acceder y ver el documento"
msgid "Oops! Something went wrong."
msgstr "¡Ups! Algo salió mal."
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:101
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:140
msgid "Opened"
msgstr "Abierto"
@ -2599,7 +2612,7 @@ msgstr "Se requiere pago para finalizar la creación de tu equipo."
msgid "Payment overdue"
msgstr "Pago atrasado"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:122
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:211
#: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82
#: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77
@ -2692,6 +2705,10 @@ msgstr "Por favor, ten en cuenta que esta acción es irreversible. Una vez confi
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Por favor, ten en cuenta que perderás acceso a todos los documentos asociados con este equipo y todos los miembros serán eliminados y notificados"
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:37
msgid "Please provide a reason"
msgstr ""
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:127
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Por favor, proporciona un token del autenticador o un código de respaldo. Si no tienes un código de respaldo disponible, contacta al soporte."
@ -2800,7 +2817,7 @@ msgstr "Campo de solo lectura"
msgid "Read the full <0>signature disclosure</0>."
msgstr "Lea la <0>divulgación de firma</0> completa."
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:97
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:106
msgid "Ready"
msgstr "Listo"
@ -2808,6 +2825,14 @@ msgstr "Listo"
msgid "Reason"
msgstr "Razón"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:146
msgid "Reason for rejection:"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:38
msgid "Reason must be less than 500 characters"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-dialog.tsx:62
msgid "Reauthentication is required to sign this field"
msgstr "Se requiere reautenticación para firmar este campo"
@ -2832,7 +2857,7 @@ msgid "Recipient updated"
msgstr "Destinatario actualizado"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:40
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139
msgid "Recipients"
@ -2860,6 +2885,17 @@ msgstr "Códigos de recuperación"
msgid "Registration Successful"
msgstr "Registro exitoso"
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162
msgid "Reject Document"
msgstr ""
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:141
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:101
msgid "Rejected"
msgstr ""
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:34
msgid "Remembered your password? <0>Sign In</0>"
msgstr "¿Recordaste tu contraseña? <0>Iniciar sesión</0>"
@ -3089,7 +3125,7 @@ msgstr "Enviando correo de restablecimiento..."
msgid "Sending..."
msgstr "Enviando..."
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:92
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:248
msgid "Sent"
msgstr "Enviado"
@ -3236,7 +3272,7 @@ msgstr "Firmas recolectadas"
msgid "Signatures will appear once the document has been completed"
msgstr "Las firmas aparecerán una vez que el documento se haya completado"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:105
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:270
#: apps/web/src/components/document/document-read-only-fields.tsx:84
msgid "Signed"
@ -3645,6 +3681,10 @@ msgstr "El documento ha sido movido con éxito al equipo seleccionado."
msgid "The document is now completed, please follow any instructions provided within the parent application."
msgstr "El documento ahora está completado, por favor sigue cualquier instrucción proporcionada dentro de la aplicación principal."
#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:92
msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary."
msgstr ""
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182
msgid "The document was created but could not be sent to recipients."
msgstr "El documento fue creado pero no se pudo enviar a los destinatarios."
@ -3699,7 +3739,7 @@ msgstr "El destinatario ha sido actualizado con éxito"
msgid "The selected team member will receive an email which they must accept before the team is transferred"
msgstr "El miembro del equipo seleccionado recibirá un correo electrónico que debe aceptar antes de que se transfiera el equipo"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:134
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:163
#: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:41
#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:118
msgid "The signing link has been copied to your clipboard."
@ -4141,7 +4181,7 @@ msgstr "No se pudo iniciar sesión"
msgid "Unauthorized"
msgstr "No autorizado"
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:116
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:155
msgid "Uncompleted"
msgstr "Incompleto"
@ -4386,12 +4426,12 @@ msgstr "Ver Códigos de Recuperación"
msgid "View teams"
msgstr "Ver equipos"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:111
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:259
msgid "Viewed"
msgstr "Visto"
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:86
#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:125
msgid "Waiting"
msgstr "Esperando"
@ -4846,6 +4886,10 @@ msgstr "Has alcanzado tu límite de documentos."
msgid "You have reached your document limit. <0>Upgrade your account to continue!</0>"
msgstr "Has alcanzado tu límite de documentos. <0>¡Actualiza tu cuenta para continuar!</0>"
#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:88
msgid "You have rejected this document"
msgstr ""
#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:50
msgid "You have successfully left this team."
msgstr "Has salido de este equipo con éxito."
@ -5073,4 +5117,3 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
msgid "Your tokens will be shown here once you create them."
msgstr "Tus tokens se mostrarán aquí una vez que los crees."