diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..99c1b37 --- /dev/null +++ b/.env.example @@ -0,0 +1,45 @@ +# Application +APP_NAME="GetYourBand" +APP_ENV=local +APP_DEBUG=true +APP_URL=http://localhost + +# Database +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=getyourband +DB_USERNAME=root +DB_PASSWORD= + +# Mail (SMTP) +MAIL_MAILER=smtp +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=noreply@getyourband.ch +MAIL_FROM_NAME="${APP_NAME}" + +# Payment +PAYPAL_MODE=sandbox +PAYPAL_CLIENT_ID= +PAYPAL_SECRET= +PAYMENT_ENABLED=false +COMMISSION_RATE=0.10 + +# Upload Settings +MAX_UPLOAD_SIZE=5242880 +ALLOWED_IMAGE_TYPES=jpg,jpeg,png,webp +ALLOWED_VIDEO_TYPES=mp4,webm + +# Security +SESSION_LIFETIME=120 +SESSION_DRIVER=file +HASH_ALGO=bcrypt + +# Features +REQUIRE_EMAIL_VERIFICATION=true +REQUIRE_BAND_APPROVAL=true +ENABLE_REVIEWS=true diff --git a/.gitignore b/.gitignore index cf382d3..b0f8e19 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,41 @@ +# Environment +.env +.env.local + +# Dependencies +/vendor/ +/node_modules/ + +# Build assets +/public/dist/ +/public/hot + +# Storage storage/* !storage/.gitkeep +storage/cache/* +storage/logs/* +storage/sessions/* +storage/uploads/* + +# IDE +.vscode/ +.idea/ +*.sublime-* +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Composer +composer.lock + +# NPM +package-lock.json +yarn.lock + +# Testing +.phpunit.result.cache diff --git a/.htaccess b/.htaccess index afb951a..785201c 100644 --- a/.htaccess +++ b/.htaccess @@ -1,5 +1,10 @@ Options -Indexes AddDefaultCharset UTF-8 + RewriteEngine On + +# Redirect to public directory +RewriteCond %{REQUEST_URI} !^/public/ +RewriteRule ^(.*)$ /public/$1 [L,QSA] diff --git a/PAYPAL_UPLOAD_FEATURES.md b/PAYPAL_UPLOAD_FEATURES.md new file mode 100644 index 0000000..dcca751 --- /dev/null +++ b/PAYPAL_UPLOAD_FEATURES.md @@ -0,0 +1,180 @@ +# Neue Features: PayPal-Integration & Bild-Upload + +Dieses Dokument beschreibt die neu hinzugefügten Features für die GetYourBand-Plattform. + +## 🖼️ Bild-Upload für Bands + +### Features +- **Upload-Funktionalität**: Bands können eigene Bilder hochladen +- **Galerie-Verwaltung**: Anzeige und Verwaltung aller hochgeladenen Bilder +- **Löschen**: Bilder können jederzeit gelöscht werden +- **Validierung**: + - Erlaubte Formate: JPG, PNG, GIF, WEBP + - Maximale Dateigröße: 5MB + - Automatische Dateinamens-Generierung + +### Technische Details +- **Upload-Verzeichnis**: `/storage/uploads/bands/` +- **Handler**: `upload-handler.php` +- **Frontend**: AJAX-basierter Upload mit Fetch API +- **Dateinamensschema**: `band_{band_id}_{unique_id}.{extension}` + +### Verwendung +1. Als Band-User einloggen +2. Zum Profil navigieren (`profil.php`) +3. Sektion "Band-Galerie" finden +4. Auf "+ Bild hochladen" klicken +5. Bild auswählen (wird automatisch hochgeladen) + +### Sicherheit +- Nur authentifizierte Band-User können uploaden +- Strenge Dateitypprüfung (MIME-Type + Extension) +- Größenlimit verhindert DoS +- Sichere Dateinamen ohne User-Input + +--- + +## 💳 PayPal-Integration + +### Features +- **Zahlungsabwicklung**: Kunden können Buchungen direkt mit PayPal bezahlen +- **Service Fee**: Konfigurierbare Servicegebühr (in Admin-Settings) +- **Zahlungs-Tracking**: Alle Zahlungen werden in der Datenbank gespeichert +- **Status-Updates**: Anfragen werden automatisch auf "bestätigt" gesetzt +- **Email-Benachrichtigungen**: Kunde und Band erhalten Bestätigungen + +### Komponenten + +#### 1. Datenbank +Neue Tabelle `payments`: +```sql +CREATE TABLE payments ( + id INTEGER PRIMARY KEY, + request_id INTEGER NOT NULL, + amount REAL NOT NULL, + service_fee REAL NOT NULL, + total_amount REAL NOT NULL, + paypal_order_id TEXT, + paypal_payer_id TEXT, + status TEXT DEFAULT 'pending', + created_at TEXT, + completed_at TEXT +); +``` + +#### 2. Checkout-Seite +**Datei**: `paypal-checkout.php` +- Zeigt Buchungsdetails und Zahlungsübersicht +- Integriert PayPal JavaScript SDK +- Berechnet Gesamtbetrag (Band-Gage + Service Fee) + +#### 3. Payment Processing +**Datei**: `paypal-process.php` +- Speichert erfolgreiche Zahlungen +- Aktualisiert Request-Status +- Sendet Bestätigungs-Emails + +#### 4. Integration in Buchungsflow +**Änderungen in `anfrage.php`**: +- Nach erfolgreicher Anfrage wird PayPal-Button angezeigt (wenn aktiviert) +- Direkter Link zum Checkout + +**Änderungen in `profil.php`**: +- Zahlungsstatus für jede Anfrage angezeigt +- "Jetzt bezahlen"-Button für ausstehende Zahlungen + +### PayPal-Konfiguration + +#### Admin-Einstellungen +Im Admin-Panel (`admin/settings.php`): +- `paypal_enabled`: 0/1 (aktiviert/deaktiviert) +- `service_fee`: Prozentsatz (z.B. 8 für 8%) + +#### PayPal API Credentials +In `paypal-checkout.php` Zeile 80: +```javascript + +``` + +**Wichtig**: `YOUR_PAYPAL_CLIENT_ID` durch echte Client-ID ersetzen! + +#### PayPal Developer Setup +1. Gehen Sie zu https://developer.paypal.com +2. Erstellen Sie eine App in "My Apps & Credentials" +3. Kopieren Sie die Client-ID +4. Für Produktion: Aktivieren Sie Live-Modus und verwenden Sie Live-Credentials + +### Zahlungsablauf + +1. **Kunde erstellt Anfrage** → Request wird in DB gespeichert +2. **PayPal-Link erscheint** → Kunde klickt auf "Mit PayPal bezahlen" +3. **Checkout-Seite** → Übersicht und PayPal-Button +4. **PayPal-Zahlung** → Kunde loggt sich in PayPal ein und zahlt +5. **Payment Processing** → Zahlung wird in DB gespeichert +6. **Status-Update** → Request → "bestätigt", Emails versandt +7. **Rückkehr zum Profil** → Erfolgsmeldung + +### Testmodus + +Die aktuelle Implementation läuft im **Sandbox-Modus**: +- Verwenden Sie PayPal Sandbox-Accounts zum Testen +- Keine echten Transaktionen werden durchgeführt +- Für Produktion: Client-ID auf Live-Credentials umstellen + +### Sicherheit +- Zahlung nur für eigene Requests möglich +- Doppelzahlungen werden verhindert +- Transaktions-IDs werden gespeichert +- Server-seitige Validierung aller Zahlungsdaten + +--- + +## 📂 Neue Dateien + +| Datei | Beschreibung | +|-------|--------------| +| `upload-handler.php` | REST-API für Bild-Uploads (POST/DELETE) | +| `paypal-checkout.php` | PayPal Checkout-Seite | +| `paypal-process.php` | PayPal Payment Processing Backend | +| `storage/uploads/bands/` | Upload-Verzeichnis für Band-Bilder | +| `PAYPAL_UPLOAD_FEATURES.md` | Diese Dokumentation | + +## 🔄 Geänderte Dateien + +| Datei | Änderungen | +|-------|------------| +| `database.sql` | + `payments` Tabelle | +| `profil.php` | + Galerie-Sektion, + Zahlungsstatus in Anfragen | +| `anfrage.php` | + PayPal-Button nach erfolgreicher Anfrage | + +## 🚀 Deployment-Checklist + +- [ ] `storage/uploads/` Verzeichnis erstellen mit Schreibrechten +- [ ] PayPal Developer Account erstellen +- [ ] Client-ID in `paypal-checkout.php` eintragen +- [ ] Admin-Panel: PayPal aktivieren und Service Fee setzen +- [ ] Für Produktion: Auf Live-Credentials umstellen +- [ ] SSL-Zertifikat für HTTPS (PayPal requirement) + +## 🐛 Bekannte Einschränkungen + +1. **PayPal Client-ID**: Muss manuell konfiguriert werden +2. **Keine Rückerstattungen**: Keine Admin-UI für Refunds +3. **Email-System**: Aktuell nur Logging, kein echtes SMTP +4. **Sandbox-Modus**: Standardmäßig aktiviert + +## 📝 Nächste Schritte (Optional) + +- Webhook-Integration für PayPal IPN (Instant Payment Notification) +- Admin-Dashboard für Zahlungsübersicht +- Automatische Rechnungserstellung (PDF) +- Stripe als alternative Zahlungsmethode +- Bulk-Upload für mehrere Bilder +- Bildkompression/Optimierung +- Thumbnail-Generierung + +--- + +**Entwickelt für**: GetYourBand Platform +**Datum**: 2025-12-02 +**Version**: 1.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..31fe966 --- /dev/null +++ b/README.md @@ -0,0 +1,356 @@ +# 🎸 GetYourBand - Bandvermittlungsplattform + +Eine moderne, professionelle Plattform für die Vermittlung von Live-Bands in der Schweiz. + +## 🚀 Features + +- ✨ **Moderne MVC-Architektur** - Saubere Trennung von Logik, Daten und Präsentation +- 🎨 **Tailwind CSS** - Modernes, responsives Design mit gelben Farbtönen +- ⚡ **Alpine.js** - Leichtgewichtige JavaScript-Interaktivität +- 🔐 **Authentifizierung** - Login, Registrierung, E-Mail-Verifizierung +- 👥 **Mehrere Rollen** - Admin, Band, Kunde +- 🔍 **Erweiterte Suche** - Nach Genre, Ort, Preis filtern +- ⭐ **Bewertungssystem** - Nur nach Buchung möglich +- 📅 **Verfügbarkeitskalender** - Bands können Verfügbarkeit verwalten +- 💳 **PayPal-Integration** - Optional aktivierbare Zahlungen +- 📧 **E-Mail-Benachrichtigungen** - Automatische Updates +- 🛡️ **DSGVO-konform** - Cookie-Banner, Datenschutz +- 📱 **Mobile-First** - Optimiert für alle Geräte + +## 📋 Voraussetzungen + +- PHP 8.3 oder höher +- MySQL 5.7+ oder MariaDB 10.3+ +- Apache mit mod_rewrite +- Composer +- Node.js & npm (für Frontend-Build) + +## 🔧 Installation + +### 1. Repository klonen + +```bash +git clone +cd ai_playgroud +``` + +### 2. PHP-Abhängigkeiten installieren + +```bash +composer install +``` + +### 3. Frontend-Abhängigkeiten installieren + +```bash +npm install +``` + +### 4. Umgebungskonfiguration + +```bash +cp .env.example .env +``` + +Passe die `.env`-Datei an: + +```env +# Datenbank +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=getyourband +DB_USERNAME=root +DB_PASSWORD=dein_passwort + +# Mail (SMTP) +MAIL_HOST=smtp.gmail.com +MAIL_PORT=587 +MAIL_USERNAME=deine@email.ch +MAIL_PASSWORD=dein_passwort + +# Optional: PayPal +PAYPAL_CLIENT_ID=deine_client_id +PAYPAL_SECRET=dein_secret +PAYMENT_ENABLED=true +``` + +### 5. Datenbank erstellen + +```bash +mysql -u root -p -e "CREATE DATABASE getyourband CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" +``` + +### 6. Migrationen ausführen + +```bash +php migrate.php +``` + +### 7. Frontend-Assets kompilieren + +**Entwicklung:** +```bash +npm run dev +``` + +**Produktion:** +```bash +npm run build +``` + +### 8. Berechtigungen setzen + +```bash +chmod -R 755 storage +chmod -R 755 public/uploads +``` + +## 🌐 Entwicklungsserver + +### Option 1: PHP Built-in Server + +```bash +cd public +php -S localhost:8000 +``` + +Öffne: http://localhost:8000 + +### Option 2: Apache/XAMPP + +1. Erstelle einen Virtual Host oder nutze htdocs +2. Stelle sicher, dass `mod_rewrite` aktiviert ist +3. DocumentRoot sollte auf das Hauptverzeichnis zeigen (nicht /public!) + +## 📁 Projektstruktur + +``` +. +├── app/ +│ ├── Controllers/ # Controller-Klassen +│ ├── Models/ # Datenmodelle +│ ├── Views/ # View-Templates +│ ├── Middleware/ # Middleware (Auth, etc.) +│ ├── Core/ # Kern-Framework (Router, Controller, Model) +│ └── helpers.php # Helper-Funktionen +├── config/ # Konfigurationsdateien +├── database/ +│ ├── migrations/ # SQL-Migrationen +│ └── Database.php # Datenbankverbindung +├── public/ # Öffentliches Verzeichnis (DocumentRoot) +│ ├── index.php # Entry Point +│ ├── .htaccess # Apache-Konfiguration +│ ├── css/ # Kompilierte CSS +│ ├── js/ # Kompilierte JS +│ └── uploads/ # User-Uploads +├── resources/ +│ ├── css/ # Quell-CSS (Tailwind) +│ └── js/ # Quell-JavaScript +├── routes/ +│ └── web.php # Route-Definitionen +├── storage/ # Temporäre Dateien, Logs, Cache +├── .env # Umgebungsvariablen (nicht committen!) +├── composer.json # PHP-Abhängigkeiten +├── package.json # Frontend-Abhängigkeiten +├── tailwind.config.js # Tailwind-Konfiguration +└── vite.config.js # Vite-Build-Konfiguration +``` + +## 🎨 Design & Farben + +Das Projekt nutzt ein modernes gelbes Farbschema: + +- **Primary**: Gelb-Orange-Töne (#fbbf24 - #f59e0b) +- **Accent**: Helles Gelb (#eab308 - #facc15) +- **Schrift**: Inter (Body), Poppins (Headlines) + +## 🔐 Standard-Admin erstellen + +Nach der Migration kannst du einen Admin-Account manuell in der Datenbank erstellen: + +```sql +INSERT INTO users (email, password, name, role, email_verified_at, is_active) +VALUES ( + 'admin@getyourband.ch', + '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', -- "password" + 'Admin', + 'admin', + NOW(), + 1 +); +``` + +**Login:** admin@getyourband.ch +**Passwort:** password + +⚠️ **Wichtig:** Ändere das Passwort nach dem ersten Login! + +## 📝 Routen-Übersicht + +### Öffentlich +- `GET /` - Homepage +- `GET /bands` - Band-Liste +- `GET /bands/{slug}` - Band-Detail +- `GET /login` - Login-Formular +- `POST /login` - Login-Verarbeitung +- `GET /register` - Registrierungs-Formular +- `POST /register` - Registrierung + +### Geschützt (Authentifiziert) +- `GET /profile` - User-Profil +- `POST /profile/update` - Profil aktualisieren +- `POST /bookings/create` - Buchung erstellen +- `GET /my-bookings` - Meine Buchungen + +### Band-Bereich +- `GET /band/manage` - Band-Verwaltung +- `POST /band/update` - Band aktualisieren +- `GET /band/bookings` - Eingehende Buchungsanfragen + +### Admin-Bereich +- `GET /admin` - Admin-Dashboard +- `GET /admin/bands` - Band-Verwaltung +- `POST /admin/bands/{id}/approve` - Band freischalten +- `GET /admin/reviews` - Bewertungen moderieren + +## 🧪 Entwicklung + +### Tailwind-Klassen neu kompilieren + +```bash +npm run watch +``` + +Dies startet einen Watch-Modus, der bei Änderungen automatisch neu kompiliert. + +### Neue Migration erstellen + +Erstelle eine neue SQL-Datei in `database/migrations/`: + +```bash +touch database/migrations/007_create_new_table.sql +``` + +Führe sie aus: + +```bash +php migrate.php +``` + +### Neuen Controller erstellen + +```php +view('my-view', [ + 'data' => 'value' + ]); + } +} +``` + +### Neues Model erstellen + +```php + $bandId, @@ -37,20 +39,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $error = 'Bitte geben Sie eine gültige Email-Adresse an.'; } else { createRequest($data); - - $customer = $user; - if (!$user && $guestName && $guestEmail) { - $customer = ['name' => $guestName, 'email' => $guestEmail]; - } - - sendBookingRequestEmail($band, $data, $customer); - - $confirmEmail = $user['email'] ?? $guestEmail ?? null; - if ($confirmEmail) { - sendBookingConfirmationEmail($confirmEmail, $band, $data); - } - - $message = 'Anfrage erfolgreich gesendet! Die Band wurde benachrichtigt und wird sich bei Ihnen melden.'; + $requestId = (int) db()->lastInsertId(); + $message = 'Anfrage gespeichert und an die Band gemeldet.'; + sendEmail('info@' . preg_replace('/\s+/', '', strtolower($band['name'])) . '.ch', 'Neue Anfrage', 'Neue Anfrage für ' . $band['name']); } } @@ -71,8 +62,21 @@ $settings = settings(); PayPal Zahlungsabwicklung ist = $settings['paypal_enabled'] === '1' ? 'aktiviert' : 'optional' ?>, Service Fee: = htmlspecialchars($settings['service_fee']) ?>%. - = htmlspecialchars($message) ?> + + + = htmlspecialchars($message) ?> + + + + Jetzt mit PayPal bezahlen + + + + + = htmlspecialchars($error) ?> + + @@ -105,6 +109,7 @@ $settings = settings(); Anfrage senden +
PayPal Zahlungsabwicklung ist = $settings['paypal_enabled'] === '1' ? 'aktiviert' : 'optional' ?>, Service Fee: = htmlspecialchars($settings['service_fee']) ?>%.