Filtering tasks and assigning a person in charge during Excel import

This commit is contained in:
2026-10-03 12:00:46 +03:30
parent 5784b09232
commit 989c03b381
7 changed files with 315 additions and 18 deletions
@@ -63,6 +63,11 @@ export class ActivitiesController {
to: query.to,
},
query.desk,
{
type: query.type,
status: query.status,
assigneeId: query.assigneeId,
},
);
}
+25 -4
View File
@@ -129,6 +129,11 @@ export class ActivitiesService {
to?: string;
},
desk?: 'mine' | 'team',
facets?: {
type?: ActivityDto['type'];
status?: ActivityDto['status'];
assigneeId?: string;
},
): Promise<PaginatedResponse<ActivityDto>> {
const where = this.buildWhere(
organizationId,
@@ -138,6 +143,7 @@ export class ActivitiesService {
entity,
range,
desk,
facets,
);
const take = Math.min(Math.max(limit, 1), 200);
const [rows, total] = await this.prisma.$transaction([
@@ -327,13 +333,24 @@ export class ActivitiesService {
to?: string;
},
desk?: 'mine' | 'team',
facets?: {
type?: ActivityDto['type'];
status?: ActivityDto['status'];
assigneeId?: string;
},
): Prisma.ActivityWhereInput {
const { start, end } = dayBounds();
const scope =
desk === 'mine' ? { assigneeId: actor.userId } : assigneeWhere(actor);
const facetWhere: Prisma.ActivityWhereInput = {
...(facets?.type ? { type: facets.type } : {}),
...(facets?.status ? { status: facets.status } : {}),
...(facets?.assigneeId?.trim() ? { assigneeId: facets.assigneeId.trim() } : {}),
};
const base: Prisma.ActivityWhereInput = {
organizationId,
...scope,
...facetWhere,
...(entity?.personId ? { personId: entity.personId } : {}),
...(entity?.companyId ? { companyId: entity.companyId } : {}),
...(entity?.dealId ? { dealId: entity.dealId } : {}),
@@ -370,19 +387,23 @@ export class ActivitiesService {
};
}
// Explicit status facet overrides the status implied by time tabs.
const impliedOpen = facets?.status ? { status: facets.status } : { status: 'open' as const };
const impliedDone = facets?.status ? { status: facets.status } : { status: 'done' as const };
switch (filter) {
case 'today':
return { ...base, status: 'open', dueAt: { gte: start, lt: end } };
return { ...base, ...impliedOpen, dueAt: { gte: start, lt: end } };
case 'overdue':
return { ...base, status: 'open', dueAt: { lt: start } };
return { ...base, ...impliedOpen, dueAt: { lt: start } };
case 'upcoming':
return {
...base,
status: 'open',
...impliedOpen,
OR: [{ dueAt: { gte: end } }, { dueAt: null }],
};
case 'done':
return { ...base, status: 'done' };
return { ...base, ...impliedDone };
case 'all':
default:
return base;
+12
View File
@@ -32,6 +32,18 @@ export class ListActivitiesQueryDto {
@IsIn(['mine', 'team'])
desk?: 'mine' | 'team';
@IsOptional()
@IsIn(ACTIVITY_TYPES)
type?: (typeof ACTIVITY_TYPES)[number];
@IsOptional()
@IsIn(ACTIVITY_STATUSES)
status?: (typeof ACTIVITY_STATUSES)[number];
@IsOptional()
@IsString()
assigneeId?: string;
@IsOptional()
@IsString()
personId?: string;