chore: allow same signer docs

This commit is contained in:
Catalin Pit
2025-02-06 14:27:37 +02:00
parent 516435fa2a
commit c41002313a
10 changed files with 42 additions and 38 deletions

View File

@ -94,9 +94,7 @@ export const setFieldsForDocument = async ({
const linkedFields = fields.map((field) => {
const existing = existingFields.find((existingField) => existingField.id === field.id);
const recipient = document.recipients.find(
(recipient) => recipient.email.toLowerCase() === field.signerEmail.toLowerCase(),
);
const recipient = document.recipients.find((recipient) => recipient.id === field.recipientId);
// Each field MUST have a recipient associated with it.
if (!recipient) {
@ -127,8 +125,6 @@ export const setFieldsForDocument = async ({
const persistedFields = await prisma.$transaction(async (tx) => {
return await Promise.all(
linkedFields.map(async (field) => {
const fieldSignerEmail = field.signerEmail.toLowerCase();
const parsedFieldMeta = field.fieldMeta
? ZFieldMetaSchema.parse(field.fieldMeta)
: undefined;
@ -211,6 +207,13 @@ export const setFieldsForDocument = async ({
id: field._persisted?.id ?? -1,
documentId,
},
include: {
recipient: {
select: {
email: true,
},
},
},
update: {
page: field.pageNumber,
positionX: field.pageX,
@ -236,10 +239,7 @@ export const setFieldsForDocument = async ({
},
recipient: {
connect: {
documentId_email: {
documentId,
email: fieldSignerEmail,
},
id: field.recipientId,
},
},
},
@ -251,7 +251,7 @@ export const setFieldsForDocument = async ({
const baseAuditLog = {
fieldId: upsertedField.secondaryId,
fieldRecipientEmail: fieldSignerEmail,
fieldRecipientEmail: upsertedField.recipient?.email ?? '',
fieldRecipientId: upsertedField.recipientId,
fieldType: upsertedField.type,
};
@ -339,7 +339,7 @@ export const setFieldsForDocument = async ({
type FieldData = {
id?: number | null;
type: FieldType;
signerEmail: string;
recipientId: number;
pageNumber: number;
pageX: number;
pageY: number;

View File

@ -23,6 +23,7 @@ export type SetFieldsForTemplateOptions = {
id?: number | null;
type: FieldType;
signerEmail: string;
recipientId: number;
pageNumber: number;
pageX: number;
pageY: number;

View File

@ -125,16 +125,12 @@ export const setDocumentRecipients = async ({
const removedRecipients = existingRecipients.filter(
(existingRecipient) =>
!normalizedRecipients.find(
(recipient) =>
recipient.id === existingRecipient.id || recipient.email === existingRecipient.email,
),
!normalizedRecipients.find((recipient) => recipient.id === existingRecipient.id),
);
const linkedRecipients = normalizedRecipients.map((recipient) => {
const existing = existingRecipients.find(
(existingRecipient) =>
existingRecipient.id === recipient.id || existingRecipient.email === recipient.email,
(existingRecipient) => existingRecipient.id === recipient.id,
);
if (

View File

@ -0,0 +1,2 @@
-- DropIndex
DROP INDEX "Recipient_documentId_email_key";

View File

@ -0,0 +1,5 @@
-- DropIndex
DROP INDEX "Recipient_templateId_email_key";
-- CreateIndex
CREATE INDEX "Recipient_email_idx" ON "Recipient"("email");

View File

@ -443,11 +443,10 @@ model Recipient {
fields Field[]
signatures Signature[]
@@unique([documentId, email])
@@unique([templateId, email])
@@index([documentId])
@@index([templateId])
@@index([token])
@@index([email])
}
enum FieldType {

View File

@ -429,6 +429,7 @@ export const fieldRouter = router({
teamId,
fields: fields.map((field) => ({
id: field.nativeId,
recipientId: field.recipientId,
signerEmail: field.signerEmail,
type: field.type,
pageNumber: field.pageNumber,

View File

@ -112,14 +112,15 @@ export const ZSetDocumentFieldsRequestSchema = z.object({
z.object({
formId: z.string().min(1),
nativeId: z.number().optional(),
id: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),
pageWidth: z.number().min(0),
pageHeight: z.number().min(0),
fieldMeta: ZFieldMetaSchema,
recipientId: z.number(),
pageNumber: ZFieldPageNumberSchema,
pageX: ZFieldPageXSchema,
pageY: ZFieldPageYSchema,
pageWidth: ZFieldWidthSchema,
pageHeight: ZFieldHeightSchema,
fieldMeta: ZFieldMetaSchema.optional(),
}),
),
});

View File

@ -92,7 +92,7 @@ export type FieldFormType = {
pageY: number;
pageWidth: number;
pageHeight: number;
signerEmail: string;
recipientId: number;
fieldMeta?: FieldMeta;
};
@ -143,8 +143,7 @@ export const AddFieldsFormPartial = ({
pageY: Number(field.positionY),
pageWidth: Number(field.width),
pageHeight: Number(field.height),
signerEmail:
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
recipientId: field.recipientId,
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
})),
typedSignatureEnabled: typedSignatureEnabled ?? false,
@ -348,7 +347,7 @@ export const AddFieldsFormPartial = ({
pageY,
pageWidth: fieldPageWidth,
pageHeight: fieldPageHeight,
signerEmail: selectedSigner.email,
recipientId: selectedSigner.id,
fieldMeta: undefined,
};
@ -441,7 +440,7 @@ export const AddFieldsFormPartial = ({
const newField: TAddFieldsFormSchema['fields'][0] = {
...structuredClone(lastActiveField),
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail,
recipientId: selectedSigner?.id ?? lastActiveField.recipientId,
pageX: lastActiveField.pageX + 3,
pageY: lastActiveField.pageY + 3,
};
@ -449,7 +448,7 @@ export const AddFieldsFormPartial = ({
append(newField);
}
},
[append, lastActiveField, selectedSigner?.email, toast],
[append, lastActiveField, selectedSigner?.id, toast],
);
const onFieldPaste = useCallback(
@ -462,13 +461,13 @@ export const AddFieldsFormPartial = ({
append({
...copiedField,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? copiedField.signerEmail,
recipientId: selectedSigner?.id ?? copiedField.recipientId,
pageX: copiedField.pageX + 3,
pageY: copiedField.pageY + 3,
});
}
},
[append, fieldClipboard, selectedSigner?.email],
[append, fieldClipboard, selectedSigner?.id],
);
useEffect(() => {
@ -567,7 +566,7 @@ export const AddFieldsFormPartial = ({
localFields.some(
(field) =>
(field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE) &&
field.signerEmail === signer.email,
field.recipientId === signer.id,
),
);
@ -637,7 +636,7 @@ export const AddFieldsFormPartial = ({
{isDocumentPdfLoaded &&
localFields.map((field, index) => {
const recipientIndex = recipients.findIndex((r) => r.email === field.signerEmail);
const recipientIndex = recipients.findIndex((r) => r.id === field.recipientId);
const hasFieldError =
emptyCheckboxFields.find((f) => f.formId === field.formId) ||
emptyRadioFields.find((f) => f.formId === field.formId) ||
@ -649,7 +648,7 @@ export const AddFieldsFormPartial = ({
recipientIndex={recipientIndex === -1 ? 0 : recipientIndex}
field={field}
disabled={
selectedSigner?.email !== field.signerEmail ||
selectedSigner?.id !== field.recipientId ||
!canRecipientBeModified(selectedSigner, fields)
}
minHeight={MIN_HEIGHT_PX}

View File

@ -9,7 +9,7 @@ export const ZAddFieldsFormSchema = z.object({
formId: z.string().min(1),
nativeId: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1),
recipientId: z.number(),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),