Skip to content
This repository was archived by the owner on Jul 20, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions db/migrations/R__automatic_account_deletion.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- R__automatic_account_deletion
-- delete once a day all the account that haven't connected since 2 years.
DROP EVENT IF EXISTS daily_account_cleanup;

CREATE EVENT daily_account_cleanup -- CREATE IF EXISTS
ON SCHEDULE
EVERY 1 MINUTE
DO
DELETE FROM account
WHERE last_login < NOW() - INTERVAL 2 YEAR;
1 change: 1 addition & 0 deletions src/app/controllers/AuthController.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public function signIn() {
$user = $this->accountModel->getAccountByEmail($email);

if ($user && password_verify($password, $user->password)) {
$this->accountModel->updateLastLogin($user->id);
$_SESSION['user_id'] = $user->id;
$_SESSION['user_first_name'] = $user->first_name;
$_SESSION['user_last_name'] = $user->last_name;
Expand Down
3 changes: 3 additions & 0 deletions src/app/controllers/HomeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ class HomeController {
public function home() {
require_once __DIR__ . '/../views/home.php';
}
public function gdpr() {
require_once __DIR__ . '/../views/gdpr.php';
}
}
22 changes: 22 additions & 0 deletions src/app/controllers/InvoiceController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

class InvoiceController
{
private $dbConnection;

public function __construct(PDO $dbConnection) {
$this->dbConnection = $dbConnection;
}
public function invoices() {
if (!isset($_SESSION['user_id'])) {
header('Location: /sign-in');
exit;
}
require_once __DIR__ . '/../models/Invoice.php';
$invoiceModel = new Invoice($this->dbConnection);
$accountId = $_SESSION['user_id'];
$invoices = $invoiceModel->getInvoicesByAccountId($accountId);
$title = 'My Invoices';
require_once __DIR__ . '/../views/invoices.php';
}
}
10 changes: 10 additions & 0 deletions src/app/models/Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,14 @@ public function deleteAccount($id) {

return $stmt->execute();
}

/**
* Update the last login to the current time.
* @param $userId
*/
public function updateLastLogin($userId) {
$sql = "UPDATE account SET last_login = NOW() WHERE id = :id";
$stmt = $this->conn->prepare($sql);
return $stmt->execute(['id' => $userId]);
}
}
22 changes: 22 additions & 0 deletions src/app/models/Invoice.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php
require_once __DIR__ . '/BaseModel.php';
class Invoice extends BaseModel
{
public function getInvoicesByAccountId($accountId) {
$query = "SELECT i.*,
s.name AS status_name,
m.name AS payment_mode_name
FROM invoice i
LEFT JOIN invoice_status s ON i.status_id = s.id
LEFT JOIN payment p ON i.payment_id = p.id
LEFT JOIN payment_mode m ON p.mode_id = m.id
WHERE i.account_id = :accountId
ORDER BY i.date DESC";

$stmt = $this->conn->prepare($query);
$stmt->bindValue(':accountId', $accountId, PDO::PARAM_INT);
$stmt->execute();

return $stmt->fetchAll(PDO::FETCH_OBJ);
}
}
55 changes: 29 additions & 26 deletions src/app/views/account.php
Original file line number Diff line number Diff line change
@@ -1,43 +1,46 @@
<?php include 'partials/header.php'; ?>

<main>
<h1>My account</h1>
<main class="container py-5">
<h1 class="text-pourpre" >My account</h1>

<div id="loading">Loading account information...</div>

<!-- Sensitive information are not displayed until server is sure user is authenticated -->
<div id="account-content" style="display: none;">
<div class="account-details">
<div>
<label>First name</label>
<p id="user-first-name"></p>
<div id="account-content" style="display: none;" class="card shadow-sm p-4 mb-4">
<div class="account-details row">
<div class="col-md-4">
<label class="fw-bold">First name</label>
<p id="user-first-name" class="border-bottom pb-1"></p>
</div>
<div>
<label>Last name</label>
<p id="user-last-name"></p>
<div class="col-md-4">
<label class="fw-bold">Last name</label>
<p id="user-last-name" class="border-bottom pb-1"></p>
</div>
<div>
<label>Email</label>
<p id="user-email"></p>
<div class="col-md-4">
<label class="fw-bold">Email</label>
<p id="user-email" class="border-bottom pb-1"></p>
</div>
</div>
</div>
<h2>Update account</h2>
<form action="/update-account" method="POST">
<div class="account-details">
<div>
<label>First name</label>
<input type="text" name="first_name"/>

<h2 class="text-pourpre border-bottom pb-2 mb-3">Update account</h2>
<form action="/update-account" method="POST" class="card p-4 shadow-sm">
<div class="account-details row g-3">
<div class="col-md-4">
<label class="form-label">First name</label>
<input type="text" name="first_name" class="form-control"/>
</div>
<div class="col-md-4">
<label class="form-label">Last name</label>
<input type="text" name="last_name" class="form-control"/>
</div>
<div>
<label>Last name</label>
<input type="text" name="last_name"/>
<div class="col-md-4">
<label class="form-label">Phone</label>
<input type="text" name="phone" class="form-control"/>
</div>
<div>
<label>Phone</label>
<input type="text" name="phone"/>
<div class="col-12 mt-4">
<button type="submit" class="btn btn-pourpre text-white px-4">Update</button>
</div>
<button type="submit">Update</button>
</div>
</form>
</main>
Expand Down
76 changes: 76 additions & 0 deletions src/app/views/gdpr.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php include 'partials/header.php'; ?>

<div class="container py-5">
<div class="mb-5">
<h1 class="text-pourpre fw-bold">Politique de Confidentialité (RGPD)</h1>
<p class="text-muted">Dernière mise à jour : 03 mai 2026</p>
</div>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">1. Responsable du traitement des données</h2>
<p style="text-align: justify;">Le responsable du traitement des données personnelles est l'entreprise :</p>
<address class="p-3">
<strong class="text-pourpre">EFES KEBAB</strong><br>
Adresse établissement<br>
90000, Belfort<br>
Email : <a href="mailto:efesRestoBelfort@gmail.com" class="text-decoration-none">efesRestoBelfort@gmail.com</a>
</address>
</section>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">2. Données collectées</h2>
<p style="text-align: justify;">Dans le cadre de votre commande de repas sur notre site, nous collectons les données suivantes :</p>
<ul>
<li><strong>Identité :</strong> Nom, prénom.</li>
<li><strong>Coordonnées :</strong> Adresse de livraison, adresse e-mail, numéro de téléphone.</li>
<li><strong>Données de commande :</strong> Historique des produits achetés et détails de la transaction.</li>
<li><strong>Données techniques :</strong> Adresse IP, type de navigateur (via les cookies).</li>
</ul>
</section>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">3. Finalités du traitement</h2>
<p style="text-align: justify;">Nous utilisons vos données pour les raisons suivantes :</p>
<ul>
<li>Préparation et livraison de vos repas.</li>
<li>Gestion de la relation client et facturation.</li>
<li>Amélioration de la navigation sur notre site.</li>
</ul>
</section>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">4. Durée de conservation des données</h2>
<p style="text-align: justify;">Vos données sont conservées uniquement le temps nécessaire :</p>
<ul>
<li>Les données relatives à votre compte client sont conservées pendant 2 ans après votre dernier achat.</li>
<li>Les documents de facturation sont conservés 10 ans pour répondre aux obligations comptables et fiscales.</li>
</ul>
</section>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">5. Destinataires des données</h2>
<p style="text-align: justify;">Vos données ne sont jamais revendues. Elles sont uniquement transmises aux services nécessaires au traitement de votre commande :</p>
<ul>
<li>L'équipe en cuisine et les livreurs du restaurant.</li>
<li>Notre prestataire de paiement sécurisé.</li>
<li>Notre hébergeur de site web.</li>
</ul>
</section>

<section class="mb-4">
<h2 class="h4 border-bottom pb-2 text-pourpre">6. Vos droits</h2>
<p style="text-align: justify;">Conformément au RGPD, vous disposez de droits sur vos données personnelles :</p>
<ul>
<li>Droit d'accès et de rectification.</li>
<li>Droit à l'effacement de vos données.</li>
<li>Droit de retirer votre consentement à tout moment.</li>
</ul>
<p>Pour exercer ces droits, contactez-nous : <strong>temp@gmail.com</strong>.</p>
</section>

<div class="mt-5">
<a href="/" class="btn btn-outline-secondary btn-sm">← Retour à l'accueil</a>
</div>
</div>

<?php include 'partials/footer.php'; ?>
37 changes: 37 additions & 0 deletions src/app/views/invoices.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php include 'partials/header.php'; ?>

<main class="container py-5">
<h1 class="text-pourpre mb-4">Mes Factures</h1>

<table class="table table-bordered">
<thead>
<tr>
<th>N° Facture</th>
<th>Date</th>
<th>Statut</th>
<th>Total</th>
</tr>
</thead>
<tbody>

<?php foreach ($invoices as $invoice): ?>
<tr>
<td>
<?= $invoice->id ?>
</td>
<td>
<? echo date('d/m/Y', strtotime($invoice->date)) ?>
</td>
<td>
<?php echo htmlspecialchars(ucfirst($invoice->status_name)); ?>
</td>
<td>
<?php echo $invoice->total ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</main>

<?php include 'partials/footer.php'; ?>
5 changes: 4 additions & 1 deletion src/app/views/partials/footer.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<footer class="py-4 mt-5 bg-light border-top text-center">
<footer class="mt-auto py-4 mt-5 bg-light border-top text-center">


<div class="container">
<p class="small mb-1"><a href="/gdpr" class="text-decoration-none text-muted">Politique de confidentialité (RGPD)</a></p>
<p class="mb-1 fw-bold text-pourpre">EFES KEBAB</p>
<p class="small text-muted mb-0">&copy; 2026 - Tous droits réservés</p>
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/app/views/partials/header.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@

</head>

<body>
<body class = "d-flex min-vh-100 flex-column">

<?php include 'navbar.php'; ?>
1 change: 1 addition & 0 deletions src/app/views/partials/navbar.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<li class="nav-item"><a class="nav-link" href="#">Order</a></li>
<li class="nav-item"><a class="nav-link" href="/account">My account</a></li>
<li class="nav-item"><a class="nav-link" href="/cart">Cart</a></li>
<li class="nav-item"><a class="nav-link" href="/invoices">Invoices</a></li>
<li class="nav-item"><a class="nav-link" href="/sign-out">Sign out</a></li>
<?php } else { ?>
<li class="nav-item"><a class="nav-link" href="/sign-in">Sign in</a></li>
Expand Down
10 changes: 10 additions & 0 deletions src/routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@
'controller' => 'CartController',
'action' => 'viewCart',
'access' => ['client']
],
'/invoices' => [
'controller' => 'InvoiceController',
'action' => 'invoices',
'access' => ['client']
],
'/admin' => [
'controller' => 'AdminController',
Expand Down Expand Up @@ -136,6 +141,11 @@
'action' => 'viewEditSupplier',
'access' => ['admin']
],
'/gdpr' => [
'controller' => 'HomeController',
'action' => 'gdpr',
'access' => ['guest', 'client', 'admin']
],
],
'POST' => [
'/sign-in' => [
Expand Down