Initial import: Carteasy Shop (Dev-Stand)

This commit is contained in:
Thomas Bartelt
2026-04-20 01:03:43 +02:00
commit d504f8a05d
3845 changed files with 761050 additions and 0 deletions
@@ -0,0 +1,10 @@
{* Form Actions: Save & Cancel *}
<div class="admin2000-form-actions">
<button type="submit" class="admin2000-btn admin2000-btn-primary">
💾 Speichern
</button>
<a href="./index.php?admin_modul=admin2000&section=stammdaten&page=kunden" class="admin2000-btn admin2000-btn-secondary">
Abbrechen
</a>
</div>
@@ -0,0 +1,101 @@
{* Section: Adressen *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Adressen</div>
{if $customer_addresses}
<div class="admin2000-address-grid">
{foreach from=$customer_addresses item=address}
<div class="admin2000-address-card">
<div class="admin2000-address-card-header">
Adresse
{if $address.id == $customer_data.default_address}
<span class="admin2000-badge-primary">Standard</span>
{/if}
</div>
<div class="admin2000-address-card-body">
{* Honorific (0=Herr, 1=Frau, 2=Firma) *}
{if $address.honorific == 0}
<div class="admin2000-address-honorific">Herr</div>
{elseif $address.honorific == 1}
<div class="admin2000-address-honorific">Frau</div>
{elseif $address.honorific == 2}
<div class="admin2000-address-honorific">Firma</div>
{/if}
{if $address.company != ''}
<div class="admin2000-address-company">{$address.company|escape:'html'}</div>
{/if}
<div class="admin2000-address-name">
{$address.firstname|escape:'html'} {$address.surname|escape:'html'}
</div>
<div class="admin2000-address-street">
{$address.street|escape:'html'} {$address.house_number|escape:'html'}
</div>
<div class="admin2000-address-city">
{$address.zip_code|escape:'html'} {$address.city|escape:'html'}
</div>
{if $address.country_name}
<div class="admin2000-address-country">{$address.country_name|escape:'html'}</div>
{/if}
</div>
<div class="admin2000-address-card-actions">
{if $address.id != $customer_data.default_address}
<button type="button" class="admin2000-btn-small admin2000-btn-secondary set-standard-address" data-address-id="{$address.id}">
Standard setzen
</button>
{/if}
<a href="./index.php?admin_modul=admin_customer_actions&action=edit_customer_address&address_id={$address.id}" class="admin2000-btn-small admin2000-btn-primary">
Bearbeiten
</a>
<button type="button" class="admin2000-btn-small admin2000-btn-danger delete-address" data-address-id="{$address.id}">
Löschen
</button>
</div>
</div>
{/foreach}
{* Add New Address Card *}
<div class="admin2000-address-card admin2000-address-card-add">
<a href="./index.php?admin_modul=admin_customer_actions&action=new_customer_address&customer_id={$customer_id}" class="admin2000-address-add-link">
<div class="admin2000-address-add-icon">+</div>
<div class="admin2000-address-add-text">Neue Adresse hinzufügen</div>
</a>
</div>
</div>
{else}
<div class="admin2000-empty-state">
<p>Keine Adressen vorhanden</p>
<a href="./index.php?admin_modul=admin_customer_actions&action=new_customer_address&customer_id={$customer_id}" class="admin2000-btn admin2000-btn-primary">
Erste Adresse hinzufügen
</a>
</div>
{/if}
</div>
<script>
$(document).ready(function() {
// Delete address confirmation
$('.delete-address').click(function() {
var addressId = $(this).data('address-id');
if (confirm('Adresse wirklich löschen?')) {
// TODO: AJAX delete call
window.location.href = './index.php?admin_modul=admin_customer_actions&action=delete_customer_address&address_id=' + addressId + '&customer_id={$customer_id}';
}
});
// Set standard address
$('.set-standard-address').click(function() {
var addressId = $(this).data('address-id');
// TODO: AJAX call to set standard
window.location.href = './index.php?admin_modul=admin_customer_actions&action=set_standard_address&address_id=' + addressId + '&customer_id={$customer_id}';
});
});
</script>
@@ -0,0 +1,36 @@
{* Section: Firmendaten *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Firmendaten</div>
{* Row 1: Firma (full width) *}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Firma</label>
<input type="text" class="admin2000-form-input" name="customer_field[company]" value="{$customer_data.company|escape:'html'}" autocomplete="off">
</div>
{* Row 2: Steuernummer + Ust-ID *}
<div class="admin2000-form-row admin2000-form-row-2">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Steuernummer</label>
<input type="text" class="admin2000-form-input" name="customer_field[tax_number]" value="{$customer_data.tax_number|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Ust-ID</label>
<input type="text" class="admin2000-form-input" name="customer_field[tax_id]" value="{$customer_data.tax_id|escape:'html'}" autocomplete="off">
</div>
</div>
{* Row 3: EU-Geschäfte *}
{if isset($select_values.eu_business)}
<div class="admin2000-form-group">
<label class="admin2000-form-label">EU-Geschäfte</label>
<select class="admin2000-form-select" name="customer_field[eu_business]">
{foreach from=$select_values.eu_business item=label key=value}
<option value="{$value}" {if $customer_data.eu_business == $value}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/if}
</div>
@@ -0,0 +1,34 @@
{* Header: Breadcrumb + Titel + Messages *}
<div class="admin2000-editor-header">
<div class="admin2000-breadcrumb">
<a href="./index.php?admin_modul=admin2000&section=stammdaten&page=kunden">Kunden</a>
<span class="admin2000-breadcrumb-separator">›</span>
<span class="admin2000-breadcrumb-current">
{if $customer_data.company}
{$customer_data.company}
{else}
{$customer_data.firstname} {$customer_data.surname}
{/if}
</span>
</div>
<h1 class="admin2000-editor-title">
Kunde bearbeiten
<span class="admin2000-editor-id">#{$customer_id}</span>
</h1>
</div>
{* Success Message *}
{if $save_success}
<div class="admin2000-success-box">
<strong>✅ Erfolgreich gespeichert!</strong> Die Kundendaten wurden aktualisiert.
</div>
{/if}
{* Error Message *}
{if isset($error)}
<div class="admin2000-error-box">
<strong>⚠️ Fehler:</strong> {$error}
</div>
{/if}
@@ -0,0 +1,60 @@
{* Section: Kontaktdaten *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Kontaktdaten</div>
{* Row 1: Anrede + Vorname + Nachname *}
<div class="admin2000-form-row admin2000-form-row-3">
{if isset($select_values.honorific)}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Anrede</label>
<select class="admin2000-form-select" name="customer_field[honorific]" autocomplete="off">
{foreach from=$select_values.honorific item=label key=value}
<option value="{$value}" {if $customer_data.honorific == $value}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/if}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Vorname *</label>
<input type="text" class="admin2000-form-input" name="customer_field[firstname]" value="{$customer_data.firstname|escape:'html'}" autocomplete="off" required>
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Nachname *</label>
<input type="text" class="admin2000-form-input" name="customer_field[surname]" value="{$customer_data.surname|escape:'html'}" autocomplete="off" required>
</div>
</div>
{* Row 2: Telefon + Handy + Fax *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Telefon</label>
<input type="text" class="admin2000-form-input" name="customer_field[phone]" value="{$customer_data.phone|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Handy</label>
<input type="text" class="admin2000-form-input" name="customer_field[mobile]" value="{$customer_data.mobile|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Fax</label>
<input type="text" class="admin2000-form-input" name="customer_field[fax]" value="{$customer_data.fax|escape:'html'}" autocomplete="off">
</div>
</div>
{* Row 3: E-Mail + Homepage (60/40 Split) *}
<div class="admin2000-form-row admin2000-form-row-mixed-3-2">
<div class="admin2000-form-group">
<label class="admin2000-form-label">E-Mail *</label>
<input type="email" class="admin2000-form-input" name="customer_field[email]" value="{$customer_data.email|escape:'html'}" autocomplete="off" required>
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Homepage</label>
<input type="url" class="admin2000-form-input" name="customer_field[website]" value="{$customer_data.website|escape:'html'}" autocomplete="off">
</div>
</div>
</div>
@@ -0,0 +1,44 @@
{* Section: Passwort *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Passwort</div>
{* Row 1: Password Action Dropdown *}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Aktion {if $customer_data.pass == ''}<span style="color:#999;font-size:12px;font-weight:normal;"> (Kunde hat kein Passwort)</span>{/if}</label>
<select id="password_action" class="admin2000-form-select" name="customer_password_action">
<option value="0">-</option>
<option value="1">Neues Passwort mit Benachrichtigung</option>
<option value="2">Neues Passwort manuell vergeben</option>
</select>
</div>
{* Row 2: Manual Password Fields (hidden by default) *}
<div id="show_passwords" style="display:none;">
<div class="admin2000-form-row admin2000-form-row-2">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Passwort</label>
<input type="password" class="admin2000-form-input" name="customer_field[pass1]" value="" autocomplete="new-password">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Passwort wiederholen</label>
<input type="password" class="admin2000-form-input" name="customer_field[pass2]" value="" autocomplete="new-password">
</div>
</div>
<div id="password_match_spring"></div>
</div>
<script>
$(document).ready(function() {
// Show/hide password fields based on action
$('#password_action').change(function() {
if ($(this).val() == '2') {
$('#show_passwords').slideDown();
} else {
$('#show_passwords').slideUp();
}
});
});
</script>
</div>
@@ -0,0 +1,58 @@
{* Section: Rechnungen / Bestellungen *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Bestellungen / Rechnungen</div>
{if $orders}
<div class="admin2000-orders-table-wrapper">
<table class="admin2000-table admin2000-orders-table">
<thead>
<tr>
<th>Bestellnummer</th>
<th>Bestelldatum</th>
<th>Bezahlstatus</th>
<th>Bestellwert</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
{foreach from=$orders item=order}
<tr>
<td>
<strong>
{$order.order_number|escape:'html'}
{if $order.order_revision}-{$order.order_revision|escape:'html'}{/if}
</strong>
</td>
<td>{$order.order_date|escape:'html'}</td>
<td>
<span class="admin2000-badge-status admin2000-badge-{$order.invoice_status_text|lower|replace:' ':'-'}">
{$order.invoice_status_text|escape:'html'}
</span>
</td>
<td>
<strong>{$order.order_total|escape:'html'}</strong>
</td>
<td>
<a href="./index.php?admin_modul=admin_order_editor&action=edit&id={$order.id}" class="admin2000-btn-small admin2000-btn-primary">
Bearbeiten
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<div class="admin2000-orders-summary">
<strong>Gesamt:</strong> {$orders|@count} Bestellung{if $orders|@count != 1}en{/if}
</div>
{else}
<div class="admin2000-empty-state">
<p>Keine Bestellungen vorhanden</p>
<small style="color: #6c757d;">Dieser Kunde hat noch keine Bestellungen aufgegeben.</small>
</div>
{/if}
</div>
@@ -0,0 +1,56 @@
{* Section: Stammdaten *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Stammdaten</div>
{* Row 1: Kundennummer + Freigabe *}
<div class="admin2000-form-row admin2000-form-row-2">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Kundennummer</label>
<input type="text" class="admin2000-form-input" name="customer_field[number]" value="{$customer_data.number|escape:'html'}">
</div>
{if isset($select_values.locked)}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freigabe</label>
<select class="admin2000-form-select" name="customer_field[locked]">
{foreach from=$select_values.locked item=label key=value}
<option value="{$value}" {if $customer_data.locked == $value}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/if}
</div>
{* Row 2: Kundengruppe + Rolle *}
<div class="admin2000-form-row admin2000-form-row-2">
{if isset($select_values.group_id)}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Kundengruppe</label>
<select class="admin2000-form-select" name="customer_field[group_id]">
{foreach from=$select_values.group_id item=label key=value}
<option value="{$value}" {if $customer_data.group_id == $value}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/if}
{if isset($select_values.admin_role_id)}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Rolle (Admin-Berechtigung)</label>
<select class="admin2000-form-select" name="customer_field[admin_role_id]">
<option value="">Keine Admin-Rechte</option>
{foreach from=$select_values.admin_role_id item=label key=value}
<option value="{$value}" {if $customer_data.admin_role_id == $value}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/if}
</div>
{* Row 3: Geburtsdatum (single field) *}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Geburtsdatum</label>
<input type="date" class="admin2000-form-input" name="customer_field[burth_date]" value="{if $customer_data.burth_date != '0000-00-00' && $customer_data.burth_date != ''}{$customer_data.burth_date|escape:'html'}{/if}">
</div>
</div>
@@ -0,0 +1,14 @@
{* Section: Steuer - Note: tax_number, tax_id, eu_business sind jetzt in firmendaten.tpl *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Steuereinstellungen</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Steuer anzeigen</label>
<select class="admin2000-form-select" name="customer_field[show_tax]">
<option value="1" {if $customer_data.show_tax == 1}selected{/if}>Ja (Preise inkl. MwSt.)</option>
<option value="0" {if $customer_data.show_tax == 0}selected{/if}>Nein (Nettopreise)</option>
</select>
<small style="display:block;margin-top:5px;color:#6c757d;">Beeinflusst die Preisanzeige für diesen Kunden</small>
</div>
</div>
@@ -0,0 +1,159 @@
{* Section: Zusatzfelder - Bankverbindung, Zahlungsmethoden, Weitere Daten *}
{* ============================================
SECTION 1: Bankverbindung
============================================ *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Bankverbindung</div>
{* Row 1: Kontoinhaber + Kontonummer + Geldinstitut *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Kontoinhaber</label>
<input type="text" class="admin2000-form-input" name="customer_field[account_holder]" value="{$customer_data.account_holder|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Kontonummer</label>
<input type="text" class="admin2000-form-input" name="customer_field[account_number]" value="{$customer_data.account_number|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Geldinstitut</label>
<input type="text" class="admin2000-form-input" name="customer_field[bank]" value="{$customer_data.bank|escape:'html'}" autocomplete="off">
</div>
</div>
{* Row 2: BLZ + IBAN + SWIFT/BIC *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">BLZ</label>
<input type="text" class="admin2000-form-input" name="customer_field[bank_number]" value="{$customer_data.bank_number|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">IBAN</label>
<input type="text" class="admin2000-form-input" name="customer_field[iban]" value="{$customer_data.iban|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">SWIFT/BIC</label>
<input type="text" class="admin2000-form-input" name="customer_field[swift_bic]" value="{$customer_data.swift_bic|escape:'html'}" autocomplete="off">
</div>
</div>
</div>
{* ============================================
SECTION 2: Zahlungsmethoden
============================================ *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Zahlungsmethoden</div>
<p style="margin-bottom: 20px; color: #6c757d; font-size: 14px;">
Hinweis: Damit der Kunde die Zahlungsart 'Bankeinzug bzw. Rechnung' wählen kann, muss für die Kundengruppe und die Lieferzone auch diese freigeschaltet sein!
</p>
{* Row 1: Bankeinzug + Rechnung + Skonto *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Bankeinzug</label>
<select class="admin2000-form-select" name="customer_field[direct_debit_active]">
<option value="1" {if $customer_data.direct_debit_active == 1}selected{/if}>freigegeben</option>
<option value="0" {if $customer_data.direct_debit_active == 0}selected{/if}>gesperrt</option>
</select>
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Rechnung</label>
<select class="admin2000-form-select" name="customer_field[rechnung_active]">
<option value="1" {if $customer_data.rechnung_active == 1}selected{/if}>freigegeben</option>
<option value="0" {if $customer_data.rechnung_active == 0}selected{/if}>gesperrt</option>
</select>
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Skonto %</label>
<select class="admin2000-form-select" name="customer_field[skonto]">
<option value="0" {if $customer_data.skonto == 0}selected{/if}>-</option>
<option value="1" {if $customer_data.skonto == 1}selected{/if}>1</option>
<option value="2" {if $customer_data.skonto == 2}selected{/if}>2</option>
<option value="3" {if $customer_data.skonto == 3}selected{/if}>3</option>
<option value="4" {if $customer_data.skonto == 4}selected{/if}>4</option>
<option value="5" {if $customer_data.skonto == 5}selected{/if}>5</option>
<option value="6" {if $customer_data.skonto == 6}selected{/if}>6</option>
<option value="7" {if $customer_data.skonto == 7}selected{/if}>7</option>
<option value="8" {if $customer_data.skonto == 8}selected{/if}>8</option>
<option value="9" {if $customer_data.skonto == 9}selected{/if}>9</option>
<option value="10" {if $customer_data.skonto == 10}selected{/if}>10</option>
</select>
</div>
</div>
</div>
{* ============================================
SECTION 3: Weitere Kundendaten
============================================ *}
<div class="admin2000-form-section">
<div class="admin2000-form-section-title">Weitere Kundendaten</div>
{* Row 1: Freitextfeld 1-3 *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 1</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield1]" value="{$customer_data.freetextfield1|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 2</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield2]" value="{$customer_data.freetextfield2|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 3</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield3]" value="{$customer_data.freetextfield3|escape:'html'}" autocomplete="off">
</div>
</div>
{* Row 2: Freitextfeld 4-6 *}
<div class="admin2000-form-row admin2000-form-row-3">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 4</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield4]" value="{$customer_data.freetextfield4|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 5</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield5]" value="{$customer_data.freetextfield5|escape:'html'}" autocomplete="off">
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Freitextfeld 6</label>
<input type="text" class="admin2000-form-input" name="customer_field[freetextfield6]" value="{$customer_data.freetextfield6|escape:'html'}" autocomplete="off">
</div>
</div>
{* Row 3: Artikel Export + Newsletter *}
<div class="admin2000-form-row admin2000-form-row-2">
<div class="admin2000-form-group">
<label class="admin2000-form-label">Artikel Export</label>
<select class="admin2000-form-select" name="customer_field[has_item_export]">
<option value="0" {if $customer_data.has_item_export == 0}selected{/if}>Nein</option>
<option value="1" {if $customer_data.has_item_export == 1}selected{/if}>Ja</option>
</select>
</div>
<div class="admin2000-form-group">
<label class="admin2000-form-label">Newsletter</label>
<select class="admin2000-form-select" name="customer_field[newsletter_sub]">
<option value="0" {if $customer_data.newsletter_sub == 0}selected{/if}>Nein</option>
<option value="1" {if $customer_data.newsletter_sub == 1}selected{/if}>Ja</option>
</select>
</div>
</div>
{* Row 4: Notiz (full width) *}
<div class="admin2000-form-group">
<label class="admin2000-form-label">Notiz</label>
<textarea class="admin2000-form-textarea" name="customer_field[info]" rows="6">{$customer_data.info|escape:'html'}</textarea>
</div>
</div>