last merge under deadline. xaml-C#/data-binding into master
continuous-integration/drone/push Build is passing Details

Reviewed-on: #69
master
Antoine PEREDERII 2 years ago
commit 4c7a98801f

@ -22,10 +22,5 @@ public partial class App : Application
MainPage = new AppShell();
//MyManager.SelectedTransaction = MyManager.CustomersList[0].AccountsList[0].TransactionsList[0];
//MainPage = new Views.TransactionsPage();
}
}

@ -1,26 +1,18 @@
using Banquale.Views;
using Banquale.Views.Category;
using Banquale.Views.Transfer;
using Model;
namespace Banquale;
public partial class AppShell : Shell
{
public AppShell()
public Manager Mgr => (App.Current as App).MyManager;
public AppShell()
{
InitializeComponent();
RegisterRoutes();
}
private void RegisterRoutes()
{
Routing.RegisterRoute("balance/categorydetails", typeof(CategoryPage));
Routing.RegisterRoute("balance/newpagedetails", typeof(NewPage1));
Routing.RegisterRoute("menu/requestdetails", typeof(RequestPage));
Routing.RegisterRoute("menu/ribdetails", typeof(RibPage));
Routing.RegisterRoute("menu/transferdetails", typeof(TransferPage));
Routing.RegisterRoute("connection/consultant", typeof(ConsultantHomePage));
Routing.RegisterRoute("consultant/idpage", typeof(ConsultantIdPage));
Routing.RegisterRoute("consultant/createcustomer", typeof(CreateCustomerPage));
}
}

@ -34,6 +34,7 @@
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
<Compile Remove="Views\Converters\ReverseList.cs" />
<MauiImage Include="Resources\Images\sources\accounts.svg" />
<MauiImage Include="Resources\Images\sources\dotnet_bot.svg" />
<MauiImage Include="Resources\Images\sources\help.svg" />

@ -11,6 +11,9 @@ 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
public class DataContractPersJSON : IPersistenceManager
{
@ -18,7 +21,7 @@ namespace Banquale.DataContractPersistance
public string FileName { get; set; } = "DataSave.json";
public (List<Customer>, Consultant) DataLoad()
public (HashSet<Customer>, Consultant) DataLoad()
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
@ -33,7 +36,7 @@ namespace Banquale.DataContractPersistance
}
public void DataSave(List<Customer> cu, Consultant co)
public void DataSave(HashSet<Customer> cu, Consultant co)
{
DataToPersist data = new DataToPersist();

@ -0,0 +1,46 @@
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Xml;
namespace Banquale.DataContractPersistance
{
public class DataContractPersLINQ : IPersistenceManager
{
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.xml";
public (HashSet<Customer>, Consultant) DataLoad()
{
throw new NotImplementedException();
}
public void DataSave(HashSet<Customer> cu, Consultant co)
{
XDocument dataSave = new XDocument();
var save = cu.Select(v => new XElement("Customer",
new XElement("Personne",
new XElement("name", v.FirstName),
new XElement("id", Convert.ToString(v.Id)),
new XElement("mdp", v.Password),
new XAttribute("Account", v.AccountsList))));
dataSave.Add(new XElement("Customers", save));
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileName)))
using (XmlWriter writer = XmlWriter.Create(tw, settings))
{
dataSave.Save(writer);
}
}
}
}

@ -10,12 +10,11 @@ namespace Banquale.DataContractPersistance
{
public class DataContractPersXML : IPersistenceManager
{
//public string FilePath { get; set; } = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/datbase.xml";
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.xml";
public (List<Customer>, Consultant) DataLoad()
public (HashSet<Customer>, Consultant) DataLoad()
{
var serializer = new DataContractSerializer(typeof(DataToPersist));
@ -33,23 +32,10 @@ namespace Banquale.DataContractPersistance
data = new DataToPersist(); // Si le fichier n'existe pas, créez une nouvelle liste
}
// List<Customer> CustomersList;
//Consultant Consultant;
//using (Stream s = File.OpenRead(Path.Combine(FilePath, FileNameCustomer)))
//{
// CustomersList = serializer.ReadObject(s) as List<Customer>;
// }
// using (Stream s = File.OpenRead(Path.Combine(FilePath, FileNameConsultant)))
// {
// Consultant = serializer2.ReadObject(s) as Consultant;
// }
return (data.customer, data.consultant);
}
public void DataSave(List<Customer> cu, Consultant co)
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
@ -74,33 +60,6 @@ namespace Banquale.DataContractPersistance
}
}
// var serializer = new DataContractSerializer(typeof(List<Customer>));
// var serializer2 = new DataContractSerializer(typeof(Consultant));
// if (!Directory.Exists(FilePath))
//{
// Debug.WriteLine("Directory created");
// Debug.WriteLine(FilePath);
// Directory.CreateDirectory(FilePath);
//}
//var settings = new XmlWriterSettings() { Indent = true };
// using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileNameCustomer)))
//{
// using (XmlWriter writer = XmlWriter.Create(tw, settings))
// {
// serializer.WriteObject(writer, cu);
// }
//}
// using (TextWriter tw2 = File.CreateText(Path.Combine(FilePath, FileNameConsultant)))
// {
// using (XmlWriter writer2 = XmlWriter.Create(tw2, settings))
// {
// serializer.WriteObject(writer2, co);
// }
// }
}
}
}

@ -5,7 +5,7 @@ namespace Banquale.DataContractPersistance
{
public class DataToPersist
{
public List<Customer> customer { get; set; } = new List<Customer>();
public HashSet<Customer> customer { get; set; } = new HashSet<Customer>();
public Consultant consultant { get; set; }
}
}

@ -8,10 +8,34 @@ namespace Banquale.Stub
public class Stub : IPersistenceManager
{
public (List<Customer>, Consultant) DataLoad()
public (HashSet<Customer>, Consultant) DataLoad()
{
Consultant Consultant = new Consultant("Consultant", "Consultant", "Consultant"); // toujours creer en premier le consultant
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
@ -25,16 +49,16 @@ namespace Banquale.Stub
Account Account2 = new Account(9510, "Despoints", "FR7647858569691441525263003");
Account Account3 = new Account(3519, "Perotte", "FR7663522541416969585847002");
Transaction Transaction1 = new Transaction(true, 55, Account2, 1, new DateTime(2023, 6, 21, 15, 29, 20));
Transaction Transaction12 = new Transaction(true, 105, Account2, 2, new DateTime(2023, 8, 17, 18, 54, 35));
Transaction Transaction13 = new Transaction(true, 187, Account3, 3, new DateTime(2023, 5, 3, 8, 39, 49));
Transaction Transaction2 = new Transaction(false, 54.99, Account2, 4, new DateTime(2022, 8, 15));
Transaction Transaction3 = new Transaction(true, 1000, Account3, 5, new DateTime(2020, 9, 1, 20, 00, 00));
Transaction Transaction1 = new Transaction(true, 55, Account2, new DateTime(2023, 6, 21, 15, 29, 20));
Transaction Transaction12 = new Transaction(true, 105, Account2, new DateTime(2023, 8, 17, 18, 54, 35));
Transaction Transaction13 = new Transaction(true, 187, Account3, new DateTime(2023, 5, 3, 8, 39, 49));
Transaction Transaction2 = new Transaction(false, 54.99, Account2, new DateTime(2022, 8, 15));
Transaction Transaction3 = new Transaction(true, 1000, Account3, new DateTime(2020, 9, 1, 20, 00, 00));
Debug.WriteLine(Customer1.Name, Customer1.Password);
List<Customer> CustomersList = new List<Customer>();
Debug.WriteLine(Customer1.Name, Customer1.Password);
HashSet<Customer> CustomersList = new HashSet<Customer>();
List<Transaction> TransactionsList= new List<Transaction>();
List<Account> AccountsList = new List<Account>();
@ -46,16 +70,17 @@ namespace Banquale.Stub
//Account2.TransactionsList.Add(Transaction2);
Account1.DoTransactions(Account2, 55, true, 1);
Account1.DoTransactions(Account2, 105, true, 2);
Account1.DoTransactions(Account3, 187, true, 3);
Account1.DoTransactions(Account2, 54.99, false, 4);
Account1.DoTransactions(Account3, 1000, false, 5);
Account1.DoTransactions(Account2, 55, true);
Account1.DoTransactions(Account2, 105, true);
Account1.DoTransactions(Account3, 187, true);
Account1.DoTransactions(Account2, 54.99, false);
Account1.DoTransactions(Account3, 1000, false);
Customer1.AccountsList.Add(Account1);
Customer1.AccountsList.Add(Account2);
Customer2.AccountsList.Add(Account3);
CustomersList.Add(Customer1);
@ -64,7 +89,7 @@ namespace Banquale.Stub
return (CustomersList, Consultant);
}
public void DataSave(List<Customer> c, Consultant consultant)
public void DataSave(HashSet<Customer> c, Consultant consultant)
{
throw new NotImplementedException();
}

@ -3,8 +3,15 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Banquale.Views.Balance.BalancePage"
xmlns:local="clr-namespace:Banquale.Views.Balance"
Shell.NavBarIsVisible="False">
xmlns:conv="clr-namespace:Banquale.Views.Converters"
Shell.NavBarIsVisible="False"
Shell.TabBarIsVisible="True">
<ContentPage.Resources>
<conv:Bool2ColorConverters x:Key="bool2ColorConverters"/>
<conv:Int2StringConverters x:Key="int2StringConverters"/>
</ContentPage.Resources>
<Grid RowDefinitions="auto, auto, *" x:Name="Grid">
<Frame BackgroundColor="{StaticResource Key=Banquale}"
@ -22,12 +29,6 @@
RowDefinitions="auto, 35, *"
ColumnDefinitions="250, auto">
<Grid.GestureRecognizers>
<TapGestureRecognizer
Tapped="Balance_Clicked"
NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
<Label
Text="Compte Professionnel"
HorizontalOptions="Center"
@ -68,12 +69,55 @@
Color="{StaticResource Key=Gray100}"
Grid.Row="1"
HeightRequest="1"/>
<VerticalStackLayout Grid.Row="2">
<ListView ItemsSource="{Binding TransactionsList}"
SelectionMode="None">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid
ColumnDefinitions="*, *"
Margin="20, 5, 20, 5"
HorizontalOptions="Fill">
<Grid.GestureRecognizers>
<TapGestureRecognizer
Tapped="Transaction_Clicked"
NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
<Label
Text="{Binding Date, StringFormat='{0:ddd dd MMM yyyy HH:mm}'}"
Grid.Column="0"
VerticalOptions="Center"
Margin="10, 0, 0, 0"/>
<Label
Text="{Binding Sum, StringFormat='{0} €'}"
Grid.Column="2"
TextColor="{Binding Type, Converter={StaticResource bool2ColorConverters}}"
VerticalOptions="Center"
HorizontalOptions="End"
Margin="0, 0, 20, 0"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<Label Text="{Binding TransactionsList[0].Id}"
x:Name="idLabel" />
</ListView>
<local:BalanceView
Grid.Row="2"/>
</VerticalStackLayout>
</Grid>
</ContentPage>

@ -1,4 +1,5 @@
using Model;
using Android.Telephony;
using Model;
namespace Banquale.Views.Balance;
@ -7,22 +8,29 @@ public partial class BalancePage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
//private BalanceView MybalanceView;
public BalancePage()
{
InitializeComponent();
BindingContext = Mgr.SelectedAccount;
if(Mgr.IsConsultant == true)
{
//Label lext = new Label { Text = "Hello" };
//Grid.Add(lext);
Image backArrow = new Image { Source = "{StaticResource AccountIcon}", HeightRequest = 100 };
Grid.Add(backArrow);
}
//MybalanceView = balanceViewContainer.FindByName<BalanceView>("balanceViewContainer");
}
public async void Balance_Clicked(object sender, EventArgs e)
public void RefreshPage()
{
await Shell.Current.Navigation.PushAsync(new NewPage1());
BindingContext = Mgr.SelectedAccount;
//MybalanceView.RefreshView();
}
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,10 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:Banquale.Views.Converters"
x:Class="Banquale.Views.Balance.BalanceView">
<ContentView.Resources>
<conv:Bool2ColorConverters x:Key="bool2ColorConverters"/>
<conv:Int2StringConverters x:Key="int2StringConverters"/>
</ContentView.Resources>
<VerticalStackLayout>
<ListView ItemsSource="{Binding TransactionsList}"
SelectionMode="None">
@ -26,11 +34,6 @@
</Grid.GestureRecognizers>
<Label
Text="{Binding Id}"
Grid.Column="0"
x:Name="transactionId"/>
<Label
Text="{Binding Date, StringFormat='{0:ddd dd MMM yyyy}'}"
Grid.Column="1"
@ -40,9 +43,11 @@
<Label
Text="{Binding Sum, StringFormat='{0} €'}"
Grid.Column="2"
TextColor="{Binding Type, Converter={StaticResource bool2ColorConverters}}"
VerticalOptions="Center"
HorizontalOptions="End"
Margin="0, 0, 20, 0"/>
</Grid>

@ -23,27 +23,12 @@ public partial class BalanceView : ContentView
Mgr.SelectedTransaction = selectedItem;
await Navigation.PushModalAsync(new TransactionsPage());
}
}
//if (string.IsNullOrWhiteSpace(idLabel.Text))
//{
// //await DisplayAlert("Erreur", "Aucune transaction présente", "OK");
// Debug.WriteLine("Erreur1");
// return;
//}
//Transaction transaction = Mgr.SelectedAccount.TransactionsList.FirstOrDefault(u => u.Id == TransactionId);
//if (transaction == null)
//{
// Debug.WriteLine("Erreur2");
// //await DisplayAlert("Erreur", "La transaction n'éxiste pas !", "OK");
// return;
//}
//Mgr.SelectedTransaction = transaction;
//Mgr.SelectedTransaction = Mgr.CustomersList[0].AccountsList[0].TransactionsList[0];
//await Navigation.PushModalAsync(new TransactionsPage());
public void RefreshView()
{
BindingContext = Mgr.SelectedAccount;
}
}

@ -18,6 +18,7 @@ public partial class CategoryView : ContentView
if (selectedItem != null)
{
Mgr.SelectedTransaction.ChangeCategory(selectedItem);
Mgr.Persistence.DataSave(Mgr.CustomersList, Mgr.Consultant);
await Shell.Current.Navigation.PopAsync();
}

@ -13,19 +13,6 @@ public partial class ConsultantIdPage : ContentPage
InitializeComponent();
}
//public async void Connection_Clicked(Object sender, EventArgs e)
//{
// string id = ident.Text;
// if (string.IsNullOrWhiteSpace(id))
// {
// await DisplayAlert("Erreur", "l'id ne doit pas être nulle", "OK");
// return;
// }
// await Navigation.PushModalAsync(new Balance.BalancePage());
//}
public async void Connection_Clicked(Object sender, EventArgs e)
{
uint currentId = Convert.ToUInt32(ident.Text);

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Views.Converters
{
public class Bool2ColorConverters : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool NewValue = (bool) value;
if (NewValue== true)
return Colors.Red;
return Colors.Green;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Views.Converters
{
public class Int2StringConverters : IValueConverter
{
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;
else
res = "+" + (string)value;
return res;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

@ -8,7 +8,7 @@
<Label
Text="Informations du client"
FontSize="Title"
FontSize="30"
HorizontalOptions="Center"
Margin="0,20,0,15"
TextColor="Red"/>
@ -22,7 +22,7 @@
<Label
Text="Nom"
FontSize="Subtitle"
FontSize="16"
Grid.Column="0"
Grid.Row="0"/>
<Entry
@ -33,7 +33,7 @@
<Label
Text="Prénom"
FontSize="Subtitle"
FontSize="16"
Grid.Column="1"
Grid.Row="0"/>
<Entry
@ -46,14 +46,15 @@
<Label
Text="Mot de Passe"
FontSize="Subtitle" />
FontSize="16" />
<Entry
x:Name="PasswordEntry"
Placeholder="Entrez le mot de passe" />
Placeholder="Entrez le mot de passe"
IsPassword="True"/>
<Label
Text="Compte 1"
FontSize="Title"
FontSize="25"
Margin="0, 10, 0, 10"
TextColor="DarkRed"/>
@ -63,7 +64,7 @@
<Label
Text="Solde"
FontSize="Subtitle"
FontSize="16"
Grid.Column="0"
Grid.Row="0"/>
<Entry
@ -75,7 +76,7 @@
<Label
Text="Nom du compte"
FontSize="Subtitle"
FontSize="16"
Grid.Column="1"
Grid.Row="0"/>
<Entry
@ -88,17 +89,17 @@
<Label
Text="IBAN"
FontSize="Subtitle" />
FontSize="16" />
<Entry
Text="FR "
Text="FR"
CursorPosition="2"
x:Name="AccountIbanEntry"
TextChanged="IbanChanged"
Placeholder="Entrez l'IBAN du compte"
Keyboard="Telephone"/>
Keyboard="Numeric"/>
</StackLayout>
<Button
Text="Ajouter un compte"
HorizontalOptions="Center"

@ -8,14 +8,29 @@ public partial class CreateCustomerPage : ContentPage
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 { };
public CreateCustomerPage()
{
InitializeComponent();
}
public void Create_Customer_Clicked(System.Object sender, System.EventArgs e)
public async void Create_Customer_Clicked(System.Object sender, System.EventArgs e)
{
string name = NameEntry.Text;
double BalanceAccount2 = Convert.ToDouble(balanceEntry.Text);
string NameAccount2 = nameEntry.Text;
string IbanAccount2 = ibanEntry.Text;
string name = NameEntry.Text;
string firstName = FirstNameEntry.Text;
string password = PasswordEntry.Text;
string accountName = AccountNameEntry.Text;
@ -24,35 +39,50 @@ public partial class CreateCustomerPage : ContentPage
if(string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(password)
|| double.IsNegative(accountBalance) || string.IsNullOrWhiteSpace(accountName)
|| string.IsNullOrWhiteSpace(accountIban) || string.IsNullOrWhiteSpace(AccountBalanceEntry.Text))
|| 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)
{
DisplayAlert("Erreur", "Tous les champs doivent être renseignés et corect (pas de solde négatif)", "OK");
await DisplayAlert("Erreur", "L'IBAN doit contenir exactement 25 chiffres.", "OK");
}
else
{
Customer customer = new Customer(name, firstName, password);
Account account = new Account(accountBalance, accountName, accountIban);
customer.AccountsList.Add(account);
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(account.IBAN);
DisplayAlert("Création", "Client " + customer.Name +" crée avec succès.", "OK");
Shell.Current.Navigation.PopAsync();
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)
{
Account2 = true;
nbAccount++;
if(nbAccount >= 4)
if(nbAccount >= 3)
{
DisplayAlert("Erreur", "Impossible d'ajouter plus de compte. Un client ne peut avoir plus de 3 comptes.", "OK");
DisplayAlert("Erreur", "Impossible d'ajouter plus de compte. Un client ne peut avoir plus de 2 comptes.", "OK");
return;
}
Label account = new Label { Text = "Compte " + Convert.ToString(nbAccount)};
account.FontSize = 20;
Grid gridAccount = new Grid();
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);
@ -61,13 +91,18 @@ public partial class CreateCustomerPage : ContentPage
gridAccount.RowDefinitions.Add(row2);
gridAccount.ColumnDefinitions.Add(col1);
gridAccount.ColumnDefinitions.Add(col2);
Label balance = new Label { Text = "Solde" };
balance.FontSize = 12;
Entry balanceEntry = new Entry { Placeholder = "Entrez le solde du compte" };
Label nameLabel = new Label { Text = "Nom du compte" };
Entry nameEntry = new Entry { Placeholder = "Entrez le nom du compte" };
Label iban = new Label { Text = "IBAN" };
Entry ibanEntry = new Entry { Placeholder = "Entrez l'IBAN du compte" };
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.Placeholder = "Entrez l'IBAN du compte";
ibanEntry.Keyboard = Keyboard.Numeric;
StackLayout.Add(account);
gridAccount.SetColumn(balance, 0);
gridAccount.SetRow(balance, 0);
@ -82,12 +117,18 @@ public partial class CreateCustomerPage : ContentPage
gridAccount.Children.Add(nameLabel);
gridAccount.Children.Add(nameEntry);
StackLayout.Add(gridAccount);
//StackLayout.Add(balance);
// StackLayout.Add(balanceEntry);
//StackLayout.Add(nameLabel);
//StackLayout.Add(nameEntry);
StackLayout.Add(iban);
StackLayout.Add(ibanEntry);
}
public void IbanChanged(object sender, EventArgs e)
{
if(AccountIbanEntry.Text.Length < 2)
{
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
}
}
}

@ -26,7 +26,7 @@
Padding="15, 5, 15, 5">
<Editor Placeholder="Decrivez votre demande ici."
x:Name="Message"/>
x:Name="Description"/>
</Frame>

@ -11,9 +11,17 @@ public partial class HelpPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
Message message = Account.AskForHelp(Subject.Text, Message.Text);
Mgr.Consultant.MessagesList.Add(message);
await Shell.Current.GoToAsync("//balance");
if(Subject.Text.Length >= 50 || Description.Text.Length >= 200)
{
await DisplayAlert("Erreur", "Trop de caracteres", "OK");
}
else
{
Message message = Account.AskForHelp(Subject.Text, Description.Text);
Mgr.Consultant.MessagesList.Add(message);
await Shell.Current.GoToAsync("//balance");
}
}
}

@ -7,24 +7,29 @@
<VerticalStackLayout>
<!--<Label
Text="rzklpkrz,e"
Grid.Column="1"
VerticalOptions="Center"
Margin="10, 0, 0, 0"
BackgroundColor="Red"/>-->
<ListView ItemsSource="{Binding Consultant.MessagesList}"
SelectionMode="None"
RowHeight="100">
<!--<Label Text="{Binding CustomersList[0].Name}" />-->
<ListView.ItemTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding MessagesList}"
SelectionMode="None">
<ViewCell>
<Grid RowDefinitions="auto, auto">
<ListView.ItemTemplate>
<Label
Text="{Binding Subject}"
FontSize="Title"
Padding="10"/>
<Label
Text="{Binding Description}"
Grid.Row="1"/>
<DataTemplate>
</Grid>
<TextCell Text="{Binding Subject}" />
</ViewCell>
</DataTemplate>

@ -11,7 +11,8 @@ public partial class MessageListPage : ContentPage
public MessageListPage()
{
Debug.WriteLine(Mgr.Consultant.MessagesList[0].Subject);
InitializeComponent();
BindingContext = Mgr.Consultant;
BindingContext = Mgr;
InitializeComponent();
}
}

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Banquale.Views.NewPage1">
<VerticalStackLayout>
<Label
Text="Welcome to .NET MAUI!"
VerticalOptions="Center"
HorizontalOptions="Center" />
<Button
Text="Click me"
Clicked="Button_Clicked"/>
<Button
Clicked="ArrowBack" />
<ListView ItemsSource="{Binding ListeClients}" x:Name="ListViewID">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Nom}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentPage>

@ -1,32 +0,0 @@
using Model;
namespace Banquale.Views;
public partial class NewPage1 : ContentPage
{
public Manager myManager => (App.Current as App).MyManager;
public NewPage1()
{
InitializeComponent();
ListViewID.BindingContext = myManager;
}
int cpt = 0;
void Button_Clicked(System.Object sender, System.EventArgs e)
{
Customer customer1 = new Customer("Mister", "Hello", "HelloThisIsMyPassword");
myManager.AddCustomer(customer1);
cpt++;
Console.WriteLine(cpt);
Console.WriteLine(customer1.Name);
}
public async void ArrowBack(object sender, EventArgs e)
{
await Shell.Current.Navigation.PopAsync();
}
}

@ -4,7 +4,8 @@
xmlns:local="clr-namespace:Banquale.Views"
x:Class="Banquale.Views.SwitchAccountPage"
Title="SwitchAccountPage"
Shell.NavBarIsVisible="False">
Shell.NavBarIsVisible="False"
Shell.TabBarIsVisible="False">
<VerticalStackLayout
@ -13,7 +14,8 @@
<ListView
ItemsSource="{Binding AccountsList}"
SelectionMode="None">
SelectionMode="None"
RowHeight="100">
<ListView.ItemTemplate>
@ -22,7 +24,7 @@
<ViewCell>
<VerticalStackLayout
HeightRequest="84"
HeightRequest="100"
Margin="10">
<Button

@ -1,4 +1,5 @@
using System.Diagnostics;
using Banquale.Views.Balance;
using Model;
namespace Banquale.Views;
@ -13,6 +14,13 @@ public partial class SwitchAccountPage : ContentPage
BindingContext = Mgr.SelectedCustomer;
}
protected override void OnAppearing()
{
base.OnAppearing();
RefreshData();
}
public async void Transfer_Clicked(object sender, EventArgs e)
{
var selectedItem = (sender as Button)?.BindingContext as Account;
@ -27,6 +35,8 @@ public partial class SwitchAccountPage : ContentPage
else
{
await Shell.Current.GoToAsync("//balance");
var balancePage = Shell.Current.CurrentPage as BalancePage;
balancePage?.RefreshPage();
}
}
@ -36,8 +46,7 @@ public partial class SwitchAccountPage : ContentPage
{
if(Mgr.IsConsultant == true)
{
//await Shell.Current.GoToAsync(;
Debug.WriteLine("Hello");
await Shell.Current.Navigation.PopAsync();
}
else
{
@ -45,4 +54,9 @@ public partial class SwitchAccountPage : ContentPage
}
}
private void RefreshData()
{
BindingContext = Mgr.SelectedCustomer;
}
}

@ -2,46 +2,23 @@
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Banquale.Views.TransactionsPage"
xmlns:conv="clr-namespace:Banquale.Views.Converters"
Title="TransactionsPage">
<!--<Grid RowDefinitions="2*, *, 0*, *, 0*, *, *, *, *, *, *">
<Grid Grid.Row="1" ColumnDefinitions="2*, *, 2*">
<Label Grid.Column="1"
Text="Prix"
HorizontalOptions="Center"
FontSize="Large"/>
</Grid>
<Grid Grid.Row="3" ColumnDefinitions="*, *, *">
<Label Grid.Column="1"
Text="poiuytreza"
HorizontalOptions="Center"/>
</Grid>
<ContentPage.Resources>
<conv:Bool2ColorConverters x:Key="bool2ColorConverters"/>
</ContentPage.Resources>
<Grid Grid.Row="5" ColumnDefinitions="*, 4*, *">
<Button Grid.Column="1" Text="Categorie" FontSize="Medium" />
</Grid>
<Grid Grid.Row="7" RowDefinitions="auto, *, *" ColumnDefinitions="*, auto, *">
<Label Grid.Row="0" Grid.Column="1" Text=" Paiment par carte &#x0a;4859 **** **** 9985" VerticalOptions="Center"/>
<BoxView Grid.Row="1" Grid.Column="1" HorizontalOptions="FillAndExpand"
HeightRequest="1.3"/>
<Label Grid.Row="2" Grid.Column="1" Text="En date du 15/06/2023"/>
</Grid>
<VerticalStackLayout
VerticalOptions="Center">
<Grid Grid.Row="9" ColumnDefinitions="*, 4*, *">
<Button Grid.Column="1" Text="Faire opposition"/>
</Grid>
</Grid>-->
<VerticalStackLayout VerticalOptions="Center">
<Label
Text="{Binding Sum, StringFormat='{0} €'}"
HorizontalOptions="Center"
TextColor="{Binding Type, Converter={StaticResource bool2ColorConverters}}"
FontSize="Large"
Margin="0, 0, 0, 20"/>
Margin="0, 0, 0, 20"
x:Name="sum"/>
<Button
Grid.Column="1"
@ -86,7 +63,15 @@
<Button
Text="Faire opposition"
Margin="0, 50, 0, 0"
Clicked="Objection_Clicked" x:Name="oppose"/>
Clicked="Objection_Clicked"
x:Name="oppose"/>
<Button
Text="Refuser l'opposition"
Margin="0, 20, 0, 0"
IsVisible="false"
Clicked="Refuse_Clicked"
x:Name="refuseOpposition"/>
</VerticalStackLayout>

@ -5,13 +5,38 @@ namespace Banquale.Views;
public partial class TransactionsPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
public TransactionsPage()
{
InitializeComponent();
BindingContext = Mgr.SelectedTransaction;
if(Mgr.IsConsultant == true)
if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == false)
{
oppose.Text = "Aucune demande en cours";
}
else if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == true)
{
oppose.Text = "Accepter l'opposition";
refuseOpposition.IsVisible = true;
}
if(Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == true)
{
oppose.Text = "Accepter l'oposition";
oppose.Text = "Demande en cours";
}
if(Mgr.SelectedTransaction.Type == true)
{
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;
}
}
@ -22,8 +47,36 @@ public partial class TransactionsPage : ContentPage
async void Objection_Clicked(System.Object sender, System.EventArgs e)
{
await Shell.Current.Navigation.PopAsync();
if(Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == false)
{
Mgr.SelectedTransaction.IsOpposition = true;
await DisplayAlert("Opposition", "Votre demande d'opposition à bien été pris en compte", "OK");
await Shell.Current.Navigation.PopAsync();
}
else if(Mgr.IsConsultant == true && Mgr.SelectedTransaction.IsOpposition == true)
{
Mgr.SelectedAccount.TransactionsList.Remove(Mgr.SelectedTransaction);
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)
{
await DisplayAlert("Erreur", "Aucune demande d'opposition est en cours sur cette transaction", "OK");
await Shell.Current.Navigation.PopAsync();
}
else if (Mgr.IsConsultant == false && Mgr.SelectedTransaction.IsOpposition == true)
{
await DisplayAlert("Opposition", "Votre demande est en cours. Veuillez patienter SVP.", "OK");
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();
}
}

@ -26,10 +26,11 @@
Padding="3">
<Entry
Text="FR "
Text="FR"
Placeholder="IBAN (FR)"
HorizontalOptions="Center"
WidthRequest="280"
TextChanged="IbanChanged"
x:Name="IBAN"
Keyboard="Numeric"/>
@ -54,7 +55,8 @@
Margin="0, 75, 0, 0"
MinimumHeightRequest="80"
WidthRequest="300"
MaximumWidthRequest="400"/>
MaximumWidthRequest="400"
Clicked="Send_Clicked"/>
</VerticalStackLayout>

@ -14,7 +14,49 @@ public partial class RequestPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
//Account.DoRequest(Name.Text, IBAN.Text, Sum.Text);
await Shell.Current.GoToAsync("//balance");
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");
return;
}
else if(IBAN.Text.Length != 27)
{
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 vous faire de demande à vous même", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{
foreach (var acc in cust.AccountsList)
{
if (acc.Name == Name.Text && acc.IBAN == IBAN.Text)
{
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");
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");
}
public void IbanChanged(object sender, EventArgs e)
{
if (IBAN.Text.Length < 2)
{
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
}
}
}

@ -30,6 +30,7 @@
Placeholder="IBAN"
HorizontalOptions="Center"
WidthRequest="280"
TextChanged="IbanChanged"
x:Name="IBAN"
Keyboard="Numeric"/>

@ -5,6 +5,7 @@ namespace Banquale.Views.Transfer;
public partial class TransferPage : ContentPage
{
public Manager Mgr => (App.Current as App).MyManager;
public TransferPage()
{
InitializeComponent();
@ -12,13 +13,16 @@ public partial class TransferPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
int count = Mgr.SelectedAccount.TransactionsList.Count;
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");
return;
}
else if (IBAN.Text.Length != 27)
{
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 vous faire de virement à vous même", "OK");
@ -35,7 +39,8 @@ public partial class TransferPage : ContentPage
await DisplayAlert("Erreur", "Vous ne possèdez pas assez d'argent sur ce compte pour aboutir à la transaction", "OK");
return;
}
Mgr.SelectedAccount.DoTransactions(acc, Convert.ToDouble(Sum.Text), true, count+1); // Type true car c'est un virement
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;
}
@ -44,4 +49,13 @@ public partial class TransferPage : ContentPage
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
public void IbanChanged(object sender, EventArgs e)
{
if (IBAN.Text.Length < 2)
{
DisplayAlert("Erreur", "Vous ne pouvez pas effacer le FR !", "OK");
var cast = ((Entry)sender);
cast.Text = "FR";
}
}
}

@ -127,19 +127,18 @@ namespace Model
/// <param name="involvedAccount">Compte tiers impliqué dans la transaction.</param>
/// <param name="sum">Somme de la transaction.</param>
/// <param name="type">Type de transaction (débit ou crédit).</param>
/// <param name="nb">Numéro de la transaction.</param>
public void DoTransactions(Account involvedAccount, double sum, bool type, int nb)
public void DoTransactions(Account involvedAccount, double sum, bool type)
{
if (type) // si le type est True => c'est un débit, on doit donc ajouter la transaction pour l'autre compte
{
Transaction transaction = new Transaction(type, sum, involvedAccount, nb, DateTime.Now);
TransactionsList.Add(transaction);
Transaction transaction = new Transaction(type, sum, involvedAccount, DateTime.Now);
TransactionsList.Insert(0, transaction);
Balance = Balance - sum;
involvedAccount.DoTransactions(this, sum, !type, nb + 1);
involvedAccount.DoTransactions(this, sum, !type);
}
else // Sinon, c'est un crédit, on a juste à l'ajouter à notre liste de transactions
{
TransactionsList.Add(new Transaction(type, sum, involvedAccount, nb, DateTime.Now));
TransactionsList.Insert(0, new Transaction(type, sum, involvedAccount, DateTime.Now));
Balance = Balance + sum;
}
}

@ -17,7 +17,7 @@ namespace Model
/// Liste des messages du consultant.
/// </summary>
[DataMember]
public List<Message> MessagesList = new List<Message>();
public List<Message> MessagesList { get; } = new ();
/// <summary>
/// Constructeur de la classe Consultant.

@ -15,14 +15,14 @@ namespace Model
/// <summary>
/// Charge les données depuis une source de persistance.
/// </summary>
/// <returns>Un tuple contenant la liste des clients et le consultant.</returns>
(List<Customer>, Consultant) DataLoad();
/// <returns>Un tuple contenant lle hashSet des clients et le consultant.</returns>
public (HashSet<Customer>, Consultant) DataLoad();
/// <summary>
/// Enregistre les données dans une source de persistance.
/// </summary>
/// <param name="cu">La liste des clients à enregistrer.</param>
/// <param name="co">Le consultant à enregistrer.</param>
void DataSave(List<Customer> cu, Consultant co);
void DataSave(HashSet<Customer> cu, Consultant co);
}
}

@ -26,7 +26,7 @@ namespace Model
/// Liste des clients gérés par le gestionnaire.
/// </summary>
[DataMember]
public List<Customer> CustomersList { get; private set; } // devient un 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)"};
@ -101,18 +101,18 @@ namespace Model
/// Constructeur du gestionnaire avec un gestionnaire de persistance spécifié.
/// </summary>
/// <param name="persistence">Gestionnaire de persistance.</param>
public Manager(IPersistenceManager persistence)
{
CustomersList = new List<Customer>();
Persistence = persistence;
}
public Manager(IPersistenceManager persistence)
{
CustomersList = new HashSet<Customer>();
Persistence = persistence;
}
/// <summary>
/// Constructeur du gestionnaire sans gestionnaire de persistance.
/// </summary>
public Manager()
{
CustomersList = new List<Customer>();
CustomersList = new HashSet<Customer>();
}
/// <summary>
@ -126,16 +126,6 @@ namespace Model
return true;
}
/// <summary>
/// Récupère le client à la position spécifiée dans la liste des clients.
/// </summary>
/// <param name="place">Position du client.</param>
/// <returns>Le client à la position spécifiée.</returns>
public Customer GetCustomer(int place)
{
return CustomersList[place];
}
/// <summary>
/// Enregistre les données dans la source de persistance.
/// </summary>
@ -148,10 +138,10 @@ namespace Model
/// Charge les données depuis la source de persistance.
/// </summary>
public void DataLoad()
{
var data = Persistence.DataLoad();
{
var data = Persistence.DataLoad();
CustomersList.AddRange(data.Item1);
CustomersList =data.Item1;
Consultant = data.Item2;
}

@ -6,7 +6,7 @@ namespace Model
/// <summary>
/// Represents a transaction.
/// </summary>
[DataContract(IsReference = true)]
[DataContract(IsReference = false)]
public class Transaction : INotifyPropertyChanged
{
/// <summary>
@ -19,16 +19,10 @@ namespace Model
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Gets the unique identifier of the transaction.
/// </summary>
[DataMember(Order = 1)]
public int Id { get; private set; }
/// <summary>
/// Gets or sets the type of the transaction (debit or credit).
/// </summary>
[DataMember(Order = 2)]
[DataMember(Order = 1)]
public bool Type
{
get => type;
@ -46,7 +40,7 @@ namespace Model
/// <summary>
/// Gets or sets the sum of the transaction.
/// </summary>
[DataMember(Order = 3)]
[DataMember(Order = 2)]
public double Sum
{
get => sum;
@ -64,7 +58,7 @@ namespace Model
/// <summary>
/// Gets or sets the account(s) involved in the transaction.
/// </summary>
[DataMember(Order = 4)]
[DataMember(Order = 3)]
public Account? InvolvedAccounts
{
get => involvedAccounts;
@ -82,7 +76,7 @@ namespace Model
/// <summary>
/// Gets or sets the category of the transaction.
/// </summary>
[DataMember(Order = 5)]
[DataMember(Order = 4)]
public string? Category
{
get => category;
@ -100,7 +94,7 @@ namespace Model
/// <summary>
/// Gets or sets the date of the transaction.
/// </summary>
[DataMember(Order = 6)]
[DataMember(Order = 5)]
public DateTime Date
{
get => date;
@ -115,6 +109,11 @@ namespace Model
[DataMember]
private DateTime date;
[DataMember(Order = 6)]
public bool IsOpposition { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="Transaction"/> class.
/// </summary>
@ -123,14 +122,14 @@ namespace Model
/// <param name="involvedAccounts">The account(s) involved in the transaction.</param>
/// <param name="id">The unique identifier of the transaction.</param>
/// <param name="date">The date of the transaction.</param>
public Transaction(bool type, double sum, Account involvedAccounts, int id, DateTime date)
public Transaction(bool type, double sum, Account involvedAccounts, DateTime date)
{
Category = null;
Type = type;
Sum = sum;
Id = id;
InvolvedAccounts = involvedAccounts;
Date = date;
IsOpposition = false;
}
public void ChangeCategory(string newCateg)

@ -39,7 +39,7 @@ namespace UnitTest
// Effectuer une transaction entre les comptes
double amount = 200;
Console.WriteLine($"\nEffectuer une transaction de {amount} du compte 1 vers le compte 2...");
account1.DoTransactions(account2, amount, true, 1);
account1.DoTransactions(account2, amount, true);
// Affichage des informations des comptes après la transaction
Console.WriteLine("\nAprès la transaction:");

@ -1,81 +1,81 @@
using System;
using Model;
//using System;
//using Model;
namespace UnitTest
{
/// \file
/// \brief Fichier de tests pour l'interface IPersistenceManager.
/// \author Votre nom
//namespace UnitTest
//{
// /// \file
// /// \brief Fichier de tests pour l'interface IPersistenceManager.
// /// \author Votre nom
/// <summary>
/// Classe de tests pour l'interface IPersistenceManager.
/// </summary>
public class PersistenceManagerTests
{
/// <summary>
/// Teste la sauvegarde des données.
/// </summary>
[Fact]
public void DataSave_ValidData_CallsDataSave()
{
// Arrange
MockPersistenceManager persistenceManager = new MockPersistenceManager();
List<Customer> customersList = new List<Customer> { new Customer("Doe", "John", "123456") };
Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
// /// <summary>
// /// Classe de tests pour l'interface IPersistenceManager.
// /// </summary>
// public class PersistenceManagerTests
// {
// /// <summary>
// /// Teste la sauvegarde des données.
// /// </summary>
// [Fact]
// public void DataSave_ValidData_CallsDataSave()
// {
// // Arrange
// MockPersistenceManager persistenceManager = new MockPersistenceManager();
// List<Customer> customersList = new List<Customer> { new Customer("Doe", "John", "123456") };
// Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
// Act
persistenceManager.DataSave(customersList, consultant);
// // Act
// persistenceManager.DataSave(customersList, consultant);
// Assert
Assert.True(persistenceManager.DataSaveCalled);
Assert.Equal(customersList, persistenceManager.SavedCustomersList);
Assert.Equal(consultant, persistenceManager.SavedConsultant);
}
// // Assert
// Assert.True(persistenceManager.DataSaveCalled);
// Assert.Equal(customersList, persistenceManager.SavedCustomersList);
// Assert.Equal(consultant, persistenceManager.SavedConsultant);
// }
/// <summary>
/// Teste le chargement des données.
/// </summary>
[Fact]
public void DataLoad_CallsDataLoad_ReturnsData()
{
// Arrange
MockPersistenceManager persistenceManager = new MockPersistenceManager();
List<Customer> customersList = new List<Customer> { new Customer("Doe", "John", "123456") };
Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
persistenceManager.DataToLoad = (customersList, consultant);
// /// <summary>
// /// Teste le chargement des données.
// /// </summary>
// [Fact]
// public void DataLoad_CallsDataLoad_ReturnsData()
// {
// // Arrange
// MockPersistenceManager persistenceManager = new MockPersistenceManager();
// List<Customer> customersList = new List<Customer> { new Customer("Doe", "John", "123456") };
// Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
// persistenceManager.DataToLoad = (customersList, consultant);
// Act
var result = persistenceManager.DataLoad();
// // Act
// var result = persistenceManager.DataLoad();
// Assert
Assert.True(persistenceManager.DataLoadCalled);
Assert.Equal(customersList, result.Item1);
Assert.Equal(consultant, result.Item2);
}
// // Assert
// Assert.True(persistenceManager.DataLoadCalled);
// Assert.Equal(customersList, result.Item1);
// Assert.Equal(consultant, result.Item2);
// }
/// <summary>
/// Classe de mock pour le gestionnaire de persistance.
/// </summary>
private class MockPersistenceManager : IPersistenceManager
{
public bool DataSaveCalled { get; private set; }
public bool DataLoadCalled { get; private set; }
public (List<Customer>, Consultant) DataToLoad { get; set; }
public List<Customer>? SavedCustomersList { get; private set; }
public Consultant? SavedConsultant { get; private set; }
// /// <summary>
// /// Classe de mock pour le gestionnaire de persistance.
// /// </summary>
// private class MockPersistenceManager : IPersistenceManager
// {
// public bool DataSaveCalled { get; private set; }
// public bool DataLoadCalled { get; private set; }
// public (List<Customer>, Consultant) DataToLoad { get; set; }
// public List<Customer>? SavedCustomersList { get; private set; }
// public Consultant? SavedConsultant { get; private set; }
public void DataSave(List<Customer> customersList, Consultant consultant)
{
DataSaveCalled = true;
SavedCustomersList = customersList;
SavedConsultant = consultant;
}
// public void DataSave(List<Customer> customersList, Consultant consultant)
// {
// DataSaveCalled = true;
// SavedCustomersList = customersList;
// SavedConsultant = consultant;
// }
public (List<Customer>, Consultant) DataLoad()
{
DataLoadCalled = true;
return DataToLoad;
}
}
}
}
// public (List<Customer>, Consultant) DataLoad()
// {
// DataLoadCalled = true;
// return DataToLoad;
// }
// }
// }
//}

@ -1,137 +1,137 @@
using System;
using Model;
namespace UnitTest
{
/// \file
/// \brief Fichier de tests pour la classe Manager.
/// \author Votre nom
/// <summary>
/// Classe de tests pour la classe Manager.
/// </summary>
public class ManagerTests
{
/// <summary>
/// Teste si la liste des clients est initialisée correctement.
/// </summary>
[Fact]
public void Constructor_CustomersListInitialized()
{
// Arrange
Manager manager = new Manager();
// Act
// Assert
Assert.NotNull(manager.CustomersList);
Assert.Empty(manager.CustomersList);
}
/// <summary>
/// Teste l'ajout d'un client à la liste des clients.
/// </summary>
[Fact]
public void AddCustomer_ValidCustomer_ReturnsTrue()
{
// Arrange
Manager manager = new Manager();
Customer customer = new Customer("Doe", "John", "123456");
// Act
bool result = manager.AddCustomer(customer);
// Assert
Assert.True(result);
Assert.Contains(customer, manager.CustomersList);
}
/// <summary>
/// Teste la récupération d'un client à partir de la liste des clients.
/// </summary>
[Fact]
public void GetCustomer_ValidPosition_ReturnsCustomer()
{
// Arrange
Manager manager = new Manager();
Customer customer1 = new Customer("Doe", "John", "123456");
Customer customer2 = new Customer("Smith", "Jane", "abcdef");
manager.AddCustomer(customer1);
manager.AddCustomer(customer2);
// Act
Customer result = manager.GetCustomer(1);
// Assert
Assert.Equal(customer2, result);
}
/// <summary>
/// Teste la sauvegarde des données.
/// </summary>
[Fact]
public void DataSave_ValidData_CallsPersistenceManagerDataSave()
{
// Arrange
MockPersistenceManager persistenceManager = new MockPersistenceManager();
Manager manager = new Manager(persistenceManager);
Customer customer = new Customer("Doe", "John", "123456");
manager.AddCustomer(customer);
// Act
manager.DataSave();
// Assert
Assert.True(persistenceManager.DataSaveCalled);
Assert.Equal(manager.CustomersList, persistenceManager.SavedCustomersList);
Assert.Equal(manager.Consultant, persistenceManager.SavedConsultant);
}
/// <summary>
/// Teste le chargement des données.
/// </summary>
[Fact]
public void DataLoad_ValidData_CallsPersistenceManagerDataLoad()
{
// Arrange
MockPersistenceManager persistenceManager = new MockPersistenceManager();
Manager manager = new Manager(persistenceManager);
Customer customer = new Customer("Doe", "John", "123456");
Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
persistenceManager.DataToLoad = (new List<Customer> { customer }, consultant);
// Act
manager.DataLoad();
// Assert
Assert.True(persistenceManager.DataLoadCalled);
Assert.Contains(customer, manager.CustomersList);
Assert.Equal(consultant, manager.Consultant);
}
/// <summary>
/// Classe de mock pour le gestionnaire de persistance.
/// </summary>
private class MockPersistenceManager : IPersistenceManager
{
public bool DataSaveCalled { get; private set; }
public bool DataLoadCalled { get; private set; }
public (List<Customer>, Consultant) DataToLoad { get; set; }
public List<Customer>? SavedCustomersList { get; private set; }
public Consultant? SavedConsultant { get; private set; }
public void DataSave(List<Customer> customersList, Consultant consultant)
{
DataSaveCalled = true;
SavedCustomersList = customersList;
SavedConsultant = consultant;
}
public (List<Customer>, Consultant) DataLoad()
{
DataLoadCalled = true;
return DataToLoad;
}
}
}
}
//using System;
//using Model;
//namespace UnitTest
//{
// /// \file
// /// \brief Fichier de tests pour la classe Manager.
// /// \author Votre nom
// /// <summary>
// /// Classe de tests pour la classe Manager.
// /// </summary>
// public class ManagerTests
// {
// /// <summary>
// /// Teste si la liste des clients est initialisée correctement.
// /// </summary>
// [Fact]
// public void Constructor_CustomersListInitialized()
// {
// // Arrange
// Manager manager = new Manager();
// // Act
// // Assert
// Assert.NotNull(manager.CustomersList);
// Assert.Empty(manager.CustomersList);
// }
// /// <summary>
// /// Teste l'ajout d'un client à la liste des clients.
// /// </summary>
// [Fact]
// public void AddCustomer_ValidCustomer_ReturnsTrue()
// {
// // Arrange
// Manager manager = new Manager();
// Customer customer = new Customer("Doe", "John", "123456");
// // Act
// bool result = manager.AddCustomer(customer);
// // Assert
// Assert.True(result);
// Assert.Contains(customer, manager.CustomersList);
// }
// /// <summary>
// /// Teste la récupération d'un client à partir de la liste des clients.
// /// </summary>
// [Fact]
// public void GetCustomer_ValidPosition_ReturnsCustomer()
// {
// // Arrange
// Manager manager = new Manager();
// Customer customer1 = new Customer("Doe", "John", "123456");
// Customer customer2 = new Customer("Smith", "Jane", "abcdef");
// manager.AddCustomer(customer1);
// manager.AddCustomer(customer2);
// // Act
// Customer result = manager.GetCustomer(1);
// // Assert
// Assert.Equal(customer2, result);
// }
// /// <summary>
// /// Teste la sauvegarde des données.
// /// </summary>
// [Fact]
// public void DataSave_ValidData_CallsPersistenceManagerDataSave()
// {
// // Arrange
// MockPersistenceManager persistenceManager = new MockPersistenceManager();
// Manager manager = new Manager(persistenceManager);
// Customer customer = new Customer("Doe", "John", "123456");
// manager.AddCustomer(customer);
// // Act
// manager.DataSave();
// // Assert
// Assert.True(persistenceManager.DataSaveCalled);
// Assert.Equal(manager.CustomersList, persistenceManager.SavedCustomersList);
// Assert.Equal(manager.Consultant, persistenceManager.SavedConsultant);
// }
// /// <summary>
// /// Teste le chargement des données.
// /// </summary>
// [Fact]
// public void DataLoad_ValidData_CallsPersistenceManagerDataLoad()
// {
// // Arrange
// MockPersistenceManager persistenceManager = new MockPersistenceManager();
// Manager manager = new Manager(persistenceManager);
// Customer customer = new Customer("Doe", "John", "123456");
// Consultant consultant = new Consultant("Smith", "Jane", "abcdef");
// persistenceManager.DataToLoad = (new List<Customer> { customer }, consultant);
// // Act
// manager.DataLoad();
// // Assert
// Assert.True(persistenceManager.DataLoadCalled);
// Assert.Contains(customer, manager.CustomersList);
// Assert.Equal(consultant, manager.Consultant);
// }
// /// <summary>
// /// Classe de mock pour le gestionnaire de persistance.
// /// </summary>
// private class MockPersistenceManager : IPersistenceManager
// {
// public bool DataSaveCalled { get; private set; }
// public bool DataLoadCalled { get; private set; }
// public (List<Customer>, Consultant) DataToLoad { get; set; }
// public List<Customer>? SavedCustomersList { get; private set; }
// public Consultant? SavedConsultant { get; private set; }
// public void DataSave(List<Customer> customersList, Consultant consultant)
// {
// DataSaveCalled = true;
// SavedCustomersList = customersList;
// SavedConsultant = consultant;
// }
// public (List<Customer>, Consultant) DataLoad()
// {
// DataLoadCalled = true;
// return DataToLoad;
// }
// }
// }
//}

@ -22,7 +22,7 @@ namespace UnitTest
Account account = new Account(1000, "John Doe", "FR123456789");
// Création d'une transaction
Transaction transaction = new Transaction(true, 200, account, 1, DateTime.Now);
Transaction transaction = new Transaction(true, 200, account, DateTime.Now);
// Affichage des informations de la transaction
Console.WriteLine("Transaction:");

Loading…
Cancel
Save