Feature: Fällige Lead-Wiedervorlagen auf der Leads-Seite
naechsterSchrittDatum wurde erfasst, aber nie als faellige Liste geb√ºndelt — warme Leads gingen unter. Neue Query lead.dueFollowUps (aktive Leads mit faelligem/ueberfaelligem naechsten Schritt) + "Faellige Wiedervorlagen"-Block oben auf /leads. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
3d9b739d25
commit
23e850287c
2 files changed
+64
-1
No files matched your search
@@ -1,10 +1,11 @@
|
||||
import { TRPCError } from '@trpc/server';
|
||||
import { asc, desc, eq, sql } from 'drizzle-orm';
|
||||
import { and, asc, desc, eq, inArray, isNotNull, lte, sql } from 'drizzle-orm';
|
||||
import { lead, leadContact, leadTouchpoint, deal, area, user, project } from '@cockpit/db';
|
||||
import type { Db } from '@cockpit/db';
|
||||
import { LeadSchemas } from '@cockpit/shared';
|
||||
import { router, protectedProcedure } from '../trpc.js';
|
||||
import { parseCsv, normalizeHeader } from '../lib/csv.js';
|
||||
import { todayIso } from '../lib/werktag.js';
|
||||
|
||||
const SALES_AREA_SLUG = 'vertrieb';
|
||||
|
||||
@@ -30,6 +31,35 @@ export const leadRouter = router({
|
||||
return rows.map((r) => ({ ...r.lead, ownerName: r.ownerName, projectName: r.projectName }));
|
||||
}),
|
||||
|
||||
/**
|
||||
* Fällige Wiedervorlagen: aktive Leads (cold/warm/hot), deren geplanter nächster
|
||||
* Schritt heute oder überfällig ist. naechsterSchrittDatum wurde erfasst, aber
|
||||
* nie als Liste gebündelt — so geht keine warme Spur mehr unter.
|
||||
*/
|
||||
dueFollowUps: protectedProcedure.query(async ({ ctx }) => {
|
||||
const today = todayIso();
|
||||
const rows = await ctx.db
|
||||
.select({
|
||||
id: lead.id,
|
||||
firma: lead.firma,
|
||||
status: lead.status,
|
||||
ownerName: user.name,
|
||||
naechsterSchritt: lead.naechsterSchritt,
|
||||
faelligAm: lead.naechsterSchrittDatum,
|
||||
})
|
||||
.from(lead)
|
||||
.leftJoin(user, eq(user.id, lead.ownerUserId))
|
||||
.where(
|
||||
and(
|
||||
inArray(lead.status, ['cold', 'warm', 'hot']),
|
||||
isNotNull(lead.naechsterSchrittDatum),
|
||||
lte(lead.naechsterSchrittDatum, today),
|
||||
),
|
||||
)
|
||||
.orderBy(asc(lead.naechsterSchrittDatum));
|
||||
return rows;
|
||||
}),
|
||||
|
||||
// Leads, die einem Projekt zugeordnet sind (Vertriebs-Sicht im Projekt).
|
||||
forProject: protectedProcedure
|
||||
.input(LeadSchemas.leadsForProjectInput)
|
||||
|
||||
Reference in new issue
Block a user