## i Τι είναι αυτό

Είναι μια αυτόνομη, πολύ ελαφριά εφαρμογή που εμφανίζει τον κατάλογο/μενού του καταστήματος σε μια κινητόφιλη σελίδα. Οι πελάτες σκανάρουν ένα QR code και βλέπουν πάντα τις τρέχουσες τιμές και προϊόντα.

### 🛍️ Δημόσια σελίδα

Στο `/` — ο κατάλογος που βλέπουν οι πελάτες. Καρτέλες κατηγοριών, δημοφιλέστερα, χάρτης, ωράριο, ένδειξη «Ανοιχτά/Κλειστά».

### 🔐 Πίνακας διαχείρισης

Στο `/admin-login` — μπαίνεις με κωδικό και αλλάζεις τιμές, προσθέτεις προϊόντα, ανεβάζεις φωτογραφίες, διαχειρίζεσαι κατηγορίες.

Το βασικό πλεονέκτημα: το QR δείχνει πάντα στο ίδιο URL. Αλλάζεις τιμές μέσα από τον πίνακα και το ίδιο QR εμφανίζει αμέσως τα νέα — δεν χρειάζεται να ξανατυπώσεις τίποτα.

## 1 Εγκατάσταση βήμα-βήμα

Ο πιο αξιόπιστος τρόπος είναι να ετοιμάσεις τα πάντα τοπικά στον υπολογιστή σου και μετά να ανεβάσεις τον φάκελο. Χρειάζεσαι PHP 8.2+ και Composer τοπικά.

1. ### Εγκατάσταση εξαρτήσεων

   Μέσα στον φάκελο του project, τρέξε:

       composer install --optimize-autoloader --no-dev

   Αυτό δημιουργεί τον φάκελο `vendor/` (δεν περιλαμβάνεται στο ZIP γιατί είναι μεγάλος).

2. ### Ρύθμιση του `.env`

   Αντίγραψε το `.env.example` σε `.env`:

       cp .env.example .env

   Άνοιξε το `.env` και βάλε το σωστό `APP_URL` (το domain σου). Το `DB_CONNECTION=sqlite` είναι ήδη ρυθμισμένο.

3. ### Κλειδί εφαρμογής

       php artisan key:generate

   Γεμίζει αυτόματα το `APP_KEY` στο `.env`.

4. ### Δημιουργία βάσης & αρχικά δεδομένα

       # Το αρχείο database/database.sqlite υπάρχει ήδη άδειο
       php artisan migrate --seed

   Φτιάχνει τους πίνακες και φορτώνει τις κατηγορίες + μερικά προϊόντα-δείγματα.

5. ### Δοκιμή τοπικά (προαιρετικό)

       php artisan serve

   Άνοιξε `http://localhost:8000`. Αν δεις τον κατάλογο, όλα δουλεύουν.

6. ### Ανέβασμα στο shared hosting

   Στο cPanel/Plesk, το «web root» είναι συνήθως ο φάκελος `public_html`. Έχεις δύο επιλογές:

   ### ✅ Επιλογή Α — Συνιστάται (ασφαλέστερη)

   - Ανέβασε ολόκληρο τον φάκελο της εφαρμογής έξω από το `public_html` — π.χ. στο `/home/χρήστης/coffee-drop/`.
   - Μετάφερε τα περιεχόμενα του `coffee-drop/public/` μέσα στο `public_html/`.
   - Άνοιξε το `public_html/index.php` και διόρθωσε τις δύο διαδρομές ώστε να δείχνουν στον φάκελο της εφαρμογής:

       require __DIR__.'/../coffee-drop/vendor/autoload.php';
       $app = require_once __DIR__.'/../coffee-drop/bootstrap/app.php';

   ### Επιλογή Β — Subdomain

   Φτιάξε ένα subdomain (π.χ. `menu.todomain.gr`) και στις ρυθμίσεις «Domains» όρισε ως document root τον φάκελο `coffee-drop/public`. Δεν χρειάζεται να αγγίξεις το `index.php`.

7. ### Δικαιώματα αρχείων (permissions)

   Μέσω τερματικού (SSH) ή του File Manager, δώσε δικαιώματα εγγραφής:

       chmod -R 775 storage bootstrap/cache
       chmod 775 database
       chmod 664 database/database.sqlite
       chmod -R 775 public/uploads

   Σημαντικό: η SQLite χρειάζεται δικαίωμα εγγραφής και στο αρχείο `database.sqlite` και στον φάκελο `database/` που το περιέχει. Αν λείπει, θα δεις «readonly database» σφάλμα.

8. ### Cache για ταχύτητα (production)

       php artisan config:cache
       php artisan route:cache
       php artisan view:cache

## 2 Κωδικός Admin

Δεν υπάρχει πίνακας χρηστών — ένας μόνο κωδικός προστατεύει τον πίνακα διαχείρισης. Αποθηκεύεται κρυπτογραφημένος (hashed), ποτέ σε απλό κείμενο.

### Πώς φτιάχνεις/αλλάζεις τον κωδικό

1. Τρέξε `php artisan tinker`
2. Πληκτρολόγησε (βάζοντας τον δικό σου κωδικό):

    echo Hash::make('ο-μυστικός-κωδικός-σου');

Θα βγάλει μια συμβολοσειρά που ξεκινά με `$2y$...`. Αντίγραψέ την ολόκληρη στο `.env`:

    ADMIN_PASSWORD_HASH=$2y$12$..........................................

Αν αλλάξεις το `.env` ενώ τρέχει σε production: τρέξε ξανά `php artisan config:cache`, αλλιώς ο νέος κωδικός δεν θα φορτωθεί.
Αν το hosting σου δεν επιτρέπει `tinker`, φτιάξε το hash τοπικά στον υπολογιστή σου και απλώς αντίγραψε το αποτέλεσμα στο `.env` του server.

## 3 Δημιουργία του QR Code

Το QR code δεν το παράγει η εφαρμογή — και δεν χρειάζεται. Είναι απλό:

1. ### Πήγαινε σε μια δωρεάν γεννήτρια

   Π.χ. qr-code-generator.com ή qrcode.tec-it.com.

2. ### Βάλε το URL του καταλόγου

   Το domain σου, π.χ. `https://menu.todomain.gr`. Επίλεξε τύπο «URL / Website».

3. ### Κατέβασέ το σε υψηλή ποιότητα

   Προτίμησε SVG ή PNG υψηλής ανάλυσης — δίνει καθαρή εκτύπωση σε κάθε μέγεθος (αυτοκόλλητο, σταντ τραπεζιού, αφίσα).

Επειδή ο κατάλογος είναι δυναμικός, τυπώνεις το QR μία φορά. Όσες αλλαγές κι αν κάνεις σε τιμές/προϊόντα, το ίδιο QR συνεχίζει να δείχνει τα ενημερωμένα.

## 4 Καθημερινή χρήση (για τον καταστηματάρχη)

Μπες στο `https://todomain.gr/admin-login`, δώσε τον κωδικό, και βλέπεις τον πίνακα διαχείρισης.

### 💶 Αλλαγή τιμής (το πιο γρήγορο)

Στη λίστα προϊόντων, κάθε γραμμή έχει ένα πεδίο τιμής. Άλλαξε το νούμερο και πάτα `Save`. Αποθηκεύεται αμέσως (με ένα ✓) χωρίς να φορτώσει ξανά η σελίδα. Η τιμή δέχεται και κείμενο, π.χ. `Από 2,40€`.

### 📷 Αλλαγή / ανέβασμα φωτογραφίας

Κάνε κλικ πάνω στη μικρή εικόνα (ή στο τετράγωνο με το +) αριστερά κάθε προϊόντος, διάλεξε αρχείο από το κινητό/υπολογιστή, και ανεβαίνει αυτόματα. Δεκτά: `jpg`, `png`, `webp` — έως 2 MB.

### ➕ Προσθήκη νέου προϊόντος

Στη φόρμα «Νέο Προϊόν»: τίτλος, τιμή, περιγραφή, κατηγορία (από λίστα), προαιρετικό «σήμα» (π.χ. `1ο ΣΕ ΠΑΡΑΓΓΕΛΙΕΣ`), φωτογραφία και κουτάκι «Δημοφιλές». Πάτα «Προσθήκη Προϊόντος».

### ✎ Επεξεργασία προϊόντος

Πάτα το εικονίδιο μολυβιού ✎ σε μια γραμμή. Ανοίγει παράθυρο όπου αλλάζεις τίτλο, περιγραφή, κατηγορία, σήμα και αν είναι δημοφιλές.

### 🗂️ Κατηγορίες

Στην ενότητα «Κατηγορίες» προσθέτεις νέα, μετονομάζεις υπάρχουσες (άλλαξε το όνομα → «Αποθήκευση»), ή διαγράφεις με το ✕.

Προσοχή στη διαγραφή κατηγορίας: δεν επιτρέπεται να διαγράψεις κατηγορία που έχει ακόμη προϊόντα — η εφαρμογή θα σε σταματήσει. Μετάφερε πρώτα τα προϊόντα σε άλλη κατηγορία (μέσω ✎) ή διάγραψέ τα.

### 🟢 Ένδειξη «Ανοιχτά / Κλειστά»

Υπολογίζεται αυτόματα από το ωράριο στη δημόσια σελίδα (Δευ–Παρ 07–21, Σάβ 08–20, Κυρ 08–18). Αν αλλάξει το ωράριο, ζήτησέ μου να το προσαρμόσω — είναι μέσα στο `resources/views/catalog.blade.php`.

## 5 Δομή αρχείων

Τα σημεία που πιθανόν να αγγίξεις είναι επισημασμένα.

coffee-drop/ ├─ app/ │ ├─ Http/Controllers/ │ │ ├─ CatalogController.php # δημόσια σελίδα │ │ └─ AdminController.php # όλη η λογική διαχείρισης │ ├─ Http/Middleware/ │ │ └─ AdminAuth.php # προστασία /admin │ └─ Models/ Category.php · Product.php ├─ database/ │ ├─ database.sqlite # Η ΒΑΣΗ — κράτα backup! │ ├─ migrations/ # δομή πινάκων │ └─ seeders/ CatalogSeeder.php # αρχικά προϊόντα ├─ public/ │ ├─ index.php # σημείο εισόδου │ └─ uploads/ # οι φωτογραφίες προϊόντων ├─ resources/views/ │ ├─ catalog.blade.php # εμφάνιση δημόσιας σελίδας │ └─ admin/ login · dashboard # πίνακας διαχείρισης ├─ routes/ web.php # διευθύνσεις URL └─ .env # ρυθμίσεις + κωδικός (μυστικό)
Backup: για να κρατήσεις αντίγραφο όλου του καταλόγου σου αρκεί να κατεβάσεις δύο πράγματα: το αρχείο `database/database.sqlite` και τον φάκελο `public/uploads/`. Αυτά περιέχουν όλα τα προϊόντα, τιμές και φωτογραφίες.

## ? Επίλυση προβλημάτων

Σύμπτωμα | Πιθανή αιτία & λύση
--- | ---
500 / λευκή σελίδα | Συνήθως permissions ή λείπει το `APP_KEY`. Τρέξε `php artisan key:generate` και έλεγξε τα δικαιώματα του `storage/` (775). Δες το `storage/logs/laravel.log`.
«readonly database» | Η SQLite δεν έχει δικαίωμα εγγραφής. `chmod 664 database/database.sqlite` και `chmod 775 database`.
Ο νέος κωδικός δεν δουλεύει | Άλλαξες το `.env` αλλά μένει η cache. Τρέξε `php artisan config:cache`.
Δεν ανεβαίνουν φωτογραφίες | Ο φάκελος `public/uploads/` δεν είναι εγγράψιμος (`chmod -R 775 public/uploads`) ή το αρχείο > 2MB / λάθος τύπος.
Οι φωτογραφίες δεν φαίνονται στη σελίδα | Με την Επιλογή Α, ο φάκελος `uploads` πρέπει να βρίσκεται μέσα στο `public_html/`. Βεβαιώσου ότι το `APP_URL` στο `.env` είναι σωστό.
404 σε όλες τις σελίδες εκτός αρχικής | Λείπει το `mod_rewrite` ή το `.htaccess`. Βεβαιώσου ότι ανέβηκε το `public/.htaccess` και ότι ο server επιτρέπει rewrites.
Αλλαγές δεν φαίνονται | Καθάρισε τις caches: `php artisan optimize:clear`.

Χρυσός κανόνας: μετά από κάθε αλλαγή σε αρχεία ή στο `.env` σε production, τρέξε `php artisan optimize:clear` και μετά ξανά τα `config:cache` / `route:cache` / `view:cache`.
↑