Compare commits

...

4 Commits

Author SHA1 Message Date
ephraimduncan 179902a96f chore: trim verbose audit log backfill migration comment 2026-06-16 11:46:54 +00:00
ephraimduncan 77889270b8 fix: address per-document audit log review feedback
- backfill DocumentMeta.includeAuditLog from the effective team/org
  setting so documents created before the column keep embedding audit
  logs after deploy
- default includeAuditLog in the webhook payload schema so resending
  historical WebhookCall payloads stays backward-compatible
- allow audit-log embedding to be changed after a document is sent
  (drop the server guards and the editor checkbox lock)
- restore the commented change-detection block in updateEnvelope
2026-06-16 11:40:36 +00:00
ephraimduncan ecc99b8e4f fix: clarify audit log PDF setting 2026-05-21 12:09:19 +00:00
ephraimduncan 89c804a635 feat: configure audit log embedding per document 2026-05-21 03:42:41 +00:00
27 changed files with 302 additions and 3 deletions
@@ -41,6 +41,7 @@ import { TemplateTypeSelect, TemplateTypeTooltip } from '@documenso/ui/component
import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button';
import { CardDescription, CardHeader, CardTitle } from '@documenso/ui/primitives/card';
import { Checkbox } from '@documenso/ui/primitives/checkbox';
import { Combobox } from '@documenso/ui/primitives/combobox';
import {
Dialog,
@@ -50,7 +51,15 @@ import {
DialogTitle,
DialogTrigger,
} from '@documenso/ui/primitives/dialog';
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@documenso/ui/primitives/form/form';
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@documenso/ui/primitives/form/form';
import { Input } from '@documenso/ui/primitives/input';
import { MultiSelectCombobox } from '@documenso/ui/primitives/multi-select-combobox';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@documenso/ui/primitives/select';
@@ -93,6 +102,7 @@ export const ZAddSettingsFormSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.default(DEFAULT_DOCUMENT_TIME_ZONE),
dateFormat: ZDocumentMetaDateFormatSchema.default(DEFAULT_DOCUMENT_DATE_FORMAT),
distributionMethod: z.nativeEnum(DocumentDistributionMethod).optional().default(DocumentDistributionMethod.EMAIL),
includeAuditLog: z.boolean().default(false),
redirectUrl: z
.string()
.optional()
@@ -181,6 +191,7 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
dateFormat: (envelope.documentMeta.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT) as TDocumentMetaDateFormat,
distributionMethod: envelope.documentMeta.distributionMethod || DocumentDistributionMethod.EMAIL,
includeAuditLog: envelope.documentMeta.includeAuditLog,
redirectUrl: envelope.documentMeta.redirectUrl ?? '',
language: envelope.documentMeta.language ?? 'en',
emailId: envelope.documentMeta.emailId ?? null,
@@ -236,6 +247,7 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
emailReplyTo,
envelopeExpirationPeriod,
reminderSettings,
includeAuditLog,
} = data.meta;
const parsedGlobalAccessAuth = z.array(ZDocumentAccessAuthTypesSchema).safeParse(data.globalAccessAuth);
@@ -265,6 +277,7 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD),
envelopeExpirationPeriod,
reminderSettings,
includeAuditLog,
},
});
@@ -892,6 +905,33 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
)}
/>
<FormField
control={form.control}
name="meta.includeAuditLog"
render={({ field }) => (
<FormItem>
<div className="flex items-center">
<FormControl>
<Checkbox
id="include-audit-log"
checked={field.value}
disabled={field.disabled}
onCheckedChange={(checked) => field.onChange(Boolean(checked))}
/>
</FormControl>
<FormLabel className="ml-2 text-muted-foreground text-sm" htmlFor="include-audit-log">
<Trans>Include audit logs in signed PDF</Trans>
</FormLabel>
</div>
<FormDescription>
<Trans>Audit logs can still be downloaded separately from the document logs page.</Trans>
</FormDescription>
</FormItem>
)}
/>
{!isEmbedded && (
<FormField
control={form.control}
@@ -0,0 +1,208 @@
import { getDocumentByToken } from '@documenso/lib/server-only/document/get-document-by-token';
import { getEnvelopeItemPdfUrl } from '@documenso/lib/utils/envelope-download';
import { prisma } from '@documenso/prisma';
import { PDF } from '@libpdf/core';
import { expect, type Page, test } from '@playwright/test';
import { DocumentStatus } from '@prisma/client';
import { apiCreateTestContext, apiSeedDraftDocument, apiSeedPendingDocument } from '../fixtures/api-seeds';
import { apiSignin } from '../fixtures/authentication';
import { signSignaturePad } from '../fixtures/signature';
type TeamDocumentSettings = {
includeAuditLog?: boolean;
includeSigningCertificate?: boolean;
};
const updateTeamDocumentSettings = async (teamId: number, data: TeamDocumentSettings) => {
const teamSettings = await prisma.teamGlobalSettings.findFirstOrThrow({
where: {
team: {
id: teamId,
},
},
});
await prisma.teamGlobalSettings.update({
where: {
id: teamSettings.id,
},
data,
});
};
const getFirstEnvelopeItemSignedPageCount = async (envelopeId: string, token: string) => {
const envelopeItem = await prisma.envelopeItem.findFirstOrThrow({
where: {
envelopeId,
},
});
const documentUrl = getEnvelopeItemPdfUrl({
type: 'download',
envelopeItem,
token,
version: 'signed',
});
const response = await fetch(documentUrl);
expect(response.ok).toBe(true);
const pdfData = await response.arrayBuffer();
const pdfDoc = await PDF.load(new Uint8Array(pdfData));
return pdfDoc.getPageCount();
};
const completeSigning = async ({
page,
signingUrl,
recipientToken,
fieldId,
}: {
page: Page;
signingUrl: string;
recipientToken: string;
fieldId: number;
}) => {
await page.goto(signingUrl);
await signSignaturePad(page);
await page.locator(`#field-${fieldId}`).getByRole('button').click();
await expect(page.locator(`#field-${fieldId}`)).toHaveAttribute('data-inserted', 'true');
await page.getByRole('button', { name: 'Complete' }).click();
await page.getByRole('button', { name: 'Sign' }).click({ force: true });
await page.waitForURL(/\/complete$/);
await expect(async () => {
const { status } = await getDocumentByToken({
token: recipientToken,
});
expect(status).toBe(DocumentStatus.COMPLETED);
}).toPass();
};
test.describe('Document audit log embedding', () => {
test('new documents derive audit-log embedding from team settings', async ({ request }) => {
const context = await apiCreateTestContext('e2e-audit-log-default');
await updateTeamDocumentSettings(context.team.id, {
includeAuditLog: true,
});
const { envelope } = await apiSeedDraftDocument(request, {
context,
});
expect(envelope.documentMeta.includeAuditLog).toBe(true);
await updateTeamDocumentSettings(context.team.id, {
includeAuditLog: false,
});
const documentMeta = await prisma.documentMeta.findFirstOrThrow({
where: {
id: envelope.documentMeta.id,
},
});
expect(documentMeta.includeAuditLog).toBe(true);
});
test('meta.includeAuditLog true appends audit-log pages when team default is false', async ({ page, request }) => {
const context = await apiCreateTestContext('e2e-audit-log-override-true');
await updateTeamDocumentSettings(context.team.id, {
includeAuditLog: false,
includeSigningCertificate: false,
});
const { distributeResult, envelope } = await apiSeedPendingDocument(request, {
context,
meta: {
includeAuditLog: true,
},
});
expect(envelope.documentMeta.includeAuditLog).toBe(true);
const signer = distributeResult.recipients[0];
const signatureField = envelope.fields.find((field) => field.recipientId === signer.id);
if (!signatureField) {
throw new Error('Signature field not found');
}
const baselinePageCount = await getFirstEnvelopeItemSignedPageCount(envelope.id, signer.token);
await completeSigning({
page,
signingUrl: signer.signingUrl,
recipientToken: signer.token,
fieldId: signatureField.id,
});
await expect(async () => {
const signedPageCount = await getFirstEnvelopeItemSignedPageCount(envelope.id, signer.token);
expect(signedPageCount).toBe(baselinePageCount + 1);
}).toPass();
});
test('meta.includeAuditLog false skips embedded audit logs when team default is true', async ({ page, request }) => {
const context = await apiCreateTestContext('e2e-audit-log-override-false');
await updateTeamDocumentSettings(context.team.id, {
includeAuditLog: true,
includeSigningCertificate: false,
});
const { distributeResult, envelope, team, user } = await apiSeedPendingDocument(request, {
context,
meta: {
includeAuditLog: false,
},
});
expect(envelope.documentMeta.includeAuditLog).toBe(false);
const signer = distributeResult.recipients[0];
const signatureField = envelope.fields.find((field) => field.recipientId === signer.id);
if (!signatureField) {
throw new Error('Signature field not found');
}
const baselinePageCount = await getFirstEnvelopeItemSignedPageCount(envelope.id, signer.token);
await completeSigning({
page,
signingUrl: signer.signingUrl,
recipientToken: signer.token,
fieldId: signatureField.id,
});
await expect(async () => {
const signedPageCount = await getFirstEnvelopeItemSignedPageCount(envelope.id, signer.token);
expect(signedPageCount).toBe(baselinePageCount);
}).toPass();
await apiSignin({
page,
email: user.email,
redirectPath: `/t/${team.url}/documents/${envelope.id}/logs`,
});
const downloadPromise = page.waitForEvent('download');
await page.getByRole('button', { name: 'Download Audit Logs' }).click();
const download = await downloadPromise;
expect(download.suggestedFilename()).toContain('Audit Logs.pdf');
});
});
@@ -177,7 +177,7 @@ export const run = async ({ payload, io }: { payload: TSealDocumentJobDefinition
const usePlaywrightPdf = NEXT_PRIVATE_USE_PLAYWRIGHT_PDF();
const needsCertificate = settings.includeSigningCertificate;
const needsAuditLog = settings.includeAuditLog;
const needsAuditLog = envelope.documentMeta.includeAuditLog;
const newDocumentData: Array<{ oldDocumentDataId: string; newDocumentDataId: string }> = [];
@@ -25,6 +25,7 @@ export type CreateDocumentMetaOptions = {
signingOrder?: DocumentSigningOrder;
allowDictateNextSigner?: boolean;
distributionMethod?: DocumentDistributionMethod;
includeAuditLog?: boolean;
typedSignatureEnabled?: boolean;
uploadSignatureEnabled?: boolean;
drawSignatureEnabled?: boolean;
@@ -47,6 +48,7 @@ export const updateDocumentMeta = async ({
emailReplyTo,
emailSettings,
distributionMethod,
includeAuditLog,
typedSignatureEnabled,
uploadSignatureEnabled,
drawSignatureEnabled,
@@ -108,6 +110,7 @@ export const updateDocumentMeta = async ({
emailReplyTo,
emailSettings,
distributionMethod,
includeAuditLog,
typedSignatureEnabled,
uploadSignatureEnabled,
drawSignatureEnabled,
@@ -40,6 +40,7 @@ export const ZEnvelopeForSigningResponse = z.object({
documentMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
timezone: true,
dateFormat: true,
redirectUrl: true,
@@ -105,6 +105,7 @@ export type CreateDocumentFromTemplateOptions = {
language?: SupportedLanguageCodes;
distributionMethod?: DocumentDistributionMethod;
allowDictateNextSigner?: boolean;
includeAuditLog?: boolean;
emailSettings?: TDocumentEmailSettings;
typedSignatureEnabled?: boolean;
uploadSignatureEnabled?: boolean;
@@ -513,6 +514,7 @@ export const createDocumentFromTemplate = async ({
dateFormat: override?.dateFormat || template.documentMeta?.dateFormat,
redirectUrl: override?.redirectUrl || template.documentMeta?.redirectUrl,
distributionMethod: override?.distributionMethod || template.documentMeta?.distributionMethod,
includeAuditLog: override?.includeAuditLog ?? template.documentMeta?.includeAuditLog,
emailSettings: override?.emailSettings || template.documentMeta?.emailSettings,
signingOrder: override?.signingOrder || template.documentMeta?.signingOrder,
language: override?.language || template.documentMeta?.language || settings.documentLanguage,
@@ -666,7 +668,7 @@ export const createDocumentFromTemplate = async ({
const date = new Date(selector.value);
if (isNaN(date.getTime())) {
if (Number.isNaN(date.getTime())) {
throw new AppError(AppErrorCode.INVALID_BODY, {
message: `Invalid date value for field ${field.id}: ${selector.value}`,
});
@@ -47,6 +47,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo
drawSignatureEnabled: true,
language: 'en',
distributionMethod: DocumentDistributionMethod.EMAIL,
includeAuditLog: false,
emailSettings: null,
},
recipients: [
+6
View File
@@ -19,6 +19,7 @@ import { ZDocumentEmailSettingsSchema } from './document-email';
export const ZDocumentMetaSchema = DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
id: true,
subject: true,
message: true,
@@ -93,6 +94,10 @@ export const ZDocumentMetaDistributionMethodSchema = z
.nativeEnum(DocumentDistributionMethod)
.describe('The distribution method to use when sending the document to the recipients.');
export const ZDocumentMetaIncludeAuditLogSchema = z
.boolean()
.describe('Whether to include the audit logs in the sealed document PDF.');
export const ZDocumentMetaTypedSignatureEnabledSchema = z
.boolean()
.describe('Whether to allow recipients to sign using a typed signature.');
@@ -116,6 +121,7 @@ export const ZDocumentMetaCreateSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
allowDictateNextSigner: z.boolean().optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
+1
View File
@@ -53,6 +53,7 @@ export const ZDocumentSchema = LegacyDocumentSchema.pick({
documentMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
id: true,
subject: true,
message: true,
+1
View File
@@ -270,6 +270,7 @@ export const ZEditorEnvelopeSchema = EnvelopeSchema.pick({
documentMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
id: true,
subject: true,
message: true,
+1
View File
@@ -40,6 +40,7 @@ export const ZEnvelopeSchema = EnvelopeSchema.pick({
documentMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
id: true,
subject: true,
message: true,
+2
View File
@@ -56,6 +56,7 @@ export const ZTemplateSchema = TemplateSchema.pick({
drawSignatureEnabled: true,
allowDictateNextSigner: true,
distributionMethod: true,
includeAuditLog: true,
redirectUrl: true,
language: true,
emailSettings: true,
@@ -149,6 +150,7 @@ export const ZTemplateManySchema = TemplateSchema.pick({
templateMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
}).nullable(),
directLink: LegacyTemplateDirectLinkSchema.pick({
token: true,
+1
View File
@@ -56,6 +56,7 @@ export const ZWebhookDocumentMetaSchema = z.object({
drawSignatureEnabled: z.boolean(),
language: z.string(),
distributionMethod: z.nativeEnum(DocumentDistributionMethod),
includeAuditLog: z.boolean().default(false),
emailSettings: z.any().nullable(),
});
+1
View File
@@ -44,6 +44,7 @@ export const extractDerivedDocumentMeta = (
signingOrder: meta.signingOrder || DocumentSigningOrder.PARALLEL,
allowDictateNextSigner: meta.allowDictateNextSigner ?? false,
distributionMethod: meta.distributionMethod || DocumentDistributionMethod.EMAIL, // Todo: Make this a setting.
includeAuditLog: meta.includeAuditLog ?? settings.includeAuditLog,
// Signature settings.
typedSignatureEnabled: meta.typedSignatureEnabled ?? settings.typedSignatureEnabled,
@@ -0,0 +1,12 @@
-- AlterTable
ALTER TABLE "DocumentMeta" ADD COLUMN "includeAuditLog" BOOLEAN NOT NULL DEFAULT false;
-- Backfill includeAuditLog from the effective team/organisation setting
UPDATE "DocumentMeta" AS dm
SET "includeAuditLog" = COALESCE(tgs."includeAuditLog", ogs."includeAuditLog")
FROM "Envelope" e
JOIN "Team" t ON t."id" = e."teamId"
JOIN "TeamGlobalSettings" tgs ON tgs."id" = t."teamGlobalSettingsId"
JOIN "Organisation" o ON o."id" = t."organisationId"
JOIN "OrganisationGlobalSettings" ogs ON ogs."id" = o."organisationGlobalSettingsId"
WHERE e."documentMetaId" = dm."id";
+1
View File
@@ -524,6 +524,7 @@ model DocumentMeta {
language String @default("en")
distributionMethod DocumentDistributionMethod @default(EMAIL)
includeAuditLog Boolean @default(false)
emailSettings Json? /// [DocumentEmailSettings] @zod.custom.use(ZDocumentEmailSettingsSchema)
emailReplyTo String?
@@ -37,6 +37,7 @@ export const distributeDocumentRoute = authenticatedProcedure
timezone: meta.timezone,
redirectUrl: meta.redirectUrl,
distributionMethod: meta.distributionMethod,
includeAuditLog: meta.includeAuditLog,
emailSettings: meta.emailSettings ?? undefined,
language: meta.language,
emailId: meta.emailId,
@@ -3,6 +3,7 @@ import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-emai
import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -33,6 +34,7 @@ export const ZDistributeDocumentRequestSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
emailId: z.string().nullish(),
@@ -3,6 +3,7 @@ import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -59,6 +60,7 @@ export const ZCreateEmbeddingDocumentRequestSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
@@ -3,6 +3,7 @@ import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -56,6 +57,7 @@ export const ZCreateEmbeddingTemplateRequestSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
@@ -21,6 +21,7 @@ export const ZGetMultiSignDocumentResponseSchema = ZDocumentLiteSchema.extend({
documentMeta: DocumentMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
id: true,
subject: true,
message: true,
@@ -3,6 +3,7 @@ import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -60,6 +61,7 @@ export const ZUpdateEmbeddingDocumentRequestSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
@@ -3,6 +3,7 @@ import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -60,6 +61,7 @@ export const ZUpdateEmbeddingTemplateRequestSchema = z.object({
timezone: ZDocumentMetaTimezoneSchema.optional(),
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
@@ -37,6 +37,7 @@ export const distributeEnvelopeRoute = authenticatedProcedure
timezone: meta.timezone,
redirectUrl: meta.redirectUrl,
distributionMethod: meta.distributionMethod,
includeAuditLog: meta.includeAuditLog,
emailSettings: meta.emailSettings ?? undefined,
language: meta.language,
emailId: meta.emailId,
@@ -23,6 +23,7 @@ export const ZDistributeEnvelopeRequestSchema = z.object({
timezone: true,
dateFormat: true,
distributionMethod: true,
includeAuditLog: true,
redirectUrl: true,
language: true,
emailId: true,
@@ -5,6 +5,7 @@ import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaIncludeAuditLogSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
@@ -89,6 +90,7 @@ export const ZUseEnvelopePayloadSchema = z.object({
dateFormat: ZDocumentMetaDateFormatSchema.optional(),
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
includeAuditLog: ZDocumentMetaIncludeAuditLogSchema.optional(),
emailSettings: ZDocumentEmailSettingsSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(),
@@ -61,6 +61,7 @@ export const getTemplatesByIdsRoute = authenticatedProcedure
select: {
signingOrder: true,
distributionMethod: true,
includeAuditLog: true,
},
},
directLink: {
@@ -106,6 +107,7 @@ export const getTemplatesByIdsRoute = authenticatedProcedure
? {
signingOrder: envelope.documentMeta.signingOrder,
distributionMethod: envelope.documentMeta.distributionMethod,
includeAuditLog: envelope.documentMeta.includeAuditLog,
}
: null,
directLink: envelope.directLink