feat(cotizador): multi-desarrollo — ATELIER, ESTANZA, SENDA, SOLANA + DIAGONAL

- Motor de cálculo parametrizado por desarrollo (enganches, descuentos, splits,
  fuente de N, quirk Infonavit-lista); DIAGONAL byte-idéntico
- 285 unidades (5 desarrollos) en seeds, API (?desarrollo=) y board Monday
- Selector de desarrollo en UI, propuestas por config, PDF multi-desarrollo
- Knowledge IA: catálogo por desarrollo + matriz de diferencias (10 docs)
- Tests: cotizador 53, api 99 — fixtures de los Excel validados al centavo
This commit is contained in:
2026-08-22 04:31:21 +00:00
parent 05c44478ec
commit afb454b54c
33 changed files with 2074 additions and 338 deletions

View File

@@ -21,7 +21,8 @@ export function ComparadorPropuestas({ precioLista, apartado, propuestas, titulo
const [abierto, setAbierto] = useState(false)
const totales = propuestas.map((p) => totalPagado(p, apartado))
const ganador = indiceMenorTotal(totales)
// null (plazo desconocido) nunca gana el menor total
const ganador = indiceMenorTotal(totales.map((t) => t ?? Number.POSITIVE_INFINITY))
const filas: Fila[] = [
{ etiqueta: 'Precio de lista', obtener: () => formatoMoneda(precioLista) },
@@ -34,19 +35,30 @@ export function ComparadorPropuestas({ precioLista, apartado, propuestas, titulo
{
etiqueta: 'Mensualidad',
obtener: (p) =>
p.mensualidad === null
? 'N/A'
: `${p.numMensualidades} × ${formatoMoneda(p.mensualidad)}`,
p.notaMensualidades
? `— (${p.notaMensualidades})`
: p.mensualidad === null
? 'N/A'
: `${p.numMensualidades} × ${formatoMoneda(p.mensualidad)}`,
},
{
etiqueta: 'Total mensualidades',
obtener: (p) => (p.mensualidadesTotal === null ? 'N/A' : formatoMoneda(p.mensualidadesTotal)),
obtener: (p) =>
p.notaMensualidades
? '—'
: p.mensualidadesTotal === null
? 'N/A'
: formatoMoneda(p.mensualidadesTotal),
},
{ etiqueta: 'Pago final', obtener: (p) => formatoMoneda(p.pagoFinal) },
{ etiqueta: 'Total pagado', obtener: (_p, i) => formatoMoneda(totales[i]), destacada: true },
{
etiqueta: 'Total pagado',
obtener: (_p, i) => (totales[i] === null ? '—' : formatoMoneda(totales[i])),
destacada: true,
},
{
etiqueta: 'Diferencia vs precio de lista',
obtener: (_p, i) => formatoMoneda(totales[i] - precioLista),
obtener: (_p, i) => (totales[i] === null ? '—' : formatoMoneda(totales[i] - precioLista)),
},
]

View File

@@ -67,7 +67,9 @@ export function ProposalCard({ numero, titulo, propuesta, onDescuentoChange }: P
nota="incluye deducción del apartado"
valor={formatoMoneda(propuesta.enganche)}
/>
{propuesta.mensualidad !== null && propuesta.mensualidadesTotal !== null ? (
{propuesta.notaMensualidades ? (
<Renglon etiqueta="Mensualidades" nota={propuesta.notaMensualidades} valor="—" />
) : propuesta.mensualidad !== null && propuesta.mensualidadesTotal !== null ? (
<Renglon
etiqueta="Mensualidades"
nota={`${propuesta.numMensualidades} × ${formatoMoneda(propuesta.mensualidad)}`}

View File

@@ -3,7 +3,7 @@ import { formatoFechaCorta } from '../lib/formatters'
interface Props {
unidad: Unidad
numMeses: number
numMeses: number | null
}
function Fila({ etiqueta, valor }: { etiqueta: string; valor: string }) {
@@ -15,8 +15,12 @@ function Fila({ etiqueta, valor }: { etiqueta: string; valor: string }) {
)
}
const formatoM2 = (v: number | null): string =>
v === null ? '—' : `${v.toLocaleString('es-MX')} m²`
/** Tarjeta con la ficha técnica de la unidad seleccionada */
export function UnitInfoCard({ unidad, numMeses }: Props) {
const extras = unidad.extras ?? {}
return (
<section className="border border-neutral-200 bg-white p-6">
<h2 className="mb-4 text-xs font-bold tracking-widest text-neutral-900 uppercase">
@@ -24,11 +28,19 @@ export function UnitInfoCard({ unidad, numMeses }: Props) {
</h2>
<dl className="divide-y divide-neutral-200">
<Fila etiqueta="Modelo" valor={unidad.modelo} />
<Fila etiqueta="Sup. construcción" valor={`${unidad.supConstruccion.toLocaleString('es-MX')} m²`} />
<Fila etiqueta="Sup. excedente" valor={`${unidad.supExcedente.toLocaleString('es-MX')} m²`} />
<Fila etiqueta="Sup. estacionamiento" valor={`${unidad.supEstacionamiento.toLocaleString('es-MX')} m²`} />
<Fila etiqueta="Fecha de entrega (obra)" valor={formatoFechaCorta(unidad.fechaEntrega)} />
<Fila etiqueta="Meses restantes" valor={String(numMeses)} />
{extras['prototipo'] != null && <Fila etiqueta="Prototipo" valor={String(extras['prototipo'])} />}
{extras['etapa'] != null && <Fila etiqueta="Etapa" valor={String(extras['etapa'])} />}
{extras['manzana'] != null && <Fila etiqueta="Manzana" valor={String(extras['manzana'])} />}
{extras['lote'] != null && <Fila etiqueta="Lote" valor={String(extras['lote'])} />}
{extras['cajones'] != null && <Fila etiqueta="Cajones" valor={String(extras['cajones'])} />}
<Fila etiqueta="Sup. construcción" valor={formatoM2(unidad.supConstruccion)} />
<Fila etiqueta="Sup. excedente" valor={formatoM2(unidad.supExcedente)} />
<Fila etiqueta="Sup. estacionamiento" valor={formatoM2(unidad.supEstacionamiento)} />
<Fila
etiqueta="Fecha de entrega (obra)"
valor={unidad.fechaEntrega ? formatoFechaCorta(unidad.fechaEntrega) : '—'}
/>
<Fila etiqueta="Meses restantes" valor={numMeses === null ? '—' : String(numMeses)} />
</dl>
</section>
)

View File

@@ -0,0 +1,319 @@
import type { DescuentosPropuestas, ParametrosDesarrollo } from '../types'
/**
* Parámetros comerciales por desarrollo, replicados de los cotizadores Excel
* de producción (ver reference/cotizadores/*.md). NO "corregir" fórmulas:
* algunas usan precio de lista donde intuitivamente iría precio final; así
* está en los Excel y así debe quedar.
*/
const DIAGONAL: ParametrosDesarrollo = {
id: 'DIAGONAL',
nombre: 'Diagonal',
precioUnico: false,
fuenteDeN: 'fechaEntrega',
cuotaMantenimiento: '1,500 Aprox.',
prefijoUnidadPdf: 'CASA',
propuestas: [
{
tipo: 'CREDITO_BANCARIO',
claveDescuento: 'creditoBancario',
titulo: 'Crédito Bancario',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'lista',
pctPagoFinal: 0.9,
pagoFinalBase: 'final',
modoMensualidades: 'remanente',
},
{
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
claveDescuento: 'creditoInfonavit',
titulo: 'Crédito Infonavit-Cofinavit',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'lista',
pctPagoFinal: 0.95,
pagoFinalBase: 'final',
modoMensualidades: 'remanenteLista',
},
{
tipo: 'CONTADO',
claveDescuento: 'contado',
titulo: 'Contado',
descuentoDefault: 0.02,
pctEnganche: 0.9,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'ninguna',
},
{
tipo: 'SEMI_CONTADO',
claveDescuento: 'semiContado',
titulo: 'Semi Contado',
descuentoDefault: 0.01,
pctEnganche: 0.5,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
],
}
const ATELIER: ParametrosDesarrollo = {
id: 'ATELIER',
nombre: 'Atelier',
precioUnico: true,
fuenteDeN: 'fijo', // inventario ya entregado: las mensualidades son 1 solo pago
nFijo: 1,
cuotaMantenimiento: 'PENDIENTE',
prefijoUnidadPdf: 'DEPTO',
propuestas: [
{
tipo: 'CREDITO_BANCARIO',
claveDescuento: 'creditoBancario',
titulo: 'Crédito Bancario',
descuentoDefault: 0,
pctEnganche: 0.05,
engancheBase: 'lista', // Excel M36: 5% sobre precio de LISTA
pctPagoFinal: 0.9,
pagoFinalBase: 'final',
modoMensualidades: 'remanente',
},
{
// ATELIER no tiene Infonavit: COFINAVIT con la estructura del Infonavit
// de DIAGONAL (2.5% / 95%) pero sin el quirk (todo sobre precio final)
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
claveDescuento: 'creditoInfonavit',
titulo: 'Crédito Cofinavit',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'final',
pctPagoFinal: 0.95,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
{
tipo: 'CONTADO',
claveDescuento: 'contado',
titulo: 'Contado',
descuentoDefault: 0,
pctEnganche: 0.9,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'ninguna',
},
{
tipo: 'SEMI_CONTADO',
claveDescuento: 'semiContado',
titulo: 'Semi Contado',
descuentoDefault: 0,
pctEnganche: 0.5,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
],
}
const ESTANZA: ParametrosDesarrollo = {
id: 'ESTANZA',
nombre: 'Estanza',
precioUnico: true,
fuenteDeN: 'fijo', // TERM. OBRA = 1 mes en todas las casas
nFijo: 1,
cuotaMantenimiento: 'PENDIENTE',
prefijoUnidadPdf: 'CASA',
propuestas: [
{
tipo: 'CREDITO_BANCARIO',
claveDescuento: 'creditoBancario',
titulo: 'Crédito Bancario',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'final',
pctPagoFinal: 0.9,
pagoFinalBase: 'lista', // Excel M20 = C12*H20: pago final sobre LISTA (quirk)
modoMensualidades: 'porcentaje',
},
{
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
claveDescuento: 'creditoInfonavit',
titulo: 'Crédito Infonavit-Cofinavit',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'final',
pctPagoFinal: 0.95,
pagoFinalBase: 'lista', // Excel M26 = H26*C12: pago final sobre LISTA (quirk)
modoMensualidades: 'porcentaje',
},
{
tipo: 'CONTADO',
claveDescuento: 'contado',
titulo: 'Contado',
descuentoDefault: 0,
pctEnganche: 0.9,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'ninguna',
},
{
tipo: 'SEMI_CONTADO',
claveDescuento: 'semiContado',
titulo: 'Semi Contado',
descuentoDefault: 0,
pctEnganche: 0.5,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
],
}
const SENDA: ParametrosDesarrollo = {
id: 'SENDA',
nombre: 'Senda',
precioUnico: true,
fuenteDeN: 'fechaEntrega', // unidades sin fecha en TERM => N null (mensualidades "—")
cuotaMantenimiento: 'PENDIENTE DE DEFINIR',
prefijoUnidadPdf: 'CASA',
propuestas: [
{
tipo: 'CREDITO_BANCARIO',
claveDescuento: 'creditoBancario',
titulo: 'Crédito Bancario',
descuentoDefault: 0,
pctEnganche: 0.05,
engancheBase: 'final',
pctPagoFinal: 0.9,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
{
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
claveDescuento: 'creditoInfonavit',
titulo: 'Crédito Infonavit-Cofinavit',
descuentoDefault: 0,
pctEnganche: 0.025,
engancheBase: 'final',
pctPagoFinal: 0.95,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
{
tipo: 'CONTADO',
claveDescuento: 'contado',
titulo: 'Contado',
descuentoDefault: 0.02,
pctEnganche: 0.9,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'ninguna',
},
{
tipo: 'SEMI_CONTADO',
claveDescuento: 'semiContado',
titulo: 'Semi Contado',
descuentoDefault: 0.01,
pctEnganche: 0.5,
engancheBase: 'final',
pctPagoFinal: 0.05, // pago final 5% (DIAGONAL: 10%)
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
],
}
const SOLANA: ParametrosDesarrollo = {
id: 'SOLANA',
nombre: 'Solana',
precioUnico: true,
fuenteDeN: 'porUnidad', // MESES PARA FIRMA APROX del inventario (1–4)
cuotaMantenimiento: 'PENDIENTE',
prefijoUnidadPdf: 'CASA',
propuestas: [
{
tipo: 'CREDITO_BANCARIO',
claveDescuento: 'creditoBancario',
titulo: 'Crédito Bancario',
descuentoDefault: 0,
pctEnganche: 0.05,
engancheBase: 'final',
pctPagoFinal: 0.9,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
{
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
claveDescuento: 'creditoInfonavit',
titulo: 'Crédito Infonavit-Cofinavit',
descuentoDefault: 0,
pctEnganche: 0,
engancheBase: 'final',
pctPagoFinal: 0.95,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
engancheCeroSinApartado: true, // Excel M27: IF(H27=0, 0, ...)
},
{
tipo: 'CONTADO',
claveDescuento: 'contado',
titulo: 'Contado',
descuentoDefault: 0,
pctEnganche: 0.9,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'ninguna',
},
{
tipo: 'SEMI_CONTADO',
claveDescuento: 'semiContado',
titulo: 'Semi Contado',
descuentoDefault: 0,
pctEnganche: 0.5,
engancheBase: 'final',
pctPagoFinal: 0.1,
pagoFinalBase: 'final',
modoMensualidades: 'porcentaje',
},
],
}
export const DESARROLLOS: Record<string, ParametrosDesarrollo> = {
DIAGONAL,
ATELIER,
ESTANZA,
SENDA,
SOLANA,
}
export const DESARROLLO_DEFAULT = 'DIAGONAL'
/** Ids en orden de presentación en el selector */
export const LISTA_DESARROLLOS: string[] = ['DIAGONAL', 'ATELIER', 'ESTANZA', 'SENDA', 'SOLANA']
/** Parámetros de un desarrollo; cae a DIAGONAL si el id es desconocido */
export function obtenerDesarrollo(id?: string | null): ParametrosDesarrollo {
return (id && DESARROLLOS[id]) || DESARROLLOS[DESARROLLO_DEFAULT]
}
/** Descuentos por defecto del desarrollo, indexados por clave de propuesta */
export function descuentosDefault(id?: string | null): DescuentosPropuestas {
const params = obtenerDesarrollo(id)
const out: DescuentosPropuestas = {
creditoBancario: 0,
creditoInfonavit: 0,
contado: 0,
semiContado: 0,
}
for (const p of params.propuestas) out[p.claveDescuento] = p.descuentoDefault
return out
}

View File

@@ -0,0 +1,41 @@
import type { Unidad } from '../types'
// Inventario ATELIER — 34 unidades. Departamentos, MZA 32 LOTE 1.
// Generado desde reference/cotizadores/ATELIER.json (NO editar a mano; regenerar con scripts/generar-seeds.py).
// Precio único por unidad: precioSinAcabados/precioConAcabados replican precioLista.
export const UNIDADES_ATELIER: Unidad[] = [
{ codigo: 'ATELIER-1', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-01-27', supEstacionamiento: null, supConstruccion: 75.005, supExcedente: 17.468, precioSinAcabados: 3554291, precioConAcabados: 3554291, precioLista: 3554291, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: '2R-A', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-2', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-15', supEstacionamiento: null, supConstruccion: 52.5359, supExcedente: 4.1864, precioSinAcabados: 2397434.52, precioConAcabados: 2397434.52, precioLista: 2397434.52, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-A', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-3', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.115, supExcedente: null, precioSinAcabados: 2666831, precioConAcabados: 2666831, precioLista: 2666831, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-4', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-28', supEstacionamiento: null, supConstruccion: 53.1241, supExcedente: 4.6853, precioSinAcabados: 2614540, precioConAcabados: 2614540, precioLista: 2614540, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-5', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.827, supExcedente: 4.5684, precioSinAcabados: 2614540, precioConAcabados: 2614540, precioLista: 2614540, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-6', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.309, supExcedente: 4.326, precioSinAcabados: 2666831, precioConAcabados: 2666831, precioLista: 2666831, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-7', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.309, supExcedente: 4.324, precioSinAcabados: 2373713, precioConAcabados: 2373713, precioLista: 2373713, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-8', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.059, supExcedente: 4.22, precioSinAcabados: 2327169, precioConAcabados: 2327169, precioLista: 2327169, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-9', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 82.828, supExcedente: 27.913, precioSinAcabados: 4451040, precioConAcabados: 4451040, precioLista: 4451040, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: '2R-B', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-10', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-01-21', supEstacionamiento: null, supConstruccion: 83.348, supExcedente: 16.065, precioSinAcabados: 3997500, precioConAcabados: 3997500, precioLista: 3997500, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: '2R-C', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-11', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-15', supEstacionamiento: null, supConstruccion: 52.194, supExcedente: 4.219, precioSinAcabados: 2304339, precioConAcabados: 2304339, precioLista: 2304339, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-A', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-12', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-27', supEstacionamiento: null, supConstruccion: 52.526, supExcedente: 4.461, precioSinAcabados: 2281538, precioConAcabados: 2281538, precioLista: 2281538, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-13', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-05', supEstacionamiento: null, supConstruccion: 52.856, supExcedente: 4.575, precioSinAcabados: 2327169, precioConAcabados: 2327169, precioLista: 2327169, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-14', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-30', supEstacionamiento: null, supConstruccion: 52.148, supExcedente: 4.252, precioSinAcabados: 2491122, precioConAcabados: 2491122, precioLista: 2491122, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-15', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-31', supEstacionamiento: null, supConstruccion: 51.772, supExcedente: 4.109, precioSinAcabados: 2261538, precioConAcabados: 2261538, precioLista: 2261538, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-16', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-01-27', supEstacionamiento: null, supConstruccion: 52.371, supExcedente: 4.249, precioSinAcabados: 2327169, precioConAcabados: 2327169, precioLista: 2327169, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-17', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 83.025, supExcedente: 27.495, precioSinAcabados: 4250600, precioConAcabados: 4250600, precioLista: 4250600, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: '2R-B', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-18', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-03-24', supEstacionamiento: null, supConstruccion: 75.115, supExcedente: null, precioSinAcabados: 2985326, precioConAcabados: 2985326, precioLista: 2985326, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: '2R-A', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-19', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-21', supEstacionamiento: null, supConstruccion: 52.536, supExcedente: null, precioSinAcabados: 2191183, precioConAcabados: 2191183, precioLista: 2191183, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-A', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-20', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-21', supEstacionamiento: null, supConstruccion: 52.11, supExcedente: 4.2481, precioSinAcabados: 2281538, precioConAcabados: 2281538, precioLista: 2281538, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-21', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-14', supEstacionamiento: null, supConstruccion: 53.056, supExcedente: null, precioSinAcabados: 2506220, precioConAcabados: 2506220, precioLista: 2506220, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-22', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-14', supEstacionamiento: null, supConstruccion: 52.827, supExcedente: null, precioSinAcabados: 2506220, precioConAcabados: 2506220, precioLista: 2506220, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-23', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-09', supEstacionamiento: null, supConstruccion: 52.503, supExcedente: null, precioSinAcabados: 2216961, precioConAcabados: 2216961, precioLista: 2216961, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-24', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-09', supEstacionamiento: null, supConstruccion: 52.501, supExcedente: null, precioSinAcabados: 2666831, precioConAcabados: 2666831, precioLista: 2666831, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-25', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-03-04', supEstacionamiento: null, supConstruccion: 52.085, supExcedente: null, precioSinAcabados: 2173491, precioConAcabados: 2173491, precioLista: 2173491, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-26', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-03-04', supEstacionamiento: null, supConstruccion: 82.805, supExcedente: null, precioSinAcabados: 3547406, precioConAcabados: 3547406, precioLista: 3547406, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: '2R-B', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-27', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-03-14', supEstacionamiento: null, supConstruccion: 82.633, supExcedente: null, precioSinAcabados: 3750500, precioConAcabados: 3750500, precioLista: 3750500, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: '2R-C', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
{ codigo: 'ATELIER-28', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-07', supEstacionamiento: null, supConstruccion: 52.242, supExcedente: null, precioSinAcabados: 2059713, precioConAcabados: 2059713, precioLista: 2059713, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-A', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-29', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-28', supEstacionamiento: null, supConstruccion: 52.518, supExcedente: null, precioSinAcabados: 2579442, precioConAcabados: 2579442, precioLista: 2579442, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-30', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-12', supEstacionamiento: null, supConstruccion: 52.958, supExcedente: null, precioSinAcabados: 2173491, precioConAcabados: 2173491, precioLista: 2173491, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-31', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-17', supEstacionamiento: null, supConstruccion: 52.101, supExcedente: null, precioSinAcabados: 2216961, precioConAcabados: 2216961, precioLista: 2216961, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-32', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-25', supEstacionamiento: null, supConstruccion: 51.83, supExcedente: null, precioSinAcabados: 2173491, precioConAcabados: 2173491, precioLista: 2173491, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-33', modelo: 'SOHO', desarrollo: 'ATELIER', fechaEntrega: '2026-02-25', supEstacionamiento: null, supConstruccion: 52.25, supExcedente: null, precioSinAcabados: 2151756.09, precioConAcabados: 2151756.09, precioLista: 2151756.09, status: 'ESCRITURADO', mesesParaFirma: null, extras: { prototipo: 'E-B', manzana: 32, lote: 1, cajones: '1 C-INT' } },
{ codigo: 'ATELIER-34', modelo: 'TRIBECA', desarrollo: 'ATELIER', fechaEntrega: '2026-02-28', supEstacionamiento: null, supConstruccion: 83.154, supExcedente: null, precioSinAcabados: 3750500, precioConAcabados: 3750500, precioLista: 3750500, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: '2R-B', manzana: 32, lote: 1, cajones: '1 C-EXT' } },
]

View File

@@ -0,0 +1,71 @@
import type { Unidad } from '../types'
// Inventario ESTANZA — 64 unidades. Casas DUPLO A/B, MZA 92 LOTE 32.
// Generado desde reference/cotizadores/ESTANZA.json (NO editar a mano; regenerar con scripts/generar-seeds.py).
// Precio único por unidad: precioSinAcabados/precioConAcabados replican precioLista.
export const UNIDADES_ESTANZA: Unidad[] = [
{ codigo: 'ESTANZA-1', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 27.061, precioSinAcabados: 2617632, precioConAcabados: 2617632, precioLista: 2617632, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-2', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 14.6227, precioSinAcabados: 2653052, precioConAcabados: 2653052, precioLista: 2653052, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-3', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 10.3277, precioSinAcabados: 2273327, precioConAcabados: 2273327, precioLista: 2273327, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-4', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 8.1628, precioSinAcabados: 2558590, precioConAcabados: 2558590, precioLista: 2558590, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-5', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 4.4683, precioSinAcabados: 2292631, precioConAcabados: 2292631, precioLista: 2292631, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-6', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 2.394, precioSinAcabados: 2536885, precioConAcabados: 2536885, precioLista: 2536885, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-7', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 1.0732, precioSinAcabados: 2486023, precioConAcabados: 2486023, precioLista: 2486023, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-8', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 1.4823, precioSinAcabados: 2485590, precioConAcabados: 2485590, precioLista: 2485590, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-9', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 1.5349, precioSinAcabados: 2489942, precioConAcabados: 2489942, precioLista: 2489942, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-10', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 1.1014, precioSinAcabados: 2340562, precioConAcabados: 2340562, precioLista: 2340562, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-11', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2501683, precioConAcabados: 2501683, precioLista: 2501683, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-12', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2512571, precioConAcabados: 2512571, precioLista: 2512571, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-13', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2472677, precioConAcabados: 2472677, precioLista: 2472677, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-14', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2508175, precioConAcabados: 2508175, precioLista: 2508175, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-15', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2361751, precioConAcabados: 2361751, precioLista: 2361751, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-16', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2589780, precioConAcabados: 2589780, precioLista: 2589780, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-17', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-18', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2407848, precioConAcabados: 2407848, precioLista: 2407848, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-19', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-20', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2563074, precioConAcabados: 2563074, precioLista: 2563074, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-21', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2528824, precioConAcabados: 2528824, precioLista: 2528824, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-22', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2241564, precioConAcabados: 2241564, precioLista: 2241564, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-23', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2410854, precioConAcabados: 2410854, precioLista: 2410854, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-24', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2345652, precioConAcabados: 2345652, precioLista: 2345652, status: 'VENDIDO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-25', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-26', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2563074, precioConAcabados: 2563074, precioLista: 2563074, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-27', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2497404, precioConAcabados: 2497404, precioLista: 2497404, status: 'VENDIDO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-28', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2512571, precioConAcabados: 2512571, precioLista: 2512571, status: 'VENDIDO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-29', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2492611, precioConAcabados: 2492611, precioLista: 2492611, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-30', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2516765, precioConAcabados: 2516765, precioLista: 2516765, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-31', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 18.296, precioSinAcabados: 2521121, precioConAcabados: 2521121, precioLista: 2521121, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-32', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2412850, precioConAcabados: 2412850, precioLista: 2412850, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-33', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-34', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2537697, precioConAcabados: 2537697, precioLista: 2537697, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-35', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2380999, precioConAcabados: 2380999, precioLista: 2380999, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-36', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2380999, precioConAcabados: 2380999, precioLista: 2380999, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-37', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-38', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2427873, precioConAcabados: 2427873, precioLista: 2427873, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-39', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2485590, precioConAcabados: 2485590, precioLista: 2485590, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-40', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2506594, precioConAcabados: 2506594, precioLista: 2506594, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-41', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-42', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2515999, precioConAcabados: 2515999, precioLista: 2515999, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-43', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2443465, precioConAcabados: 2443465, precioLista: 2443465, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-44', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2287855, precioConAcabados: 2287855, precioLista: 2287855, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-45', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2269258, precioConAcabados: 2269258, precioLista: 2269258, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-46', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: 6.3751, precioSinAcabados: 2581017, precioConAcabados: 2581017, precioLista: 2581017, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-47', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: 27.7262, precioSinAcabados: 2752486, precioConAcabados: 2752486, precioLista: 2752486, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-48', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2581017, precioConAcabados: 2581017, precioLista: 2581017, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-49', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2516765, precioConAcabados: 2516765, precioLista: 2516765, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-50', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2529223, precioConAcabados: 2529223, precioLista: 2529223, status: 'VENDIDO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-51', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2490390, precioConAcabados: 2490390, precioLista: 2490390, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-52', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2437250, precioConAcabados: 2437250, precioLista: 2437250, status: 'APARTADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-53', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2345652, precioConAcabados: 2345652, precioLista: 2345652, status: 'APARTADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-54', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2556059, precioConAcabados: 2556059, precioLista: 2556059, status: 'VENDIDO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-55', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2492920, precioConAcabados: 2492920, precioLista: 2492920, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-56', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2533257, precioConAcabados: 2533257, precioLista: 2533257, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-57', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2492920, precioConAcabados: 2492920, precioLista: 2492920, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-58', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2529223, precioConAcabados: 2529223, precioLista: 2529223, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-59', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2388920, precioConAcabados: 2388920, precioLista: 2388920, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-60', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2558590, precioConAcabados: 2558590, precioLista: 2558590, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-61', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2345652, precioConAcabados: 2345652, precioLista: 2345652, status: 'DISPONIBLE', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-62', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2537697, precioConAcabados: 2537697, precioLista: 2537697, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-63', modelo: 'DUPLO A', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.06, supExcedente: null, precioSinAcabados: 2248242, precioConAcabados: 2248242, precioLista: 2248242, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
{ codigo: 'ESTANZA-64', modelo: 'DUPLO B', desarrollo: 'ESTANZA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.18, supExcedente: null, precioSinAcabados: 2457269, precioConAcabados: 2457269, precioLista: 2457269, status: 'ESCRITURADO', mesesParaFirma: null, extras: { manzana: 92, lote: 32, cajones: 1 } },
]

View File

@@ -0,0 +1,146 @@
import type { Unidad } from '../types'
// Inventario SENDA — 139 unidades. Casas; fechaEntrega null cuando la unidad no está en la tabla TERM (mensualidades no calculables).
// Generado desde reference/cotizadores/SENDA.json (NO editar a mano; regenerar con scripts/generar-seeds.py).
// Precio único por unidad: precioSinAcabados/precioConAcabados replican precioLista.
export const UNIDADES_SENDA: Unidad[] = [
{ codigo: 'SENDA-411-1-2', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-07', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2287000, precioConAcabados: 2287000, precioLista: 2287000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-401-26-10', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-02', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-11', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-09', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-12', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-16', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2468483, precioConAcabados: 2468483, precioLista: 2468483, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-13', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-23', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-14', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-01-30', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-2', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-07', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-3', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-14', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2468483, precioConAcabados: 2468483, precioLista: 2468483, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-4', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-21', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-5', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-28', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-6', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-05', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2468483, precioConAcabados: 2468483, precioLista: 2468483, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-26-7', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-12', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2450000, precioConAcabados: 2450000, precioLista: 2450000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-3-5', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-401-3-6', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-401-3-2', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-411-2-2', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 411, lote: 2, cajones: 2 } },
{ codigo: 'SENDA-401-26-1', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-10-24', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-3-7', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-401-26-9', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-26', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2450000, precioConAcabados: 2450000, precioLista: 2450000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-401-3-3', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-401-3-8', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-401-26-8', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-19', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 401, lote: 26, cajones: 1 } },
{ codigo: 'SENDA-411-1-4', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-21', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2287000, precioConAcabados: 2287000, precioLista: 2287000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-2', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-09-04', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-3', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-09-11', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-4', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-09-18', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-5', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-09-25', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-6', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-10-02', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-7', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-10-09', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-8', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-10-16', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-411-1-13', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-23', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-10', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-10-30', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-1-11', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-11-06', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-409-2-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-12-04', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 2, cajones: 2 } },
{ codigo: 'SENDA-409-1-13', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-04-09', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-14', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-04-02', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-15', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-03-26', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-16', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-03-19', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-17', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-03-12', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-18', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-03-05', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-19', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-02-26', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-20', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-02-19', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-21', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-02-12', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-22', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-02-05', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-23', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-01-29', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-24', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-01-22', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-25', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-01-15', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-26', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-01-08', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-27', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2029-01-01', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-28', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-12-25', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-29', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-12-18', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-30', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-12-04', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 409, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-3-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-12-11', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-410-2-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-07-17', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 410, lote: 2, cajones: 2 } },
{ codigo: 'SENDA-410-3-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-07-24', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 410, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-410-1-11', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2450000, precioConAcabados: 2450000, precioLista: 2450000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-410-1-8', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-9', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-10', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-12', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-16', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2318246, precioConAcabados: 2318246, precioLista: 2318246, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-12', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-13', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-14', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-15', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-16', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-17', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-13', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-18', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-20', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-19', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-10-09', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-20', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-10-02', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-21', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-09-25', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-22', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-09-18', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-23', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-09-11', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-24', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-09-04', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-25', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-08-28', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-26', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-08-21', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-27', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-08-14', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-28', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-08-07', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-29', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-07-31', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-30', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-07-24', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-31', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2028-07-17', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'BLOQUEADO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-7A', modelo: 'SANTA CRUZ', desarrollo: 'SENDA', fechaEntrega: '2027-03-20', supEstacionamiento: null, supConstruccion: null, supExcedente: null, precioSinAcabados: 2063666.75, precioConAcabados: 2063666.75, precioLista: 2063666.75, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'DUPLO', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-A102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-A101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-A201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-B101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-B102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-5', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-28', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-B202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-C101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-C102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-C201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-C202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-D101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-D102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-D201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-D202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-E101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-E102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-E201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-E202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-F101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-F102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-F201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-F202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-G101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-G202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-5-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-11-20', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 5, cajones: 2 } },
{ codigo: 'SENDA-409-4-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-11-27', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 4, cajones: 2 } },
{ codigo: 'SENDA-409-1-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-08-28', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-411-1-1', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-10-24', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2326593, precioConAcabados: 2326593, precioLista: 2326593, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-409-1-12', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-11-13', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-410-1-15A', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: '2027-05-15', supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 0, precioConAcabados: 0, precioLista: null, status: 'APARTADO', mesesParaFirma: null, extras: { prototipo: 'DUPLO', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-3', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-11-14', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-11', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-09', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-6', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-05', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-7', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-12', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-8', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-19', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-9', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2026-12-26', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-401-3-4', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 401, lote: 3, cajones: 2 } },
{ codigo: 'SENDA-409-1-9', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2027-10-23', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2700000, precioConAcabados: 2700000, precioLista: 2700000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 409, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-411-1-10', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-01-02', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-14', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-04-17', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-23', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-13', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-16', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-04-03', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-15', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-04-10', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-17', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-03-27', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-18', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-03-20', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-19', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-03-13', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-20', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-03-06', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-21', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-27', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-22', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-20', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-410-1-16B', modelo: 'SANTA CRUZ', desarrollo: 'SENDA', fechaEntrega: '2027-05-15', supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 2112663.75, precioConAcabados: 2112663.75, precioLista: 2112663.75, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'DUPLO', manzana: 410, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-1-24', modelo: 'HIMALAYA', desarrollo: 'SENDA', fechaEntrega: '2027-02-06', supEstacionamiento: null, supConstruccion: 69.33, supExcedente: null, precioSinAcabados: 2451750, precioConAcabados: 2451750, precioLista: 2451750, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'UNE-C', manzana: 411, lote: 1, cajones: 1 } },
{ codigo: 'SENDA-411-25-A201', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 411, lote: 25, cajones: 1 } },
{ codigo: 'SENDA-411-25-A202', modelo: 'ESMERALDA PA', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.78, supExcedente: null, precioSinAcabados: 1850000, precioConAcabados: 1850000, precioLista: 1850000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 411, lote: 25, cajones: 1 } },
{ codigo: 'SENDA-411-25-A101', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 411, lote: 25, cajones: 1 } },
{ codigo: 'SENDA-411-25-A102', modelo: 'ESMERALDA PB', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 55.2, supExcedente: null, precioSinAcabados: 1948000, precioConAcabados: 1948000, precioLista: 1948000, status: 'DISPONIBLE', mesesParaFirma: null, extras: { prototipo: 'CUADRUPLEX', manzana: 411, lote: 25, cajones: 1 } },
{ codigo: 'SENDA-411-26-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2750000, precioConAcabados: 2750000, precioLista: 2750000, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 411, lote: 1, cajones: 2 } },
{ codigo: 'SENDA-411-3-1', modelo: 'SANTIAGO', desarrollo: 'SENDA', fechaEntrega: '2026-12-05', supEstacionamiento: null, supConstruccion: 63.95, supExcedente: null, precioSinAcabados: 2524241, precioConAcabados: 2524241, precioLista: 2524241, status: 'VENDIDO', mesesParaFirma: null, extras: { prototipo: 'LAUREL', manzana: 411, lote: 3, cajones: 2 } },
]

View File

@@ -0,0 +1,17 @@
import type { Unidad } from '../types'
// Inventario SOLANA — 10 unidades. Casas etapas SOLANA I/II; mesesParaFirma (1-4) es el plazo de mensualidades.
// Generado desde reference/cotizadores/SOLANA.json (NO editar a mano; regenerar con scripts/generar-seeds.py).
// Precio único por unidad: precioSinAcabados/precioConAcabados replican precioLista.
export const UNIDADES_SOLANA: Unidad[] = [
{ codigo: 'SOLANA-1A', modelo: 'PANORAMA', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: 33.8094, precioSinAcabados: 2990445, precioConAcabados: 2990445, precioLista: 2990445, status: 'ESCRITURADO', mesesParaFirma: 3, extras: { prototipo: 'UNE-C', etapa: 'SOLANA I', cajones: 2 } },
{ codigo: 'SOLANA-2A', modelo: 'PANORAMA', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: 4.95, precioSinAcabados: 2767518, precioConAcabados: 2767518, precioLista: 2767518, status: 'VENDIDO', mesesParaFirma: 2, extras: { prototipo: 'UNE-C', etapa: 'SOLANA I', cajones: 2 } },
{ codigo: 'SOLANA-3A', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: 26.647, precioSinAcabados: 2922847, precioConAcabados: 2922847, precioLista: 2922847, status: 'ESCRITURADO', mesesParaFirma: 3, extras: { prototipo: 'UNE-C', etapa: 'SOLANA I', cajones: 1 } },
{ codigo: 'SOLANA-4A', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: 27.815, precioSinAcabados: 2952847, precioConAcabados: 2952847, precioLista: 2952847, status: 'ESCRITURADO', mesesParaFirma: 4, extras: { prototipo: 'UNE-C', etapa: 'SOLANA I', cajones: 1 } },
{ codigo: 'SOLANA-5A', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.83, supExcedente: 22.067, precioSinAcabados: 3400000, precioConAcabados: 3400000, precioLista: 3400000, status: 'ESCRITURADO', mesesParaFirma: 4, extras: { prototipo: 'LAUREL', etapa: 'SOLANA I', cajones: 1 } },
{ codigo: 'SOLANA-6', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 69.33, supExcedente: 0, precioSinAcabados: 2560000, precioConAcabados: 2560000, precioLista: 2560000, status: 'DISPONIBLE', mesesParaFirma: 1, extras: { prototipo: 'UNE-C', etapa: 'SOLANA II', cajones: 1 } },
{ codigo: 'SOLANA-7', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.83, supExcedente: 0, precioSinAcabados: 2595000, precioConAcabados: 2595000, precioLista: 2595000, status: 'DISPONIBLE', mesesParaFirma: 1, extras: { prototipo: 'DUPLO-B', etapa: 'SOLANA II', cajones: 2 } },
{ codigo: 'SOLANA-8', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 56.17, supExcedente: 0, precioSinAcabados: 2575000, precioConAcabados: 2575000, precioLista: 2575000, status: 'VENDIDO', mesesParaFirma: 1, extras: { prototipo: 'DUPLO-A', etapa: 'SOLANA II', cajones: 2 } },
{ codigo: 'SOLANA-9', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 63.83, supExcedente: 0, precioSinAcabados: 2605000, precioConAcabados: 2605000, precioLista: 2605000, status: 'DISPONIBLE', mesesParaFirma: 1, extras: { prototipo: 'DUPLO-B', etapa: 'SOLANA II', cajones: 2 } },
{ codigo: 'SOLANA-10', modelo: 'MIRADOR', desarrollo: 'SOLANA', fechaEntrega: null, supEstacionamiento: null, supConstruccion: 56.17, supExcedente: 0, precioSinAcabados: 2730000, precioConAcabados: 2730000, precioLista: 2730000, status: 'VENDIDO', mesesParaFirma: 1, extras: { prototipo: 'DUPLO-A', etapa: 'SOLANA II', cajones: 2 } },
]

View File

@@ -1,43 +1,57 @@
import type { Unidad } from '../types'
// Inventario real — 38 unidades, todas DISPONIBLE
import { UNIDADES_ATELIER } from './unidades-atelier'
import { UNIDADES_ESTANZA } from './unidades-estanza'
import { UNIDADES_SENDA } from './unidades-senda'
import { UNIDADES_SOLANA } from './unidades-solana'
export const UNIDADES_SEED: Unidad[] = [
{ codigo: 'U-101', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 21.336, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE' },
{ codigo: 'U-102', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-103', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-104', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-105', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-106', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-107', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 20.842, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE' },
{ codigo: 'U-108', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 18.97, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE' },
{ codigo: 'U-109', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-110', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-111', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-112', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-113', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE' },
{ codigo: 'U-114', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 18.476, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE' },
{ codigo: 'U-201', modelo: '2RA', fechaEntrega: '2027-10-15', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE' },
{ codigo: 'U-202', modelo: '1R', fechaEntrega: '2027-10-15', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-203', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-204', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-205', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-206', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-207', modelo: '2RA', fechaEntrega: '2027-10-29', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE' },
{ codigo: 'U-208', modelo: '2RA', fechaEntrega: '2027-10-29', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE' },
{ codigo: 'U-209', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-210', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-211', modelo: '1R', fechaEntrega: '2027-11-05', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-212', modelo: '1R', fechaEntrega: '2027-11-05', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-213', modelo: '1R', fechaEntrega: '2027-11-12', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE' },
{ codigo: 'U-214', modelo: '2RA', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE' },
{ codigo: 'U-301', modelo: '2RA', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE' },
{ codigo: 'U-302', modelo: '2RB', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 68.757, supExcedente: 0, precioSinAcabados: 4120000, precioConAcabados: 4280000, status: 'DISPONIBLE' },
{ codigo: 'U-303', modelo: '2RC', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE' },
{ codigo: 'U-304', modelo: '2RC', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE' },
{ codigo: 'U-305', modelo: '2RA', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE' },
{ codigo: 'U-306', modelo: '2RA', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE' },
{ codigo: 'U-307', modelo: '2RC', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE' },
{ codigo: 'U-308', modelo: '2RC', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE' },
{ codigo: 'U-309', modelo: '2RB', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 68.757, supExcedente: 0, precioSinAcabados: 4120000, precioConAcabados: 4280000, status: 'DISPONIBLE' },
{ codigo: 'U-310', modelo: '2RA', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE' },
{ codigo: 'U-101', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 21.336, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-102', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-103', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-104', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-105', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-106', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.132, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-107', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 20.842, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-108', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 18.97, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-109', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-110', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-111', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-112', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-113', modelo: '1R', fechaEntrega: '2027-10-08', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 9.13, precioSinAcabados: 3107108.39, precioConAcabados: 3269000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-114', modelo: '2RA', fechaEntrega: '2027-10-08', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 18.476, precioSinAcabados: 4415000, precioConAcabados: 4579000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-201', modelo: '2RA', fechaEntrega: '2027-10-15', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-202', modelo: '1R', fechaEntrega: '2027-10-15', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-203', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-204', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-205', modelo: '1R', fechaEntrega: '2027-10-22', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-206', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-207', modelo: '2RA', fechaEntrega: '2027-10-29', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-208', modelo: '2RA', fechaEntrega: '2027-10-29', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-209', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-210', modelo: '1R', fechaEntrega: '2027-10-29', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-211', modelo: '1R', fechaEntrega: '2027-11-05', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-212', modelo: '1R', fechaEntrega: '2027-11-05', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-213', modelo: '1R', fechaEntrega: '2027-11-12', supEstacionamiento: 14.31, supConstruccion: 47.87, supExcedente: 0, precioSinAcabados: 2850000, precioConAcabados: 2950000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-214', modelo: '2RA', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 3960000, precioConAcabados: 4127000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-301', modelo: '2RA', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-302', modelo: '2RB', fechaEntrega: '2027-11-12', supEstacionamiento: 28.62, supConstruccion: 68.757, supExcedente: 0, precioSinAcabados: 4120000, precioConAcabados: 4280000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-303', modelo: '2RC', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-304', modelo: '2RC', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-305', modelo: '2RA', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-306', modelo: '2RA', fechaEntrega: '2027-11-19', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-307', modelo: '2RC', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-308', modelo: '2RC', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 72.328, supExcedente: 0, precioSinAcabados: 4300000, precioConAcabados: 4450000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-309', modelo: '2RB', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 68.757, supExcedente: 0, precioSinAcabados: 4120000, precioConAcabados: 4280000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
{ codigo: 'U-310', modelo: '2RA', fechaEntrega: '2027-11-26', supEstacionamiento: 28.62, supConstruccion: 69.485, supExcedente: 0, precioSinAcabados: 4150000, precioConAcabados: 4315000, status: 'DISPONIBLE', desarrollo: 'DIAGONAL' },
]
/** Inventario local completo (fallback cuando el API no responde) */
export const INVENTARIO_SEED: Unidad[] = [
...UNIDADES_SEED,
...UNIDADES_ATELIER,
...UNIDADES_ESTANZA,
...UNIDADES_SENDA,
...UNIDADES_SOLANA,
]

View File

@@ -1,15 +1,19 @@
import { useMemo, useState } from 'react'
import type { Unidad, DescuentosPropuestas } from '../types'
import type { Unidad, DescuentosPropuestas, ParametrosDesarrollo } from '../types'
import {
APARTADO_DEFAULT,
DESCUENTOS_DEFAULT,
calcularNumMensualidades,
calcularPropuestas,
obtenerPrecioLista,
resolverNumMensualidades,
type PropuestaResultado,
} from '../lib/calculations'
import { DESARROLLO_DEFAULT, descuentosDefault, obtenerDesarrollo } from '../data/desarrollos'
interface UseCotizacionResult {
desarrollo: string
/** Cambia de desarrollo: limpia la unidad elegida y reinicia los descuentos */
setDesarrollo: (id: string) => void
params: ParametrosDesarrollo
unidad: Unidad | null
setUnidad: (u: Unidad | null) => void
acabados: boolean
@@ -19,24 +23,34 @@ interface UseCotizacionResult {
descuentos: DescuentosPropuestas
setDescuento: (clave: keyof DescuentosPropuestas, valor: number) => void
precioLista: number
numMeses: number
numMeses: number | null
propuestas: PropuestaResultado[]
}
/** Estado central de la cotización: unidad, acabados, apartado y descuentos */
/** Estado central de la cotización: desarrollo, unidad, acabados, apartado y descuentos */
export function useCotizacion(): UseCotizacionResult {
const [desarrollo, setDesarrolloState] = useState<string>(DESARROLLO_DEFAULT)
const [unidad, setUnidad] = useState<Unidad | null>(null)
const [acabados, setAcabados] = useState(false)
const [apartado, setApartado] = useState<number>(APARTADO_DEFAULT)
const [descuentos, setDescuentos] = useState<DescuentosPropuestas>({ ...DESCUENTOS_DEFAULT })
const [descuentos, setDescuentos] = useState<DescuentosPropuestas>(descuentosDefault(DESARROLLO_DEFAULT))
const params = obtenerDesarrollo(desarrollo)
const setDesarrollo = (id: string) => {
setDesarrolloState(id)
setUnidad(null)
setAcabados(false)
setDescuentos(descuentosDefault(id))
}
const setDescuento = (clave: keyof DescuentosPropuestas, valor: number) => {
setDescuentos((prev) => ({ ...prev, [clave]: valor }))
}
const numMeses = useMemo(
() => (unidad ? calcularNumMensualidades(unidad.fechaEntrega) : 0),
[unidad],
() => (unidad ? resolverNumMensualidades(unidad, params) : null),
[unidad, params],
)
const precioLista = useMemo(
@@ -46,10 +60,13 @@ export function useCotizacion(): UseCotizacionResult {
const propuestas = useMemo(() => {
if (!unidad) return []
return calcularPropuestas({ unidad, acabados, apartado, descuentos })
}, [unidad, acabados, apartado, descuentos])
return calcularPropuestas({ unidad, acabados, apartado, descuentos, desarrollo })
}, [unidad, acabados, apartado, descuentos, desarrollo])
return {
desarrollo,
setDesarrollo,
params,
unidad,
setUnidad,
acabados,

View File

@@ -0,0 +1,291 @@
import { describe, it, expect } from 'vitest'
import {
calcularPropuestas,
obtenerPrecioLista,
resolverNumMensualidades,
totalPagado,
APARTADO_DEFAULT,
} from './calculations'
import { DESARROLLOS, descuentosDefault, obtenerDesarrollo } from '../data/desarrollos'
import { UNIDADES_ATELIER } from '../data/unidades-atelier'
import { UNIDADES_ESTANZA } from '../data/unidades-estanza'
import { UNIDADES_SENDA } from '../data/unidades-senda'
import { UNIDADES_SOLANA } from '../data/unidades-solana'
import type { Unidad } from '../types'
/**
* Fixtures validados al centavo contra los Excel de producción
* (ver reference/cotizadores/{ATELIER,ESTANZA,SENDA,SOLANA}.md).
* Orden de propuestas en la config: [bancario, infonavit/cofinavit, contado, semi].
*/
function porCodigo(unidades: Unidad[], codigo: string): Unidad {
const u = unidades.find((x) => x.codigo === codigo)
if (!u) throw new Error(`Fixture ${codigo} no existe en el seed`)
return u
}
describe('ATELIER — depto 10 (L = 3,997,500, apartado 20,000, N fijo = 1)', () => {
const unidad = porCodigo(UNIDADES_ATELIER, 'ATELIER-10')
const calcular = () =>
calcularPropuestas({
unidad,
acabados: false,
apartado: APARTADO_DEFAULT,
descuentos: descuentosDefault('ATELIER'),
})
it('precio único: no depende de acabados', () => {
expect(obtenerPrecioLista(unidad, true)).toBe(3997500)
expect(obtenerPrecioLista(unidad, false)).toBe(3997500)
})
it('resuelve N = 1 fijo (entrega inmediata)', () => {
expect(resolverNumMensualidades(unidad, DESARROLLOS['ATELIER'])).toBe(1)
})
it('BANCARIO: enganche 5% sobre LISTA; mensualidad = remanente en 1 pago', () => {
const [p] = calcular()
expect(p.enganche).toBeCloseTo(179875, 2)
expect(p.mensualidadesTotal).toBeCloseTo(199875, 2)
expect(p.mensualidad).toBeCloseTo(199875, 2)
expect(p.numMensualidades).toBe(1)
expect(p.pagoFinal).toBeCloseTo(3597750, 2)
})
it('COFINAVIT: estructura Infonavit sin quirk (todo sobre precio final)', () => {
const [, p] = calcular()
expect(p.titulo).toBe('Crédito Cofinavit')
expect(p.enganche).toBeCloseTo(79937.5, 2)
expect(p.mensualidadesTotal).toBeCloseTo(99937.5, 2)
expect(p.mensualidad).toBeCloseTo(99937.5, 2)
expect(p.pagoFinal).toBeCloseTo(3797625, 2)
expect(totalPagado(p, APARTADO_DEFAULT)).toBeCloseTo(3997500, 2)
})
it('CONTADO', () => {
const [, , p] = calcular()
expect(p.enganche).toBeCloseTo(3577750, 2)
expect(p.pagoFinal).toBeCloseTo(399750, 2)
expect(p.mensualidad).toBeNull()
})
it('SEMI CONTADO', () => {
const [, , , p] = calcular()
expect(p.enganche).toBeCloseTo(1978750, 2)
expect(p.mensualidadesTotal).toBeCloseTo(1599000, 2)
expect(p.pagoFinal).toBeCloseTo(399750, 2)
})
it('bancario cuadra: apartado + enganche + mensualidades + pago final = precio final', () => {
const [p] = calcular()
expect(totalPagado(p, APARTADO_DEFAULT)).toBeCloseTo(3997500, 2)
})
})
describe('ESTANZA — casa 52 (L = 2,437,250, apartado 20,000, N fijo = 1, desc 0)', () => {
const unidad = porCodigo(UNIDADES_ESTANZA, 'ESTANZA-52')
const calcular = () =>
calcularPropuestas({
unidad,
acabados: false,
apartado: APARTADO_DEFAULT,
descuentos: descuentosDefault('ESTANZA'),
})
it('BANCARIO: enganche 2.5% sobre final; pago final 90% sobre LISTA (quirk)', () => {
const [p] = calcular()
expect(p.enganche).toBeCloseTo(40931.25, 2)
expect(p.mensualidadesTotal).toBeCloseTo(182793.75, 2)
expect(p.mensualidad).toBeCloseTo(182793.75, 2)
expect(p.pagoFinal).toBeCloseTo(2193525, 2)
})
it('INFONAVIT: pago final 95% sobre LISTA (quirk)', () => {
const [, p] = calcular()
expect(p.enganche).toBeCloseTo(40931.25, 2)
expect(p.mensualidadesTotal).toBeCloseTo(60931.25, 2)
expect(p.pagoFinal).toBeCloseTo(2315387.5, 2)
})
it('CONTADO', () => {
const [, , p] = calcular()
expect(p.enganche).toBeCloseTo(2173525, 2)
expect(p.pagoFinal).toBeCloseTo(243725, 2)
})
it('SEMI CONTADO', () => {
const [, , , p] = calcular()
expect(p.enganche).toBeCloseTo(1198625, 2)
expect(p.mensualidadesTotal).toBeCloseTo(974900, 2)
expect(p.pagoFinal).toBeCloseTo(243725, 2)
})
})
describe('SENDA — 411-1-7 (L = 2,451,750, apartado 0 en el Excel, N = 4)', () => {
const unidad = porCodigo(UNIDADES_SENDA, 'SENDA-411-1-7')
const calcular = () =>
calcularPropuestas({
unidad,
acabados: false,
apartado: 0, // el Excel de SENDA traía MONTO APARTADO (C15) en 0
descuentos: descuentosDefault('SENDA'),
numMeses: 4,
})
it('BANCARIO: enganche 5%, mensualidades 5% ÷ N, pago final 90%', () => {
const [p] = calcular()
expect(p.enganche).toBeCloseTo(122587.5, 2)
expect(p.mensualidadesTotal).toBeCloseTo(122587.5, 2)
expect(p.mensualidad).toBeCloseTo(30646.875, 3)
expect(p.pagoFinal).toBeCloseTo(2206575, 2)
})
it('INFONAVIT: sin quirk de lista — mensualidades sobre precio final', () => {
const [, p] = calcular()
expect(p.enganche).toBeCloseTo(61293.75, 2)
expect(p.mensualidadesTotal).toBeCloseTo(61293.75, 2)
expect(p.mensualidad).toBeCloseTo(15323.4375, 4)
expect(p.pagoFinal).toBeCloseTo(2329162.5, 2)
})
it('CONTADO (desc default 2%)', () => {
const [, , p] = calcular()
expect(p.precioFinal).toBeCloseTo(2402715, 2)
expect(p.enganche).toBeCloseTo(2162443.5, 2)
expect(p.pagoFinal).toBeCloseTo(240271.5, 2)
})
it('SEMI CONTADO (desc default 1%, split 50/45/5)', () => {
const [, , , p] = calcular()
expect(p.precioFinal).toBeCloseTo(2427232.5, 2)
expect(p.enganche).toBeCloseTo(1213616.25, 2)
expect(p.mensualidadesTotal).toBeCloseTo(1092254.625, 3)
expect(p.mensualidad).toBeCloseTo(273063.65625, 5)
expect(p.pagoFinal).toBeCloseTo(121361.625, 3)
})
})
describe('SENDA — unidad sin fecha de entrega (411-25-A101)', () => {
const unidad = porCodigo(UNIDADES_SENDA, 'SENDA-411-25-A101')
it('N = null y mensualidades "—" con nota; enganche y pago final sí se calculan', () => {
expect(unidad.fechaEntrega).toBeNull()
const [bancario] = calcularPropuestas({
unidad,
acabados: false,
apartado: APARTADO_DEFAULT,
descuentos: descuentosDefault('SENDA'),
})
expect(bancario.numMensualidades).toBeNull()
expect(bancario.mensualidad).toBeNull()
expect(bancario.mensualidadesTotal).toBeNull()
expect(bancario.notaMensualidades).toBe('sin fecha de entrega')
expect(bancario.enganche).toBeCloseTo(0.05 * 1948000 - APARTADO_DEFAULT, 2)
expect(bancario.pagoFinal).toBeCloseTo(0.9 * 1948000, 2)
expect(totalPagado(bancario, APARTADO_DEFAULT)).toBeNull()
})
})
describe('SOLANA — casa 6 (L = 2,560,000, apartado 20,000, mesesParaFirma = 1)', () => {
const unidad = porCodigo(UNIDADES_SOLANA, 'SOLANA-6')
const calcular = () =>
calcularPropuestas({
unidad,
acabados: false,
apartado: APARTADO_DEFAULT,
descuentos: descuentosDefault('SOLANA'),
})
it('N viene de mesesParaFirma de la unidad', () => {
expect(unidad.mesesParaFirma).toBe(1)
expect(resolverNumMensualidades(unidad, DESARROLLOS['SOLANA'])).toBe(1)
})
it('BANCARIO: enganche 5% sobre final', () => {
const [p] = calcular()
expect(p.enganche).toBeCloseTo(108000, 2)
expect(p.mensualidadesTotal).toBeCloseTo(128000, 2)
expect(p.pagoFinal).toBeCloseTo(2304000, 2)
})
it('INFONAVIT: enganche 0% con guarda (no resta el apartado)', () => {
const [, p] = calcular()
expect(p.enganche).toBe(0)
expect(p.mensualidadesTotal).toBeCloseTo(128000, 2)
expect(p.pagoFinal).toBeCloseTo(2432000, 2)
})
it('CONTADO', () => {
const [, , p] = calcular()
expect(p.enganche).toBeCloseTo(2284000, 2)
expect(p.pagoFinal).toBeCloseTo(256000, 2)
})
it('SEMI CONTADO', () => {
const [, , , p] = calcular()
expect(p.enganche).toBeCloseTo(1260000, 2)
expect(p.mensualidadesTotal).toBeCloseTo(1024000, 2)
expect(p.pagoFinal).toBeCloseTo(256000, 2)
})
})
describe('SOLANA — casa 9 (L = 2,605,000, mesesParaFirma = 1)', () => {
const unidad = porCodigo(UNIDADES_SOLANA, 'SOLANA-9')
const calcular = () =>
calcularPropuestas({
unidad,
acabados: false,
apartado: APARTADO_DEFAULT,
descuentos: descuentosDefault('SOLANA'),
})
it('las 4 propuestas al centavo', () => {
const [bancario, infonavit, contado, semi] = calcular()
expect(bancario.enganche).toBeCloseTo(110250, 2)
expect(bancario.mensualidadesTotal).toBeCloseTo(130250, 2)
expect(bancario.pagoFinal).toBeCloseTo(2344500, 2)
expect(infonavit.enganche).toBe(0)
expect(infonavit.mensualidadesTotal).toBeCloseTo(130250, 2)
expect(infonavit.pagoFinal).toBeCloseTo(2474750, 2)
expect(contado.enganche).toBeCloseTo(2324500, 2)
expect(contado.pagoFinal).toBeCloseTo(260500, 2)
expect(semi.enganche).toBeCloseTo(1282500, 2)
expect(semi.mensualidadesTotal).toBeCloseTo(1042000, 2)
expect(semi.pagoFinal).toBeCloseTo(260500, 2)
})
})
describe('configuración de desarrollos', () => {
it('los 5 desarrollos tienen 4 propuestas', () => {
for (const id of ['DIAGONAL', 'ATELIER', 'ESTANZA', 'SENDA', 'SOLANA']) {
expect(DESARROLLOS[id].propuestas).toHaveLength(4)
}
})
it('id desconocido cae a DIAGONAL', () => {
expect(obtenerDesarrollo('NO_EXISTE').id).toBe('DIAGONAL')
expect(obtenerDesarrollo(undefined).id).toBe('DIAGONAL')
})
it('descuentos default por desarrollo', () => {
expect(descuentosDefault('DIAGONAL')).toEqual({
creditoBancario: 0,
creditoInfonavit: 0,
contado: 0.02,
semiContado: 0.01,
})
expect(descuentosDefault('SENDA')).toEqual({
creditoBancario: 0,
creditoInfonavit: 0,
contado: 0.02,
semiContado: 0.01,
})
expect(descuentosDefault('ATELIER')).toEqual({
creditoBancario: 0,
creditoInfonavit: 0,
contado: 0,
semiContado: 0,
})
})
})

View File

@@ -129,7 +129,7 @@ describe('totalPagado', () => {
describe('indiceMenorTotal', () => {
it('devuelve el índice de la propuesta con menor total pagado', () => {
const propuestas = calcular()
const totales = propuestas.map((p) => totalPagado(p, APARTADO_DEFAULT))
const totales = propuestas.map((p) => totalPagado(p, APARTADO_DEFAULT) ?? 0)
// Contado (2% desc) tiene el menor total pagado
expect(indiceMenorTotal(totales)).toBe(2)
})

View File

@@ -1,15 +1,27 @@
import type { Unidad, TipoPropuesta, DescuentosPropuestas } from '../types'
import type {
Unidad,
TipoPropuesta,
DescuentosPropuestas,
ParametrosDesarrollo,
PropuestaConfig,
} from '../types'
import { DESARROLLO_DEFAULT, obtenerDesarrollo } from '../data/desarrollos'
/**
* Cálculos replicados fielmente del Excel de producción "COTIZADOR" de
* Frasa Desarrollos (ya validado). NO "corregir" las fórmulas: algunas
* Cálculos replicados fielmente de los Excel de producción "COTIZADOR" de
* Frasa Desarrollos (ya validados). NO "corregir" las fórmulas: algunas
* usan precio de lista donde intuitivamente iría precio final; así está
* en el Excel y así debe quedar.
* en los Excel y así debe quedar.
*
* El motor está parametrizado por desarrollo (ver src/data/desarrollos.ts);
* con los parámetros de DIAGONAL reproduce byte a byte las fórmulas
* originales de este archivo.
*/
export const APARTADO_DEFAULT = 20000
// Descuentos por defecto de cada propuesta (fracción, no porcentaje)
// Descuentos por defecto de DIAGONAL (fracción, no porcentaje).
// Para otros desarrollos usar descuentosDefault(desarrollo) de data/desarrollos.
export const DESCUENTOS_DEFAULT: DescuentosPropuestas = {
creditoBancario: 0,
creditoInfonavit: 0,
@@ -19,22 +31,28 @@ export const DESCUENTOS_DEFAULT: DescuentosPropuestas = {
export interface PropuestaResultado {
tipo: TipoPropuesta
/** Título para mostrar, viene de la config del desarrollo (p. ej. 'Crédito Cofinavit') */
titulo: string
descuento: number // fracción (0.02 = 2%)
montoDescuento: number
precioFinal: number // precio lista - descuento
enganche: number // NETO del apartado (el apartado ya se pagó)
numMensualidades: number
mensualidad: number | null // null => N/A (Contado)
mensualidadesTotal: number | null // null => N/A (Contado)
numMensualidades: number | null // null => sin fecha de entrega / plazo desconocido
mensualidad: number | null // null => N/A (Contado) o plazo desconocido
mensualidadesTotal: number | null // null => N/A (Contado) o plazo desconocido
pagoFinal: number
/** Nota explicativa cuando no se pueden calcular mensualidades ('sin fecha de entrega') */
notaMensualidades?: string
}
export interface CotizacionInput {
unidad: Unidad
acabados: boolean // true => incluye cocina y closet
acabados: boolean // true => incluye cocina y closet (ignorado en desarrollos de precio único)
apartado: number
descuentos: DescuentosPropuestas
/** Permite forzar N en tests; por defecto se calcula desde fechaEntrega */
/** Desarrollo cuyos parámetros aplican; por defecto unidad.desarrollo ?? 'DIAGONAL' */
desarrollo?: string
/** Permite forzar N en tests; por defecto se resuelve según la fuenteDeN del desarrollo */
numMeses?: number
}
@@ -46,6 +64,26 @@ export function calcularNumMensualidades(fechaEntrega: string, hoy: Date = new D
return Math.max(1, Math.round((entrega.getTime() - hoy.getTime()) / MS_POR_MES))
}
/**
* Resuelve N según la fuente del desarrollo:
* - fijo: nFijo (entrega inmediata)
* - porUnidad: mesesParaFirma del inventario (null si falta)
* - fechaEntrega: meses desde hoy (null si la unidad no tiene fecha)
*/
export function resolverNumMensualidades(
unidad: Unidad,
params: ParametrosDesarrollo,
): number | null {
switch (params.fuenteDeN) {
case 'fijo':
return params.nFijo ?? 1
case 'porUnidad':
return unidad.mesesParaFirma ?? null
case 'fechaEntrega':
return unidad.fechaEntrega ? calcularNumMensualidades(unidad.fechaEntrega) : null
}
}
function baseComun(precioLista: number, descuento: number) {
// Excel COTIZADOR: MONTO DE DESCUENTO y PRECIO FINAL C/DESC
const montoDescuento = precioLista * descuento
@@ -53,102 +91,82 @@ function baseComun(precioLista: number, descuento: number) {
return { montoDescuento, precioFinal }
}
/** PROPUESTA 1 — CRÉDITO BANCARIO */
function calcularBancario(precioLista: number, apartado: number, descuento: number, n: number): PropuestaResultado {
/** Calcula una propuesta comercial con los parámetros dados */
function calcularPropuestaConfig(
cfg: PropuestaConfig,
precioLista: number,
apartado: number,
descuento: number,
n: number | null,
): PropuestaResultado {
const { montoDescuento, precioFinal } = baseComun(precioLista, descuento)
// Excel COTIZADOR!M17 — enganche 2.5% sobre precio LISTA, neto del apartado
const enganche = 0.025 * precioLista - apartado
// Excel COTIZADOR!M19 — pago final 90% del precio final c/desc
const pagoFinal = 0.9 * precioFinal
// Excel COTIZADOR!M18 — remanente a mensualidades
const mensualidadesTotal = precioFinal - apartado - enganche - pagoFinal
// Enganche: pct sobre su base, neto del apartado (salvo la guarda de SOLANA)
const baseEnganche = cfg.engancheBase === 'lista' ? precioLista : precioFinal
const enganche =
cfg.engancheCeroSinApartado && cfg.pctEnganche === 0
? 0
: cfg.pctEnganche * baseEnganche - apartado
const basePagoFinal = cfg.pagoFinalBase === 'lista' ? precioLista : precioFinal
const pagoFinal = cfg.pctPagoFinal * basePagoFinal
let mensualidadesTotal: number | null = null
let mensualidad: number | null = null
let notaMensualidades: string | undefined
if (cfg.modoMensualidades !== 'ninguna') {
if (n === null) {
// Unidad sin fecha de entrega / plazo: el Excel mostraría #N/A
notaMensualidades = 'sin fecha de entrega'
} else {
switch (cfg.modoMensualidades) {
case 'remanente':
mensualidadesTotal = precioFinal - apartado - enganche - pagoFinal
break
case 'remanenteLista':
// Quirk DIAGONAL Infonavit: el Excel usa precioLista aquí, NO precioFinal
mensualidadesTotal = precioLista - pagoFinal - apartado - enganche
break
case 'porcentaje':
mensualidadesTotal = precioFinal * (1 - cfg.pctEnganche - cfg.pctPagoFinal)
break
}
mensualidad = mensualidadesTotal / n
}
}
return {
tipo: 'CREDITO_BANCARIO',
tipo: cfg.tipo,
titulo: cfg.titulo,
descuento,
montoDescuento,
precioFinal,
enganche,
numMensualidades: n,
mensualidad: mensualidadesTotal / n,
mensualidad,
mensualidadesTotal,
pagoFinal,
...(notaMensualidades !== undefined ? { notaMensualidades } : {}),
}
}
/** PROPUESTA 2 — CRÉDITO INFONAVIT-COFINAVIT */
function calcularInfonavit(precioLista: number, apartado: number, descuento: number, n: number): PropuestaResultado {
const { montoDescuento, precioFinal } = baseComun(precioLista, descuento)
// Excel COTIZADOR!M26 — enganche 2.5% sobre precio LISTA, neto del apartado
const enganche = 0.025 * precioLista - apartado
// Excel COTIZADOR!M28 — pago final 95% del precio final c/desc
const pagoFinal = 0.95 * precioFinal
// Excel COTIZADOR!M27 — OJO: el Excel usa precioLista aquí, NO precioFinal. Replicar tal cual.
const mensualidadesTotal = precioLista - pagoFinal - apartado - enganche
return {
tipo: 'CREDITO_INFONAVIT_COFINAVIT',
descuento,
montoDescuento,
precioFinal,
enganche,
numMensualidades: n,
mensualidad: mensualidadesTotal / n,
mensualidadesTotal,
pagoFinal,
}
}
/** PROPUESTA 3 — CONTADO (sin mensualidades) */
function calcularContado(precioLista: number, apartado: number, descuento: number, n: number): PropuestaResultado {
const { montoDescuento, precioFinal } = baseComun(precioLista, descuento)
// Excel COTIZADOR!M36 — enganche 90% del precio final c/desc, neto del apartado
const enganche = 0.9 * precioFinal - apartado
// Excel COTIZADOR!M37 — pago final 10% del precio final c/desc
const pagoFinal = 0.1 * precioFinal
return {
tipo: 'CONTADO',
descuento,
montoDescuento,
precioFinal,
enganche,
numMensualidades: n,
mensualidad: null, // N/A
mensualidadesTotal: null, // N/A
pagoFinal,
}
}
/** PROPUESTA 4 — SEMI CONTADO */
function calcularSemiContado(precioLista: number, apartado: number, descuento: number, n: number): PropuestaResultado {
const { montoDescuento, precioFinal } = baseComun(precioLista, descuento)
// Excel COTIZADOR!M45 — enganche 50% del precio final c/desc, neto del apartado
const enganche = 0.5 * precioFinal - apartado
// Excel COTIZADOR!M46 — 40% del precio final a mensualidades (= 1 - 0.5 - 0.1)
const mensualidadesTotal = precioFinal * 0.4
// Excel COTIZADOR!M47 — pago final 10% del precio final c/desc
const pagoFinal = 0.1 * precioFinal
return {
tipo: 'SEMI_CONTADO',
descuento,
montoDescuento,
precioFinal,
enganche,
numMensualidades: n,
mensualidad: mensualidadesTotal / n,
mensualidadesTotal,
pagoFinal,
}
}
/** Precio de lista según si incluye cocina y closet (acabados) */
/**
* Precio de lista según si incluye cocina y closet (acabados).
* En desarrollos de precio único la unidad trae `precioLista` y no hay
* distinción de acabados.
*/
export function obtenerPrecioLista(unidad: Unidad, acabados: boolean): number {
if (unidad.precioLista != null) return unidad.precioLista
return acabados ? unidad.precioConAcabados : unidad.precioSinAcabados
}
/**
* Total pagado por el cliente en una propuesta:
* apartado + enganche (neto del apartado) + mensualidades + pago final.
* Devuelve null cuando el total no se puede conocer (plazo desconocido).
*/
export function totalPagado(p: PropuestaResultado, apartado: number): number {
export function totalPagado(p: PropuestaResultado, apartado: number): number | null {
if (p.notaMensualidades) return null
return apartado + p.enganche + (p.mensualidadesTotal ?? 0) + p.pagoFinal
}
@@ -162,15 +180,13 @@ export function indiceMenorTotal(totales: number[]): number {
return indice
}
/** Calcula las 4 propuestas comerciales */
/** Calcula las propuestas comerciales del desarrollo de la unidad */
export function calcularPropuestas(input: CotizacionInput): PropuestaResultado[] {
const { unidad, acabados, apartado, descuentos } = input
const params = obtenerDesarrollo(input.desarrollo ?? unidad.desarrollo ?? DESARROLLO_DEFAULT)
const precioLista = obtenerPrecioLista(unidad, acabados)
const n = input.numMeses ?? calcularNumMensualidades(unidad.fechaEntrega)
return [
calcularBancario(precioLista, apartado, descuentos.creditoBancario, n),
calcularInfonavit(precioLista, apartado, descuentos.creditoInfonavit, n),
calcularContado(precioLista, apartado, descuentos.contado, n),
calcularSemiContado(precioLista, apartado, descuentos.semiContado, n),
]
const n = input.numMeses ?? resolverNumMensualidades(unidad, params)
return params.propuestas.map((cfg) =>
calcularPropuestaConfig(cfg, precioLista, apartado, descuentos[cfg.claveDescuento], n),
)
}

View File

@@ -1,8 +1,9 @@
import { jsPDF } from 'jspdf'
import autoTable from 'jspdf-autotable'
import type { Unidad, Cliente } from '../types'
import type { Unidad, Cliente, ParametrosDesarrollo } from '../types'
import type { PropuestaResultado } from './calculations'
import { formatoMoneda, formatoPorcentaje, formatoFechaLarga, fechaISOHoy } from './formatters'
import { DESARROLLOS, DESARROLLO_DEFAULT } from '../data/desarrollos'
export interface PdfInput {
unidad: Unidad
@@ -11,14 +12,11 @@ export interface PdfInput {
precioLista: number
propuestas: PropuestaResultado[]
cliente: Cliente
/** Parámetros del desarrollo; por defecto DIAGONAL */
desarrollo?: ParametrosDesarrollo
}
const TITULOS: Record<PropuestaResultado['tipo'], string> = {
CREDITO_BANCARIO: 'CREDITO BANCARIO',
CREDITO_INFONAVIT_COFINAVIT: 'CREDITO INFONAVIT-COFINAVIT',
CONTADO: 'CONTADO',
SEMI_CONTADO: 'SEMI CONTADO',
}
const formatoM2Pdf = (v: number | null): string => (v === null ? '—' : `${v} m2`)
const DISCLAIMER =
'ESTA COTIZACION NO INCLUYE GASTOS DE ESCRITURACION. LOS VALORES ANTERIORES SON EN PESOS, MERAMENTE INFORMATIVOS, POR LO QUE ESTE DOCUMENTO NO CONSTITUYE PREAPROBACIÓN Y POR LO TANTO NO COMPROMETE AL DESARROLLADOR.\n\nMONTOS, PORCENTAJES Y PRECIOS EN LA PRESENTE COTIZACIÓN PUEDEN CAMBIAR SIN PREVIO AVISO.\n\nEL MONTO TOTAL DE ENGANCHE INCLUYE LA DEDUCCIÓN DEL MONTO DE APARTADO.\n\nLA PRESENTE COTIZACIÓN TIENE UNA VIGENCIA DE 3 DÍAS NATURALES A PARTIR DE LA FECHA DE EMISIÓN, PARA CONGELAR EL PRECIO DE VENTA ES NECESARIO REALIZAR EL PAGO DE SU APARTADO COMPLETO Y TENDRÁ 7 DÍAS PARA FORMALIZAR Y NO PERDER LA UBICACIÓN.'
@@ -41,7 +39,8 @@ export interface DocumentoPdf {
}
/** Construye el documento PDF "ANEXO A" (sin descargarlo) */
export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, propuestas, cliente }: PdfInput): DocumentoPdf {
export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, propuestas, cliente, desarrollo }: PdfInput): DocumentoPdf {
const params = desarrollo ?? DESARROLLOS[DESARROLLO_DEFAULT]
const doc = new jsPDF()
const hoy = new Date()
const limiteDocumentos = new Date(hoy.getTime() + 7 * 86400000)
@@ -69,6 +68,9 @@ export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, pro
doc.setFontSize(10)
doc.setFont('helvetica', 'normal')
doc.text(formatoFechaLarga(hoy), 105, y, { align: 'center' })
y += 5
doc.setFont('helvetica', 'bold')
doc.text(`DESARROLLO ${params.nombre.toUpperCase()}`, 105, y, { align: 'center' })
y += 8
// 2. Tabla de unidad
@@ -82,16 +84,16 @@ export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, pro
'MONTO APARTADO $ MN', 'CUOTA MANTENIMIENTO',
]],
body: [[
`CASA ${unidad.codigo}`,
`${params.prefijoUnidadPdf} ${unidad.codigo}`,
unidad.modelo,
acabados ? 'SI' : 'NO',
params.precioUnico ? 'N/A' : acabados ? 'SI' : 'NO',
formatoMoneda(precioLista),
unidad.status,
`${unidad.supConstruccion} m2`,
`${unidad.supExcedente} m2`,
`${unidad.supEstacionamiento} m2`,
formatoM2Pdf(unidad.supConstruccion),
formatoM2Pdf(unidad.supExcedente),
formatoM2Pdf(unidad.supEstacionamiento),
formatoMoneda(apartado),
'1,500 Aprox.',
params.cuotaMantenimiento,
]],
})
y = finalY(doc) + 8
@@ -103,8 +105,9 @@ export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, pro
y += 4
propuestas.forEach((p, i) => {
const mensualidades =
p.mensualidad !== null && p.mensualidadesTotal !== null
const mensualidades = p.notaMensualidades
? { pagos: `— (${p.notaMensualidades})`, total: '—' }
: p.mensualidad !== null && p.mensualidadesTotal !== null
? {
pagos: `${p.numMensualidades} × ${formatoMoneda(p.mensualidad)}`,
total: formatoMoneda(p.mensualidadesTotal),
@@ -116,7 +119,7 @@ export function crearDocumentoPdf({ unidad, acabados, apartado, precioLista, pro
margin: { left: MARGEN, right: MARGEN },
styles: { fontSize: 8 },
headStyles: { fillColor: [4, 120, 87] },
head: [[`PROPUESTA COMERCIAL #${i + 1} — ${TITULOS[p.tipo]}`, '%', 'PAGOS MENSUALES', 'TOTAL']],
head: [[`PROPUESTA COMERCIAL #${i + 1} — ${p.titulo.toUpperCase()}`, '%', 'PAGOS MENSUALES', 'TOTAL']],
body: [
['DESCUENTO', formatoPorcentaje(p.descuento), '', ''],
['MONTO DE DESCUENTO', '', '', formatoMoneda(p.montoDescuento)],

View File

@@ -10,6 +10,7 @@ import { ComparadorPropuestas } from '../components/ComparadorPropuestas'
import { generarPdf } from '../lib/pdf'
import { formatoMoneda, formatoFechaLarga } from '../lib/formatters'
import { calcularVigencia } from '../lib/vigencia'
import { LISTA_DESARROLLOS, obtenerDesarrollo } from '../data/desarrollos'
import type { Cliente } from '../types'
const esquemaCliente = z.object({
@@ -22,13 +23,6 @@ const esquemaCliente = z.object({
type FormularioCliente = z.infer<typeof esquemaCliente>
const TITULOS_PROPUESTAS: [string, keyof import('../types').DescuentosPropuestas][] = [
['Crédito Bancario', 'creditoBancario'],
['Crédito Infonavit-Cofinavit', 'creditoInfonavit'],
['Contado', 'contado'],
['Semi Contado', 'semiContado'],
]
const campoInputBase =
'w-full border bg-white px-3 py-2.5 text-sm transition-colors duration-150 focus:border-neutral-900 focus:outline-none'
const campoInput = `${campoInputBase} border-neutral-300`
@@ -40,6 +34,9 @@ export default function CotizadorPage() {
const { unidades, cargando, error, usandoSeed } = useUnidades()
const cotizacion = useCotizacion()
const {
desarrollo,
setDesarrollo,
params,
unidad,
setUnidad,
acabados,
@@ -52,6 +49,9 @@ export default function CotizadorPage() {
propuestas,
} = cotizacion
const unidadesDesarrollo = unidades.filter((u) => (u.desarrollo ?? 'DIAGONAL') === desarrollo)
const disponiblesDesarrollo = unidadesDesarrollo.filter((u) => u.status === 'DISPONIBLE').length
const {
register,
watch,
@@ -72,7 +72,7 @@ export default function CotizadorPage() {
email: watch('email') || undefined,
telefono: watch('telefono') || undefined,
}
generarPdf({ unidad, acabados, apartado, precioLista, propuestas, cliente })
generarPdf({ unidad, acabados, apartado, precioLista, propuestas, cliente, desarrollo: params })
}
return (
@@ -105,15 +105,51 @@ export default function CotizadorPage() {
{cargando ? (
<p className="text-sm text-neutral-500">Cargando unidades…</p>
) : (
<UnitSelector
unidades={unidades}
valor={unidad?.codigo ?? ''}
onChange={(codigo) =>
setUnidad(unidades.find((u) => u.codigo === codigo) ?? null)
}
/>
<>
<div>
<span className={etiquetaCampo}>Desarrollo</span>
<div className="flex flex-wrap border border-neutral-300" role="group">
{LISTA_DESARROLLOS.map((id) => {
const activo = id === desarrollo
const total = unidades.filter((u) => (u.desarrollo ?? 'DIAGONAL') === id).length
const disponibles = unidades.filter(
(u) => (u.desarrollo ?? 'DIAGONAL') === id && u.status === 'DISPONIBLE',
).length
return (
<button
key={id}
type="button"
aria-pressed={activo}
onClick={() => setDesarrollo(id)}
className={`px-4 py-2.5 text-xs font-bold tracking-widest uppercase transition-colors duration-150 ${
activo
? 'bg-accent text-white'
: 'bg-white text-neutral-600 hover:bg-neutral-100'
}`}
>
{obtenerDesarrollo(id).nombre}
<span className={`ml-1 font-normal ${activo ? 'text-white' : 'text-neutral-400'}`}>
{disponibles}/{total}
</span>
</button>
)
})}
</div>
<p className="mt-2 text-xs text-neutral-500">
{unidadesDesarrollo.length} unidades · {disponiblesDesarrollo} disponibles
</p>
</div>
<UnitSelector
unidades={unidadesDesarrollo}
valor={unidad?.codigo ?? ''}
onChange={(codigo) =>
setUnidad(unidadesDesarrollo.find((u) => u.codigo === codigo) ?? null)
}
/>
</>
)}
{!params.precioUnico && (
<div>
<span className={etiquetaCampo}>Cocina y closet</span>
<div className="inline-flex border border-neutral-300" role="group">
@@ -137,6 +173,7 @@ export default function CotizadorPage() {
})}
</div>
</div>
)}
<div>
<label htmlFor="apartado" className={etiquetaCampo}>
@@ -227,9 +264,9 @@ export default function CotizadorPage() {
<ProposalCard
key={p.tipo}
numero={i + 1}
titulo={TITULOS_PROPUESTAS[i][0]}
titulo={p.titulo}
propuesta={p}
onDescuentoChange={(v) => setDescuento(TITULOS_PROPUESTAS[i][1], v)}
onDescuentoChange={(v) => setDescuento(params.propuestas[i].claveDescuento, v)}
/>
))}
</div>
@@ -237,7 +274,7 @@ export default function CotizadorPage() {
precioLista={precioLista}
apartado={apartado}
propuestas={propuestas}
titulos={TITULOS_PROPUESTAS.map(([titulo]) => titulo)}
titulos={propuestas.map((p) => p.titulo)}
/>
<div className="mt-16 flex justify-end">
<button

View File

@@ -1,6 +1,6 @@
import { describe, it, expect, vi, afterEach } from 'vitest'
import { getUnidades } from './api'
import { UNIDADES_SEED } from '../data/unidades'
import { INVENTARIO_SEED } from '../data/unidades'
import type { Unidad } from '../types'
const unidadApi: Unidad = {
@@ -50,7 +50,7 @@ describe('getUnidades', () => {
const resultado = await getUnidades()
expect(resultado.usandoSeed).toBe(true)
expect(resultado.unidades).toEqual(UNIDADES_SEED)
expect(resultado.unidades).toEqual(INVENTARIO_SEED)
expect(warn).toHaveBeenCalledOnce()
})
@@ -61,7 +61,7 @@ describe('getUnidades', () => {
const resultado = await getUnidades()
expect(resultado.usandoSeed).toBe(true)
expect(resultado.unidades).toEqual(UNIDADES_SEED)
expect(resultado.unidades).toEqual(INVENTARIO_SEED)
expect(warn).toHaveBeenCalledOnce()
})
})

View File

@@ -1,5 +1,5 @@
import type { Unidad } from '../types'
import { UNIDADES_SEED } from '../data/unidades'
import { INVENTARIO_SEED } from '../data/unidades'
// TODO produccion: '/api' same-origin detras de NGINX
const API_URL = import.meta.env.VITE_API_URL ?? 'http://192.168.10.123:3000/api'
@@ -23,6 +23,6 @@ export async function getUnidades(): Promise<GetUnidadesResult> {
return { unidades, usandoSeed: false }
} catch (err) {
console.warn('[api] No se pudo obtener el inventario del API; usando seed local.', err)
return { unidades: UNIDADES_SEED, usandoSeed: true }
return { unidades: INVENTARIO_SEED, usandoSeed: true }
}
}

View File

@@ -1,14 +1,29 @@
export type StatusUnidad =
| 'DISPONIBLE'
| 'APARTADA'
| 'VENDIDA'
| 'APARTADO'
| 'VENDIDO'
| 'ESCRITURADO'
| 'BLOQUEADO'
export interface Unidad {
codigo: string // 'U-101'
modelo: string // '1R' | '2RA' | '2RB' | '2RC'
fechaEntrega: string // ISO 'YYYY-MM-DD' (terminación de obra)
supEstacionamiento: number // m2
supConstruccion: number // m2
supExcedente: number // m2
precioSinAcabados: number // MXN
precioConAcabados: number // MXN
status: 'DISPONIBLE' | 'APARTADA' | 'VENDIDA'
desarrollo?: string // lo agrega el API Gateway (Monday); el seed local no lo trae
codigo: string // 'U-101' (DIAGONAL), 'ATELIER-10', 'ESTANZA-52', 'SENDA-411-1-7', 'SOLANA-6'
modelo: string // '1R' | '2RA' | '2RB' | '2RC' | 'TRIBECA' | 'SOHO' | 'DUPLO A' | ...
fechaEntrega: string | null // ISO 'YYYY-MM-DD' (terminación de obra); null si no aplica o se desconoce
supEstacionamiento: number | null // m2
supConstruccion: number | null // m2
supExcedente: number | null // m2
precioSinAcabados: number // MXN (en desarrollos de precio único = precioLista)
precioConAcabados: number // MXN (en desarrollos de precio único = precioLista)
status: StatusUnidad
desarrollo?: string // 'DIAGONAL' | 'ATELIER' | 'ESTANZA' | 'SENDA' | 'SOLANA'
/** Precio único de lista (desarrollos sin distinción de acabados) */
precioLista?: number | null
/** Plazo de mensualidades cuando lo fija el inventario (SOLANA: meses para firma) */
mesesParaFirma?: number | null
/** Datos extra del inventario: prototipo, manzana, lote, etapa, cajones, etc. */
extras?: Record<string, string | number | null>
}
export interface Cliente {
@@ -29,3 +44,49 @@ export interface DescuentosPropuestas {
contado: number
semiContado: number
}
// ---------- Parametrización por desarrollo ----------
/** Sobre qué precio se calcula un componente: lista o final (c/descuento) */
export type BasePrecio = 'lista' | 'final'
/**
* Cómo se calcula el total de mensualidades:
* - ninguna: sin mensualidades (Contado)
* - remanente: precioFinal − apartado − enganche − pagoFinal
* - remanenteLista: precioLista − pagoFinal − apartado − enganche (quirk DIAGONAL Infonavit)
* - porcentaje: precioFinal × (1 − pctEnganche − pctPagoFinal)
*/
export type ModoMensualidades = 'ninguna' | 'remanente' | 'remanenteLista' | 'porcentaje'
export interface PropuestaConfig {
tipo: TipoPropuesta
/** Clave dentro de DescuentosPropuestas donde vive el descuento editable */
claveDescuento: keyof DescuentosPropuestas
/** Título para mostrar (p. ej. 'Crédito Cofinavit' en ATELIER) */
titulo: string
descuentoDefault: number // fracción (0.02 = 2%)
pctEnganche: number
engancheBase: BasePrecio
pctPagoFinal: number
pagoFinalBase: BasePrecio
modoMensualidades: ModoMensualidades
/** SOLANA Infonavit: si pctEnganche es 0, el enganche es 0 (no se resta el apartado) */
engancheCeroSinApartado?: boolean
}
export interface ParametrosDesarrollo {
id: string // 'DIAGONAL'
nombre: string // nombre para mostrar
/** true => un solo precio de lista; se oculta el toggle de acabados */
precioUnico: boolean
/** De dónde sale N (número de mensualidades) */
fuenteDeN: 'fechaEntrega' | 'fijo' | 'porUnidad'
/** N fijo cuando fuenteDeN === 'fijo' (entrega inmediata / term. obra) */
nFijo?: number
/** Texto de cuota de mantenimiento para el PDF */
cuotaMantenimiento: string
/** Prefijo de la unidad en el PDF ('CASA', 'DEPTO') */
prefijoUnidadPdf: string
propuestas: PropuestaConfig[]
}