| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/seaside.pacim.de/web/ |
Upload File : |
# PACIM – Projektanalyse
> Analyse des Projektverzeichnisses `/var/www/clients/client1/web17/web`
> Stand: 2026-06-02
## 1. Überblick
**PACIM** ist ein selbst entwickeltes PHP-basiertes **Parkplatz-Management-System** der
**SeaSide Travel GmbH & Co. Immobilien KG** für das Angebot **„Parken am Schiff"**
(parken-am-schiff.de). Es verwaltet die Buchung, Abrechnung und logistische Abwicklung
von Parkplätzen für Kreuzfahrtgäste (vorrangig **AIDA Cruises**) in Hafennähe.
Kernfunktionen:
- Verwaltung von **Buchungen, Kunden, Fahrzeugen, Rechnungen und Events** (Kreuzfahrten)
- **Import** von AIDA-Buchungs- und Vorbuchungslisten (Excel)
- Generierung von **PDF-Dokumenten** (Rechnungen, Buchungsbestätigungen, Kundenkarten, Valet-Bedingungen)
- **Excel-Reports** (Ankunftslisten, Tagesabrechnungen)
- Automatisierter **E-Mail-Versand** und Buchhaltung über Cronjobs
- Integration mit **Google Drive**, **WordPress** und Remote-Datenbank-Sync
### Technischer Stack
| Bereich | Technologie |
|---|---|
| Sprache / Laufzeit | PHP 7.3 |
| Template-Engine | Smarty 3.1.30 |
| DB-Layer | MysqliDb (custom, v2.9.2) auf MySQL/MariaDB |
| PDF | FPDF (erweitert) |
| Excel | PHPExcel (Altcode) + PhpSpreadsheet (Composer) |
| E-Mail | PHPMailer + externes Versand-Script |
| Composer-Deps | `google/apiclient`, `spatie/schema-org`, `phpoffice/phpspreadsheet` |
| Versionierung | Git (Single Commit: „Initial commit – Backup vom alten Projekt") |
---
## 2. Verzeichnisstruktur
```
web/
├── index.php Haupteinstiegspunkt (Login → Page-Router)
├── file.php Dokumentenausgabe (PDF: Rechnung/Karte/Valet, Token-gesichert)
├── ajax_request.php AJAX-Mailer (Token-gesichert)
├── app_request.php POST-API (invoices, favorites, setPayment)
├── gdrive_quick.php Google-Drive OAuth (CLI-only)
├── pinf.php iCal-Export für Kreuzfahrten (deaktiviert)
├── import-manager.php Alter Import-Manager (Web-UI)
├── import-neu.php Neue Import-Engine (deaktiviert)
├── import-delete.php Import-Rollback
│
├── includes/ Kern-Anwendung
│ ├── config.inc.php Zentrale Konfiguration + Bootstrap (alle Klassen/Plugins)
│ ├── functions.php Globale Hilfsfunktionen
│ ├── classes/ Geschäftslogik (siehe §4)
│ ├── functions/ basic.php, eventHelper.php, import-manager.php
│ ├── templates/ Smarty-Views (.tpl) + _compile
│ ├── plugins/ Smarty, FPDF, PHPExcel, PHPMailer, Google, TCPDF, vendor/
│ ├── parent_system/ Karten-/Keycard-Erzeugung
│ └── certs/ Google Service-Account Credentials
│
├── crons/ Geplante Aufgaben (siehe §5)
│ ├── accounting/ Monatsrechnungs-Generierung
│ ├── aida/ AIDA-Vorbuchungs-Import
│ ├── bash/ Shell-Scripts (Stats, DB-Mirror, Archivierung)
│ ├── external/, wordpress/, pacim_sync/
│ └── sendMails.php, createInvoiceMails.php, importFiles*.php, handler.php …
│
├── import-manager/ Modularisierte Neufassung des Import-Managers (PHP 7.3)
│ ├── public/ index.php, ajax.php, undo.php
│ ├── includes/services/ ExcelSearchService, ImportFileService, ImportUndoService
│ └── assets/
│
├── datas/ Daten- und Dokumentenspeicher (siehe §6)
├── stats/ Monatsweise Statistik-Ordner (2018-02 … 2026, ~100 Ordner)
├── time/ Arbeitszeiterfassung (Mitarbeiter, Stunden, Excel-Vorlagen)
├── mobile/ Schlanke Mobile-Ansicht (Kalender, Stats)
├── assets/ CSS, JS, Fonts, Images, Icons
└── import/, error/ Sonstiges
```
---
## 3. Anwendungsarchitektur
```
index.php → config.inc.php (Bootstrap) → $oPage->checkLogin() → $oPage->display()
│
├─ Router: page.class.php ( ?getTemplate=booking/view → templates/booking/view.tpl )
│
├─ Daten: MysqliDb (mysql.class.php) → pacim_* Tabellen
│
├─ Domäne: data / invoice / car / ticket / reports / import / user / product
│
├─ Doks: documents.class.php → pdf.class.php (FPDF) / excel.class.php (PHPExcel)
│ mail.class.php → CURL an externes MAIL_SCRIPT
│
└─ View: Smarty 3.1.30 (.tpl) — globale Objekte werden ins Template injiziert
```
**Routing:** Der GET-Parameter `getTemplate` steuert das geladene Template
(`?getTemplate=booking/view` → `includes/templates/templates/booking/view.tpl`),
Fallback ist `errors/404.tpl`.
**Login:** Single-User-Auth über Konstanten (`LOGIN_USER`/`LOGIN_PASS`) plus
ein Debug-User (`nico`). Der Debug-User schaltet auf eine lokale Testdatenbank um.
---
## 4. Geschäftslogik – Klassen (`includes/classes/`)
| Klasse | Zweck |
|---|---|
| `mysql.class.php` (2420 Z.) | MysqliDb-Bibliothek – Query-Builder & DB-Abstraktion, Basis aller Klassen |
| `data.class.php` (2009 Z.) | Zentrale Datenschicht: `dataset()`, Produkte, Mail-Templates, Favoriten, Rechnungsnummern |
| `pdf.class.php` (1648 Z.) | FPDF-Erweiterung: Rechnungen, Buchungen, Karten, Valet-AGB; HTML-Cells, Alpha, Rotation |
| `documents.class.php` (1228 Z.) | Orchestriert Dokumenterzeugung & Versand (Karten, Listen, Tagesabrechnung) |
| `invoice.class.php` (964 Z.) | Rechnungsberechnung (Rabatte, MwSt 19%), Zahlungsstatus, XLS-Kategorisierung |
| `excel.class.php` (638 Z.) | PHPExcel-Wrapper: Import-Parsing & Report-Export |
| `reports.class.php` (506 Z.) | Auswertungen: `preBooking()` (Kapazität), `dayReport()` (Check-ins/Zahlungen) |
| `mail.class.php` (380 Z.) | E-Mail-Versand via CURL an externes Script |
| `import.class.php` (301 Z.) | AIDA-Import: `FileProcessor`, `dayImport()`, `importPreBooking()` |
| `page.class.php` (157 Z.) | Router / Display, Login-Prüfung |
| `ticket.class.php` (93 Z.) | Support-Tickets aus `pacim_messages` (Template 8) |
| `schema.class.php` (90 Z.) | JSON-LD (schema.org) für Buchungsbestätigungen |
| `car.class.php` (50 Z.) | Fahrzeug-Check-in, Kennzeichen-Änderung |
| `product.class.php` (39 Z.) | Produktkatalog |
| `user.class.php` (24 Z.) | Benutzerverwaltung nach `user_level` |
| `datetime.class.php` (18 Z.) | Datums-Hilfen |
*(Hinweis: `__excel.class.php` und `__pdf.class.php` sind ältere, inaktive Versionen.)*
### Produkt-IDs (Geschäftsbedeutung)
- **1 / 2** – Parkplatz Halle (indoor) / Außen (outdoor)
- **3 / 9** – Camper
- **4 / 6 / 7** – Fahrzeugreinigung
- **8 / 10** – Valet-Service (Übergabe am Terminal)
---
## 5. Datenmodell (Tabellen `pacim_*`)
| Tabelle | Inhalt |
|---|---|
| `pacim_booking` | Buchungen (Zeitraum, Check-in, Typ indoor/outdoor, Kennzeichen) |
| `pacim_invoice` / `pacim_invoice_pos` | Rechnungen (`PAS…`-Nr., Status, Zahlung) + Positionen |
| `pacim_customer` | Kunden, mit `customer_source` (AIDA vs. Seaside/Walk-in) |
| `pacim_products` / `pacim_parking_prices` | Produktkatalog & Preise |
| `pacim_events` / `pacim_events_info` | Kreuzfahrt-Events (Kalender, Logo, Titel) |
| `pacim_prebooking` | AIDA-Vorbuchungen (Fahrzeuge, Halle/Außen/Camper/Valet, Passagiere, MD5) |
| `pacim_messages` / `pacim_templates` / `pacim_templates_attachments` | E-Mail-Queue, Vorlagen, Anhänge |
| `pacim_files` / `pacim_import` | Importierte Dateien (MD5, Kategorie) & Zuordnung |
| `pacim_users` | Benutzer |
| `pacim_key` | Schlüsselkarten |
| `pacim_payments` / `pacim_value` / `pacim_view` | Zahlungen, Konfig-Werte, Favoriten/Lesezeichen |
**Zahlungsstatus** (invoice_payment): 0 = offen · 1 = Überweisung · 2 = EC · 3 = Bar · 4 = Nachkontrolle
---
## 6. Cronjobs & Automatisierung (`crons/`)
| Job | Funktion |
|---|---|
| `sendMails.php` | Versendet offene Mails aus `pacim_messages` (Status 0) via CURL/Token |
| `createInvoiceMails.php` | Erzeugt Rechnungsmails + PDFs für Nicht-AIDA-Kunden |
| `coupon_mailing.php` | Rabatt-/Coupon-Kampagnen |
| `importFiles.php` / `importFiles_v2.php` | AIDA-Buchungsimport (XLSX aus `datas/aida/`) |
| `aida/importPreBooking.php` | Import von Vorbuchungslisten (`ParkingPredictionlist`) → `pacim_prebooking` |
| `accounting/createInvoices.php` | Monatliche Rechnungserstellung (PDF) |
| `handler.php` | Generischer Cron-Dispatcher über `pacim_cronjob` |
| `bash/update_booking_stats.sh` | Aggregiert Buchungsstatistiken pro Event (remote MySQL) |
| `bash/mirror.pacim.db.sh` | Datenbankspiegelung |
| `bash/import.notice.mail.sh` | Archiviert XLSX verschlüsselt (7z) und überträgt per SSH |
| `pacim_sync/bin/run_sync.php` | Sync von Statistiken local ↔ remote (SSH/SCP) |
| `wordpress/sync.php` | Sync mit `seaside_history` (Remote-DB) für Web-Buchungen |
| `invoice_counter.php`, `deleteBooking.php` | Deaktiviert (Altcode) |
---
## 7. Import-Subsystem (AIDA-Listen)
**AIDA** = Kreuzfahrtreederei. Gäste, die mit AIDA-Schiffen reisen, buchen Parkplätze;
ihre Daten kommen als Excel-Listen, die in PACIM importiert werden:
1. **ParkingOperatorlist** → tatsächliche Buchungen → `pacim_booking`, `pacim_customer` (Quelle „AIDA"), `pacim_invoice`
2. **ParkingPredictionlist** → Vorbuchungen / Kapazitätsplanung → `pacim_prebooking`
**Ablauf** (`FileProcessor`): XLSX einlesen → parsen → in DB speichern (MD5-Duplikat-Check über `pacim_files`) → Original nach `datas/trash/` kopieren → löschen.
**AIDA-Produktcodes** (in `import-neu.php`): `PW50` = Halle · `PW85` = Halle + Valet · `PW40` = Außen.
Zwei Generationen: das alte `import-manager.php` (monolithisch) und die neue,
modularisierte App unter `import-manager/` (Service-Klassen, AJAX-Livesuche, Undo).
---
## 8. Dokumente & Reports
- **PDF (FPDF):** Rechnungen (`PAS*.pdf`), Buchungsbestätigungen, Kundenkarten (85×54 mm), Valet-AGB, Gutschriften.
- **Excel (PHPExcel):** Ankunftslisten (mit Autofilter/Freeze-Panes), Tagesabrechnungen (gruppiert nach Zahlungsart: IBAN / AIDA / EC / Bar).
- **JSON-LD:** schema.org-Markup für Buchungsbestätigungen (`schema.class.php`).
- Versand template-gesteuert über `pacim_messages` + externes Mail-Script (Audit-Trail).
---
## 9. Externe Integrationen
| System | Datei | Zweck |
|---|---|---|
| Google Drive | `gdrive_quick.php` | OAuth2 (Service-Account), Ablage von Rechnungen/Buchhaltung |
| WordPress | `crons/wordpress/sync.php` | Übernahme von Web-Buchungen aus Remote-DB |
| Externes Mail-Script | `MAIL_SCRIPT` | Tatsächlicher SMTP-Versand mit Anhängen über parken-am-schiff.de |
| Remote-DB / Server | `bash/*.sh`, `pacim_sync` | Statistik- & DB-Sync per SSH/SCP |
---
## 10. Weitere Module
- **`time/`** – Eigenständige Arbeitszeiterfassung: Mitarbeiter anlegen, Arbeitsstunden erfassen/löschen, Excel-Vorlagen (2024/2025), JSON-Status.
- **`mobile/`** – Schlanke mobile Ansicht (Kalender, Inhalte, Statistiken).
- **`stats/`** – Monatsweise abgelegte Statistik-/Berichtsordner (2018–2026).
---
## 11. ⚠️ Beobachtungen & Risiken
> Diese Punkte sind keine Aufgaben, sondern Hinweise aus der Analyse.
1. **Hartcodierte Zugangsdaten** in `includes/config.inc.php` (DB-Passwörter, SMTP, Login,
Google-Drive-Ordner) – im Klartext und im Git-Repository. Empfehlenswert wäre die
Auslagerung in eine nicht versionierte `.env` (bereits in `.gitignore` vorgesehen).
2. **Statische API-Tokens** im Code (z. B. `eFD6dx2G4RFBkrYS7Z87`, `YIz8HqUPWQ7cwcVHE57O`)
in mehreren öffentlich erreichbaren Einstiegspunkten (`file.php`, `ajax_request.php`).
3. **`app_request.php`** verarbeitet POST-Daten teils ohne erkennbare Authentifizierung.
4. **PHP 7.3** ist End-of-Life (Sicherheitsupdates eingestellt).
5. **Doppelte/Alt-Codestände:** `__pdf.class.php`/`__excel.class.php`, mehrere
`sendMails.php.save*`, zwei Import-Manager-Generationen, mehrere mit `die()` deaktivierte
Scripte – erhöht die Wartungslast.
6. **Single Git-Commit** („Backup vom alten Projekt") – keine Historie/Nachvollziehbarkeit
bisheriger Änderungen.
---
## 12. Zusammenfassung
PACIM ist eine über Jahre gewachsene, monolithische PHP-Anwendung zur vollständigen
Abwicklung des Parkplatzgeschäfts rund um AIDA-Kreuzfahrten: vom **Import** der Reederei-Listen
über **Buchungs-, Kunden- und Fahrzeugverwaltung**, **Rechnungsstellung** und
**Dokumentenerzeugung** (PDF/Excel) bis zum automatisierten **E-Mail-Versand** und der
**Buchhaltung** per Cronjobs. Smarty liefert die Oberfläche, eine custom MysqliDb-Schicht
die Datenanbindung. Ergänzt wird das Kernsystem durch Module für Arbeitszeit (`time/`),
Mobile-Ansicht (`mobile/`) und eine modernisierte Import-Manager-App.