186 lines
7.2 KiB
Python
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
|