mirror of
https://github.com/documenso/documenso.git
synced 2026-08-24 15:22:26 +10:00
fix: advance signing groups by step completion instead of send status
This commit is contained in:
@@ -373,7 +373,6 @@ export const completeDocumentWithToken = async ({
|
|||||||
name: true,
|
name: true,
|
||||||
email: true,
|
email: true,
|
||||||
role: true,
|
role: true,
|
||||||
sendStatus: true,
|
|
||||||
},
|
},
|
||||||
where: {
|
where: {
|
||||||
envelopeId: envelope.id,
|
envelopeId: envelope.id,
|
||||||
@@ -399,24 +398,26 @@ export const completeDocumentWithToken = async ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (envelope.documentMeta?.signingOrder === DocumentSigningOrder.SEQUENTIAL) {
|
if (envelope.documentMeta?.signingOrder === DocumentSigningOrder.SEQUENTIAL) {
|
||||||
// The active group: every pending recipient sharing the lowest pending
|
// The next group: every pending recipient sharing the lowest pending
|
||||||
// signing order. Members already activated (sendStatus SENT) are group
|
// signing order. If the completing recipient's own step is still
|
||||||
// peers who were notified earlier — activating only fresh members means
|
// pending (a group peer has not signed yet), the flow does not advance —
|
||||||
// a mid-group completion is a no-op and a step transition activates the
|
// the remaining peers were already activated when their step unlocked.
|
||||||
// whole next group at once.
|
|
||||||
const nextGroup = filterRecipientsInFirstSigningGroup(pendingRecipients);
|
const nextGroup = filterRecipientsInFirstSigningGroup(pendingRecipients);
|
||||||
const recipientsToActivate = nextGroup.filter((r) => r.sendStatus !== SendStatus.SENT);
|
|
||||||
|
|
||||||
|
const currentRecipientOrder = recipient.signingOrder ?? Number.MAX_SAFE_INTEGER;
|
||||||
|
|
||||||
|
const hasCompletedCurrentStep = nextGroup.every(
|
||||||
|
(pendingRecipient) => (pendingRecipient.signingOrder ?? Number.MAX_SAFE_INTEGER) > currentRecipientOrder,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (nextGroup.length > 0 && hasCompletedCurrentStep) {
|
||||||
// Dictation only applies when advancing to a single-recipient step.
|
// Dictation only applies when advancing to a single-recipient step.
|
||||||
const canDictateNextSigner =
|
const canDictateNextSigner =
|
||||||
Boolean(nextSigner) &&
|
Boolean(nextSigner) && Boolean(envelope.documentMeta?.allowDictateNextSigner) && nextGroup.length === 1;
|
||||||
Boolean(envelope.documentMeta?.allowDictateNextSigner) &&
|
|
||||||
nextGroup.length === 1 &&
|
|
||||||
recipientsToActivate.length === 1;
|
|
||||||
|
|
||||||
await prisma.$transaction(async (tx) => {
|
await prisma.$transaction(async (tx) => {
|
||||||
if (canDictateNextSigner && nextSigner) {
|
if (canDictateNextSigner && nextSigner) {
|
||||||
const [nextRecipient] = recipientsToActivate;
|
const [nextRecipient] = nextGroup;
|
||||||
|
|
||||||
await tx.documentAuditLog.create({
|
await tx.documentAuditLog.create({
|
||||||
data: createDocumentAuditLogData({
|
data: createDocumentAuditLogData({
|
||||||
@@ -449,7 +450,7 @@ export const completeDocumentWithToken = async ({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const nextRecipient of recipientsToActivate) {
|
for (const nextRecipient of nextGroup) {
|
||||||
await tx.recipient.update({
|
await tx.recipient.update({
|
||||||
where: { id: nextRecipient.id },
|
where: { id: nextRecipient.id },
|
||||||
data: {
|
data: {
|
||||||
@@ -466,7 +467,7 @@ export const completeDocumentWithToken = async ({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const nextRecipient of recipientsToActivate) {
|
for (const nextRecipient of nextGroup) {
|
||||||
await jobs.triggerJob({
|
await jobs.triggerJob({
|
||||||
name: 'send.signing.requested.email',
|
name: 'send.signing.requested.email',
|
||||||
payload: {
|
payload: {
|
||||||
@@ -479,6 +480,7 @@ export const completeDocumentWithToken = async ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const haveAllRecipientsSigned = await prisma.envelope.findFirst({
|
const haveAllRecipientsSigned = await prisma.envelope.findFirst({
|
||||||
where: {
|
where: {
|
||||||
|
|||||||
Reference in New Issue
Block a user