diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index b22eeda21..51106fdce 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -72,6 +72,22 @@ export const setFieldsForDocument = async ({ }); } + // Check that every signer has a signature field + const signers = document.recipients.filter((recipient) => recipient.role === 'SIGNER'); + const hasEverySignerSignature = signers.every((signer) => + fields.some( + (field) => + (field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE) && + field.recipientId === signer.id, + ), + ); + + if (!hasEverySignerSignature) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Every signer must have at least one signature field', + }); + } + if (document.completedAt) { throw new AppError(AppErrorCode.INVALID_REQUEST, { message: 'Document already complete', diff --git a/packages/lib/server-only/field/set-fields-for-template.ts b/packages/lib/server-only/field/set-fields-for-template.ts index c1c41de7c..720f355f7 100644 --- a/packages/lib/server-only/field/set-fields-for-template.ts +++ b/packages/lib/server-only/field/set-fields-for-template.ts @@ -58,12 +58,29 @@ export const setFieldsForTemplate = async ({ teamId: null, }), }, + include: { + recipients: true, + }, }); if (!template) { throw new Error('Template not found'); } + // Check that every signer has a signature field + const signers = template.recipients.filter((recipient) => recipient.role === 'SIGNER'); + const hasEverySignerSignature = signers.every((signer) => + fields.some( + (field) => + (field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE) && + field.signerId === signer.id, + ), + ); + + if (!hasEverySignerSignature) { + throw new Error('Every signer must have at least one signature field'); + } + const existingFields = await prisma.field.findMany({ where: { templateId,