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 <cursoragent@cursor.com>
This commit is contained in:
2026-10-15 13:02:01 +03:30
co-authored by Cursor
parent 6bff9d2888
commit 582733e2ea
4 changed files with 21 additions and 1 deletions
+7
View File
@@ -305,6 +305,13 @@ export class BillingService {
SELECT 1 FROM "Deal" AS d2 SELECT 1 FROM "Deal" AS d2
WHERE d2."id" = a."dealId" AND d2."importSource" = 'didar' 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}
)
) )
) )
) )
+7
View File
@@ -34,6 +34,7 @@ function stillOpenAhead(now: Date): Prisma.ActivityWhereInput {
* فعالیت قبلی است اگر منبعش didar باشد، * فعالیت قبلی است اگر منبعش didar باشد،
* یا قبل از روشن شدن ماژول ساخته شده و به شخص/شرکت/معاملهٔ قبلی وصل باشد. * یا قبل از روشن شدن ماژول ساخته شده و به شخص/شرکت/معاملهٔ قبلی وصل باشد.
* معاملهٔ غیرقبلی مانع نمی‌شود؛ شخص قبلی (حتی اگر بعداً منبعش عوض شده) کافی است. * معاملهٔ غیرقبلی مانع نمی‌شود؛ شخص قبلی (حتی اگر بعداً منبعش عوض شده) کافی است.
* فعالیت بدون شخص و شرکت و معامله هم اگر موعدش قبل از همان لحظه باشد قبلی است.
*/ */
function historicalActivity(cutoff: Date): Prisma.ActivityWhereInput { function historicalActivity(cutoff: Date): Prisma.ActivityWhereInput {
return { return {
@@ -52,6 +53,12 @@ function historicalActivity(cutoff: Date): Prisma.ActivityWhereInput {
}, },
{ company: { importSource: PRIOR_IMPORT_SOURCE } }, { company: { importSource: PRIOR_IMPORT_SOURCE } },
{ deal: { importSource: PRIOR_IMPORT_SOURCE } }, { deal: { importSource: PRIOR_IMPORT_SOURCE } },
{
personId: null,
companyId: null,
dealId: null,
dueAt: { lt: cutoff },
},
], ],
}, },
], ],
+6
View File
@@ -61,6 +61,12 @@ describe('بایگانی اطلاعات قبل', () => {
OR: [{ importSource: 'didar' }, { previousImportSource: 'didar' }], 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() } }); assert.deepEqual(current.OR[1], { status: 'open', dueAt: { gt: now.toISOString() } });
const archive = JSON.parse(JSON.stringify(activityPriorWhere('archive', now, cutoff))) as { const archive = JSON.parse(JSON.stringify(activityPriorWhere('archive', now, cutoff))) as {
@@ -26,7 +26,7 @@
رکورد قبلی یعنی: رکورد قبلی یعنی:
- شخص، شرکت یا معامله‌ای که منبع ورودش `didar` است. - شخص، شرکت یا معامله‌ای که منبع ورودش `didar` است.
- فعالیتی که منبع ورودش `didar` است. فعالیت امروز این فیلد را ندارد؛ در پیاده‌سازی همان فیلد با پیش‌فرض `manual` اضافه می‌شود. پر کردن اولیه: اگر معاملهٔ مرتبط `didar` باشد، یا تاریخ ساخت فعالیت قبل از لحظهٔ روشن شدن ماژول باشد و شخص (حتی با منبع قبلی `didar`)، شرکت یا معاملهٔ مرتبط `didar` باشد. وجود معاملهٔ غیرقبلی این را لغو نمی‌کند. فعالیتی که بعد از آن لحظه در منتکت ساخته شود جاری است، حتی اگر روی شخص قبلی باشد. - فعالیتی که منبع ورودش `didar` است. فعالیت امروز این فیلد را ندارد؛ در پیاده‌سازی همان فیلد با پیش‌فرض `manual` اضافه می‌شود. پر کردن اولیه: اگر معاملهٔ مرتبط `didar` باشد، یا تاریخ ساخت فعالیت قبل از لحظهٔ روشن شدن ماژول باشد و شخص (حتی با منبع قبلی `didar`)، شرکت یا معاملهٔ مرتبط `didar` باشد. وجود معاملهٔ غیرقبلی این را لغو نمی‌کند. فعالیت بدون شخص، شرکت و معامله که موعدش هم قبل از همان لحظه است، قبلی است. فعالیتی که بعد از آن لحظه در منتکت ساخته شود جاری است، حتی اگر روی شخص قبلی باشد.
استثنا فقط در حالت کار جاری: معامله یا فعالیت قبلی که هنوز باز است و موعدش در آینده است، در کار جاری می‌آید و در بایگانی نمی‌آید. معامله یا فعالیت باز بدون موعد، یا با موعد گذشته، بایگانی می‌ماند. با بسته شدن یا گذشتن موعد، از کار جاری خارج و فقط در بایگانی دیده می‌شود. استثنا فقط در حالت کار جاری: معامله یا فعالیت قبلی که هنوز باز است و موعدش در آینده است، در کار جاری می‌آید و در بایگانی نمی‌آید. معامله یا فعالیت باز بدون موعد، یا با موعد گذشته، بایگانی می‌ماند. با بسته شدن یا گذشتن موعد، از کار جاری خارج و فقط در بایگانی دیده می‌شود.