feat: separate prior records behind an owner switch and count last-period questions

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-15 10:48:30 +03:30
co-authored by Cursor
parent 3a8a684aa4
commit 6bc5e1bec7
29 changed files with 775 additions and 77 deletions
@@ -12,6 +12,7 @@ import { Prisma } from '@prisma/client';
import { PrismaService } from '../prisma/prisma.service';
import type { Actor } from '../common/record-scope';
import { dealAccessWhere, resolveOwnerId } from '../common/record-scope';
import { dealPriorWhere } from '../common/prior-archive';
import { asCustomFields, toJsonCustomFields } from '../common/custom-fields';
import { normalizePhone } from '../contacts/normalize';
import {
@@ -110,7 +111,11 @@ export class DealsExcelService {
async export(actor: Actor): Promise<Buffer> {
const [rows, defs] = await Promise.all([
this.prisma.deal.findMany({
where: { organizationId: actor.organizationId, ...dealAccessWhere(actor) },
where: {
organizationId: actor.organizationId,
...dealAccessWhere(actor),
...dealPriorWhere(actor.priorLens),
},
include: {
person: {
select: {
@@ -37,8 +37,9 @@ export class PipelinesController {
board(
@CurrentUser() user: Actor,
@Query('pipelineId') pipelineId?: string,
@Query('prior') prior?: string,
) {
return this.pipelinesService.getBoard(user.organizationId, pipelineId, user);
return this.pipelinesService.getBoard(user.organizationId, pipelineId, user, prior === 'all');
}
@Post()
+5 -2
View File
@@ -15,6 +15,7 @@ import { Prisma } from '@prisma/client';
import { PrismaService } from '../prisma/prisma.service';
import { asCustomFields } from '../common/custom-fields';
import { type Actor, dealAccessWhere } from '../common/record-scope';
import { dealPriorWhere } from '../common/prior-archive';
import { decimalToBase, loadOrgRates } from '../common/currency';
import { assertStageMap, dealStatusForStage } from './pipeline-merge.util';
@@ -294,8 +295,9 @@ export class PipelinesService {
pipelineId?: string,
actor?: Pick<
Actor,
'userId' | 'role' | 'dataVisibility' | 'visibleUserIds'
'userId' | 'role' | 'dataVisibility' | 'visibleUserIds' | 'priorLens'
>,
includePrior = false,
): Promise<PipelineBoardDto> {
const pipeline = pipelineId
? await this.prisma.pipeline.findFirst({
@@ -313,7 +315,7 @@ export class PipelinesService {
if (!resolved) {
const created = await this.ensureDefaultPipeline(organizationId);
return this.getBoard(organizationId, created.id, actor);
return this.getBoard(organizationId, created.id, actor, includePrior);
}
const deals = await this.prisma.deal.findMany({
@@ -321,6 +323,7 @@ export class PipelinesService {
organizationId,
pipelineId: resolved.id,
...(actor ? dealAccessWhere(actor) : {}),
...(includePrior ? {} : dealPriorWhere(actor?.priorLens)),
},
include: {
person: { select: { id: true, firstName: true, lastName: true } },