Ir al contenido

Mediciones

Ficheros: backend/app/models/budget_measurement.py, backend/app/services/budget_breakdown_service.py.

En Serconsa las mediciones viven a nivel de partida (BudgetItem), no de descompuesto. Cada partida puede tener varias mediciones, y cada medición varias líneas.

Campo Tipo Descripción
id UUID PK
budget_item_id UUID FK a budget_items.
tipo string(30) Tipo de medición (manual, bc3, etc.).
descripcion text Descripción de la medición.
total Numeric(18,4) Suma de los parciales de sus líneas.
cantidad_certificada Numeric(18,4) Cantidad ya certificada.
orden int Orden dentro de la partida.

Relación:

item: Mapped["BudgetItem"]
lines: Mapped[list["BudgetMeasurementLine"]]

Cada línea representa una medición geométrica.

Campo Tipo Descripción
n Numeric(18,4) Número de veces.
largo Numeric(18,4) Dimensión L.
ancho Numeric(18,4) Dimensión A.
alto Numeric(18,4) Dimensión H.
formula string(100) Fórmula alternativa (p. ej. L*A*N).
tipo string(10) Tipo de línea.
comentario text Nota libre.
espacio string(100) Zona / planta (Presto Tema 19).
tag string(50) Etiqueta.
estado_pres string(30) Estado presupuesto.
color string(7) Color.
fase_plan / fase_real / fase_cert string(50) Fases planificada, real y certificada.
cota / sup_cons / pres_m2 / pres_dim_alt Numeric Campos semánticos Presto.
parcial Numeric(18,4) Resultado N×L×A×H o fórmula.
orden int Orden dentro de la medición.

El parcial se calcula en BudgetBreakdownService._compute_line_parcial (backend/app/services/budget_breakdown_service.py:411):

largo = _safe_decimal(data.get("largo"), Decimal("0"))
ancho = _safe_decimal(data.get("ancho"), Decimal("0"))
alto = _safe_decimal(data.get("alto"), Decimal("0"))
n = _safe_decimal(data.get("n"), Decimal("1"))
active = [d for d in (largo, ancho, alto) if d != 0]
if not active:
return Decimal("0").quantize(DEC2, rounding=ROUND_HALF_UP)
base = Decimal("1")
for dim in active:
base *= dim
return (n * base).quantize(DEC2, rounding=ROUND_HALF_UP)
  • Dimensiones: 2 decimales.
  • Parcial: 2 decimales (ROUND_HALF_UP).
  • Total de medición: 2 decimales.

Véase también Reglas de redondeo.

El campo espacio permite agrupar líneas por zona. Hay endpoints dedicados en backend/app/api/v1/budget_espacios.py para listar y renombrar espacios.