developmentStats — los números calculados del desarrollo

Cuando el objeto es un desarrollo, la respuesta trae un bloque developmentStats con los indicadores agregados de sus unidades: cuántas hay y en qué estado, cuánto se comercializó separando venta de alquiler, los m² disponibles, el precio por moneda y la distribución por tipología.

Son los mismos números que mostramos en nuestro panel de desarrollos. No tenés que recorrer las unidades ni calcular nada: viene resuelto, en verify, en el POST, en el PUT y en el GET.

1. No confundirlo con canonical.development

Son dos bloques distintos, y la diferencia es de quién es cada uno:

canonical.developmentlo que mandaste, tal cual. El eco de tu objeto
developmentStatslo que calculamos sobre tus unidades

Por eso no está adentro de canonical: ahí sólo va tu objeto, verbatim.

2. El bloque, completo

{
  "units": {
    "total": 4,
    "available": 1,
    "sold": 1,
    "rented": 1,
    "reserved": 1,
    "suspended": 0,
    "withOperation": 3,
    "availabilityRate": 25
  },
  "sale":  { "units": 3, "commercialized": 2, "rate": 67 },
  "rent":  { "units": 1, "commercialized": 1, "rate": 100 },
  "otherOperation": { "units": 0 },
  "buildingArea": {
    "unit": "m2",
    "total": 220,
    "available": 62,
    "unavailable": 158,
    "sold": 48,
    "rented": 48,
    "reserved": 62
  },
  "prices": {
    "mixedCurrencies": true,
    "byCurrency": {
      "USD": { "units": 3, "from": 85000, "to": 120000, "total": 325000 },
      "ARS": { "units": 1, "from": 450000, "to": 450000, "total": 450000 }
    }
  },
  "typology": {
    "byAmbiences":    { "2": 2, "3": 2 },
    "byRooms":        { "1": 2, "2": 2 },
    "byBuildingArea": { "48": 2, "62": 2 },
    "byLandArea":     { "70": 4 }
  }
}

Los nombres son los mismos que vos posteás: tus m² cubiertos son buildingArea, tus dormitorios son rooms, tus m² totales son landArea. No hay un vocabulario nuevo que aprender.

3. units — cuántas y en qué estado

CampoQué es
totalCuántas unidades tiene el desarrollo
availableDisponibles: ninguno de los cuatro estados de abajo
sold · rented · reserved · suspendedVendidas, alquiladas, reservadas, suspendidas
withOperationUnidades con al menos uno de esos cuatro estados
availabilityRateavailable / total, porcentaje entero

withOperation cuenta unidades, no estados: una unidad vendida y reservada cuenta una. Por eso available + withOperation siempre da total, y los disponibles nunca dan negativo.

4. 🔴 sale y rent — venta y alquiler se miden SEPARADO

Es la parte que más conviene entender, porque es donde un promedio único miente.

Venta y alquiler son negocios distintos y no se promedian. Cada uno se mide contra su propio universo, y el evento que cuenta como comercializada es distinto:

UniversoSe comercializa cuando está…
salelas unidades en ventavendida o reservada
rentlas unidades en alquileralquilada o reservada

En el ejemplo de arriba, el alquiler está colocado al 100 % y la venta al 67 %. Un promedio único diría "75 %" y no diría nada de ninguno de los dos negocios.

rate: null no es 0

ValorSignifica
0hay unidades de esa operación y no se colocó ninguna
nullno hay unidades de esa operación: la pregunta no aplica

Un desarrollo de puros alquileres devuelve "sale": { "units": 0, "commercialized": 0, "rate": null } — no un 0 % de ventas que no existen.

otherOperation

Las unidades en permuta, traspaso, compartir o remate no entran en ninguna de las dos tasas: no son venta ni alquiler. Se cuentan aparte para que sale.units + rent.units + otherOperation.units dé siempre el total y ninguna unidad desaparezca.

5. buildingArea — los metros cuadrados cubiertos

CampoQué es
unitLa unidad de medida. Siempre m2
totalLos m² cubiertos de todas las unidades, sumados
availabletotal − unavailable
unavailableLos que no están disponibles: vendido, reservado o alquilado
sold · rented · reservedLos de cada estado

unavailable es un o, no una suma: los m² de una unidad vendida y reservada se descuentan una vez. Por eso sold + rented + reserved puede dar más que unavailable, y available nunca da negativo.

6. 🔴 prices — siempre por moneda

Un desarrollo puede tener unidades en monedas distintas, y eso es normal. Así que el precio se devuelve siempre desglosado:

CampoQué es
byCurrency.{MONEDA}.unitsCuántas unidades usan esa moneda
byCurrency.{MONEDA}.fromEl precio más bajo en esa moneda — el "desde" del desarrollo
byCurrency.{MONEDA}.toEl más alto — el "hasta"
byCurrency.{MONEDA}.totalLa suma en esa moneda
mixedCurrenciestrue si hay más de una

No devolvemos un total que cruce monedas. Un rango que mezcla dólares con pesos no es un dato degradado: es un dato falso. Si querés un total único, convertí vos con la cotización que uses — es una decisión tuya, no nuestra.

⚠️ Una unidad con precio pero sin moneda declarada no entra al desglose: no le inventamos una.

7. typology — la distribución de las unidades

Cuántas unidades hay de cada configuración. Son mapas: la clave es el valor y el valor es cuántas unidades.

MapaAgrupa por
byAmbiencescantidad de ambientes (ambiences)
byRoomscantidad de dormitorios (rooms)
byBuildingAream² cubiertos (buildingArea)
byLandAream² totales (landArea)

"byAmbiences": { "2": 18, "3": 22 } se lee: 18 unidades de 2 ambientes y 22 de 3.

No tienen techo: si tenés unidades de 9 ambientes, aparece la clave "9". Y una configuración que ninguna unidad tiene no aparece — no sale como 0.

Recordá el cruce de nombres de nuestro modelo, el mismo que en una propiedad suelta: ambiences son los ambientes y rooms los dormitorios.

8. Un desarrollo sin unidades

El bloque sale igual, con los contadores en cero, los mapas vacíos y las dos tasas en null. No es lo mismo que ausente: te está diciendo que el desarrollo existe y todavía no tiene unidades cargadas, que es un estado normal.

El bloque no aparece cuando el objeto no es un desarrollo.

9. Y después

El objeto JSON del desarrollo — cómo se declara, y las reglas de las unidades

Verificar y dar de alta un desarrollo — el flujo y qué validamos

GET /properties — consultar un desarrollo ya cargado