Bedienerhandbuch

Buchhaltungssystem (BMS) - intrasaar media

1. Systemanforderungen

KomponenteMindestversion
PHP7.4+ (getestet mit 8.0, 8.1, 8.2, 8.3, 8.4)
WebserverApache mit mod_rewrite oder Nginx
Schreibrechtedata/, uploads/

PHP-Erweiterungen

2. Installation

Schritt 1: Dateien hochladen

  1. ZIP-Datei buchhaltungssystem.zip herunterladen
  2. Entpacken
  3. Den Ordner accounting-system komplett auf den Webserver hochladen

Zielverzeichnis (Beispiel fuer intrasaar.de):

/var/www/vhosts/intrasaar.de/httpdocs/accounting-system/

Schritt 2: Verzeichnisrechte setzen

chmod -R 755 accounting-system/data/ accounting-system/uploads/

Falls der Webserver-Putzer dies nicht kann:

chmod -R 777 accounting-system/data/ accounting-system/uploads/
Hinweis: 777 ist fuer die Ersteinrichtung ok. Nach dem Testen auf 755 zuruecksetzen.

Schritt 3: .htaccess pruefen

Die .htaccess-Datei muss im Hauptverzeichnis liegen.

Fuer Nginx-Server - diesen Block in die nginx.conf einfuegen:

location /accounting-system/ {
    try_files $uri $uri/ /accounting-system/index.php?$query_string;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

3. Ersteinrichtung

Schritt 1: Setup aufrufen

Im Browser oeffnen:

https://ihredomain.de/accounting-system/setup.php

Das System leitet automatisch auf setup.php weiter, wenn die Daten-Dateien noch nicht existieren.

Schritt 2: Installation starten

  1. Admin-Passwort eingeben (Standard: admin123)
  2. Auf "Installation starten" klicken
  3. Das System erstellt ALLE noetigen Dateien: Benutzer, Beispiel-Kunden, Beispiel-Artikel, Einstellungen, Zaehler
  4. Auf "Zum Admin-Login" klicken

Schritt 3: Setup sperren

WICHTIG: Nach der Installation die Datei setup.php vom Server loeschen oder umbenennen!
rm setup.php
# Oder (empfohlen):
mv setup.php setup.php.old
Warum? setup.php kann jederzeit wieder ausgefuehrt werden und setzt alle Passwoerter zurueck.

4. Lizenzierung

Das System ist domaingebunden. Bei Kopie auf einen anderen Server blockiert es sich automatisch.

Lizenzschluessel generieren (nur fuer Entwickler)

generate_license.php ist nicht im Verteilungs-ZIP enthalten. Nur lokal ausfuehren:

require 'core/License.php';
$key = License::generateKey('kundendomain.de', 'unlimited', 0);
echo $key;
WICHTIG: generate_license.php nach Gebrauch lokal loeschen und niemals auf den Produktivserver laden.

Lizenzschluessel beim Kunden aktivieren

  1. Admin-Login -> Einstellungen -> Lizenz
  2. Schluessel eingeben -> "Lizenz aktivieren"
  3. Status zeigt "Aktiviert" mit Domain und Gueltigkeit

Was passiert bei Kopie?

Jeder Seitenaufruf (ausser Login und Setup) prueft, ob die aktuelle Domain mit der Domain im Lizenzschluessel uebereinstimmt. Bei Abweichung erfolgt eine Weiterleitung auf die Einstellungen mit Fehlermeldung.

Lizenzschluessel-Uebersicht

DomainSchluesselTyp
intrasaar.deBMS-eyJkIjoiaW50cmFzYWFyLmRlIiwidCI6InN0YW5kYXJkIiwiZSI6InVubGltaXRlZCJ9-d7aa3fc2standard/unlimited
www.intrasaar.deBMS-eyJkIjoid3d3LmludHJhc2Fhci5kZSIsInQiOiJzdGFuZGFyZCIsImUiOiJ1bmxpbWl0ZWQifQ-34323c74standard/unlimited

5. Login-Daten

Administrator

FeldWert
URLhttps://ihredomain.de/accounting-system/login
Benutzernameadmin
Passwortadmin123

Buchhalter

FeldWert
URLhttps://ihredomain.de/accounting-system/login
Benutzernamebuchhalter
Passwortadmin123

Kundenportal (Beispiel)

FeldWert
URLhttps://ihredomain.de/accounting-system/portal/login
E-Mailweber@techsolutions.de
Passwortadmin123
Nach dem ersten Login: Passwoerter umgehend aendern!

6. Funktionen

Dashboard

Rechnungen

Kunden

Artikel und Dienstleistungen

Berichte

Einstellungen

Benutzerverwaltung

Kundenportal

7. Verzeichnisstruktur

accounting-system/
    .htaccess              # Apache-Rewriting & Sicherheit
    index.php              # Haupt-Einstiegspunkt (Router)
    setup.php              # Ersteinrichtung (danach loeschen!)
    config/
        config.php         # Systemkonfiguration, Konstanten
    core/
        Auth.php           # Authentifizierung & Sitzung
        Database.php       # JSON-Datei-Database-Engine
        License.php        # Lizenzverwaltung
        Router.php         # URL-Routing
        Security.php       # XSS-Schutz, CSRF, Validierung
        Session.php        # Session-Management
    models/
        Model.php          # Basisklasse (CRUD)
        User.php           # Benutzer-Model
        Customer.php       # Kunden-Model
        Invoice.php        # Rechnungs-Model
        Item.php           # Artikel-Model
        Setting.php        # Einstellungen-Model
    controllers/
        AuthController.php       # Login/Logout
        DashboardController.php  # Dashboard
        CustomerController.php   # Kunden-CRUD
        InvoiceController.php    # Rechnungen-CRUD
        ItemController.php       # Artikel-CRUD
        ReportController.php     # Berichte & Export
        SettingController.php    # Einstellungen & Lizenz
        UserController.php       # Benutzer-CRUD
        PortalController.php     # Kundenportal
    views/
        layouts/
            header.php           # HTML-Head, Navigation
            footer.php           # HTML-Footer
        auth/login.php           # Admin-Login
        dashboard/index.php      # Dashboard-Ansicht
        customers/               # Kunden-Ansichten
        invoices/                # Rechnungs-Ansichten
        items/                   # Artikel-Ansichten
        reports/                 # Berichts-Ansichten
        settings/                # Einstellungs-Ansicht
        users/                   # Benutzer-Ansichten
        portal/                  # Kundenportal-Ansichten
    assets/
        css/style.css            # Stylesheet
        js/app.js                # JavaScript
    lib/
        EmailService.php         # E-Mail-Versand (SMTP)
        DatevExport.php          # DATEV-Export
    data/                        # JSON-Datenbank (beschreibbar!)
        skr03.json               # SKR03 Kontenrahmen
    uploads/                     # Uploads (beschreibbar!)

8. Konfiguration

Basispfad aendern

Falls das System in ein Unterverzeichnis verschoben wird, passt sich der Router automatisch an.

SMTP fuer E-Mail-Versand

In Einstellungen -> SMTP konfigurieren:

FeldBeschreibungBeispiel
SMTP-HostMailserversmtp.gmail.com
PortSMTP-Port587 (TLS) oder 465 (SSL)
BenutzernameE-Mail-Adresseuser@gmail.com
PasswortE-Mail-Passwort(App-Passwort bei Gmail)
VersandadresseAbsender-E-Mailrechnung@firma.de
AbsendernameName des AbsendersFirma GmbH
VerschluesselungTLS oder SSLtls

Produktiv-Einstellungen in config.php

Fuer den Produktivbetrieb in config/config.php pruefen:

ini_set('display_errors', '0');
ini_set('log_errors', '1');

9. Sicherheit

Was ist abgedeckt

SchutzUmsetzung
XSS-Schutzhtmlspecialchars() ueber Security::sanitize()
CSRF-SchutzToken-basiert in allen Formularen
Passwoerterpassword_hash() mit bcrypt (cost 12)
Session-SicherheitHttpOnly, Secure (bei HTTPS), SameSite=Lax, Timeout 30 Min
Versteckte Dateien.htaccess blockiert .json, .log, .ini
LizenzbindungHMAC-signierte Schluessel, domaingebunden

Nach der Installation

  1. setup.php loeschen (kritisch!)
  2. Standard-Passwoerter aendern (admin123)
  3. data/-Verzeichnis auf 755 setzen (nicht 777)
  4. SSL-Zertifikat installieren (HTTPS erzwingen)

10. Backup

Vollstaendiges Backup

# Gesamtes Verzeichnis sichern
tar czf backup-buchhaltung-$(date +%Y%m%d).tar.gz accounting-system/

# Nur Daten sichern
tar czf backup-daten-$(date +%Y%m%d).tar.gz \
    accounting-system/data/ \
    accounting-system/uploads/

Automatisches Backup (Cron)

# Taegliches Backup um 2:00 Uhr
0 2 * * * tar czf /backups/buchhaltung-$(date +\%Y\%m\%d).tar.gz /var/www/html/accounting-system/data/

11. Deployment auf neuem Server

Das System ist vollstaendig portabel. Alle Pfade sind relativ.

Checkliste

PruefpunktBefehl/Info
PHP >= 7.4?php -v
mod_rewrite aktiv?apache2ctl -M | grep rewrite
data/ beschreibbar?chmod 755 data/
uploads/ beschreibbar?chmod 755 uploads/
setup.php geloescht?ls setup.php - darf nicht existieren

Schritt-fuer-Schritt

  1. Dateien kopieren
  2. Rechte setzen: chmod -R 755 accounting-system/data/ accounting-system/uploads/
  3. setup.php aufrufen und Installation durchfuehren
  4. Lizenz aktivieren (neuer Schluessel fuer neue Domain noetig!)
  5. setup.php loeschen

Lizenz bei Serverwechsel

Der bestehende Lizenzschluessel gilt nur fuer die Original-Domain. Fuer den neuen Server:

  1. generate_license.php mit neuer Domain ausfuehren (lokal)
  2. Neuen Schluessel beim Kunden unter Einstellungen -> Lizenz eingeben

12. Fehlerbehebung

ERR_TOO_MANY_REDIRECTS

Ursache 1: Session-Cookie wird nicht gespeichert (HTTPS) - SSL pruefen, Browser-Cookies loeschen.

Ursache 2: setup.php wurde noch nicht ausgefuehrt - setup.php aufrufen und Installation starten.

Ursache 3: .htaccess-Konflikt mit Server-Konfiguration - parent-.htaccess und RewriteBase pruefen:

RewriteEngine On
RewriteBase /accounting-system/

Ursache 4: www/non-www Redirect-Schleife - Domain konsistent aufrufen (mit oder ohne www).

HTTP 500

Ursache 1: PHP-Fehler - temporaer Fehleranzeige aktivieren:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Ursache 2: Fehlende require_once-Zeilen in index.php.

Ursache 3: Verzeichnisrechte pruefen: chmod -R 755 data/ uploads/

Ursache 4: mod_rewrite nicht geladen: a2enmod rewrite && systemctl restart apache2

Login funktioniert nicht

  1. Passwort pruefen (Standard: admin123)
  2. Setup nochmal ausfuehren (setzt Passwoerter zurueck)
  3. Browser-Cookies loeschen, anderen Browser oder Incognito-Modus testen
  4. JSON-Datei pruefen: cat data/users.json | python3 -m json.tool

Daten werden nicht gespeichert

Ursache 1: Keine Schreibrechte - ls -la data/ pruefen.

Ursache 2: JSON-Datei beschraenkt - cat data/invoices.json | python3 -m json.tool

Rechnungsnummern-Spruenge

Das System nutzt einen Zaehler in data/counter.json. Bei jedem Erstellen wird er erhoht.

Performance-Probleme bei vielen Daten

JSON-Dateien werden bei jedem Zugriff komplett geladen. Ab ca. 1000+ Rechnungen kann es langsam werden. Loesung: Auf ein SQL-basiertes System migrieren.

Fehler im Apache Error Log finden

tail -50 /var/log/apache2/error.log

Bei Plesk/cPanel: Logs - Fehlerprotokolle im Hosting-Dashboard.