Compare commits

..

No commits in common. "master" and "feature/Esteban" have entirely different histories.

19 changed files with 154 additions and 592 deletions

View File

@ -21,8 +21,5 @@
<Button Text="Gérer les Réservations" <Button Text="Gérer les Réservations"
Clicked="OnReservationsClicked" Clicked="OnReservationsClicked"
Margin="0,10"/> Margin="0,10"/>
<Button Text="Gérer les départs et arrivées"
Clicked="OnGestionDepartClicked"
Margin="0,10"/>
</StackLayout> </StackLayout>
</ContentPage> </ContentPage>

View File

@ -2,7 +2,6 @@ using HegreHotel.Views;
using HegreHotel.Views.Chambre; using HegreHotel.Views.Chambre;
using HegreHotel.Views.Client; using HegreHotel.Views.Client;
using HegreHotel.Views.Reservation; using HegreHotel.Views.Reservation;
using HegreHotel.Views.GestionDepart;
using Microsoft.Maui.Controls; using Microsoft.Maui.Controls;
namespace HegreHotel namespace HegreHotel
@ -28,10 +27,5 @@ namespace HegreHotel
{ {
await Navigation.PushAsync(new ReservationsPage()); await Navigation.PushAsync(new ReservationsPage());
} }
private async void OnGestionDepartClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new GestionDepartPage());
}
} }
} }

View File

@ -17,7 +17,4 @@ public class Chambre
public int NbPersonne { get; set; } public int NbPersonne { get; set; }
public int StatusId { get; set; } public int StatusId { get; set; }
[Ignore]
public Status Status { get; set; }
} }

View File

@ -1,46 +0,0 @@
# HegreHotel
**Projet de gestion hôtelière développé avec MAUI pour les réceptionnistes.**
Permet la gestion des clients, des chambres, des réservations, et des réceptionnistes via une application mobile Android.
## 🔧 Installation
Cloner le projet :
```bash
git clone https://gitea.btssio-poitiers.fr/allavenavr/HegreHotel.git
cd HegreHotel
```
---
## 📱 Fonctionnalités principales
| Fonction | Description |
|------------------------|-----------------------------------------------------------------------------|
| Gestion des utilisateurs | Ajout, modification et suppression des clients et réceptionnistes |
| Gestion des chambres | Création, modification, suppression, visualisation, blocage/déblocage |
| Réservations | Création/modification avec dates, nombre d'invités, demandes spécifiques |
| Historique client | Accès à l'historique complet des séjours, y compris les réservations annulées |
| Affichage | Vue densemble des chambres disponibles/occupées, filtrage par période |
---
## ▶️ Lancement de lapplication
1. Sélectionner la plateforme cible : **Android**.
2. Brancher un appareil ou utiliser un émulateur.
3. Cliquer sur **Run** (ou `F5`) dans Visual Studio.
---
## 📦 Contraintes techniques
- Application mobile sous Android
- Développée avec .NET MAUI
- Utilisation d'une base de données SQLite
---
## 🕓 Deadline
- Livraison finale prévue : **9 mai 2025**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -6,7 +6,7 @@ namespace HegreHotel
{ {
public class SingletonConnection : SQLiteAsyncConnection public class SingletonConnection : SQLiteAsyncConnection
{ {
private static SingletonConnection? _instance; private static SingletonConnection instance;
private SingletonConnection(string dbPath) : base(dbPath) private SingletonConnection(string dbPath) : base(dbPath)
{ {
@ -14,11 +14,11 @@ namespace HegreHotel
public static SingletonConnection GetInstance(string dbPath) public static SingletonConnection GetInstance(string dbPath)
{ {
if (_instance == null) if (instance == null)
{ {
_instance = new SingletonConnection(dbPath); instance = new SingletonConnection(dbPath);
} }
return _instance; return instance;
} }
} }
} }

View File

@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Chambre.ChambresPage" x:Class="HegreHotel.Views.Chambre.ChambresPage"
Title="Gestion des Chambres" Title="Gestion des Chambres"
Appearing="ChambresPage_OnAppearing"> Appearing="ChambresPage_OnAppearing">
<StackLayout Padding="10"> <StackLayout Padding="10">
<Picker x:Name="PickerFiltreStatus" Title="Filtrer par statut" SelectedIndexChanged="OnFiltreChanged"/> <Picker x:Name="PickerFiltreStatus" Title="Filtrer par statut" SelectedIndexChanged="OnFiltreChanged"/>
<Button Text="Ajouter Chambre" <Button Text="Ajouter Chambre"
@ -16,34 +18,26 @@
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate> <DataTemplate>
<ViewCell> <ViewCell>
<StackLayout Orientation="Horizontal" Padding="5" Spacing="10"> <StackLayout Orientation="Horizontal" Padding="5">
<!-- Nom de la chambre -->
<Label Text="{Binding Nom}" <Label Text="{Binding Nom}"
FontAttributes="Bold" FontAttributes="Bold"
VerticalOptions="Center"
WidthRequest="120"/> <!-- Ajusté pour laisser de la place -->
<!-- Statut de la chambre -->
<Label Text="{Binding Status.Libelle}"
FontAttributes="Italic"
VerticalOptions="Center"
WidthRequest="100"/> WidthRequest="100"/>
<Label Text="{Binding Description}"
WidthRequest="150"/>
<Label Text="{Binding Status.Libelle}"
TextColor="Gray"/>
<!-- Icônes Modifier / Supprimer --> <Button Text="Modifier"
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand" Spacing="5"> CommandParameter="{Binding .}"
<ImageButton Source="edit_icon.png"
Clicked="OnModifierChambreClicked" Clicked="OnModifierChambreClicked"
HorizontalOptions="EndAndExpand"
Margin="5,0"/>
<Button Text="Supprimer"
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
HeightRequest="30"
WidthRequest="30"
BackgroundColor="Transparent"/>
<ImageButton Source="delete_icon.png"
Clicked="OnSupprimerChambreClicked" Clicked="OnSupprimerChambreClicked"
CommandParameter="{Binding .}" HorizontalOptions="End"
HeightRequest="30" Margin="5,0"/>
WidthRequest="30"
BackgroundColor="Transparent"/>
</StackLayout>
</StackLayout> </StackLayout>
</ViewCell> </ViewCell>
</DataTemplate> </DataTemplate>

View File

@ -4,7 +4,6 @@ using System.Collections.ObjectModel;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Microsoft.Maui.Storage; using Microsoft.Maui.Storage;
using System.Collections.Generic;
namespace HegreHotel.Views.Chambre namespace HegreHotel.Views.Chambre
{ {
@ -25,47 +24,12 @@ namespace HegreHotel.Views.Chambre
var db = SingletonConnection.GetInstance(dbPath); var db = SingletonConnection.GetInstance(dbPath);
_statuts = await db.Table<Status>().ToListAsync(); _statuts = await db.Table<Status>().ToListAsync();
var statutsAvecTous = new List<string> { "Tous" }; var statutsAvecTous = new List<string> { "Tous" };
statutsAvecTous.AddRange(_statuts.Select(s => s.Libelle)); statutsAvecTous.AddRange(_statuts.Select(s => s.Libelle));
PickerFiltreStatus.ItemsSource = statutsAvecTous; PickerFiltreStatus.ItemsSource = statutsAvecTous;
var chambresList = await db.Table<Models.Chambre>().ToListAsync(); var chambresList = await db.Table<Models.Chambre>().ToListAsync();
var reservationsList = await db.Table<Models.Reservation>().ToListAsync();
DateTime today = DateTime.Today;
foreach (var chambre in chambresList)
{
var chambreReservee = reservationsList
.Where(r => r.ChambreId == chambre.Id && r.DateDebut <= today && r.DateFin >= today)
.OrderByDescending(r => r.DateFin)
.FirstOrDefault();
if (chambreReservee != null)
{
chambre.StatusId = 2;
}
else
{
var chambreFinieRecemment = reservationsList
.Where(r => r.ChambreId == chambre.Id && r.DateFin >= today.AddDays(-2) && r.DateFin < today)
.OrderByDescending(r => r.DateFin)
.FirstOrDefault();
if (chambreFinieRecemment != null)
{
chambre.StatusId = 3;
}
else
{
chambre.StatusId = 1;
}
}
chambre.Status = _statuts.FirstOrDefault(s => s.Id == chambre.StatusId);
await db.UpdateAsync(chambre);
}
_toutesLesChambres.Clear(); _toutesLesChambres.Clear();
foreach (var chambre in chambresList) foreach (var chambre in chambresList)
{ {
@ -88,17 +52,8 @@ namespace HegreHotel.Views.Chambre
} }
else else
{ {
string statutSelectionne = PickerFiltreStatus.SelectedItem.ToString(); var statutSelectionne = _statuts[PickerFiltreStatus.SelectedIndex - 1].Id;
var statut = _statuts.FirstOrDefault(s => s.Libelle == statutSelectionne); ChambresListView.ItemsSource = _toutesLesChambres.Where(c => c.StatusId == statutSelectionne).ToList();
if (statut != null)
{
ChambresListView.ItemsSource = _toutesLesChambres.Where(c => c.StatusId == statut.Id).ToList();
}
else
{
Console.WriteLine($"⚠ Filtrage impossible : statut '{statutSelectionne}' introuvable.");
}
} }
} }
@ -109,7 +64,8 @@ namespace HegreHotel.Views.Chambre
private async void OnModifierChambreClicked(object sender, EventArgs e) private async void OnModifierChambreClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Chambre chambre) var chambre = ((Button)sender).CommandParameter as Models.Chambre;
if (chambre != null)
{ {
await Navigation.PushAsync(new ModifierChambrePage(chambre)); await Navigation.PushAsync(new ModifierChambrePage(chambre));
} }
@ -117,7 +73,8 @@ namespace HegreHotel.Views.Chambre
private async void OnSupprimerChambreClicked(object sender, EventArgs e) private async void OnSupprimerChambreClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Chambre chambre) var chambre = ((Button)sender).CommandParameter as Models.Chambre;
if (chambre != null)
{ {
bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer cette chambre ?", "Oui", "Non"); bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer cette chambre ?", "Oui", "Non");
if (confirmation) if (confirmation)

View File

@ -4,44 +4,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Chambre.ModifierChambrePage" x:Class="HegreHotel.Views.Chambre.ModifierChambrePage"
Title="Modifier la Chambre"> Title="Modifier la Chambre">
<StackLayout Padding="10">
<ScrollView>
<VerticalStackLayout Padding="20" Spacing="15">
<!-- Champ Nom -->
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryNom" Placeholder="Nom de la chambre"/> <Entry x:Name="EntryNom" Placeholder="Nom de la chambre"/>
</Frame> <Entry x:Name="EntryDescription" Placeholder="Description"/>
<Entry x:Name="EntryTarif" Placeholder="Tarif" Keyboard="Numeric"/>
<!-- Champ Description -->
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Editor x:Name="EntryDescription" Placeholder="Description" AutoSize="TextChanges"/>
</Frame>
<!-- Champ Tarif -->
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryTarif" Placeholder="Tarif (€)" Keyboard="Numeric"/>
</Frame>
<!-- Champ Nombre de personnes -->
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryNbPersonne" Placeholder="Nombre de personnes" Keyboard="Numeric"/> <Entry x:Name="EntryNbPersonne" Placeholder="Nombre de personnes" Keyboard="Numeric"/>
</Frame> <Button Text="Enregistrer les modifications" Clicked="OnEnregistrerClicked" Margin="0,20"/>
</StackLayout>
<Label Text="Modifier le Statut" Margin="10,0,0,0"/>
<Picker x:Name="PickerStatut" Title=""/>
<!-- Bouton Enregistrer -->
<Button Text="Enregistrer les modifications"
Clicked="OnEnregistrerClicked"
BackgroundColor="#007AFF"
TextColor="White"
CornerRadius="10"
Padding="12"
FontAttributes="Bold"
HorizontalOptions="Center"/>
</VerticalStackLayout>
</ScrollView>
</ContentPage> </ContentPage>

View File

@ -8,8 +8,6 @@ namespace HegreHotel.Views.Chambre
public partial class ModifierChambrePage : ContentPage public partial class ModifierChambrePage : ContentPage
{ {
Models.Chambre _chambre; Models.Chambre _chambre;
private List<Status> _statuts;
public ModifierChambrePage(Models.Chambre chambre) public ModifierChambrePage(Models.Chambre chambre)
{ {
InitializeComponent(); InitializeComponent();
@ -19,40 +17,17 @@ namespace HegreHotel.Views.Chambre
EntryDescription.Text = _chambre.Description; EntryDescription.Text = _chambre.Description;
EntryTarif.Text = _chambre.Tarif.ToString(); EntryTarif.Text = _chambre.Tarif.ToString();
EntryNbPersonne.Text = _chambre.NbPersonne.ToString(); EntryNbPersonne.Text = _chambre.NbPersonne.ToString();
LoadStatuts();
}
private async void LoadStatuts()
{
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3");
var db = SingletonConnection.GetInstance(dbPath);
_statuts = await db.Table<Status>().ToListAsync();
PickerStatut.ItemsSource = _statuts.Select(s => s.Libelle).ToList();
PickerStatut.SelectedIndex = _statuts.FindIndex(s => s.Id == _chambre.StatusId);
} }
private async void OnEnregistrerClicked(object sender, EventArgs e) private async void OnEnregistrerClicked(object sender, EventArgs e)
{ {
if (PickerStatut.SelectedIndex == -1)
{
await DisplayAlert("Erreur", "Veuillez sélectionner un statut", "OK");
return;
}
_chambre.Nom = EntryNom.Text; _chambre.Nom = EntryNom.Text;
_chambre.Description = EntryDescription.Text; _chambre.Description = EntryDescription.Text;
_chambre.Tarif = decimal.TryParse(EntryTarif.Text, out decimal tarif) ? tarif : _chambre.Tarif; _chambre.Tarif = decimal.TryParse(EntryTarif.Text, out decimal tarif) ? tarif : _chambre.Tarif;
_chambre.NbPersonne = int.TryParse(EntryNbPersonne.Text, out int nb) ? nb : _chambre.NbPersonne; _chambre.NbPersonne = int.TryParse(EntryNbPersonne.Text, out int nb) ? nb : _chambre.NbPersonne;
_chambre.StatusId = _statuts[PickerStatut.SelectedIndex].Id;
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3"); string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3");
var db = SingletonConnection.GetInstance(dbPath); var db = SingletonConnection.GetInstance(dbPath);
Console.WriteLine(_chambre.StatusId);
await db.UpdateAsync(_chambre); await db.UpdateAsync(_chambre);
await Navigation.PopAsync(); await Navigation.PopAsync();
} }

View File

@ -1,69 +1,46 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Client.ClientsPage" x:Class="HegreHotel.Views.Client.ClientsPage"
Title="Gestion des Clients" Title="Gestion des Clients"
Appearing="ClientsPage_OnAppearing"> Appearing="ClientsPage_OnAppearing">
<StackLayout Padding="10">
<StackLayout Padding="15" Spacing="10">
<Button Text="Ajouter Client" <Button Text="Ajouter Client"
Clicked="OnAjouterClientClicked" Clicked="OnAjouterClientClicked"
HorizontalOptions="Center" HorizontalOptions="Center"
BackgroundColor="#007AFF" Margin="0,10"/>
TextColor="White"
CornerRadius="10"
Padding="10"
FontAttributes="Bold"
WidthRequest="200" />
<CollectionView x:Name="ClientsCollectionView" <ListView x:Name="ClientsListView" HasUnevenRows="True" ItemTapped="OnClientTapped">
SelectionMode="None"> <ListView.ItemTemplate>
<CollectionView.ItemTemplate>
<DataTemplate> <DataTemplate>
<Frame Padding="10" <ViewCell>
CornerRadius="10" <StackLayout Orientation="Horizontal" Padding="5">
BackgroundColor="White"
BorderColor="#E5E7EB"
Margin="0,5"
BindingContext="{Binding .}">
<Frame.GestureRecognizers>
<TapGestureRecognizer Tapped="OnClientTapped" />
</Frame.GestureRecognizers>
<StackLayout Orientation="Horizontal" Spacing="15">
<Image Source="user_icon.png"
WidthRequest="40"
HeightRequest="40" />
<VerticalStackLayout>
<Label Text="{Binding Nom}" <Label Text="{Binding Nom}"
VerticalOptions="Center"
FontAttributes="Bold" FontAttributes="Bold"
FontSize="16" /> WidthRequest="100"/>
<Label Text="{Binding Prenom}" <Label Text="{Binding Prenom}"
FontSize="14" VerticalOptions="Center"
TextColor="Gray" /> WidthRequest="100"/>
</VerticalStackLayout>
<StackLayout Orientation="Horizontal" <Button Text="Modifier"
HorizontalOptions="EndAndExpand"
Spacing="5">
<ImageButton Source="edit_icon.png"
Clicked="OnModifierClientClicked" Clicked="OnModifierClientClicked"
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
HeightRequest="30" HorizontalOptions="EndAndExpand"
WidthRequest="30" Margin="5,0"/>
BackgroundColor="Transparent" />
<ImageButton Source="delete_icon.png" <Button Text="Supprimer"
Clicked="OnSupprimerClientClicked" Clicked="OnSupprimerClientClicked"
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
HeightRequest="30" HorizontalOptions="End"
WidthRequest="30" Margin="5,0"/>
BackgroundColor="Transparent" />
</StackLayout> </StackLayout>
</StackLayout> </ViewCell>
</Frame>
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </ListView.ItemTemplate>
</CollectionView> </ListView>
</StackLayout> </StackLayout>
</ContentPage> </ContentPage>

View File

@ -17,26 +17,17 @@ namespace HegreHotel.Views.Client
} }
private async void LoadClients() private async void LoadClients()
{
try
{ {
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3"); string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3");
var db = SingletonConnection.GetInstance(dbPath); var db = SingletonConnection.GetInstance(dbPath);
var clientsList = await db.Table<Models.Client>().ToListAsync(); var clientsList = await db.Table<Models.Client>().ToListAsync();
MainThread.BeginInvokeOnMainThread(() =>
{
Clients.Clear(); Clients.Clear();
foreach (var client in clientsList) foreach (var client in clientsList)
Clients.Add(client);
ClientsCollectionView.ItemsSource = Clients;
});
}
catch (Exception ex)
{ {
Console.WriteLine($"Erreur lors du chargement des clients : {ex.Message}"); Clients.Add(client);
} }
ClientsListView.ItemsSource = Clients;
} }
private async void OnAjouterClientClicked(object sender, EventArgs e) private async void OnAjouterClientClicked(object sender, EventArgs e)
@ -46,7 +37,8 @@ namespace HegreHotel.Views.Client
private async void OnModifierClientClicked(object sender, EventArgs e) private async void OnModifierClientClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Client client) var client = ((Button)sender).CommandParameter as Models.Client;
if (client != null)
{ {
await Navigation.PushAsync(new ModifierClientPage(client)); await Navigation.PushAsync(new ModifierClientPage(client));
} }
@ -54,7 +46,8 @@ namespace HegreHotel.Views.Client
private async void OnSupprimerClientClicked(object sender, EventArgs e) private async void OnSupprimerClientClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Client client) var client = ((Button)sender).CommandParameter as Models.Client;
if (client != null)
{ {
bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer ce client ?", "Oui", "Non"); bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer ce client ?", "Oui", "Non");
if (confirmation) if (confirmation)
@ -62,24 +55,27 @@ namespace HegreHotel.Views.Client
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3"); string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3");
var db = SingletonConnection.GetInstance(dbPath); var db = SingletonConnection.GetInstance(dbPath);
await db.DeleteAsync(client); await db.DeleteAsync(client);
LoadClients();
MainThread.BeginInvokeOnMainThread(() =>
{
Clients.Remove(client);
});
} }
} }
} }
private void ClientsPage_OnAppearing(object sender, EventArgs e) private void ClientsPage_OnAppearing(object? sender, EventArgs e)
{ {
LoadClients(); LoadClients();
} }
private async void OnClientTapped(object sender, EventArgs e) private async void OnClientTapped(object sender, ItemTappedEventArgs e)
{ {
if (sender is Frame frame && frame.BindingContext is Models.Client client) if (e.Item != null)
{ {
// Désélectionne l'élément tappé
((ListView)sender).SelectedItem = null;
// Récupère le client sélectionné
var client = e.Item as Models.Client;
// Navigue vers la page de détails du client
await Navigation.PushAsync(new DetailsClientPage(client)); await Navigation.PushAsync(new DetailsClientPage(client));
} }
} }

View File

@ -1,59 +1,35 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Client.DetailsClientPage" x:Class="HegreHotel.Views.Client.DetailsClientPage">
Title="Détails du Client"> <ContentPage.Content>
<ScrollView> <ScrollView>
<VerticalStackLayout Padding="20" Spacing="15"> <StackLayout Padding="10" Spacing="5">
<HorizontalStackLayout Spacing="5">
<!-- Nom et prénom --> <Label Text="{Binding Nom}" FontAttributes="Bold" FontSize="18"/>
<Frame Padding="10" CornerRadius="10" BackgroundColor="#F3F4F6"> <Label Text="{Binding Prenom}" FontSize="18"/>
<HorizontalStackLayout Spacing="10">
<Label Text="{Binding Nom}" FontAttributes="Bold" FontSize="22"/>
<Label Text="{Binding Prenom}" FontSize="22"/>
</HorizontalStackLayout>
</Frame>
<!-- Coordonnées -->
<Frame Padding="10" CornerRadius="10" BackgroundColor="#F9FAFB">
<VerticalStackLayout Spacing="5">
<HorizontalStackLayout Spacing="10">
<Image Source="email_icon.png" WidthRequest="20" HeightRequest="20"/>
<Label Text="{Binding Email}" FontSize="16"/>
</HorizontalStackLayout>
<HorizontalStackLayout Spacing="10">
<Image Source="phone_icon.png" WidthRequest="20" HeightRequest="20"/>
<Label Text="{Binding Telephone}" FontSize="16"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<VerticalStackLayout>
<Label Text="{Binding Email}"/>
<Label Text="{Binding Telephone}"/>
</VerticalStackLayout> </VerticalStackLayout>
</Frame> <Label Text="Historique des réservations :" FontAttributes="Bold" FontSize="Large"/>
<ListView x:Name="ListeReservations">
<!-- Historique des réservations --> <ListView.ItemTemplate>
<Label Text="Historique des réservations :" FontAttributes="Bold" FontSize="18" Margin="0,10,0,5"/>
<CollectionView x:Name="ListeReservations">
<CollectionView.ItemTemplate>
<DataTemplate> <DataTemplate>
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB" Margin="0,5"> <ViewCell>
<VerticalStackLayout Spacing="5"> <StackLayout Orientation="Horizontal" Padding="5" Spacing="10">
<Label Text="{Binding ChambreNom}" FontAttributes="Bold" FontSize="16"/>
<HorizontalStackLayout Spacing="10">
<Label Text="Début :" FontAttributes="Bold"/>
<Label Text="{Binding DateDebut, StringFormat='{0:dd/MM/yyyy}'}"/> <Label Text="{Binding DateDebut, StringFormat='{0:dd/MM/yyyy}'}"/>
</HorizontalStackLayout>
<HorizontalStackLayout Spacing="10">
<Label Text="Fin :" FontAttributes="Bold"/>
<Label Text="{Binding DateFin, StringFormat='{0:dd/MM/yyyy}'}"/> <Label Text="{Binding DateFin, StringFormat='{0:dd/MM/yyyy}'}"/>
</HorizontalStackLayout>
<HorizontalStackLayout Spacing="10">
<Label Text="Invités :" FontAttributes="Bold"/>
<Label Text="{Binding NbInvite}"/> <Label Text="{Binding NbInvite}"/>
</HorizontalStackLayout> <Label Text="{Binding ChambreNom}"/>
</VerticalStackLayout> </StackLayout>
</Frame> </ViewCell>
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </ListView.ItemTemplate>
</CollectionView> </ListView>
</StackLayout>
</VerticalStackLayout>
</ScrollView> </ScrollView>
</ContentPage.Content>
</ContentPage> </ContentPage>

View File

@ -1,47 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Client.ModifierClientPage" x:Class="HegreHotel.Views.Client.ModifierClientPage"
Title="Modifier le Client"> Title="Modifier le Client">
<StackLayout Padding="10">
<ScrollView> <Entry x:Name="EntryNom" Placeholder="Nom du client"/>
<VerticalStackLayout Padding="20" Spacing="15"> <Entry x:Name="EntryPrenom" Placeholder="Prenom"/>
<Entry x:Name="EntryEmail" Placeholder="Email" />
<!-- Champ Nom --> <Entry x:Name="EntryTelephone" Placeholder="Téléphone" Keyboard="Numeric"/>
<Label Text="Nom du client" FontAttributes="Bold" FontSize="16"/> <Button Text="Enregistrer" Clicked="OnEnregistrerClicked" Margin="0,20"/>
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB"> </StackLayout>
<Entry x:Name="EntryNom" Placeholder="Entrez le nom du client"/>
</Frame>
<!-- Champ Prénom -->
<Label Text="Prénom" FontAttributes="Bold" FontSize="16"/>
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryPrenom" Placeholder="Entrez le prénom"/>
</Frame>
<!-- Champ Email -->
<Label Text="Email" FontAttributes="Bold" FontSize="16"/>
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryEmail" Placeholder="Entrez l'email" Keyboard="Email"/>
</Frame>
<!-- Champ Téléphone -->
<Label Text="Téléphone" FontAttributes="Bold" FontSize="16"/>
<Frame Padding="10" CornerRadius="10" BackgroundColor="White" BorderColor="#E5E7EB">
<Entry x:Name="EntryTelephone" Placeholder="Entrez le téléphone" Keyboard="Telephone"/>
</Frame>
<!-- Bouton Enregistrer -->
<Button Text="Enregistrer les modifications"
Clicked="OnEnregistrerClicked"
BackgroundColor="#007AFF"
TextColor="White"
CornerRadius="10"
Padding="12"
FontAttributes="Bold"
HorizontalOptions="Center"/>
</VerticalStackLayout>
</ScrollView>
</ContentPage> </ContentPage>

View File

@ -1,136 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.GestionDepart.GestionDepartPage"
Title="Gestion des départs et arrivées"
Appearing="GestionPage_OnAppearing">
<ContentPage.Content>
<StackLayout>
<StackLayout>
<StackLayout Padding="20" Orientation="Vertical">
<StackLayout Padding="20" Orientation="Horizontal">
<BoxView HeightRequest="5" Color="MediumPurple"/>
<Label Text="Arrivée(s)"
FontSize="24"
FontAttributes="Bold"
HorizontalOptions="Center"/>
</StackLayout>
<ListView x:Name="GestionArriveListView" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical" Padding="5" HorizontalOptions="FillAndExpand">
<!-- Première ligne : ID chambre et Nombre de personnes -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="ID chambre :"
VerticalOptions="Center"
WidthRequest="120"/>
<Label Text="{Binding ChambreId}"
VerticalOptions="Center"
WidthRequest="50"/>
<Label Text="Nombres de personnes :"
VerticalOptions="Center"
WidthRequest="160"/>
<Label Text="{Binding NbPersonnes}"
VerticalOptions="Center"
WidthRequest="50"/>
</StackLayout>
<!-- Deuxième ligne : Date d'arrivée -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="Date d'arrivée :"
VerticalOptions="Center"
WidthRequest="150"/>
<Label Text="{Binding DateDebut, StringFormat='{0:dd/MM/yyyy}'}"
VerticalOptions="Center"
WidthRequest="100"/>
</StackLayout>
<!-- Troisième ligne : Date de départ -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="Date de départ :"
VerticalOptions="Center"
WidthRequest="150"/>
<Label Text="Aujourd'hui"
VerticalOptions="Center"
WidthRequest="100"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
<StackLayout Padding="20" Orientation="Vertical">
<StackLayout Padding="20" Orientation="Horizontal">
<BoxView HeightRequest="5" Color="MediumPurple"/>
<Label Text="Départ(s)"
FontSize="24"
FontAttributes="Bold"
HorizontalOptions="Center" />
</StackLayout>
<ListView x:Name="GestionDepartListView" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<!-- StackLayout principal avec orientation verticale -->
<StackLayout Orientation="Vertical" Padding="5" HorizontalOptions="FillAndExpand">
<!-- Première ligne : ID chambre et Nombre de personnes -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="ID chambre :"
VerticalOptions="Center"
WidthRequest="120"/>
<Label Text="{Binding ChambreId}"
VerticalOptions="Center"
WidthRequest="50"/>
<Label Text="Nombres de personnes :"
VerticalOptions="Center"
WidthRequest="160"/>
<Label Text="{Binding NbPersonnes}"
VerticalOptions="Center"
WidthRequest="50"/>
</StackLayout>
<!-- Deuxième ligne : Date d'arrivée -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="Date d'arrivée :"
VerticalOptions="Center"
WidthRequest="150"/>
<Label Text="{Binding DateDebut, StringFormat='{0:dd/MM/yyyy}'}"
VerticalOptions="Center"
WidthRequest="100"/>
</StackLayout>
<!-- Troisième ligne : Date de départ -->
<StackLayout Orientation="Horizontal" Padding="5" HorizontalOptions="FillAndExpand">
<Label Text="Date de départ :"
VerticalOptions="Center"
WidthRequest="150"/>
<Label Text="Aujourd'hui"
VerticalOptions="Center"
WidthRequest="100"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ContentPage.Content>
</ContentPage>

View File

@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using HegreHotel.Models;
using Microsoft.Maui.Controls;
using System.Collections.ObjectModel;
using System.IO;
using Microsoft.Maui.Storage;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HegreHotel.Views.GestionDepart;
public partial class GestionDepartPage : ContentPage
{
public ObservableCollection<Models.Reservation> ReservationsDeb { get; set; } = new ObservableCollection<Models.Reservation>();
public ObservableCollection<Models.Reservation> ReservationsFin { get; set; } = new ObservableCollection<Models.Reservation>();
public GestionDepartPage()
{
InitializeComponent();
LoadReservations();
}
private async void LoadReservations()
{
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "HegreHotel.db3");
var db = SingletonConnection.GetInstance(dbPath);
var reservationList = await db.Table<Models.Reservation>().ToListAsync();
ReservationsDeb.Clear();
ReservationsFin.Clear();
foreach (var reservation in reservationList)
{
if (reservation.DateDebut == DateTime.Now.Date)
{
ReservationsDeb.Add(reservation);
} else if (reservation.DateFin == DateTime.Now.Date)
{
ReservationsFin.Add(reservation);
}
}
GestionArriveListView.ItemsSource = ReservationsDeb;
GestionDepartListView.ItemsSource = ReservationsFin;
}
private void GestionPage_OnAppearing(object? sender, EventArgs e)
{
LoadReservations();
}
}

View File

@ -1,20 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HegreHotel.Views.Reservation.ReservationsPage" x:Class="HegreHotel.Views.Reservation.ReservationsPage"
Title="Gestion des Réservations" Title="Gestion des Réservations"
Appearing="ReservationsPage_OnAppearing"> Appearing="ReservationsPage_OnAppearing">
<StackLayout Padding="10"> <StackLayout Padding="10">
<Button Text="Ajouter Réservation" <Button Text="Ajouter Réservation"
Clicked="OnAjouterReservationClicked" Clicked="OnAjouterReservationClicked"
HorizontalOptions="Center" HorizontalOptions="Center"
Margin="0,10"/> Margin="0,10"/>
<ListView x:Name="ReservationsListView" HasUnevenRows="True"> <ListView x:Name="ReservationsListView" HasUnevenRows="True">
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate> <DataTemplate>
<ViewCell> <ViewCell>
<StackLayout Orientation="Horizontal" Padding="5" Spacing="10"> <StackLayout Orientation="Horizontal" Padding="5">
<Label Text="{Binding NbInvite}" <Label Text="{Binding NbInvite}"
VerticalOptions="Center" VerticalOptions="Center"
WidthRequest="50"/> WidthRequest="50"/>
@ -25,20 +29,17 @@
VerticalOptions="Center" VerticalOptions="Center"
WidthRequest="100"/> WidthRequest="100"/>
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand" Spacing="5"> <Button Text="Modifier"
<ImageButton Source="edit_icon.png" CommandParameter="{Binding .}"
Clicked="OnModifierReservationClicked" Clicked="OnModifierReservationClicked"
HorizontalOptions="EndAndExpand"
Margin="5,0"/>
<Button Text="Supprimer"
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
HeightRequest="30"
WidthRequest="30"
BackgroundColor="Transparent"/>
<ImageButton Source="delete_icon.png"
Clicked="OnSupprimerReservationClicked" Clicked="OnSupprimerReservationClicked"
CommandParameter="{Binding .}" HorizontalOptions="End"
HeightRequest="30" Margin="5,0"/>
WidthRequest="30"
BackgroundColor="Transparent"/>
</StackLayout>
</StackLayout> </StackLayout>
</ViewCell> </ViewCell>
</DataTemplate> </DataTemplate>

View File

@ -36,7 +36,8 @@ namespace HegreHotel.Views.Reservation
private async void OnModifierReservationClicked(object sender, EventArgs e) private async void OnModifierReservationClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Reservation reservation) var reservation = ((Button)sender).CommandParameter as Models.Reservation;
if (reservation != null)
{ {
await Navigation.PushAsync(new ModifierReservationPage(reservation)); await Navigation.PushAsync(new ModifierReservationPage(reservation));
} }
@ -44,7 +45,8 @@ namespace HegreHotel.Views.Reservation
private async void OnSupprimerReservationClicked(object sender, EventArgs e) private async void OnSupprimerReservationClicked(object sender, EventArgs e)
{ {
if (sender is ImageButton imageButton && imageButton.CommandParameter is Models.Reservation reservation) var reservation = ((Button)sender).CommandParameter as Models.Reservation;
if (reservation != null)
{ {
bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer cette réservation ?", "Oui", "Non"); bool confirmation = await DisplayAlert("Suppression", "Voulez-vous vraiment supprimer cette réservation ?", "Oui", "Non");
if (confirmation) if (confirmation)