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.
BudgetMeasurement
Sección titulada «BudgetMeasurement»| 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"]]BudgetMeasurementLine
Sección titulada «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. |
Cálculo del parcial
Sección titulada «Cálculo del parcial»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 *= dimreturn (n * base).quantize(DEC2, rounding=ROUND_HALF_UP)Redondeo
Sección titulada «Redondeo»- Dimensiones: 2 decimales.
- Parcial: 2 decimales (
ROUND_HALF_UP). - Total de medición: 2 decimales.
Véase también Reglas de redondeo.
Espacios
Sección titulada «Espacios»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.