"use client"; import { useState } from "react"; import { formatCurrency, precioDisplay, IVA_RATE } from "@/lib/calculators"; interface ServicioItem { id: string; nombre: string; precio: number; modeloCobro?: string | null; tarifaHora?: number | null; } interface PreciosEditablesProps { cotizacionId: string; serviciosUnicos: ServicioItem[]; serviciosMensuales: ServicioItem[]; } const INPUT_CLS = "w-28 px-2 py-1 border border-border rounded text-sm text-right focus:outline-none focus:ring-1 focus:ring-primary"; export function PreciosEditables({ cotizacionId, serviciosUnicos, serviciosMensuales, }: PreciosEditablesProps) { const [unicos, setUnicos] = useState(serviciosUnicos); const [mensuales, setMensuales] = useState(serviciosMensuales); const [saving, setSaving] = useState(null); const totalUnico = unicos.reduce((s, x) => s + x.precio, 0); const totalMensual = mensuales.reduce((s, x) => s + x.precio, 0); const handlePrecioChange = async ( servicioId: string, nuevoPrecio: number, tipo: "unico" | "mensual" ) => { const lista = tipo === "unico" ? unicos : mensuales; const setter = tipo === "unico" ? setUnicos : setMensuales; const prev = lista; setter(lista.map((s) => (s.id === servicioId ? { ...s, precio: nuevoPrecio } : s))); setSaving(servicioId); try { const res = await fetch(`/api/cotizaciones/${cotizacionId}/precio`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ servicioId, precio: nuevoPrecio }), }); if (!res.ok) setter(prev); } catch { setter(prev); } finally { setSaving(null); } }; // Las partidas "bajo demanda" no tienen un precio fijo (se facturan por consumo): // su monto guardado es 0 y lo relevante es la tarifa por hora cotizada, que se // muestra como texto en vez de un input editable de precio. const renderFila = (s: ServicioItem, tipo: "unico" | "mensual") => (
{s.nombre}
{s.modeloCobro === "demanda" ? ( {precioDisplay(s)} ) : ( <> $ handlePrecioChange(s.id, parseFloat(e.target.value) || 0, tipo) } className={INPUT_CLS} /> {saving === s.id && ...} )}
); return (

Pago Unico

{unicos.length === 0 ? (

Sin servicios

) : (
{unicos.map((s) => renderFila(s, "unico"))}
)}
Subtotal {formatCurrency(totalUnico)}
IVA (16%) {formatCurrency(totalUnico * IVA_RATE)}
Total {formatCurrency(totalUnico * (1 + IVA_RATE))}

Pago Mensual

{mensuales.length === 0 ? (

Sin servicios

) : (
{mensuales.map((s) => renderFila(s, "mensual"))}
)}
Subtotal {formatCurrency(totalMensual)}
IVA (16%) {formatCurrency(totalMensual * IVA_RATE)}
Total {formatCurrency(totalMensual * (1 + IVA_RATE))}
); }