🎨 📝 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.Stub;
using Banquale.DataContractPersistance; using Banquale.DataContractPersistance;
namespace Banquale; namespace Banquale
public partial class App : Application
{ {
/// <summary>
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub() /*DataContractPersistance.DataContractPersXML()*/); /// Classe principale de l'application Banquale.
/// </summary>
public partial class App : Application
{
public App() /// <summary>
{ /// Déclare et instencie le manager MyManager
/// </summary>
MyManager.DataLoad(); public Manager MyManager { get; private set; } = new Manager(new Stub.Stub() /*DataContractPersistance.DataContractPersXML()*/);
MyManager.Persistence = new DataContractPersistance.DataContractPersXML();
MyManager.DataSave(); /// <summary>
/// Initialise une nouvelle instance de la classe App.
InitializeComponent(); /// </summary>
public App()
MainPage = new AppShell(); {
// 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 Banquale.Views.Transfer;
using Model; using Model;
namespace Banquale; namespace Banquale
public partial class AppShell : Shell
{ {
/// <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;
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
/// Initialise une nouvelle instance de la classe AppShell.
public AppShell() /// </summary>
{ public AppShell()
InitializeComponent(); {
InitializeComponent();
}
} }
}
}

@ -7,20 +7,31 @@ using System.Runtime.Serialization.Json;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Banquale.DataContractPersistance namespace Banquale.DataContractPersistance
{ {
// Nous ne pouvons utiliser la persitance avec JSON dans notre application car la persitance avec JSON n'accepte pas // 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 // 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 public class DataContractPersJSON : IPersistenceManager
{ {
/// <summary>
/// Chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory; 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() public (HashSet<Customer>, Consultant) DataLoad()
{ {
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist)); DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
@ -33,12 +44,15 @@ namespace Banquale.DataContractPersistance
} }
return (data.customer, data.consultant); 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) public void DataSave(HashSet<Customer> cu, Consultant co)
{ {
DataToPersist data = new DataToPersist(); DataToPersist data = new DataToPersist();
data.customer = cu; data.customer = cu;
data.consultant = co; data.consultant = co;
@ -50,7 +64,7 @@ namespace Banquale.DataContractPersistance
stream, stream,
System.Text.Encoding.UTF8, System.Text.Encoding.UTF8,
false, false,
true))//<- this boolean says that we sant indentation true)) // <- this boolean says that we want indentation
{ {
jsonSerializer.WriteObject(writer, data); jsonSerializer.WriteObject(writer, data);
} }

@ -9,17 +9,35 @@ using System.Xml;
namespace Banquale.DataContractPersistance namespace Banquale.DataContractPersistance
{ {
/// <summary>
/// Classe de gestion de persistance utilisant LINQ.
/// </summary>
public class DataContractPersLINQ : IPersistenceManager public class DataContractPersLINQ : IPersistenceManager
{ {
/// <summary>
/// Chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory; public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
/// <summary>
/// Nom du fichier de sauvegarde.
/// </summary>
public string FileName { get; set; } = "DataSave.xml"; 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() public (HashSet<Customer>, Consultant) DataLoad()
{ {
throw new NotImplementedException(); 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) public void DataSave(HashSet<Customer> cu, Consultant co)
{ {
XDocument dataSave = new XDocument(); XDocument dataSave = new XDocument();
@ -29,7 +47,7 @@ namespace Banquale.DataContractPersistance
new XElement("name", v.FirstName), new XElement("name", v.FirstName),
new XElement("id", Convert.ToString(v.Id)), new XElement("id", Convert.ToString(v.Id)),
new XElement("mdp", v.Password), new XElement("mdp", v.Password),
new XAttribute("Account", v.AccountsList)))); new XAttribute("Account", v.AccountsList))));
dataSave.Add(new XElement("Customers", save)); dataSave.Add(new XElement("Customers", save));

@ -5,20 +5,32 @@ using System.Diagnostics;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Xml; using System.Xml;
namespace Banquale.DataContractPersistance namespace Banquale.DataContractPersistance
{ {
public class DataContractPersXML : IPersistenceManager /// <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; public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.xml";
/// <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() public (HashSet<Customer>, Consultant) DataLoad()
{ {
var serializer = new DataContractSerializer(typeof(DataToPersist)); var serializer = new DataContractSerializer(typeof(DataToPersist));
DataToPersist data; DataToPersist data;
if (File.Exists(Path.Combine(FilePath, FileName))) // Vérifiez si le fichier existe if (File.Exists(Path.Combine(FilePath, FileName))) // Vérifiez si le fichier existe
{ {
@ -33,11 +45,16 @@ namespace Banquale.DataContractPersistance
} }
return (data.customer, data.consultant); return (data.customer, data.consultant);
} }
public void DataSave(HashSet<Customer> cu, Consultant co) /// <summary>
{ /// Sauvegarde les données.
var serializer = new DataContractSerializer(typeof(DataToPersist), new DataContractSerializerSettings() { PreserveObjectReferences = true }); /// </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 });
// La deuxième partie sert à faire des références, cela sert à ne pas duppliquer l'écriture de certains attributs // La deuxième partie sert à faire des références, cela sert à ne pas duppliquer l'écriture de certains attributs
if (!Directory.Exists(FilePath)) if (!Directory.Exists(FilePath))
@ -46,7 +63,6 @@ namespace Banquale.DataContractPersistance
Directory.CreateDirectory(FilePath); Directory.CreateDirectory(FilePath);
} }
DataToPersist data = new DataToPersist(); DataToPersist data = new DataToPersist();
data.customer = cu; data.customer = cu;
data.consultant = co; data.consultant = co;
@ -59,8 +75,6 @@ namespace Banquale.DataContractPersistance
serializer.WriteObject(w, data); serializer.WriteObject(w, data);
} }
} }
} }
} }
} }

@ -3,10 +3,19 @@ using Model;
namespace Banquale.DataContractPersistance namespace Banquale.DataContractPersistance
{ {
public class DataToPersist /// <summary>
{ /// Classe de données à persister.
public HashSet<Customer> customer { get; set; } = new HashSet<Customer>(); /// </summary>
public Consultant consultant { get; set; } 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,36 +1,44 @@
using Android.Telephony; using Android.Telephony;
using Model; using Model;
namespace Banquale.Views.Balance; namespace Banquale.Views.Balance
public partial class BalancePage : ContentPage
{ {
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
/// Page de balance.
//private BalanceView MybalanceView; /// </summary>
public BalancePage() public partial class BalancePage : ContentPage
{
InitializeComponent();
BindingContext = Mgr.SelectedAccount;
//MybalanceView = balanceViewContainer.FindByName<BalanceView>("balanceViewContainer");
}
public void RefreshPage()
{ {
BindingContext = Mgr.SelectedAccount; public Manager Mgr => (App.Current as App).MyManager;
//MybalanceView.RefreshView();
}
public async void Transaction_Clicked(Object sender, EventArgs e) /// <summary>
{ /// Constructeur de la page BalancePage.
var selectedItem = (sender as Grid)?.BindingContext as Transaction; /// </summary>
public BalancePage()
{
InitializeComponent();
BindingContext = Mgr.SelectedAccount;
}
if (selectedItem != null) /// <summary>
/// Actualise la page.
/// </summary>
public void RefreshPage()
{ {
Mgr.SelectedTransaction = selectedItem; BindingContext = Mgr.SelectedAccount;
await Navigation.PushModalAsync(new TransactionsPage());
} }
}
/// <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;
if (selectedItem != null)
{
Mgr.SelectedTransaction = selectedItem;
await Navigation.PushModalAsync(new TransactionsPage());
}
}
}
} }

@ -1,34 +1,44 @@
using System.Diagnostics; using System.Diagnostics;
using Model; using Model;
namespace Banquale.Views.Balance; namespace Banquale.Views.Balance
public partial class BalanceView : ContentView
{ {
/// <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;
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
/// Constructeur de la vue BalanceView.
public BalanceView() /// </summary>
{ public BalanceView()
InitializeComponent(); {
BindingContext = Mgr.SelectedAccount; InitializeComponent();
} BindingContext = Mgr.SelectedAccount;
}
public async void Transaction_Clicked(Object sender, EventArgs e) /// <summary>
{ /// Gère l'événement de clic sur une transaction.
var selectedItem = (sender as Grid)?.BindingContext as Transaction; /// </summary>
public async void Transaction_Clicked(Object sender, EventArgs e)
{
var selectedItem = (sender as Grid)?.BindingContext as Transaction;
if (selectedItem != null) if (selectedItem != null)
{ {
Mgr.SelectedTransaction = selectedItem; Mgr.SelectedTransaction = selectedItem;
await Navigation.PushModalAsync(new TransactionsPage()); await Navigation.PushModalAsync(new TransactionsPage());
}
} }
}
public void RefreshView() /// <summary>
{ /// Rafraîchit la vue.
BindingContext = Mgr.SelectedAccount; /// </summary>
public void RefreshView()
{
BindingContext = Mgr.SelectedAccount;
}
} }
} }

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

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

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

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

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

@ -7,17 +7,26 @@ using System.Threading.Tasks;
namespace Banquale.Views.Converters namespace Banquale.Views.Converters
{ {
/// <summary>
/// Convertisseur de type pour convertir une valeur booléenne en couleur.
/// </summary>
public class Bool2ColorConverters : IValueConverter public class Bool2ColorConverters : IValueConverter
{ {
/// <summary>
/// Convertit une valeur booléenne en couleur.
/// </summary>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
bool NewValue = (bool) value; bool NewValue = (bool)value;
if (NewValue== true) if (NewValue == true)
return Colors.Red; return Colors.Red;
return Colors.Green; 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) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

@ -8,15 +8,18 @@ using System.Threading.Tasks;
namespace Banquale.Views.Converters 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 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) public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
string res; string res;
Debug.WriteLine(parameter); Debug.WriteLine(parameter);
//return value.ToString();
//if (parameter is not bool)
// return false;
bool NewParameter = (bool)parameter; bool NewParameter = (bool)parameter;
if (NewParameter) if (NewParameter)
res = "-" + (string)value; res = "-" + (string)value;
@ -25,6 +28,9 @@ namespace Banquale.Views.Converters
return res; 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) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

@ -1,136 +1,170 @@
using System.Diagnostics; using System.Diagnostics;
using Model; using Model;
namespace Banquale.Views;
public partial class CreateCustomerPage : ContentPage namespace Banquale.Views
{ {
public Manager Mgr => (App.Current as App).MyManager; /// <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; 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 { };
bool Account2 = false; /// <summary>
/// Initialise une nouvelle instance de la classe CreateCustomerPage.
/// </summary>
public CreateCustomerPage()
{
InitializeComponent();
}
Label account = new Label { }; /// <summary>
Grid gridAccount = new Grid(); /// Gère l'événement du bouton de création de client.
Label balance = new Label { }; /// </summary>
Entry balanceEntry = new Entry { }; public async void Create_Customer_Clicked(System.Object sender, System.EventArgs e)
Label nameLabel = new Label { }; {
Entry nameEntry = new Entry { }; // Récupération des valeurs des champs
Label iban = new Label { }; double BalanceAccount2 = Convert.ToDouble(balanceEntry.Text);
Entry ibanEntry = new Entry { }; string NameAccount2 = nameEntry.Text;
string IbanAccount2 = ibanEntry.Text;
string name = NameEntry.Text;
string firstName = FirstNameEntry.Text;
string password = PasswordEntry.Text;
string accountName = AccountNameEntry.Text;
double accountBalance = Convert.ToDouble(AccountBalanceEntry.Text);
string accountIban = AccountIbanEntry.Text;
public CreateCustomerPage() // Validation des champs
{ if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(password)
InitializeComponent(); || 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 corrects (pas de solde négatif)", "OK");
}
else if (AccountIbanEntry.Text.Length != 27 || IbanAccount2.Length != 27)
{
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);
public async void Create_Customer_Clicked(System.Object sender, System.EventArgs e) 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);
double BalanceAccount2 = Convert.ToDouble(balanceEntry.Text); Debug.WriteLine(customer.Id);
string NameAccount2 = nameEntry.Text; Debug.WriteLine(customer.Password);
string IbanAccount2 = ibanEntry.Text; Debug.WriteLine(account1.IBAN);
string name = NameEntry.Text; Debug.WriteLine(customer.AccountsList[0].Balance);
string firstName = FirstNameEntry.Text; Debug.WriteLine(customer.AccountsList[1].Balance);
string password = PasswordEntry.Text;
string accountName = AccountNameEntry.Text; await DisplayAlert("Création", "Client " + customer.Name + " créé avec succès.", "OK");
double accountBalance = Convert.ToDouble(AccountBalanceEntry.Text); await Shell.Current.Navigation.PopAsync();
string accountIban = AccountIbanEntry.Text;
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");
}
else if(AccountIbanEntry.Text.Length != 27 || IbanAccount2.Length != 27)
{
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK");
}
else
{
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);
} }
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 Shell.Current.Navigation.PopAsync();
}
}
public void Account_Clicked(object sender, EventArgs e) /// <summary>
{ /// Gère l'événement du bouton d'ajout de compte.
Account2 = true; /// </summary>
nbAccount++; public void Account_Clicked(object sender, EventArgs e)
if(nbAccount >= 3) {
{ Account2 = true;
DisplayAlert("Erreur", "Impossible d'ajouter plus de compte. Un client ne peut avoir plus de 2 comptes.", "OK"); nbAccount++;
return;
} if (nbAccount >= 3)
account.Text = "Compte " + Convert.ToString(nbAccount); {
account.FontSize = 25; DisplayAlert("Erreur", "Impossible d'ajouter plus de compte. Un client ne peut avoir plus de 2 comptes.", "OK");
account.TextColor = Colors.DarkRed; return;
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);
gridAccount.SetColumn(balanceEntry, 0);
gridAccount.SetRow(balanceEntry, 1);
gridAccount.SetColumn(nameLabel, 1);
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);
}
public void IbanChanged(object sender, EventArgs e) account.Text = "Compte " + Convert.ToString(nbAccount);
{ account.FontSize = 25;
if(AccountIbanEntry.Text.Length < 2 || ibanEntry.Text.Length < 2) account.TextColor = Colors.DarkRed;
{
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
cast.CursorPosition = 3;
}
}
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);
gridAccount.SetColumn(balanceEntry, 0);
gridAccount.SetRow(balanceEntry, 1);
gridAccount.SetColumn(nameLabel, 1);
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)
{
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
cast.CursorPosition = 3;
}
}
}
} }

@ -1,27 +1,45 @@
using Model; using Model;
namespace Banquale.Views; namespace Banquale.Views;
/// <summary>
/// Page d'aide permettant aux utilisateurs d'envoyer des messages de demande d'aide.
/// </summary>
public partial class HelpPage : ContentPage 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; public Manager Mgr => (App.Current as App).MyManager;
public HelpPage()
{
InitializeComponent();
}
/// <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) public async void Send_Clicked(Object sender, EventArgs e)
{ {
if(Subject.Text.Length >= 50 || Description.Text.Length >= 200) 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 else
{ {
// Crée un nouveau message de demande d'aide
Message message = Account.AskForHelp(Subject.Text, Description.Text); Message message = Account.AskForHelp(Subject.Text, Description.Text);
// Ajoute le message à la liste des messages du consultant
Mgr.Consultant.MessagesList.Add(message); Mgr.Consultant.MessagesList.Add(message);
// Navigue vers la page de solde
await Shell.Current.GoToAsync("//balance"); await Shell.Current.GoToAsync("//balance");
} }
} }
} }

@ -1,18 +1,31 @@
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.Serialization.DataContracts; using System.Runtime.Serialization.DataContracts;
using Model; using Model;
namespace Banquale.Views; namespace Banquale.Views
public partial class MessageListPage : ContentPage
{ {
public Manager Mgr => (App.Current as App).MyManager; /// <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;
public MessageListPage() InitializeComponent();
{ }
Debug.WriteLine(Mgr.Consultant.MessagesList[0].Subject);
BindingContext = Mgr;
InitializeComponent();
} }
} }

@ -1,62 +1,84 @@
using System.Diagnostics; using System.Diagnostics;
using Banquale.Views.Balance; using Banquale.Views.Balance;
using Model; using Model;
namespace Banquale.Views; namespace Banquale.Views
public partial class SwitchAccountPage : ContentPage
{ {
/// <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;
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
public SwitchAccountPage() /// Initialise une nouvelle instance de la classe SwitchAccountPage.
{ /// </summary>
InitializeComponent(); public SwitchAccountPage()
BindingContext = Mgr.SelectedCustomer; {
} InitializeComponent();
protected override void OnAppearing()
{
base.OnAppearing();
RefreshData();
}
public async void Transfer_Clicked(object sender, EventArgs e) // Lie le contexte de liaison au client sélectionné dans le Manager
{ BindingContext = Mgr.SelectedCustomer;
var selectedItem = (sender as Button)?.BindingContext as Account;
if (selectedItem != null)
{
Mgr.SelectedAccount = selectedItem;
if (Mgr.IsConsultant == true)
{
await Shell.Current.Navigation.PushAsync(new Balance.BalancePage());
}
else
{
await Shell.Current.GoToAsync("//balance");
var balancePage = Shell.Current.CurrentPage as BalancePage;
balancePage?.RefreshPage();
}
} }
}
async void DisconnectionClicked(object sender, EventArgs e) /// <summary>
{ /// Méthode appelée lorsque la page apparaît.
if(Mgr.IsConsultant == true) /// </summary>
protected override void OnAppearing()
{ {
await Shell.Current.Navigation.PopAsync(); base.OnAppearing();
RefreshData();
} }
else
/// <summary>
/// Gère l'événement du bouton de transfert.
/// </summary>
public async void Transfer_Clicked(object sender, EventArgs e)
{ {
await Shell.Current.GoToAsync("///connection"); var selectedItem = (sender as Button)?.BindingContext as Account;
if (selectedItem != null)
{
Mgr.SelectedAccount = selectedItem;
if (Mgr.IsConsultant)
{
await Shell.Current.Navigation.PushAsync(new Balance.BalancePage());
}
else
{
await Shell.Current.GoToAsync("//balance");
var balancePage = Shell.Current.CurrentPage as BalancePage;
balancePage?.RefreshPage();
}
}
} }
}
/// <summary>
/// Gère l'événement du bouton de déconnexion.
/// </summary>
async void DisconnectionClicked(object sender, EventArgs e)
{
if (Mgr.IsConsultant)
{
await Shell.Current.Navigation.PopAsync();
}
else
{
await Shell.Current.GoToAsync("///connection");
}
}
private void RefreshData() /// <summary>
{ /// Rafraîchit les données de la page.
BindingContext = Mgr.SelectedCustomer; /// </summary>
private void RefreshData()
{
BindingContext = Mgr.SelectedCustomer;
}
} }
} }

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

@ -1,25 +1,40 @@
namespace Banquale.Views.Transfer; namespace Banquale.Views.Transfer
public partial class MenuTransferPage : ContentPage
{ {
public MenuTransferPage() /// <summary>
{ /// Page de menu pour les transferts.
InitializeComponent(); /// </summary>
} public partial class MenuTransferPage : ContentPage
public async void RIB_Clicked(object sender, EventArgs e)
{ {
await Shell.Current.Navigation.PushAsync(new RibPage()); /// <summary>
} /// Initialise une nouvelle instance de la classe MenuTransferPage.
/// </summary>
public MenuTransferPage()
{
InitializeComponent();
}
public async void Request_Clicked(object sender, EventArgs e) /// <summary>
{ /// Gère l'événement du bouton "RIB".
await Shell.Current.Navigation.PushAsync(new RequestPage()); /// </summary>
} public async void RIB_Clicked(object sender, EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new RibPage());
}
public async void Transfer_Clicked(object sender, EventArgs e) /// <summary>
{ /// Gère l'événement du bouton "Demande".
await Shell.Current.Navigation.PushAsync(new TransferPage()); /// </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,62 +1,79 @@
using Model; using Model;
using Microsoft.Maui.Controls; using Microsoft.Maui.Controls;
namespace Banquale.Views.Transfer; namespace Banquale.Views.Transfer
public partial class RequestPage : ContentPage
{ {
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
/// Page de demande de virement.
public RequestPage() /// </summary>
{ public partial class RequestPage : ContentPage
InitializeComponent();
}
public async void Send_Clicked(Object sender, EventArgs e)
{ {
public Manager Mgr => (App.Current as App).MyManager;
if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text)) /// <summary>
{ /// Initialise une nouvelle instance de la classe RequestPage.
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK"); /// </summary>
return; public RequestPage()
}
else if(IBAN.Text.Length != 27)
{ {
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK"); InitializeComponent();
} }
if (Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN)
{ /// <summary>
await DisplayAlert("Erreur", "Vous ne pouvez vous faire de demande à vous même", "OK"); /// Gère l'événement du bouton d'envoi de la demande de virement.
return; /// </summary>
} public async void Send_Clicked(Object sender, EventArgs e)
foreach (var cust in Mgr.CustomersList)
{ {
foreach (var acc in cust.AccountsList) if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{ {
if (acc.Name == Name.Text && acc.IBAN == IBAN.Text) 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 pas effectuer une demande de virement à votre propre compte", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{
foreach (var acc in cust.AccountsList)
{ {
if (acc.Balance - Convert.ToDouble(Sum.Text) < 0) if (acc.Name == Name.Text && acc.IBAN == IBAN.Text)
{ {
await DisplayAlert("Erreur", "Le compte ne possède assez d'argent sur son compte pour aboutir à la transaction", "OK"); if (acc.Balance - Convert.ToDouble(Sum.Text) < 0)
{
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();
return; 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();
return;
} }
} }
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
} }
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
public void IbanChanged(object sender, EventArgs e) /// <summary>
{ /// Gère l'événement de modification de l'Entry de l'IBAN.
if (IBAN.Text.Length < 2) /// </summary>
public void IbanChanged(object sender, EventArgs e)
{ {
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK"); if (IBAN.Text.Length < 2)
var cast = ((Entry)sender); {
cast.Text = "FR"; DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
}
} }
} }
} }

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

@ -1,61 +1,74 @@
using Model; using Model;
using System.Linq; using System.Linq;
namespace Banquale.Views.Transfer;
public partial class TransferPage : ContentPage namespace Banquale.Views.Transfer
{ {
public Manager Mgr => (App.Current as App).MyManager; /// <summary>
/// Page de transfert d'argent.
public TransferPage() /// </summary>
{ public partial class TransferPage : ContentPage
InitializeComponent();
}
public async void Send_Clicked(Object sender, EventArgs e)
{ {
public Manager Mgr => (App.Current as App).MyManager;
if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text)) /// <summary>
/// Initialise une nouvelle instance de la classe TransferPage.
/// </summary>
public TransferPage()
{ {
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK"); InitializeComponent();
return;
} }
else if (IBAN.Text.Length != 27)
{ /// <summary>
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK"); /// Gère l'événement du bouton d'envoi de transfert.
} /// </summary>
if(Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN) public async void Send_Clicked(Object sender, EventArgs e)
{
await DisplayAlert("Erreur", "Vous ne pouvez vous faire de virement à vous même", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{ {
foreach (var acc in cust.AccountsList) if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{
await DisplayAlert("Erreur", "Tous les champs doivent être complétés", "OK");
return;
}
else if (IBAN.Text.Length != 27)
{ {
if(acc.Name == Name.Text && acc.IBAN == IBAN.Text) await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK");
}
if (Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN)
{
await DisplayAlert("Erreur", "Vous ne pouvez pas vous faire un virement à vous-même", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{
foreach (var acc in cust.AccountsList)
{ {
if(Mgr.SelectedAccount.Balance - Convert.ToDouble(Sum.Text) < 0) if (acc.Name == Name.Text && acc.IBAN == IBAN.Text)
{ {
await DisplayAlert("Erreur", "Vous ne possèdez pas assez d'argent sur ce compte pour aboutir à la transaction", "OK"); if (Mgr.SelectedAccount.Balance - Convert.ToDouble(Sum.Text) < 0)
{
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
Mgr.Persistence.DataSave(Mgr.CustomersList, Mgr.Consultant);
await Shell.Current.Navigation.PopAsync();
return; return;
} }
Mgr.SelectedAccount.DoTransactions(acc, Convert.ToDouble(Sum.Text), true); // Type true car c'est un virement
Mgr.Persistence.DataSave(Mgr.CustomersList, Mgr.Consultant);
await Shell.Current.Navigation.PopAsync();
return;
} }
} }
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
} }
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
public void IbanChanged(object sender, EventArgs e) /// <summary>
{ /// Gère l'événement du changement de l'IBAN.
if (IBAN.Text.Length < 2) /// </summary>
public void IbanChanged(object sender, EventArgs e)
{ {
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK"); if (IBAN.Text.Length < 2)
var cast = ((Entry)sender); {
cast.Text = "FR"; DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
}
} }
} }
} }

@ -1,6 +1,6 @@
/// \file /// \file
/// \brief Définition de la classe Account. /// \brief Définition de la classe Account.
/// \author Votre nom /// \author PEREDERII Antoine, LOUVET Titouan
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -109,15 +109,15 @@ namespace Model
/// Obtient ou définit la liste des transactions effectuées sur le compte. /// Obtient ou définit la liste des transactions effectuées sur le compte.
/// </summary> /// </summary>
[DataMember(Order = 5)] [DataMember(Order = 5)]
public ObservableCollection<Transaction> TransactionsList public ObservableCollection<Transaction> TransactionsList
{ {
get => transactionsList; get => transactionsList;
set set
{ {
transactionsList = value; transactionsList = value;
OnPropertyChanged(nameof(TransactionsList)); OnPropertyChanged(nameof(TransactionsList));
} }
} }
private ObservableCollection<Transaction> transactionsList; private ObservableCollection<Transaction> transactionsList;

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

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

@ -1,6 +1,6 @@
/// \file /// \file
/// \brief Définition de l'interface IPersistenceManager. /// \brief Définition de l'interface IPersistenceManager.
/// \author Votre nom /// \author PEREDERII Antoine, LOUVET Titouan
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -15,7 +15,7 @@ namespace Model
/// <summary> /// <summary>
/// Charge les données depuis une source de persistance. /// Charge les données depuis une source de persistance.
/// </summary> /// </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(); public (HashSet<Customer>, Consultant) DataLoad();
/// <summary> /// <summary>

@ -1,6 +1,6 @@
/// \file /// \file
/// \brief Définition de la classe Manager. /// \brief Définition de la classe Manager.
/// \author Votre nom /// \author PEREDERII Antoine, LOUVET Titouan
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -16,11 +16,11 @@ namespace Model
/// </summary> /// </summary>
[DataContract] [DataContract]
public class Manager : INotifyPropertyChanged public class Manager : INotifyPropertyChanged
{ {
public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string? propertyName = null) void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary> /// <summary>
/// Liste des clients gérés par le gestionnaire. /// Liste des clients gérés par le gestionnaire.
@ -28,7 +28,7 @@ namespace Model
[DataMember] [DataMember]
public HashSet<Customer> CustomersList { get; private set; } public HashSet<Customer> CustomersList { get; private set; }
public ObservableCollection<string> CategoryList { get; private set; } = new ObservableCollection<string> {"Automobile", "Santé", "Abonnement", "Logement", "Impôts et taxes", "Courses", "Loisirs et sorties", "Enfant(s)"}; public ObservableCollection<string> CategoryList { get; private set; } = new ObservableCollection<string> { "Automobile", "Santé", "Abonnement", "Logement", "Impôts et taxes", "Courses", "Loisirs et sorties", "Enfant(s)" };
/// <summary> /// <summary>
/// Consultant assigné au gestionnaire. /// Consultant assigné au gestionnaire.
@ -102,10 +102,10 @@ namespace Model
/// </summary> /// </summary>
/// <param name="persistence">Gestionnaire de persistance.</param> /// <param name="persistence">Gestionnaire de persistance.</param>
public Manager(IPersistenceManager persistence) public Manager(IPersistenceManager persistence)
{ {
CustomersList = new HashSet<Customer>(); CustomersList = new HashSet<Customer>();
Persistence = persistence; Persistence = persistence;
} }
/// <summary> /// <summary>
/// Constructeur du gestionnaire sans gestionnaire de persistance. /// Constructeur du gestionnaire sans gestionnaire de persistance.
@ -138,10 +138,10 @@ namespace Model
/// Charge les données depuis la source de persistance. /// Charge les données depuis la source de persistance.
/// </summary> /// </summary>
public void DataLoad() public void DataLoad()
{ {
var data = Persistence.DataLoad(); var data = Persistence.DataLoad();
CustomersList =data.Item1; CustomersList = data.Item1;
Consultant = data.Item2; Consultant = data.Item2;
} }

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

@ -1,6 +1,6 @@
/// \file /// \file
/// \brief Définition de la classe Person. /// \brief Définition de la classe Person.
/// \author Votre nom /// \author PEREDERII Antoine, LOUVET Titouan
using System; using System;
using System.Collections.Generic; 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; using System.Runtime.Serialization;
namespace Model namespace Model

Loading…
Cancel
Save