import { z } from "zod";
import { defineContract } from "@withboundary/contract";
export const leadSchema = z.object({
tier: z.enum(["hot", "warm", "cold"]),
score: z.number().min(0).max(100),
reason: z.string(),
qualified: z.boolean(),
});
export const leadContract = defineContract({
name: "lead-scoring",
schema: leadSchema,
rules: [
{
name: "hot_requires_high_score",
description: "Hot leads must have a score of at least 70",
fields: ["tier", "score"],
check: (lead) =>
lead.tier !== "hot" || lead.score >= 70
|| `tier is "hot" but score is ${lead.score}; lower the tier or raise score to at least 70`,
},
{
name: "cold_requires_low_score",
description: "Cold leads must have a score below 30",
fields: ["tier", "score"],
check: (lead) =>
lead.tier !== "cold" || lead.score < 30
|| `tier is "cold" but score is ${lead.score}; raise the tier or lower score below 30`,
},
{
name: "reason_required",
description: "Every scoring decision needs a non-empty reason",
fields: ["reason"],
check: (lead) =>
lead.reason.trim().length > 0 || "reason must explain the scoring decision",
},
{
name: "qualified_requires_score",
description: "Qualified leads must have a score above 50",
fields: ["qualified", "score"],
check: (lead) =>
!lead.qualified || lead.score > 50
|| `qualified is true but score is ${lead.score}; qualified leads require score above 50`,
},
],
});