From 582733e2ea0223087230628fce99e0ce6b7b552f Mon Sep 17 00:00:00 2001 From: Mahdi Date: Thu, 15 Oct 2026 13:02:01 +0330 Subject: [PATCH] fix: hide unlinked old activities from current work Imported follow-ups with no person, company, or deal stayed on the board because only linked prior records were archived. Co-authored-by: Cursor --- apps/api/src/billing/billing.service.ts | 7 +++++++ apps/api/src/common/prior-archive.ts | 7 +++++++ apps/api/test/prior-archive.test.ts | 6 ++++++ .../specs/2026-10-14-prior-data-archive-design.md | 2 +- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/api/src/billing/billing.service.ts b/apps/api/src/billing/billing.service.ts index a9d0f14..533ba55 100644 --- a/apps/api/src/billing/billing.service.ts +++ b/apps/api/src/billing/billing.service.ts @@ -305,6 +305,13 @@ export class BillingService { SELECT 1 FROM "Deal" AS d2 WHERE d2."id" = a."dealId" AND d2."importSource" = 'didar' ) + OR ( + a."personId" IS NULL + AND a."companyId" IS NULL + AND a."dealId" IS NULL + AND a."dueAt" IS NOT NULL + AND a."dueAt" < ${cutoff} + ) ) ) ) diff --git a/apps/api/src/common/prior-archive.ts b/apps/api/src/common/prior-archive.ts index fce7164..e8ee8bf 100644 --- a/apps/api/src/common/prior-archive.ts +++ b/apps/api/src/common/prior-archive.ts @@ -34,6 +34,7 @@ function stillOpenAhead(now: Date): Prisma.ActivityWhereInput { * فعالیت قبلی است اگر منبعش didar باشد، * یا قبل از روشن شدن ماژول ساخته شده و به شخص/شرکت/معاملهٔ قبلی وصل باشد. * معاملهٔ غیرقبلی مانع نمی‌شود؛ شخص قبلی (حتی اگر بعداً منبعش عوض شده) کافی است. + * فعالیت بدون شخص و شرکت و معامله هم اگر موعدش قبل از همان لحظه باشد قبلی است. */ function historicalActivity(cutoff: Date): Prisma.ActivityWhereInput { return { @@ -52,6 +53,12 @@ function historicalActivity(cutoff: Date): Prisma.ActivityWhereInput { }, { company: { importSource: PRIOR_IMPORT_SOURCE } }, { deal: { importSource: PRIOR_IMPORT_SOURCE } }, + { + personId: null, + companyId: null, + dealId: null, + dueAt: { lt: cutoff }, + }, ], }, ], diff --git a/apps/api/test/prior-archive.test.ts b/apps/api/test/prior-archive.test.ts index f595fc0..fcc3b29 100644 --- a/apps/api/test/prior-archive.test.ts +++ b/apps/api/test/prior-archive.test.ts @@ -61,6 +61,12 @@ describe('بایگانی اطلاعات قبل', () => { OR: [{ importSource: 'didar' }, { previousImportSource: 'didar' }], }, }); + assert.deepEqual(linked.OR[3], { + personId: null, + companyId: null, + dealId: null, + dueAt: { lt: cutoff.toISOString() }, + }); assert.deepEqual(current.OR[1], { status: 'open', dueAt: { gt: now.toISOString() } }); const archive = JSON.parse(JSON.stringify(activityPriorWhere('archive', now, cutoff))) as { diff --git a/docs/superpowers/specs/2026-10-14-prior-data-archive-design.md b/docs/superpowers/specs/2026-10-14-prior-data-archive-design.md index ae41a9d..5771bb6 100644 --- a/docs/superpowers/specs/2026-10-14-prior-data-archive-design.md +++ b/docs/superpowers/specs/2026-10-14-prior-data-archive-design.md @@ -26,7 +26,7 @@ رکورد قبلی یعنی: - شخص، شرکت یا معامله‌ای که منبع ورودش `didar` است. -- فعالیتی که منبع ورودش `didar` است. فعالیت امروز این فیلد را ندارد؛ در پیاده‌سازی همان فیلد با پیش‌فرض `manual` اضافه می‌شود. پر کردن اولیه: اگر معاملهٔ مرتبط `didar` باشد، یا تاریخ ساخت فعالیت قبل از لحظهٔ روشن شدن ماژول باشد و شخص (حتی با منبع قبلی `didar`)، شرکت یا معاملهٔ مرتبط `didar` باشد. وجود معاملهٔ غیرقبلی این را لغو نمی‌کند. فعالیتی که بعد از آن لحظه در منتکت ساخته شود جاری است، حتی اگر روی شخص قبلی باشد. +- فعالیتی که منبع ورودش `didar` است. فعالیت امروز این فیلد را ندارد؛ در پیاده‌سازی همان فیلد با پیش‌فرض `manual` اضافه می‌شود. پر کردن اولیه: اگر معاملهٔ مرتبط `didar` باشد، یا تاریخ ساخت فعالیت قبل از لحظهٔ روشن شدن ماژول باشد و شخص (حتی با منبع قبلی `didar`)، شرکت یا معاملهٔ مرتبط `didar` باشد. وجود معاملهٔ غیرقبلی این را لغو نمی‌کند. فعالیت بدون شخص، شرکت و معامله که موعدش هم قبل از همان لحظه است، قبلی است. فعالیتی که بعد از آن لحظه در منتکت ساخته شود جاری است، حتی اگر روی شخص قبلی باشد. استثنا فقط در حالت کار جاری: معامله یا فعالیت قبلی که هنوز باز است و موعدش در آینده است، در کار جاری می‌آید و در بایگانی نمی‌آید. معامله یا فعالیت باز بدون موعد، یا با موعد گذشته، بایگانی می‌ماند. با بسته شدن یا گذشتن موعد، از کار جاری خارج و فقط در بایگانی دیده می‌شود.