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