# MyZenBnB

SaaS λειτουργίας καταλυμάτων (καθαριότητα, συντήρηση, προσωπικό/βάρδιες, συνεργάτες, συμμόρφωση). Προδιαγραφές: `/home/myzenbnb/dev/SaaS Λειτουργίας Καταλυμάτων — Προδιαγραφές.pdf`.

## Περιβάλλον
- Server cPanel, user `myzenbnb` (χωρίς shell). URL: https://manage.myzenbnb.gr (docroot `public/`), nginx proxy (cpnginx) → Apache.
- PHP 8.4: `/opt/cpanel/ea-php84/root/usr/bin/php` (το `php` του PATH είναι 8.3). Composer: `/home/myzenbnb/bin/composer.phar`.
- Εντολές ως ο χρήστης του account, ώστε να μη μείνουν αρχεία του root:
  `sudo -u myzenbnb env HOME=/home/myzenbnb /opt/cpanel/ea-php84/root/usr/bin/php artisan ...`
- Βάση MariaDB `myzenbnb_app`. Session / cache / queue: database.

## Συμβάσεις (όπως στο MyTabloo: /home/mytabloo/public_html/app.mytabloo.gr)
- Panels: `Tatooine` (admin, `app/Filament/Tatooine` — αντίστοιχο του `Holocron` στο MyTabloo· στο port μετονομάζεται πάντα σε Tatooine) και `Backstage` (επιχειρήσεις, tenant `Business`, `app/Filament/Backstage`). Το URL του Backstage είναι **`/company`**· η λέξη «Backstage» δεν εμφανίζεται ποτέ στους χρήστες (στα κείμενα: «διαχειριστικό»).
- Ένας χρήστης μπορεί να ανήκει σε πολλές επιχειρήσεις· κάθε επιχείρηση έχει πολλά καταλύματα.
- UI στα ελληνικά, με μεταφράσεις el/en στο `lang/`. Σχόλια κώδικα στα ελληνικά.
- Roadmap: ενημέρωσε το `public/dev/roadmap/roadmap.json` και τρέξε `python3 scripts/roadmap.py` (ξαναφτιάχνει το `ROADMAP.md`).

## Πολλές επιχειρήσεις ανά χρήστη (σημαντικό)
- `business_user` (μοντέλο `BusinessUser`): ρόλος εργασίας και ενεργός **ανά επιχείρηση**. `User::membership()` = η συμμετοχή στην τρέχουσα.
- Spatie teams με `business_id`: το `ApplyBusinessContext` (tenant middleware) ορίζει την ομάδα σε κάθε αίτημα. Εκτός Backstage (Tatooine, seeders, jobs) ορίζεται ρητά με `setPermissionsTeamId()`.
- Μέσα στο Backstage το Filament βάζει global scope ανά επιχείρηση σε κάθε model με resource (και στο `Business` και στο `User`). Ερωτήματα που πρέπει να βλέπουν **όλες** τις επιχειρήσεις του χρήστη θέλουν `withoutGlobalScopes()` (βλ. `User::businesses()`, `CreateUser`). Αλλιώς π.χ. η αφαίρεση μέλους θα έσβηνε λογαριασμό που ανήκει και αλλού.
- Αλλαγές σε καταλύματα/τμήματα/ρόλους χρήστη μόνο μέσω `App\Support\Memberships` (αγγίζουν μόνο την τρέχουσα επιχείρηση).
- Νέο δικαίωμα: `App\Support\Permissions` + `lang/{el,en}/users.php` → `permissions`, μετά `php artisan db:seed --class=PermissionsSeeder`.

## Μονάδες & ημερολόγιο
- `Unit` (πίνακας `units`, καρτέλα «Μονάδες & χώροι» στο κατάλυμα): `kind=unit` κλείνεται (γραμμή ενιαίου ημερολογίου, QR με τυχαίο `qr_token`), `kind=area` κοινόχρηστος χώρος χωρίς κρατήσεις.
- Κρατήσεις / iCal feeds θα δείχνουν σε `unit_id`. Επικαλύψεις: πάντα με `Unit::conflictingUnitIds()` (συνδυασμοί μέσω `parent_id`, ένα επίπεδο).
- Mail: `noreply@myzenbnb.gr` μέσω `server.angryparrot.gr:465`.

## Tests
`sudo -u myzenbnb env HOME=/home/myzenbnb /opt/cpanel/ea-php84/root/usr/bin/php artisan test` (SQLite στη μνήμη). Το `PagesRenderTest` ανοίγει κάθε σελίδα σε el/en· πρόσθεσε εκεί κάθε νέα σελίδα.
