Initialer Commit: Kundenverwaltung (PHP/Smarty)

Bestehende Codebasis als Ausgangsstand aufgenommen.

- .gitignore: Kundendaten (uploads_*), Smarty-Compile-Cache
  (templates_c), Laufzeit-Temp und Datenbank-Dumps ausgeschlossen;
  Verzeichnisstruktur ueber .gitkeep erhalten
- .gitattributes: Zeilenenden normalisiert (LF im Repo),
  Binaerformate markiert
- db-backup.php: MySQL-Zugangsdaten kommen jetzt wie im Rest der
  Anwendung aus der externen Konfiguration statt hartkodiert aus der
  Datei; Passwort wird ueber eine temporaere Optionsdatei statt per
  Kommandozeile uebergeben, Fehler von mysqldump/gzip werden gemeldet,
  Aufraeumen aelterer Backups berechnet Jahr und Monat konsistent

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 16:41:18 +02:00
co-authored by Claude Opus 5
commit e6eb55bc4b
2225 changed files with 1070301 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
<tr {if $nr%2==0}bgcolor='#dddddd'{/if} id='artrow{$nr|escape}'>
<td>
<button type="button" class='swart' onclick="swart({$nr|escape});"></button>
{if $type == 3}
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$nr|escape}" id="1angtyp{$nr|escape}" value="1" checked="checked" />Normal</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$nr|escape}" id="2angtyp{$nr|escape}" value="2" />Optional</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$nr|escape}" id="3angtyp{$nr|escape}" value="3" />Alternativ</label><br />
{else}
<input type="hidden" name="angtyp{$nr|escape}" id="1angtyp{$nr|escape}" value="1" />
<input type="hidden" id="2angtyp{$nr|escape}" value="1" />
<input type="hidden" id="3angtyp{$nr|escape}" value="1" />
{/if}
</td>
<td>
<button type="button" class='nopagebreak' id='pagebreakimg{$nr|escape}' onclick="togglePageBreak({$nr|escape});" title='<b>Automatischer Seitenumbruch</b><br />Durch klick wird eine neue Seite an dieser Stelle Erzwungen''></button>
<input type='hidden' id='pagebreak{$nr|escape}' name='pagebreak{$nr|escape}' value='' />
<label class='checktext'><input type="checkbox" class="artcheck" name="artact{$nr}" id="artact{$nr}" value="1" checked="checked" onclick="artactivate({$nr|escape})" title='Ohne Haken wird dieser Artikel nicht angezeigt und nicht gespeichert' />Aktiv</label><br />
<label class='artlabel'>Artikeltyp:</label><select class='artselect' name='arttyp{$nr|escape}' id='arttyp{$nr|escape}'>
{html_options values=$typids output=$typs selected="{$typ}"}
</select><br />
<label class='artlabel'>Artikelbeschreibung:</label><br />
<input class='art' value='' id='arthead{$nr|escape}' maxlength='50' name='arthead{$nr|escape}' onInput='addArtBlock({$type|escape},{$nr|escape});' /><br />
<div id='arteig{$nr|escape}'>
<div class="sweig_spacer"></div>
<input class='arteig' value='' id='arteig{$nr|escape}_1' maxlength='100' name='arteig{$nr|escape}_1' onChange='addEigBlock({$nr|escape},1);' />
<input class='artval' value='' id='artval{$nr|escape}_1' maxlength='50' name='artval{$nr|escape}_1' />
<select name='arteinh{$nr|escape}_1' id='arteinh{$nr|escape}_1' class='arteinh'>
{html_options values=$einhids output=$einhs selected="{$einh}"}
</select>
</div>
<p>
<label class='artlabel'>Bestellnummer (WA-Nr.):</label><br />
<input class='artwa' value='' id='artwa{$nr|escape}' maxlength='50' name='artwa{$nr|escape}' />
<label>Mwst:</label>
<select name='artmwst{$nr|escape}' id='artmwst{$nr|escape}' class='arteinh'>
{html_options values=$artmwstids output=$artmwsts selected="{$art.art.mwst_id|default:1}"}
</select>
</p>
</td>
<td class="pricetd">
<label class='artlabel'>Menge:</label><br />
<input class='artmen' value='' id='artmen{$nr|escape}' maxlength='7' pattern="\d{ldelim}0,3{rdelim}+(,\d{ldelim}0,3{rdelim})?" name='artmen{$nr|escape}' />
<select name='artmeneinh{$nr|escape}' id='artmeneinh{$nr|escape}' class='artmeneinh'>
{html_options values=$einhids output=$einhs selected="5"}
</select><br />
<label class='artlabel'>Preis:</label><br />
<input class='artpr' value='' id='artpr{$nr|escape}' pattern="-?\d+(,\d{ldelim}2{rdelim})?" name='artpr{$nr|escape}' /><br />
<label class='artlabel'>Rabatt:</label><br />
<input class='artpr' value='' id='artrab{$nr|escape}' maxlength='3' pattern="[0-9]*" name='artrab{$nr|escape}' /><b>%</b>
<br /><label class='checktext'><input type="checkbox" name="artrabtyp{$nr|escape}" id="artrabtyp{$nr|escape}" value="1" />Winterrabatt</label>
</td>
</tr>
<script>
$(function() {
$( "#arthead"+{$nr|escape} ).autocomplete({
source: "ajax/auto/art.php",
minLength: 2,
select: function( event, ui ) {
i=0;
$("#arthead{$nr}").val(ui.item.value);
$("#artpr{$nr|escape}").val(ui.item.preis);
$("#arttyp{$nr|escape}").val(ui.item.typ);
$("#artmeneinh{$nr|escape}").val(ui.item.einh);
cleareig({$nr});
i=0;
if(ui.item.eig)
{
$.each(ui.item.eig, function(index, value)
{
i++;
addEigBlock({$nr|escape},i);
$("#arteig"+{$nr|escape}+"_"+i).val(value.des);
$("#artval"+{$nr|escape}+"_"+i).val(value.val);
$("#arteinh"+{$nr|escape}+"_"+i).val(value.einh);
});
}
return false;
}
});
});
</script>