import { z } from "zod"; import { adjustReviewDevelopment, validateReviewDevelopmentAdjustmentRequest, type ReviewSettlementAdjustmentRequest, type ReviewSettlementAdjustment } from "@actuarial-ts/core"; import { assumptionSnapshotSchema, reviewCountDefinitionSchema } from "./reviewContracts.js"; import { reviewDevelopmentAdjustmentSchemaForInput } from "./reviewDevelopmentAdjustmentContracts.js"; import { parseReviewBoundary } from "./reviewBoundary.js"; /** Source bindings retain whole requests, so construction must stay lazy. */ export function reviewSettlementAdjustmentSchemaForInput() { const shared = reviewDevelopmentAdjustmentSchemaForInput(); return shared.omit({ severityTrend: true, relationships: true }).extend({ method: z.literal("berquistSettlement"), inputs: z.object({ paid: shared.shape.inputs.shape.paid, closedCounts: shared.shape.inputs.shape.paid.extend({ countDefinition: reviewCountDefinitionSchema }).strict() }).strict(), ultimateCounts: assumptionSnapshotSchema, interpolation: z.enum(["linear", "exponential"]), relationship: shared.shape.relationships.element.omit({ operand: true }).strict(), policies: z.object({ missingInputs: z.enum(["retain-unavailable", "reject-incomplete"]), unavailableAdjustment: z.enum(["reject", "retain-unadjusted-qualified"]), duplicateCounts: z.enum(["reject", "keep-native-last-paid-qualified"]), linearFallback: z.enum(["reject", "allow-qualified"]), extrapolation: z.enum(["reject", "allow-qualified"]), negativeAdjustedPaid: z.enum(["reject", "retain-native-zero-clamp-qualified"]), disposalAboveOne: z.enum(["reject", "allow-qualified"]), countScale: z.literal("canonical-unit-scale") }).strict(), }).strict(); } export const reviewSettlementAdjustmentRequestSchema: z.ZodType = z.lazy(reviewSettlementAdjustmentSchemaForInput); export function parseReviewSettlementAdjustmentRequest(input: unknown): ReviewSettlementAdjustmentRequest { return parseReviewBoundary(reviewSettlementAdjustmentRequestSchema, input); } export function validateReviewSettlementAdjustmentFromInput(input: unknown): { readonly request: ReviewSettlementAdjustmentRequest; readonly findings: ReviewSettlementAdjustment["findings"] } { return validateReviewDevelopmentAdjustmentRequest(parseReviewSettlementAdjustmentRequest(input)); } export function adjustReviewSettlementFromInput(input: unknown): ReviewSettlementAdjustment { return adjustReviewDevelopment(parseReviewSettlementAdjustmentRequest(input)); }