diff --git a/actions/sprints.ts b/actions/sprints.ts index ed8857d..7eb7229 100644 --- a/actions/sprints.ts +++ b/actions/sprints.ts @@ -171,10 +171,28 @@ export async function completeSprintAction( const stories = await prisma.story.findMany({ where: { id: { in: storyIds }, sprint_id: sprintId, product_id: sprint.product_id }, - select: { id: true }, + select: { id: true, pbi_id: true }, }) if (stories.length !== storyIds.length) return { error: 'Ongeldige Sprint-afronding' } + const affectedPbiIds = [...new Set(stories.map((s) => s.pbi_id))] + const candidatePbis = await prisma.pbi.findMany({ + where: { id: { in: affectedPbiIds }, status: { not: 'DONE' } }, + select: { id: true, stories: { select: { id: true, status: true } } }, + }) + + const decisionByStoryId = new Map(entries) + const pbiIdsToMarkDone = candidatePbis + .filter( + (pbi) => + pbi.stories.length > 0 && + pbi.stories.every((s) => { + const next = decisionByStoryId.get(s.id) ?? s.status + return next === 'DONE' + }) + ) + .map((p) => p.id) + await prisma.$transaction([ ...entries.map(([storyId, status]) => prisma.story.update({ @@ -185,6 +203,9 @@ export async function completeSprintAction( }, }) ), + ...pbiIdsToMarkDone.map((id) => + prisma.pbi.update({ where: { id }, data: { status: 'DONE' } }) + ), prisma.sprint.update({ where: { id: sprintId }, data: { status: 'COMPLETED', completed_at: new Date() },