Files
aufmass-web/_aufmass_web/app/modules/sas_mecka.py
T

186 lines
7.2 KiB
Python

from flask import render_template
from flask_login import current_user
from app.extensions import db
from app.models.lv import LVPosition
TEMPLATE = 'components/modul_sas_mecka.html'
def get_formular_html():
return render_template(TEMPLATE)
def _lookup_pos(pos_nr):
lv_pos = LVPosition.query.filter_by(
company_id=current_user.company_id,
pos_nr=pos_nr
).first()
if lv_pos:
return {'pos_nr': lv_pos.pos_nr, 'kurztext': lv_pos.kurztext,
'einheit': lv_pos.einheit, 'einzelpreis': lv_pos.einzelpreis}
return {'pos_nr': pos_nr, 'kurztext': f'Position {pos_nr}',
'einheit': 'ST', 'einzelpreis': 0}
def _make_pos(pos_nr, faktor=1.0, laenge=0, breite=0, tiefe=0,
menge=None, bemerkung='', abschnitt=''):
lv = _lookup_pos(pos_nr)
pos = {'pos_nr': pos_nr, 'kurztext': lv['kurztext'],
'einheit': lv['einheit'], 'einzelpreis': lv['einzelpreis'],
'faktor': faktor, 'laenge': laenge, 'breite': breite, 'tiefe': tiefe,
'bemerkung': bemerkung, 'abschnitt': abschnitt}
if menge is not None:
pos['menge'] = menge
return pos
def berechne(form_data):
positionen = []
abschnitt_ha = form_data.get('scan_name_ha', '')
# ── HA (Hausanschluss) ──
if form_data.get('ha_herstellen') == 'an':
for pnr in ['01.06.0001', '01.06.0003', '01.06.0007']:
positionen.append(_make_pos(pnr, faktor=1.0, menge=1,
abschnitt=abschnitt_ha))
anz_qkr = _float(form_data.get('anz_qkr', 0))
anz_qst = _float(form_data.get('anz_qst', 0))
if anz_qkr > 0:
bem = "Siehe Bild: "
positionen.append(_make_pos('01.03.0019',
faktor=anz_qst if anz_qst > 0 else 1,
laenge=1.0, menge=1.0, bemerkung=bem,
abschnitt=abschnitt_ha))
positionen.append(_make_pos('01.03.0020',
faktor=anz_qkr, laenge=0.5, menge=0.5,
bemerkung=bem, abschnitt=abschnitt_ha))
trmeter = _float(form_data.get('trassenmeter', 0))
strqm_ha = _float(form_data.get('strqm', 0))
if trmeter > 0:
positionen.append(_make_pos('01.06.0004',
faktor=1.0, laenge=trmeter,
abschnitt=abschnitt_ha))
einzug10 = form_data.get('einzug_10er') == 'an'
if einzug10:
positionen.append(_make_pos('01.04.0003',
faktor=1.0, laenge=trmeter, menge=trmeter,
abschnitt=abschnitt_ha))
positionen.append(_make_pos('01.06.0006',
faktor=1.0, laenge=trmeter, menge=trmeter,
abschnitt=abschnitt_ha))
else:
leange = trmeter + 1 + strqm_ha
positionen.append(_make_pos('01.06.0006',
faktor=1.0, laenge=leange,
abschnitt=abschnitt_ha))
kabelm_ha = _float(form_data.get('kabelmeter_ha', 0))
if kabelm_ha > 0:
bem = "Siehe Bild: "
positionen.append(_make_pos('01.03.0019',
faktor=1.0, laenge=kabelm_ha, menge=kabelm_ha,
bemerkung=bem, abschnitt=abschnitt_ha))
positionen.append(_make_pos('01.03.0020',
faktor=1.0, laenge=kabelm_ha, menge=kabelm_ha,
bemerkung=bem, abschnitt=abschnitt_ha))
if strqm_ha > 0:
positionen.append(_make_pos('01.03.0008',
faktor=1.0, laenge=strqm_ha, menge=strqm_ha,
bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_ha))
anz_sh = _float(form_data.get('anz_suchgrube_ha', 0))
if anz_sh > 0:
positionen.append(_make_pos('01.03.0018',
faktor=1.0, menge=anz_sh,
bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_ha))
# ── TB (Tiefbau) ──
tb_laenge = _float(form_data.get('tb_laenge', 0))
tb_tiefe = _float(form_data.get('tb_tiefe', 0))
abschnitt_tb = form_data.get('scan_name_tb', '')
if tb_laenge > 0 and tb_tiefe > 0:
if tb_tiefe <= 0.65:
tief_key = '0.6'
elif tb_tiefe <= 0.9:
tief_key = '0.8'
else:
tief_key = '1.2'
tiefe_map = {
'0.6': {'unbe': '01.03.0001', 'be_kg2': '01.03.0004',
'be_kg4': '01.03.0005', 'be_kg6': '01.03.0006'},
'0.8': {'unbe': '01.03.0002', 'be_kg2': '01.03.0008',
'be_kg4': '01.03.0009', 'be_kg6': '01.03.0010'},
'1.2': {'unbe': '01.03.0003', 'be_kg2': '01.03.0012',
'be_kg4': '01.03.0013', 'be_kg6': '01.03.0014'},
}
tm = tiefe_map[tief_key]
if form_data.get('tb_unbefestigt') == 'an':
positionen.append(_make_pos(tm['unbe'],
faktor=1.0, laenge=tb_laenge,
abschnitt=abschnitt_tb))
if form_data.get('tb_befestigt') == 'an':
for kg_key, map_key in [('tb_kg2', 'be_kg2'), ('tb_kg4', 'be_kg4'),
('tb_kg6', 'be_kg6')]:
if form_data.get(kg_key) == 'an':
positionen.append(_make_pos(tm[map_key],
faktor=1.0, laenge=tb_laenge,
abschnitt=abschnitt_tb))
anz_4x20 = _float(form_data.get('tb_anz_4x12', 0))
if anz_4x20 > 0:
positionen.append(_make_pos('01.04.0001',
faktor=anz_4x20, laenge=tb_laenge, menge=tb_laenge,
bemerkung=f"{int(anz_4x20)}x 4x20 Rohre",
abschnitt=abschnitt_tb))
anz_12x10 = _float(form_data.get('tb_anz_12x10', 0))
if anz_12x10 > 0:
positionen.append(_make_pos('01.04.0002',
faktor=anz_12x10, laenge=tb_laenge, menge=tb_laenge,
bemerkung=f"{int(anz_12x10)}x 12x10 Rohre",
abschnitt=abschnitt_tb))
tb_anz_qs = _float(form_data.get('tb_anz_qs', 0))
if tb_anz_qs > 0:
bem = "Siehe Bild: "
tb_anz_qk = _float(form_data.get('tb_anz_qk', 0))
positionen.append(_make_pos('01.03.0019',
faktor=tb_anz_qs, laenge=1.0, menge=1.0,
bemerkung=bem, abschnitt=abschnitt_tb))
positionen.append(_make_pos('01.03.0020',
faktor=tb_anz_qk if tb_anz_qk > 0 else 1,
laenge=0.5, menge=0.5, bemerkung=bem,
abschnitt=abschnitt_tb))
tb_kabelm = _float(form_data.get('tb_kabelmeter', 0))
if tb_kabelm > 0:
bem = "Siehe Bild: "
positionen.append(_make_pos('01.03.0019',
faktor=1.0, laenge=tb_kabelm, menge=tb_kabelm,
bemerkung=bem, abschnitt=abschnitt_tb))
positionen.append(_make_pos('01.03.0020',
faktor=1.0, laenge=tb_kabelm, menge=tb_kabelm,
bemerkung=bem, abschnitt=abschnitt_tb))
anz_tb_sg = _float(form_data.get('tb_anz_suchgrube', 0))
if anz_tb_sg > 0:
positionen.append(_make_pos('01.03.0018',
faktor=1.0, menge=anz_tb_sg,
bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_tb))
return positionen
def _float(val, default=0):
try:
return float(str(val).replace(',', '.'))
except (ValueError, TypeError):
return default