"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { CustomerPicker } from "@/components/CustomerPicker"; import { createPolicy, getLookups, updatePolicy } from "@/lib/api"; import type { Currency, LookupsResponse, PolicyDetail, PolicyInput, } from "@/lib/types"; function toDateInput(v: string | null | undefined): string { if (!v) return ""; const d = new Date(v); return isNaN(d.getTime()) ? "" : d.toISOString().slice(0, 10); } function numOrUndef(v: string): number | undefined { const t = v.trim(); if (t === "") return undefined; const n = Number(t); return isNaN(n) ? undefined : n; } function s(v: string): string | undefined { const t = v.trim(); return t === "" ? undefined : t; } type V = { policyNumber: string; policyTypeId: string; insuranceProviderId: string; agentName: string; policyDate: string; policyFrom: string; policyTo: string; netPremium: string; policyFee: string; brokerFee: string; commission: string; currency: Currency; liquidated: boolean; liquidationNumber: string; liquidationDate: string; endorsement: boolean; observations: string; notes: string; }; function initial(p?: PolicyDetail): V { return { policyNumber: p?.policyNumber ?? "", policyTypeId: p?.policyType?.id ?? "", insuranceProviderId: p?.insuranceProvider?.id ?? "", agentName: p?.agentName ?? "", policyDate: toDateInput(p?.policyDate), policyFrom: toDateInput(p?.policyFrom), policyTo: toDateInput(p?.policyTo), netPremium: p?.netPremium != null ? String(p.netPremium) : "", policyFee: p?.policyFee != null ? String(p.policyFee) : "", brokerFee: p?.brokerFee != null ? String(p.brokerFee) : "", commission: p?.commission != null ? String(p.commission) : "", currency: (p?.currency as Currency) ?? "MXN", liquidated: p?.liquidated ?? false, liquidationNumber: p?.liquidationNumber ?? "", liquidationDate: toDateInput(p?.liquidationDate), endorsement: p?.endorsement ?? false, observations: p?.observations ?? "", notes: p?.notes ?? "", }; } export function PolicyForm({ policy, fixedCustomerId, fixedCustomerName, }: { policy?: PolicyDetail; fixedCustomerId?: string; fixedCustomerName?: string; }) { const router = useRouter(); const editing = !!policy; const [v, setV] = useState(() => initial(policy)); const [lookups, setLookups] = useState(null); const [customerId, setCustomerId] = useState( policy?.customer.id ?? fixedCustomerId ?? "", ); const [customerName, setCustomerName] = useState( policy?.customer.name ?? fixedCustomerName ?? "", ); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { getLookups().then(setLookups).catch(() => setLookups(null)); }, []); function set(k: K, val: V[K]) { setV((p) => ({ ...p, [k]: val })); } async function submit(e: React.FormEvent) { e.preventDefault(); if (!customerId) { setError("Seleccione un cliente."); return; } setSaving(true); setError(null); const base = { policyNumber: v.policyNumber.trim(), policyTypeId: s(v.policyTypeId), insuranceProviderId: s(v.insuranceProviderId), agentName: s(v.agentName), policyDate: s(v.policyDate), policyFrom: s(v.policyFrom), policyTo: s(v.policyTo), netPremium: numOrUndef(v.netPremium), policyFee: numOrUndef(v.policyFee), brokerFee: numOrUndef(v.brokerFee), commission: numOrUndef(v.commission), currency: v.currency, liquidated: v.liquidated, liquidationNumber: s(v.liquidationNumber), liquidationDate: s(v.liquidationDate), endorsement: v.endorsement, observations: s(v.observations), notes: s(v.notes), }; try { if (editing) { const saved = await updatePolicy(policy!.id, base); router.push(`/polizas/${saved.id}`); } else { const payload: PolicyInput = { ...base, customerId }; const saved = await createPolicy(payload); router.push(`/polizas/${saved.id}`); } } catch (e2) { setError((e2 as Error)?.message ?? "No se pudo guardar la póliza."); setSaving(false); } } return (
{error &&
{error}
}

Datos de la póliza

Vigencia y prima

Liquidación