Initial commit – AufmaßCreater v2.35

This commit is contained in:
2026-06-10 11:03:43 +02:00
commit 84c933ea9c
2823 changed files with 490495 additions and 0 deletions
@@ -0,0 +1,249 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
@page {
size: A4 landscape;
margin: 5mm;
}
body {
font-family: DejaVu Sans, Helvetica, sans-serif;
font-size: 7pt;
margin: 0;
padding: 0;
color: #000;
}
table {
width: 100%;
border-collapse: collapse;
}
td, th {
border: 1px solid #000;
padding: 1px 2px;
vertical-align: middle;
}
.header-row td {
padding: 2px 4px;
font-size: 7.5pt;
text-align: left;
}
.label {
font-weight: bold;
background: #f2f2f2;
white-space: nowrap;
text-align: left;
}
.sm-header th {
background: #2F5496;
color: #fff;
font-weight: bold;
text-align: center;
font-size: 6pt;
padding: 2px 3px;
}
#pos-tbl td {
padding: 2px 3px;
}
tr.trenner td {
background: #f5f5f5;
height: 3px;
}
tr.sum-row td {
font-weight: bold;
font-size: 7pt;
}
.summary-title {
background: #D6E4F0;
color: #2F5496;
font-weight: bold;
font-size: 9pt;
text-align: center;
padding: 3px;
}
.summary-header th {
background: #2F5496;
color: #fff;
font-weight: bold;
text-align: center;
font-size: 6pt;
padding: 2px;
}
.summary-data td {
font-size: 7pt;
padding: 1px 3px;
}
.summary-sum td {
font-weight: bold;
font-size: 7pt;
border-bottom: 1px solid #000;
}
.num {
text-align: right;
}
.center {
text-align: center;
}
.left {
text-align: left;
}
</style>
</head>
<body>
<!-- Row 1: Logo / Firmenname / Aufmaß -->
<table style="margin-bottom:5mm; width:100%">
<tr>
{% if company and company.logo %}
<td style="border:none; width:30mm">
<img src="{{ company.logo }}" width="120">
</td>
<td style="border:none; text-align:center; vertical-align:middle; font-size:14pt; font-weight:bold; color:#2F5496">
Aufmaß
</td>
</tr>
{% else %}
<td style="border:none; font-size:14pt; font-weight:bold; color:#2F5496" colspan="2">
{% if company and company.name %}{{ company.name }}{% else %}Aufmaß{% endif %}
</td>
</tr>
{% endif %}
</table>
<!-- Header rows (Label-Spalten: 1,3,5,7 → jeweils 8%; Value-Spalten: 2,4,6,8 → Rest) -->
<table class="header-row">
<tr>
<td class="label" style="width:8%">Vertrag:</td>
<td style="width:17%">{{ _val(project.vertrag) or '' }}</td>
<td class="label" style="width:8%">LV-Name:</td>
<td colspan="3" style="width:42%">{{ _val(project.lv_name) or '' }}</td>
<td class="label" style="width:8%">Aufmaß-Datum:</td>
<td style="width:17%">{{ _fmt_date(project.datum) or '' }}</td>
</tr>
<tr>
<td class="label">Projekt:</td>
<td>{{ _val(project.bezeichnung) or '' }}</td>
<td class="label">Baustelle:</td>
<td colspan="5">{{ _val(project.baustelle) or '' }}</td>
</tr>
<tr>
<td class="label">Typ:</td>
<td>{{ _val(aufmass.typ if aufmass else none) or '' }}</td>
<td class="label">Bauabschnitt:</td>
<td colspan="5">{{ _val(project.bauabschnitt) or '' }}</td>
</tr>
<tr>
<td class="label">SM-Nr.:</td>
<td>{{ _val(project.sm_nr) or '' }}</td>
<td class="label">Startdatum:</td>
<td>{{ _fmt_date(project.datum_start) or '' }}</td>
<td class="label">Name:</td>
<td>{{ _val(ap_name) or '' }}</td>
<td class="label">Tel:</td>
<td>{{ _val(project.ansprechpartner_tel) or '' }}</td>
</tr>
<tr>
<td class="label">Abruf-Nr.:</td>
<td>{{ _val(project.abruf_nr) or '' }}</td>
<td class="label">Enddatum:</td>
<td>{{ _fmt_date(project.datum_ende) or '' }}</td>
<td class="label">Email:</td>
<td colspan="3">{{ _val(project.ansprechpartner_email) or '' }}</td>
</tr>
</table>
<br>
<!-- Position table (Spalten-% wie Excel max_widths) -->
<table id="pos-tbl">
<thead>
<tr class="sm-header">
<th style="width:7%">Abschn.</th>
<th style="width:6%">Pos-Nr</th>
<th style="width:4%">Fakt.</th>
<th style="width:5%">Länge</th>
<th style="width:5%">Breite</th>
<th style="width:5%">Tiefe</th>
<th style="width:6%">Menge</th>
<th style="width:3%">EH</th>
<th style="width:23%">Kurztext</th>
<th style="width:18%">Bemerkung</th>
<th style="width:6%">Menge</th>
<th style="width:6%">EP (€)</th>
<th style="width:6%">GP (€)</th>
</tr>
</thead>
<tbody>
{% if positionen %}
{% set ns = namespace(pos_counter=0, gesamt=0) %}
{% for pos in positionen %}
{% if _ist_trenner(pos) %}
<tr class="trenner"><td colspan="13"></td></tr>
{% else %}
{% set ns.pos_counter = ns.pos_counter + 1 %}
{% set menge = pos.menge if pos.menge else none %}
{% set menge_hinten = pos.menge_hinten if pos.menge_hinten else none %}
{% if pos.einheit in ('ST', 'LE', 'STD', 'h', 'Psch') %}
{% set menge = pos.faktor * 1 if pos.faktor else none %}
{% endif %}
{% set ns.gesamt = ns.gesamt + (pos.gesamtpreis or 0) %}
<tr>
<td class="center">{{ _val(pos.abschnitt) or '' }}</td>
<td>{{ pos.pos_nr or '' }}</td>
<td class="num">{{ '%.2f'|format(pos.faktor) if pos.faktor else '' }}</td>
<td class="num">{{ '%.2f'|format(pos.laenge) if pos.laenge else '' }}</td>
<td class="num">{{ '%.2f'|format(pos.breite) if pos.breite else '' }}</td>
<td class="num">{{ '%.2f'|format(pos.tiefe) if pos.tiefe else '' }}</td>
<td class="num">{{ '%.2f'|format(menge) if menge else '' }}</td>
<td class="center">{{ pos.einheit or '' }}</td>
<td class="left">{{ _val(pos.kurztext) or '' }}</td>
<td class="left">{{ _val(pos.bemerkung) or '' }}</td>
<td class="num">{{ '%.2f'|format(menge_hinten) if menge_hinten else '' }}</td>
<td class="num">{{ '%.2f'|format(pos.einzelpreis) if pos.einzelpreis else '' }}</td>
<td class="num">{{ '%.2f'|format(pos.gesamtpreis) if pos.gesamtpreis else '' }}</td>
</tr>
{% endif %}
{% endfor %}
<tr class="sum-row">
<td colspan="11"></td>
<td class="num">Summe:</td>
<td class="num">{{ '%.2f'|format(ns.gesamt) }}</td>
</tr>
{% endif %}
</tbody>
</table>
<!-- Summary section -->
{% if ns.pos_counter > 0 %}
<br>
<table style="width:100%">
<tr><td class="summary-title" colspan="5">Mengen- und Positions-Zusammenfassung</td></tr>
<tr class="summary-header">
<th style="width:7%">Pos-Nr</th>
<th style="width:48%">Kurztext</th>
<th style="width:11%">Menge</th>
<th style="width:20%">EP (€)</th>
<th style="width:14%">GP (€)</th>
</tr>
{% set total_gp = namespace(val=0) %}
{% for key in seen_pos %}
{% set g = groups[key] %}
{% set total_gp.val = total_gp.val + g['gp'] %}
<tr class="summary-data">
<td class="center">{{ key }}</td>
<td class="left" style="max-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap" title="{{ g['kurztext'] }}">{{ g['kurztext'][:120] + '...' if g['kurztext']|length > 120 else g['kurztext'] }}</td>
<td class="num">{{ '%.2f'|format(g['menge']) }}</td>
<td class="num">{{ '%.2f'|format(g['ep']) }}</td>
<td class="num">{{ '%.2f'|format(g['gp']) }}</td>
</tr>
{% endfor %}
<tr class="summary-sum">
<td colspan="2"></td>
<td class="num">Summe:</td>
<td class="num">{{ '%.2f'|format(total_gp.val) }}</td>
</tr>
</table>
{% endif %}
</body>
</html>