Block preliminary property assessor PDFs

This commit is contained in:
2026-03-28 00:34:28 -05:00
parent c68523386d
commit 761bd2f083
6 changed files with 66 additions and 7 deletions

View File

@@ -4,7 +4,11 @@ import path from "node:path";
import { discoverListingSources, type ListingDiscoveryResult } from "./listing-discovery.js";
import { extractPhotoData, type PhotoExtractionResult, type PhotoSource } from "./photo-review.js";
import { resolvePublicRecords, type PublicRecordsResolution } from "./public-records.js";
import { renderReportPdf, type ReportPayload } from "./report-pdf.js";
import {
isDecisionGradeReportPayload,
renderReportPdf,
type ReportPayload
} from "./report-pdf.js";
export interface AssessPropertyOptions {
address: string;
@@ -442,6 +446,20 @@ export async function assessProperty(
};
}
if (!isDecisionGradeReportPayload(reportPayload)) {
return {
ok: true,
needsAssessmentPurpose: false,
needsRecipientEmails: false,
pdfReady: false,
message:
"The report payload is still preliminary. Do not render or send the PDF until comps, valuation, and a decision-grade verdict are completed.",
outputPath: null,
reportPayload,
publicRecords
};
}
const outputPath =
options.output ||
path.join(

View File

@@ -25,6 +25,14 @@ export interface ReportPayload {
sourceLinks?: unknown;
}
export function isDecisionGradeReportPayload(payload: ReportPayload): boolean {
const decision = String(payload.verdict?.decision || "").trim().toLowerCase();
const fairValueRange = String(payload.verdict?.fairValueRange || "").trim().toLowerCase();
if (!decision || decision === "pending") return false;
if (!fairValueRange || fairValueRange === "not established") return false;
return true;
}
function asStringArray(value: unknown): string[] {
if (value == null) return [];
if (typeof value === "string") {
@@ -69,6 +77,11 @@ export function validateReportPayload(payload: ReportPayload): string[] {
if (!address) {
throw new ReportValidationError("The report payload must include subjectProperty.address.");
}
if (!isDecisionGradeReportPayload(payload)) {
throw new ReportValidationError(
"The report payload is still preliminary. Stop and complete the decision-grade analysis before generating or sending the property assessment PDF."
);
}
return recipients;
}