96 lines
2.6 KiB
TypeScript
96 lines
2.6 KiB
TypeScript
import { Lead } from "@/types"
|
|
|
|
export function getPeriodDateRange(period: string): { start: Date; end: Date } {
|
|
const end = new Date()
|
|
const start = new Date()
|
|
|
|
switch (period) {
|
|
case "7days":
|
|
start.setDate(start.getDate() - 7)
|
|
break
|
|
case "30days":
|
|
start.setDate(start.getDate() - 30)
|
|
break
|
|
case "6months":
|
|
start.setMonth(start.getMonth() - 6)
|
|
break
|
|
case "12months":
|
|
start.setMonth(start.getMonth() - 12)
|
|
break
|
|
default:
|
|
start.setMonth(start.getMonth() - 6)
|
|
}
|
|
|
|
return { start, end }
|
|
}
|
|
|
|
export function filterLeadsByPeriod(leads: Lead[], period: string): Lead[] {
|
|
const { start, end } = getPeriodDateRange(period)
|
|
return leads.filter((l) => {
|
|
const d = new Date(l.createdAt)
|
|
return d >= start && d <= end
|
|
})
|
|
}
|
|
|
|
export function groupLeadsByInterval(
|
|
leads: Lead[],
|
|
period: string
|
|
): { label: string; leads: number; closed: number }[] {
|
|
const { start, end } = getPeriodDateRange(period)
|
|
|
|
if (period === "7days" || period === "30days") {
|
|
return groupByDay(leads, start, end)
|
|
}
|
|
return groupByMonth(leads, start, end)
|
|
}
|
|
|
|
function groupByDay(
|
|
leads: Lead[],
|
|
start: Date,
|
|
end: Date
|
|
): { label: string; leads: number; closed: number }[] {
|
|
const result: { label: string; leads: number; closed: number }[] = []
|
|
const current = new Date(start)
|
|
|
|
while (current <= end) {
|
|
const dateStr = current.toISOString().slice(0, 10)
|
|
const dayLeads = leads.filter((l) => l.createdAt.startsWith(dateStr))
|
|
const closedCount = dayLeads.filter((l) => l.status === "closed").length
|
|
|
|
result.push({
|
|
label: current.toLocaleDateString("en-US", { month: "short", day: "numeric" }),
|
|
leads: dayLeads.length,
|
|
closed: closedCount,
|
|
})
|
|
|
|
current.setDate(current.getDate() + 1)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
function groupByMonth(
|
|
leads: Lead[],
|
|
start: Date,
|
|
end: Date
|
|
): { label: string; leads: number; closed: number }[] {
|
|
const result: { label: string; leads: number; closed: number }[] = []
|
|
const current = new Date(start.getFullYear(), start.getMonth(), 1)
|
|
|
|
while (current <= end) {
|
|
const yearMonth = `${current.getFullYear()}-${String(current.getMonth() + 1).padStart(2, "0")}`
|
|
const monthLeads = leads.filter((l) => l.createdAt.startsWith(yearMonth))
|
|
const closedCount = monthLeads.filter((l) => l.status === "closed").length
|
|
|
|
result.push({
|
|
label: current.toLocaleDateString("en-US", { month: "short", year: "2-digit" }),
|
|
leads: monthLeads.length,
|
|
closed: closedCount,
|
|
})
|
|
|
|
current.setMonth(current.getMonth() + 1)
|
|
}
|
|
|
|
return result
|
|
}
|