$_POST['company_name'] ?? '',
'company_address' => $_POST['company_address'] ?? '',
'company_zip' => $_POST['company_zip'] ?? '',
'company_city' => $_POST['company_city'] ?? '',
'company_country' => $_POST['company_country'] ?? '',
'tax_id' => $_POST['tax_id'] ?? '',
'vat_mode' => $_POST['vat_mode'] ?? 'klein',
'default_vat_rate'=> $_POST['default_vat_rate'] ?? 19.0,
'payment_terms' => $_POST['payment_terms'] ?? '',
'footer_text' => $_POST['footer_text'] ?? '',
'logo_path' => $settings['logo_path'] ?? null,
'iban' => $_POST['iban'] ?? '',
'phone' => $_POST['phone'] ?? '',
'email' => $_POST['email'] ?? '',
'website' => $_POST['website'] ?? '',
];
if (!empty($_FILES['logo']['tmp_name'])) {
$targetDir = __DIR__ . '/uploads/';
if (!is_dir($targetDir)) {
mkdir($targetDir, 0775, true);
}
$targetFile = $targetDir . 'logo.png';
if (move_uploaded_file($_FILES['logo']['tmp_name'], $targetFile)) {
$data['logo_path'] = 'uploads/logo.png';
}
}
save_settings($data);
$settings = get_settings();
$msg = 'Einstellungen gespeichert.';
}
// === JOURNAL TAB ===
// Jahr erstellen
if ($form === 'year') {
$y = (int)($_POST['year'] ?? 0);
if ($y >= 2000 && $y <= 2099) {
$existing = get_journal_year_by_year($y);
if ($existing) {
$error = "Jahr $y existiert bereits.";
} else {
create_journal_year($y, $_POST['notes'] ?? '');
$msg = "Jahr $y erstellt.";
}
} else {
$error = 'Ungültiges Jahr.';
}
$tab = 'journal';
}
// Jahr öffnen/schließen
if ($form === 'toggle_year') {
$id = (int)($_POST['id'] ?? 0);
if ($id) {
toggle_journal_year_closed($id);
$msg = 'Jahresstatus geändert.';
}
$tab = 'journal';
}
// Lieferant speichern
if ($form === 'supplier') {
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
$data = [
'name' => $_POST['name'] ?? '',
'sort_order' => $_POST['sort_order'] ?? 0,
'is_active' => isset($_POST['is_active']),
];
if ($data['name']) {
save_journal_supplier($id, $data);
$msg = 'Lieferant gespeichert.';
} else {
$error = 'Name ist Pflichtfeld.';
}
$tab = 'journal';
}
// Lieferant löschen
if ($form === 'delete_supplier') {
delete_journal_supplier((int)$_POST['id']);
$msg = 'Lieferant gelöscht.';
$tab = 'journal';
}
// Wareneingang-Kategorie speichern
if ($form === 'rev_cat') {
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
$data = [
'name' => $_POST['name'] ?? '',
'category_type' => $_POST['category_type'] ?? 'wareneingang',
'vat_rate' => $_POST['vat_rate'] ?? 19,
'sort_order' => $_POST['sort_order'] ?? 0,
'is_active' => isset($_POST['is_active']),
];
if ($data['name']) {
save_journal_revenue_category($id, $data);
$msg = 'Kategorie gespeichert.';
} else {
$error = 'Name ist Pflichtfeld.';
}
$tab = 'journal';
}
// Wareneingang-/Erlös-Kategorie löschen
if ($form === 'delete_rev_cat') {
delete_journal_revenue_category((int)$_POST['id']);
$msg = 'Kategorie gelöscht.';
$tab = 'journal';
}
// Aufwandskategorie speichern
if ($form === 'exp_cat') {
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
$data = [
'name' => $_POST['name'] ?? '',
'side' => $_POST['side'] ?? 'soll',
'sort_order' => $_POST['sort_order'] ?? 0,
'is_active' => isset($_POST['is_active']),
];
if ($data['name']) {
save_journal_expense_category($id, $data);
$msg = 'Aufwandskategorie gespeichert.';
} else {
$error = 'Name ist Pflichtfeld.';
}
$tab = 'journal';
}
// Aufwandskategorie löschen
if ($form === 'delete_exp_cat') {
delete_journal_expense_category((int)$_POST['id']);
$msg = 'Aufwandskategorie gelöscht.';
$tab = 'journal';
}
// Abzug speichern
if ($form === 'ded_cat') {
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
$data = [
'name' => $_POST['name'] ?? '',
'sort_order' => $_POST['sort_order'] ?? 0,
'is_active' => isset($_POST['is_active']),
];
if ($data['name']) {
save_journal_deduction_category($id, $data);
$msg = 'Abzug gespeichert.';
} else {
$error = 'Name ist Pflichtfeld.';
}
$tab = 'journal';
}
// Abzug löschen
if ($form === 'delete_ded_cat') {
delete_journal_deduction_category((int)$_POST['id']);
$msg = 'Abzug gelöscht.';
$tab = 'journal';
}
// Zusammenfassungsposten speichern
if ($form === 'summary_item') {
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
$data = [
'name' => $_POST['name'] ?? '',
'sort_order' => $_POST['sort_order'] ?? 0,
'is_active' => isset($_POST['is_active']),
];
if ($data['name']) {
save_journal_summary_item($id, $data);
$msg = 'Posten gespeichert.';
} else {
$error = 'Name ist Pflichtfeld.';
}
$tab = 'journal';
}
// Zusammenfassungsposten löschen
if ($form === 'delete_summary_item') {
delete_journal_summary_item((int)$_POST['id']);
$msg = 'Posten gelöscht.';
$tab = 'journal';
}
// === KONTO TAB ===
// Benutzername ändern
if ($form === 'change_username') {
$new_username = trim($_POST['new_username'] ?? '');
if (strlen($new_username) < 3) {
$error = 'Benutzername muss mindestens 3 Zeichen haben.';
} elseif (!update_username($_SESSION['user_id'], $new_username)) {
$error = 'Benutzername existiert bereits.';
} else {
$msg = 'Benutzername geändert.';
}
$tab = 'konto';
}
// Passwort ändern
if ($form === 'change_password') {
$current_pw = $_POST['current_password'] ?? '';
$new_pw = $_POST['new_password'] ?? '';
$confirm_pw = $_POST['confirm_password'] ?? '';
if (strlen($new_pw) < 6) {
$error = 'Neues Passwort muss mindestens 6 Zeichen haben.';
} elseif ($new_pw !== $confirm_pw) {
$error = 'Passwörter stimmen nicht überein.';
} elseif (!update_password($_SESSION['user_id'], $current_pw, $new_pw)) {
$error = 'Aktuelles Passwort ist falsch.';
} else {
$msg = 'Passwort geändert.';
}
$tab = 'konto';
}
}
// Journal-Daten laden
$years = get_journal_years();
$suppliers = get_journal_suppliers();
$we_cats = get_journal_revenue_categories('wareneingang');
$er_cats = get_journal_revenue_categories('erloese');
$exp_cats = get_journal_expense_categories();
$ded_cats = get_journal_deduction_categories();
$summary_items = get_journal_summary_items();
?>
Einstellungen
= htmlspecialchars($msg) ?>
= htmlspecialchars($error) ?>
Journal-Jahre
Hier verwalten Sie die Buchungsjahre. Ein geschlossenes Jahr kann nicht mehr bearbeitet werden.
Erlös-Kategorien
Kategorien für Einnahmen/Erlöse (z.B. "Umsatz 7%", "Umsatz 19%"). Diese erscheinen als Spalten im Journal.
Wareneingang-Kategorien
Kategorien für Wareneinkauf (z.B. "WE 7%", "WE 19%"). Diese erscheinen als Spalten im Journal.
Aufwandskategorien
Kategorien für Betriebsausgaben (z.B. "Miete", "Versicherung", "Telefon"). Diese erscheinen als Spalten im Journal und werden in der EÜR berücksichtigt.
Abzüge
Abzugskategorien (z.B. "Skonto", "Lotto"). Diese erscheinen als Haben-Spalten im Journal und werden in der EÜR berücksichtigt.
Lieferanten
Lieferanten können bei Buchungen ausgewählt werden, um die Zuordnung zu erleichtern.
Umsatz-Zusammenfassungsposten
Zusätzliche Posten für die monatliche Umsatzübersicht im Journal (z.B. "Reinigung", "RMV").