🎨 📝 Add all Banquale and Model projects documantation

master
Antoine PEREDERII 2 years ago
parent 5821c8c1d0
commit e1c68f442f

@ -2,25 +2,35 @@
using Banquale.Stub;
using Banquale.DataContractPersistance;
namespace Banquale;
namespace Banquale
{
/// <summary>
/// Classe principale de l'application Banquale.
/// </summary>
public partial class App : Application
{
/// <summary>
/// Déclare et instencie le manager MyManager
/// </summary>
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub() /*DataContractPersistance.DataContractPersXML()*/);
/// <summary>
/// Initialise une nouvelle instance de la classe App.
/// </summary>
public App()
{
// Charge les données
MyManager.DataLoad();
// Définit le mécanisme de persistance
MyManager.Persistence = new DataContractPersistance.DataContractPersXML();
// Enregistre les données
MyManager.DataSave();
InitializeComponent();
MainPage = new AppShell();
}
}
}

@ -3,16 +3,24 @@ using Banquale.Views.Category;
using Banquale.Views.Transfer;
using Model;
namespace Banquale;
namespace Banquale
{
/// <summary>
/// Classe représentant la coquille de l'application.
/// </summary>
public partial class AppShell : Shell
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application (Manager Mgr).
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe AppShell.
/// </summary>
public AppShell()
{
InitializeComponent();
}
}
}

@ -7,20 +7,31 @@ using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.DataContractPersistance
{
// Nous ne pouvons utiliser la persitance avec JSON dans notre application car la persitance avec JSON n'accepte pas
// les références, nous sommes pourtant obligé d'utiliser des références pour la sauvegarde des transactions
/// <summary>
/// Gestionnaire de persistance avec JSON utilisant DataContract.
/// </summary>
public class DataContractPersJSON : IPersistenceManager
{
/// <summary>
/// Chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.json";
/// <summary>
/// Nom du fichier de sauvegarde.
/// </summary>
public string FileName { get; set; } = "DataSave.json";
/// <summary>
/// Charge les données sauvegardées.
/// </summary>
/// <returns>Tuple contenant la liste des clients et le consultant.</returns>
public (HashSet<Customer>, Consultant) DataLoad()
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
@ -33,12 +44,15 @@ namespace Banquale.DataContractPersistance
}
return (data.customer, data.consultant);
}
/// <summary>
/// Sauvegarde les données.
/// </summary>
/// <param name="cu">Liste des clients.</param>
/// <param name="co">Consultant.</param>
public void DataSave(HashSet<Customer> cu, Consultant co)
{
DataToPersist data = new DataToPersist();
data.customer = cu;
data.consultant = co;
@ -50,7 +64,7 @@ namespace Banquale.DataContractPersistance
stream,
System.Text.Encoding.UTF8,
false,
true))//<- this boolean says that we sant indentation
true)) // <- this boolean says that we want indentation
{
jsonSerializer.WriteObject(writer, data);
}

@ -9,17 +9,35 @@ using System.Xml;
namespace Banquale.DataContractPersistance
{
/// <summary>
/// Classe de gestion de persistance utilisant LINQ.
/// </summary>
public class DataContractPersLINQ : IPersistenceManager
{
/// <summary>
/// Chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
/// <summary>
/// Nom du fichier de sauvegarde.
/// </summary>
public string FileName { get; set; } = "DataSave.xml";
/// <summary>
/// Charge les données à partir du fichier de sauvegarde.
/// </summary>
/// <returns>Un tuple contenant la liste des clients et le consultant.</returns>
public (HashSet<Customer>, Consultant) DataLoad()
{
throw new NotImplementedException();
}
/// <summary>
/// Sauvegarde les données dans le fichier de sauvegarde.
/// </summary>
/// <param name="cu">Liste des clients à sauvegarder.</param>
/// <param name="co">Consultant à sauvegarder.</param>
public void DataSave(HashSet<Customer> cu, Consultant co)
{
XDocument dataSave = new XDocument();

@ -5,15 +5,27 @@ using System.Diagnostics;
using System.Runtime.Serialization;
using System.Xml;
namespace Banquale.DataContractPersistance
{
/// <summary>
/// Gestionnaire de persistance avec XML utilisant DataContract.
/// </summary>
public class DataContractPersXML : IPersistenceManager
{
/// <summary>
/// Chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
/// <summary>
/// Nom du fichier de sauvegarde.
/// </summary>
public string FileName { get; set; } = "DataSave.xml";
/// <summary>
/// Charge les données sauvegardées.
/// </summary>
/// <returns>Tuple contenant la liste des clients et le consultant.</returns>
public (HashSet<Customer>, Consultant) DataLoad()
{
var serializer = new DataContractSerializer(typeof(DataToPersist));
@ -35,6 +47,11 @@ namespace Banquale.DataContractPersistance
return (data.customer, data.consultant);
}
/// <summary>
/// Sauvegarde les données.
/// </summary>
/// <param name="cu">Liste des clients.</param>
/// <param name="co">Consultant.</param>
public void DataSave(HashSet<Customer> cu, Consultant co)
{
var serializer = new DataContractSerializer(typeof(DataToPersist), new DataContractSerializerSettings() { PreserveObjectReferences = true });
@ -46,7 +63,6 @@ namespace Banquale.DataContractPersistance
Directory.CreateDirectory(FilePath);
}
DataToPersist data = new DataToPersist();
data.customer = cu;
data.consultant = co;
@ -59,8 +75,6 @@ namespace Banquale.DataContractPersistance
serializer.WriteObject(w, data);
}
}
}
}
}

@ -3,10 +3,19 @@ using Model;
namespace Banquale.DataContractPersistance
{
/// <summary>
/// Classe de données à persister.
/// </summary>
public class DataToPersist
{
/// <summary>
/// Liste des clients à persister.
/// </summary>
public HashSet<Customer> customer { get; set; } = new HashSet<Customer>();
/// <summary>
/// Consultant à persister.
/// </summary>
public Consultant consultant { get; set; }
}
}

@ -1,27 +1,35 @@
using Android.Telephony;
using Model;
namespace Banquale.Views.Balance;
namespace Banquale.Views.Balance
{
/// <summary>
/// Page de balance.
/// </summary>
public partial class BalancePage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
//private BalanceView MybalanceView;
/// <summary>
/// Constructeur de la page BalancePage.
/// </summary>
public BalancePage()
{
InitializeComponent();
BindingContext = Mgr.SelectedAccount;
//MybalanceView = balanceViewContainer.FindByName<BalanceView>("balanceViewContainer");
}
/// <summary>
/// Actualise la page.
/// </summary>
public void RefreshPage()
{
BindingContext = Mgr.SelectedAccount;
//MybalanceView.RefreshView();
}
/// <summary>
/// Gère le clic sur une transaction.
/// </summary>
public async void Transaction_Clicked(Object sender, EventArgs e)
{
var selectedItem = (sender as Grid)?.BindingContext as Transaction;
@ -32,5 +40,5 @@ public partial class BalancePage : ContentPage
await Navigation.PushModalAsync(new TransactionsPage());
}
}
}
}

@ -1,19 +1,27 @@
using System.Diagnostics;
using Model;
namespace Banquale.Views.Balance;
namespace Banquale.Views.Balance
{
/// <summary>
/// Vue pour afficher les différentes transactions d'un compte.
/// </summary>
public partial class BalanceView : ContentView
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la vue BalanceView.
/// </summary>
public BalanceView()
{
InitializeComponent();
BindingContext = Mgr.SelectedAccount;
}
/// <summary>
/// Gère l'événement de clic sur une transaction.
/// </summary>
public async void Transaction_Clicked(Object sender, EventArgs e)
{
var selectedItem = (sender as Grid)?.BindingContext as Transaction;
@ -25,10 +33,12 @@ public partial class BalanceView : ContentView
}
}
/// <summary>
/// Rafraîchit la vue.
/// </summary>
public void RefreshView()
{
BindingContext = Mgr.SelectedAccount;
}
}
}

@ -1,13 +1,20 @@
using Model;
namespace Banquale.Views.Category;
namespace Banquale.Views.Category
{
/// <summary>
/// Page de catégorie.
/// </summary>
public partial class CategoryPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page CategoryPage.
/// </summary>
public CategoryPage()
{
InitializeComponent();
}
}
}

@ -1,26 +1,36 @@
using Model;
namespace Banquale.Views.Category;
namespace Banquale.Views.Category
{
/// <summary>
/// Vue partielle pour afficher les différentes catégories.
/// </summary>
public partial class CategoryView : ContentView
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la vue CategoryView.
/// </summary>
public CategoryView()
{
InitializeComponent();
BindingContext = Mgr;
}
/// <summary>
/// Gère l'événement de clic sur une catégorie.
/// </summary>
public async void Category_Clicked(object sender, EventArgs e)
{
var selectedItem = (sender as Grid)?.BindingContext as string;
if (selectedItem != null)
{
Mgr.SelectedTransaction.ChangeCategory(selectedItem);
Mgr.Persistence.DataSave(Mgr.CustomersList, Mgr.Consultant);
await Shell.Current.Navigation.PopAsync();
}
}
}
}

@ -1,16 +1,25 @@
using Model;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page de connexion.
/// </summary>
public partial class ConnectionPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe ConnectionPage.
/// </summary>
public ConnectionPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton de connexion.
/// </summary>
public async void Connection_Clicked(Object sender, EventArgs e)
{
uint currentId = Convert.ToUInt32(ident.Text);
@ -18,7 +27,7 @@ public partial class ConnectionPage : ContentPage
if (string.IsNullOrWhiteSpace(ident.Text) || string.IsNullOrWhiteSpace(password))
{
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
await DisplayAlert("Erreur", "Tous les champs doivent être complétés", "OK");
return;
}
@ -36,14 +45,13 @@ public partial class ConnectionPage : ContentPage
Customer customer = Mgr.CustomersList.FirstOrDefault(u => u.Id == currentId && u.Password == password);
if (customer == null)
{
await DisplayAlert("Erreur", "Le mot de passe ou l'id entré est incorrect.", "OK");
await DisplayAlert("Erreur", "Le mot de passe ou l'identifiant entré est incorrect.", "OK");
return;
}
Mgr.SelectedCustomer = customer;
await Navigation.PushModalAsync(new SwitchAccountPage());
}
}
}

@ -1,33 +1,48 @@
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page d'accueil du consultant.
/// </summary>
public partial class ConsultantHomePage : ContentPage
{
/// <summary>
/// Initialise une nouvelle instance de la classe ConsultantHomePage.
/// </summary>
public ConsultantHomePage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton de déconnexion.
/// </summary>
async void DisconnectionClicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.GoToAsync("///connection");
}
/// <summary>
/// Gère l'événement du bouton d'identification du client.
/// </summary>
async void Id_Clicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new ConsultantIdPage());
//await Shell.Current.GoToAsync("..");
}
/// <summary>
/// Gère l'événement du bouton de création de client.
/// </summary>
async void Create_Customer_Clicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new CreateCustomerPage());
//await Shell.Current.GoToAsync("///createcustomer");
}
/// <summary>
/// Gère l'événement du bouton de messagerie.
/// </summary>
async void Message_Clicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new MessageListPage());
//await Shell.Current.GoToAsync("///createcustomer");
}
}
}

@ -2,21 +2,35 @@ using System.Diagnostics;
using Banquale.Views;
using Model;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page d'identification du consultant.
/// </summary>
public partial class ConsultantIdPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application.
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe ConsultantIdPage.
/// </summary>
public ConsultantIdPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton de connexion.
/// </summary>
public async void Connection_Clicked(Object sender, EventArgs e)
{
// Récupération de l'ID entré
uint currentId = Convert.ToUInt32(ident.Text);
// Validation de l'ID
if (string.IsNullOrWhiteSpace(ident.Text))
{
await DisplayAlert("Erreur", "Il faut rentrer un ID", "OK");
@ -25,23 +39,25 @@ public partial class ConsultantIdPage : ContentPage
if (currentId == 0)
{
await DisplayAlert("Erreur", "Ce compte est innaccessible", "OK");
await DisplayAlert("Erreur", "Ce compte est inaccessible", "OK");
return;
}
// Recherche du client correspondant à l'ID
Customer customer = Mgr.CustomersList.FirstOrDefault(u => u.Id == currentId);
if (customer == null)
{
await DisplayAlert("Erreur", "L'id entré est incorrect ou n'existe pas.", "OK");
await DisplayAlert("Erreur", "L'ID entré est incorrect ou n'existe pas.", "OK");
return;
}
// Sélection du client dans le gestionnaire
Mgr.SelectedCustomer = customer;
Debug.WriteLine(Mgr.IsConsultant);
// Navigation vers la page de sélection du compte
await Navigation.PushModalAsync(new SwitchAccountPage());
}
}
}

@ -7,8 +7,14 @@ using System.Threading.Tasks;
namespace Banquale.Views.Converters
{
/// <summary>
/// Convertisseur de type pour convertir une valeur booléenne en couleur.
/// </summary>
public class Bool2ColorConverters : IValueConverter
{
/// <summary>
/// Convertit une valeur booléenne en couleur.
/// </summary>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool NewValue = (bool)value;
@ -18,6 +24,9 @@ namespace Banquale.Views.Converters
return Colors.Green;
}
/// <summary>
/// Convertit une couleur en valeur booléenne (non implémenté).
/// </summary>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();

@ -8,15 +8,18 @@ using System.Threading.Tasks;
namespace Banquale.Views.Converters
{
/// <summary>
/// Convertisseur de type pour convertir un entier en chaîne de caractères avec un signe.
/// </summary>
public class Int2StringConverters : IValueConverter
{
/// <summary>
/// Convertit un entier en chaîne de caractères avec un signe.
/// </summary>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string res;
Debug.WriteLine(parameter);
//return value.ToString();
//if (parameter is not bool)
// return false;
bool NewParameter = (bool)parameter;
if (NewParameter)
res = "-" + (string)value;
@ -25,6 +28,9 @@ namespace Banquale.Views.Converters
return res;
}
/// <summary>
/// Convertit une chaîne de caractères en entier (non implémenté).
/// </summary>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();

@ -1,32 +1,43 @@
using System.Diagnostics;
using Model;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page de création de client.
/// </summary>
public partial class CreateCustomerPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application.
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
int nbAccount = 1;
bool Account2 = false;
Label account = new Label { };
Grid gridAccount = new Grid();
Label balance = new Label { };
Entry balanceEntry = new Entry { };
Label nameLabel = new Label { };
Entry nameEntry = new Entry { };
Label iban = new Label { };
Entry ibanEntry = new Entry { };
private int nbAccount = 1;
private bool Account2 = false;
private Label account = new Label { };
private Grid gridAccount = new Grid();
private Label balance = new Label { };
private Entry balanceEntry = new Entry { };
private Label nameLabel = new Label { };
private Entry nameEntry = new Entry { };
private Label iban = new Label { };
private Entry ibanEntry = new Entry { };
/// <summary>
/// Initialise une nouvelle instance de la classe CreateCustomerPage.
/// </summary>
public CreateCustomerPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton de création de client.
/// </summary>
public async void Create_Customer_Clicked(System.Object sender, System.EventArgs e)
{
// Récupération des valeurs des champs
double BalanceAccount2 = Convert.ToDouble(balanceEntry.Text);
string NameAccount2 = nameEntry.Text;
string IbanAccount2 = ibanEntry.Text;
@ -37,73 +48,91 @@ public partial class CreateCustomerPage : ContentPage
double accountBalance = Convert.ToDouble(AccountBalanceEntry.Text);
string accountIban = AccountIbanEntry.Text;
// Validation des champs
if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(password)
|| double.IsNegative(accountBalance) || string.IsNullOrWhiteSpace(accountName)
|| string.IsNullOrWhiteSpace(accountIban) || string.IsNullOrWhiteSpace(AccountBalanceEntry.Text)
|| Account2 == true && string.IsNullOrWhiteSpace(NameAccount2) || Account2 == true && string.IsNullOrWhiteSpace(IbanAccount2)
|| Account2 == true && double.IsNegative(BalanceAccount2) || Account2 == true && string.IsNullOrWhiteSpace(balanceEntry.Text))
{
await DisplayAlert("Erreur", "Tous les champs doivent être renseignés et corect (pas de solde négatif)", "OK");
await DisplayAlert("Erreur", "Tous les champs doivent être renseignés et corrects (pas de solde négatif)", "OK");
}
else if (AccountIbanEntry.Text.Length != 27 || IbanAccount2.Length != 27)
{
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK");
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 27 caractères.", "OK");
}
else
{
// Création du client
Customer customer = new Customer(name, firstName, password);
Account account1 = new Account(accountBalance, accountName, accountIban);
customer.AccountsList.Add(account1);
if (Account2 == true)
{
Account account2 = new Account(BalanceAccount2, NameAccount2, IbanAccount2);
customer.AccountsList.Add(account2);
Debug.WriteLine(account2.IBAN);
}
// Ajout du client au gestionnaire
Mgr.CustomersList.Add(customer);
Debug.WriteLine(customer.Id);
Debug.WriteLine(customer.Password);
Debug.WriteLine(account1.IBAN);
Debug.WriteLine(customer.AccountsList[0].Balance);
Debug.WriteLine(customer.AccountsList[1].Balance);
await DisplayAlert("Création", "Client " + customer.Name +" crée avec succès.", "OK");
await DisplayAlert("Création", "Client " + customer.Name + " créé avec succès.", "OK");
await Shell.Current.Navigation.PopAsync();
}
}
/// <summary>
/// Gère l'événement du bouton d'ajout de compte.
/// </summary>
public void Account_Clicked(object sender, EventArgs e)
{
Account2 = true;
nbAccount++;
if (nbAccount >= 3)
{
DisplayAlert("Erreur", "Impossible d'ajouter plus de compte. Un client ne peut avoir plus de 2 comptes.", "OK");
return;
}
account.Text = "Compte " + Convert.ToString(nbAccount);
account.FontSize = 25;
account.TextColor = Colors.DarkRed;
ColumnDefinition col1 = new ColumnDefinition(GridLength.Star);
ColumnDefinition col2 = new ColumnDefinition(GridLength.Star);
RowDefinition row1 = new RowDefinition(GridLength.Auto);
RowDefinition row2 = new RowDefinition(GridLength.Auto);
gridAccount.RowDefinitions.Add(row1);
gridAccount.RowDefinitions.Add(row2);
gridAccount.ColumnDefinitions.Add(col1);
gridAccount.ColumnDefinitions.Add(col2);
balance.Text = "Solde";
balance.FontSize = 16;
balanceEntry.Placeholder = "Entrez le solde du compte";
balanceEntry.Keyboard = Keyboard.Numeric;
nameLabel.Text = "Nom du compte";
nameLabel.FontSize = 16;
nameEntry.Placeholder = "Entrez le nom du compte";
iban.Text = "IBAN";
iban.FontSize = 16;
ibanEntry.Text = "FR";
ibanEntry.TextChanged += IbanChanged;
ibanEntry.Placeholder = "Entrez l'IBAN du compte";
ibanEntry.Keyboard = Keyboard.Numeric;
StackLayout.Add(account);
gridAccount.SetColumn(balance, 0);
gridAccount.SetRow(balance, 0);
@ -113,15 +142,20 @@ public partial class CreateCustomerPage : ContentPage
gridAccount.SetRow(nameLabel, 0);
gridAccount.SetColumn(nameEntry, 1);
gridAccount.SetColumn(nameEntry, 1);
gridAccount.Children.Add(balance);
gridAccount.Children.Add(balanceEntry);
gridAccount.Children.Add(nameLabel);
gridAccount.Children.Add(nameEntry);
StackLayout.Add(gridAccount);
StackLayout.Add(iban);
StackLayout.Add(ibanEntry);
}
/// <summary>
/// Gère l'événement de modification de l'IBAN.
/// </summary>
public void IbanChanged(object sender, EventArgs e)
{
if (AccountIbanEntry.Text.Length < 2 || ibanEntry.Text.Length < 2)
@ -132,5 +166,5 @@ public partial class CreateCustomerPage : ContentPage
cast.CursorPosition = 3;
}
}
}
}

@ -1,27 +1,45 @@
using Model;
namespace Banquale.Views;
/// <summary>
/// Page d'aide permettant aux utilisateurs d'envoyer des messages de demande d'aide.
/// </summary>
public partial class HelpPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application.
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe HelpPage.
/// </summary>
public HelpPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton d'envoi.
/// </summary>
public async void Send_Clicked(Object sender, EventArgs e)
{
if (Subject.Text.Length >= 50 || Description.Text.Length >= 200)
{
await DisplayAlert("Erreur", "Trop de caracteres", "OK");
await DisplayAlert("Erreur", "Trop de caractères", "OK");
}
else
{
// Crée un nouveau message de demande d'aide
Message message = Account.AskForHelp(Subject.Text, Description.Text);
// Ajoute le message à la liste des messages du consultant
Mgr.Consultant.MessagesList.Add(message);
// Navigue vers la page de solde
await Shell.Current.GoToAsync("//balance");
}
}
}

@ -2,17 +2,30 @@
using System.Runtime.Serialization.DataContracts;
using Model;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page affichant la liste des messages.
/// </summary>
public partial class MessageListPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application.
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe MessageListPage.
/// </summary>
public MessageListPage()
{
// Affiche le sujet du premier message dans les logs de débogage
Debug.WriteLine(Mgr.Consultant.MessagesList[0].Subject);
// Lie le contexte de liaison au gestionnaire
BindingContext = Mgr;
InitializeComponent();
InitializeComponent();
}
}
}

@ -2,18 +2,32 @@ using System.Diagnostics;
using Banquale.Views.Balance;
using Model;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page permettant de basculer entre les comptes.
/// </summary>
public partial class SwitchAccountPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application (Manager Mgr).
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe SwitchAccountPage.
/// </summary>
public SwitchAccountPage()
{
InitializeComponent();
// Lie le contexte de liaison au client sélectionné dans le Manager
BindingContext = Mgr.SelectedCustomer;
}
/// <summary>
/// Méthode appelée lorsque la page apparaît.
/// </summary>
protected override void OnAppearing()
{
base.OnAppearing();
@ -21,6 +35,9 @@ public partial class SwitchAccountPage : ContentPage
RefreshData();
}
/// <summary>
/// Gère l'événement du bouton de transfert.
/// </summary>
public async void Transfer_Clicked(object sender, EventArgs e)
{
var selectedItem = (sender as Button)?.BindingContext as Account;
@ -28,7 +45,7 @@ public partial class SwitchAccountPage : ContentPage
if (selectedItem != null)
{
Mgr.SelectedAccount = selectedItem;
if (Mgr.IsConsultant == true)
if (Mgr.IsConsultant)
{
await Shell.Current.Navigation.PushAsync(new Balance.BalancePage());
}
@ -39,12 +56,14 @@ public partial class SwitchAccountPage : ContentPage
balancePage?.RefreshPage();
}
}
}
/// <summary>
/// Gère l'événement du bouton de déconnexion.
/// </summary>
async void DisconnectionClicked(object sender, EventArgs e)
{
if(Mgr.IsConsultant == true)
if (Mgr.IsConsultant)
{
await Shell.Current.Navigation.PopAsync();
}
@ -54,9 +73,12 @@ public partial class SwitchAccountPage : ContentPage
}
}
/// <summary>
/// Rafraîchit les données de la page.
/// </summary>
private void RefreshData()
{
BindingContext = Mgr.SelectedCustomer;
}
}
}

@ -1,38 +1,51 @@
using Model;
using Banquale.Views.Category;
namespace Banquale.Views;
namespace Banquale.Views
{
/// <summary>
/// Page affichant le détail d'une transaction.
/// </summary>
public partial class TransactionsPage : ContentPage
{
/// <summary>
/// Obtient le gestionnaire de l'application à partir de l'instance de l'application (Manager Mgr).
/// </summary>
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe TransactionsPage.
/// </summary>
public TransactionsPage()
{
InitializeComponent();
// Lie le contexte de liaison aux transactions sélectionnées dans le gestionnaire
BindingContext = Mgr.SelectedTransaction;
if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == false)
// Configure l'affichage en fonction des conditions
if (Mgr.IsConsultant && !Mgr.SelectedTransaction.IsOpposition)
{
oppose.Text = "Aucune demande en cours";
}
else if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == true)
else if (Mgr.IsConsultant && Mgr.SelectedTransaction.IsOpposition)
{
oppose.Text = "Accepter l'opposition";
refuseOpposition.IsVisible = true;
}
if(Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == true)
if (!Mgr.IsConsultant && Mgr.SelectedTransaction.IsOpposition)
{
oppose.Text = "Demande en cours";
}
if(Mgr.SelectedTransaction.Type == true)
if (Mgr.SelectedTransaction.Type)
{
string price1 = sum.Text;
sum.Text = "- " + price1;
sum.TextColor = Colors.Red;
}
else if(Mgr.SelectedTransaction.Type == false)
else if (!Mgr.SelectedTransaction.Type)
{
string price2 = sum.Text;
sum.Text = "+ " + price2;
@ -40,43 +53,52 @@ public partial class TransactionsPage : ContentPage
}
}
/// <summary>
/// Gère l'événement du bouton de la catégorie.
/// </summary>
async void Categ_Clicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new CategoryPage());
}
/// <summary>
/// Gère l'événement du bouton d'opposition.
/// </summary>
async void Objection_Clicked(System.Object sender, System.EventArgs e)
{
if(Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == false)
if (!Mgr.IsConsultant && !Mgr.SelectedTransaction.IsOpposition)
{
Mgr.SelectedTransaction.IsOpposition = true;
await DisplayAlert("Opposition", "Votre demande d'opposition à bien été pris en compte", "OK");
await DisplayAlert("Opposition", "Votre demande d'opposition a bien été prise en compte", "OK");
await Shell.Current.Navigation.PopAsync();
}
else if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == true)
else if (Mgr.IsConsultant && Mgr.SelectedTransaction.IsOpposition)
{
Mgr.SelectedAccount.TransactionsList.Remove(Mgr.SelectedTransaction);
await DisplayAlert("Opposition", "La demande d'opposition à été réalisé avec succé", "OK");
await DisplayAlert("Opposition", "La demande d'opposition a été réalisée avec succès", "OK");
await Shell.Current.Navigation.PopAsync();
}
else if (Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == false)
else if (Mgr.IsConsultant && !Mgr.SelectedTransaction.IsOpposition)
{
await DisplayAlert("Erreur", "Aucune demande d'opposition est en cours sur cette transaction", "OK");
await DisplayAlert("Erreur", "Aucune demande d'opposition en cours pour cette transaction", "OK");
await Shell.Current.Navigation.PopAsync();
}
else if (Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == true)
else if (!Mgr.IsConsultant && Mgr.SelectedTransaction.IsOpposition)
{
await DisplayAlert("Opposition", "Votre demande est en cours. Veuillez patienter SVP.", "OK");
await Shell.Current.Navigation.PopAsync();
}
}
/// <summary>
/// Gère l'événement du bouton de refus d'opposition du coté du consultant.
/// </summary>
async void Refuse_Clicked(System.Object sender, System.EventArgs e)
{
Mgr.SelectedTransaction.IsOpposition = false;
await DisplayAlert("Opposition", "La demande d'opposition à bien été refusé", "OK");
await DisplayAlert("Opposition", "La demande d'opposition a bien été refusée", "OK");
refuseOpposition.IsVisible = false;
await Shell.Current.Navigation.PopAsync();
}
}
}

@ -1,25 +1,40 @@
namespace Banquale.Views.Transfer;
namespace Banquale.Views.Transfer
{
/// <summary>
/// Page de menu pour les transferts.
/// </summary>
public partial class MenuTransferPage : ContentPage
{
/// <summary>
/// Initialise une nouvelle instance de la classe MenuTransferPage.
/// </summary>
public MenuTransferPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton "RIB".
/// </summary>
public async void RIB_Clicked(object sender, EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new RibPage());
}
/// <summary>
/// Gère l'événement du bouton "Demande".
/// </summary>
public async void Request_Clicked(object sender, EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new RequestPage());
}
/// <summary>
/// Gère l'événement du bouton "Transfert".
/// </summary>
public async void Transfer_Clicked(object sender, EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new TransferPage());
}
}
}

@ -1,34 +1,45 @@
using Model;
using Microsoft.Maui.Controls;
namespace Banquale.Views.Transfer;
namespace Banquale.Views.Transfer
{
/// <summary>
/// Page de demande de virement.
/// </summary>
public partial class RequestPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe RequestPage.
/// </summary>
public RequestPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton d'envoi de la demande de virement.
/// </summary>
public async void Send_Clicked(Object sender, EventArgs e)
{
if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
await DisplayAlert("Erreur", "Tous les champs doivent être complétés", "OK");
return;
}
else if (IBAN.Text.Length != 27)
{
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK");
return;
}
if (Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN)
{
await DisplayAlert("Erreur", "Vous ne pouvez vous faire de demande à vous même", "OK");
await DisplayAlert("Erreur", "Vous ne pouvez pas effectuer une demande de virement à votre propre compte", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{
foreach (var acc in cust.AccountsList)
@ -37,9 +48,10 @@ public partial class RequestPage : ContentPage
{
if (acc.Balance - Convert.ToDouble(Sum.Text) < 0)
{
await DisplayAlert("Erreur", "Le compte ne possède assez d'argent sur son compte pour aboutir à la transaction", "OK");
await DisplayAlert("Erreur", "Le compte ne possède pas suffisamment d'argent pour effectuer la transaction", "OK");
return;
}
acc.DoTransactions(Mgr.SelectedAccount, Convert.ToDouble(Sum.Text), true); // Type true car c'est un virement que le SelectedAccount reçoit
Mgr.Persistence.DataSave(Mgr.CustomersList, Mgr.Consultant);
await Shell.Current.Navigation.PopAsync();
@ -47,9 +59,13 @@ public partial class RequestPage : ContentPage
}
}
}
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
/// <summary>
/// Gère l'événement de modification de l'Entry de l'IBAN.
/// </summary>
public void IbanChanged(object sender, EventArgs e)
{
if (IBAN.Text.Length < 2)
@ -60,3 +76,4 @@ public partial class RequestPage : ContentPage
}
}
}
}

@ -1,14 +1,21 @@
using Model;
namespace Banquale.Views.Transfer;
namespace Banquale.Views.Transfer
{
/// <summary>
/// Page d'affichage du RIB.
/// </summary>
public partial class RibPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe RibPage.
/// </summary>
public RibPage()
{
InitializeComponent();
BindingContext = Mgr;
}
}
}

@ -1,22 +1,31 @@
using Model;
using System.Linq;
namespace Banquale.Views.Transfer;
namespace Banquale.Views.Transfer
{
/// <summary>
/// Page de transfert d'argent.
/// </summary>
public partial class TransferPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
/// <summary>
/// Initialise une nouvelle instance de la classe TransferPage.
/// </summary>
public TransferPage()
{
InitializeComponent();
}
/// <summary>
/// Gère l'événement du bouton d'envoi de transfert.
/// </summary>
public async void Send_Clicked(Object sender, EventArgs e)
{
if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
await DisplayAlert("Erreur", "Tous les champs doivent être complétés", "OK");
return;
}
else if (IBAN.Text.Length != 27)
@ -25,7 +34,7 @@ public partial class TransferPage : ContentPage
}
if (Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN)
{
await DisplayAlert("Erreur", "Vous ne pouvez vous faire de virement à vous même", "OK");
await DisplayAlert("Erreur", "Vous ne pouvez pas vous faire un virement à vous-même", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
@ -36,7 +45,7 @@ public partial class TransferPage : ContentPage
{
if (Mgr.SelectedAccount.Balance - Convert.ToDouble(Sum.Text) < 0)
{
await DisplayAlert("Erreur", "Vous ne possèdez pas assez d'argent sur ce compte pour aboutir à la transaction", "OK");
await DisplayAlert("Erreur", "Vous ne possédez pas suffisamment d'argent sur ce compte pour effectuer la transaction", "OK");
return;
}
Mgr.SelectedAccount.DoTransactions(acc, Convert.ToDouble(Sum.Text), true); // Type true car c'est un virement
@ -49,6 +58,9 @@ public partial class TransferPage : ContentPage
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
/// <summary>
/// Gère l'événement du changement de l'IBAN.
/// </summary>
public void IbanChanged(object sender, EventArgs e)
{
if (IBAN.Text.Length < 2)
@ -59,3 +71,4 @@ public partial class TransferPage : ContentPage
}
}
}
}

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Account.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Collections.Generic;

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Consultant.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Runtime.Serialization;

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Customer.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Collections.Generic;

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de l'interface IPersistenceManager.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Collections.Generic;
@ -15,7 +15,7 @@ namespace Model
/// <summary>
/// Charge les données depuis une source de persistance.
/// </summary>
/// <returns>Un tuple contenant lle hashSet des clients et le consultant.</returns>
/// <returns>Un tuple contenant le hashSet des clients et le consultant.</returns>
public (HashSet<Customer>, Consultant) DataLoad();
/// <summary>

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Manager.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Collections.Generic;

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Message.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.ComponentModel;
@ -38,8 +38,6 @@ namespace Model
private string subject;
/// <summary>
/// Description du message.
/// </summary>
@ -56,6 +54,7 @@ namespace Model
}
private string description;
/// <summary>
/// Constructeur de la classe Message.
/// </summary>

@ -1,6 +1,6 @@
/// \file
/// \brief Définition de la classe Person.
/// \author Votre nom
/// \author PEREDERII Antoine, LOUVET Titouan
using System;
using System.Collections.Generic;

@ -1,4 +1,9 @@
using System.ComponentModel;
/// \file
/// \brief Définition de la classe Message.
/// \author PEREDERII Antoine, LOUVET Titouan
using System.ComponentModel;
using System.Runtime.Serialization;
namespace Model

Loading…
Cancel
Save