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(); 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;
using Banquale.Views.Category; using Banquale.Views.Category;
using Banquale.Views.Transfer; using Banquale.Views.Transfer;
using Model;
namespace Banquale; namespace Banquale;
public partial class AppShell : Shell public partial class AppShell : Shell
{ {
public AppShell()
public Manager Mgr => (App.Current as App).MyManager;
public AppShell()
{ {
InitializeComponent(); 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) --> <!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" /> <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\accounts.svg" />
<MauiImage Include="Resources\Images\sources\dotnet_bot.svg" /> <MauiImage Include="Resources\Images\sources\dotnet_bot.svg" />
<MauiImage Include="Resources\Images\sources\help.svg" /> <MauiImage Include="Resources\Images\sources\help.svg" />

@ -11,6 +11,9 @@ 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
// les références, nous sommes pourtant obligé d'utiliser des références pour la sauvegarde des transactions
public class DataContractPersJSON : IPersistenceManager public class DataContractPersJSON : IPersistenceManager
{ {
@ -18,7 +21,7 @@ namespace Banquale.DataContractPersistance
public string FileName { get; set; } = "DataSave.json"; public string FileName { get; set; } = "DataSave.json";
public (List<Customer>, Consultant) DataLoad() public (HashSet<Customer>, Consultant) DataLoad()
{ {
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist)); 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(); 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 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 FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.xml"; public string FileName { get; set; } = "DataSave.xml";
public (List<Customer>, Consultant) DataLoad() public (HashSet<Customer>, Consultant) DataLoad()
{ {
var serializer = new DataContractSerializer(typeof(DataToPersist)); 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 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); 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 }); 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
@ -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 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; } public Consultant consultant { get; set; }
} }
} }

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

@ -3,8 +3,15 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Banquale.Views.Balance.BalancePage" x:Class="Banquale.Views.Balance.BalancePage"
xmlns:local="clr-namespace:Banquale.Views.Balance" 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"> <Grid RowDefinitions="auto, auto, *" x:Name="Grid">
<Frame BackgroundColor="{StaticResource Key=Banquale}" <Frame BackgroundColor="{StaticResource Key=Banquale}"
@ -22,12 +29,6 @@
RowDefinitions="auto, 35, *" RowDefinitions="auto, 35, *"
ColumnDefinitions="250, auto"> ColumnDefinitions="250, auto">
<Grid.GestureRecognizers>
<TapGestureRecognizer
Tapped="Balance_Clicked"
NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
<Label <Label
Text="Compte Professionnel" Text="Compte Professionnel"
HorizontalOptions="Center" HorizontalOptions="Center"
@ -68,12 +69,55 @@
Color="{StaticResource Key=Gray100}" Color="{StaticResource Key=Gray100}"
Grid.Row="1" Grid.Row="1"
HeightRequest="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}" </ListView>
x:Name="idLabel" />
<local:BalanceView </VerticalStackLayout>
Grid.Row="2"/>
</Grid> </Grid>
</ContentPage> </ContentPage>

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

@ -23,27 +23,12 @@ public partial class BalanceView : ContentView
Mgr.SelectedTransaction = selectedItem; Mgr.SelectedTransaction = selectedItem;
await Navigation.PushModalAsync(new TransactionsPage()); await Navigation.PushModalAsync(new TransactionsPage());
} }
}
//if (string.IsNullOrWhiteSpace(idLabel.Text)) public void RefreshView()
//{ {
// //await DisplayAlert("Erreur", "Aucune transaction présente", "OK"); BindingContext = Mgr.SelectedAccount;
// 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());
} }
} }

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

@ -13,19 +13,6 @@ public partial class ConsultantIdPage : ContentPage
InitializeComponent(); 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) public async void Connection_Clicked(Object sender, EventArgs e)
{ {
uint currentId = Convert.ToUInt32(ident.Text); 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 <Label
Text="Informations du client" Text="Informations du client"
FontSize="Title" FontSize="30"
HorizontalOptions="Center" HorizontalOptions="Center"
Margin="0,20,0,15" Margin="0,20,0,15"
TextColor="Red"/> TextColor="Red"/>
@ -22,7 +22,7 @@
<Label <Label
Text="Nom" Text="Nom"
FontSize="Subtitle" FontSize="16"
Grid.Column="0" Grid.Column="0"
Grid.Row="0"/> Grid.Row="0"/>
<Entry <Entry
@ -33,7 +33,7 @@
<Label <Label
Text="Prénom" Text="Prénom"
FontSize="Subtitle" FontSize="16"
Grid.Column="1" Grid.Column="1"
Grid.Row="0"/> Grid.Row="0"/>
<Entry <Entry
@ -46,14 +46,15 @@
<Label <Label
Text="Mot de Passe" Text="Mot de Passe"
FontSize="Subtitle" /> FontSize="16" />
<Entry <Entry
x:Name="PasswordEntry" x:Name="PasswordEntry"
Placeholder="Entrez le mot de passe" /> Placeholder="Entrez le mot de passe"
IsPassword="True"/>
<Label <Label
Text="Compte 1" Text="Compte 1"
FontSize="Title" FontSize="25"
Margin="0, 10, 0, 10" Margin="0, 10, 0, 10"
TextColor="DarkRed"/> TextColor="DarkRed"/>
@ -63,7 +64,7 @@
<Label <Label
Text="Solde" Text="Solde"
FontSize="Subtitle" FontSize="16"
Grid.Column="0" Grid.Column="0"
Grid.Row="0"/> Grid.Row="0"/>
<Entry <Entry
@ -75,7 +76,7 @@
<Label <Label
Text="Nom du compte" Text="Nom du compte"
FontSize="Subtitle" FontSize="16"
Grid.Column="1" Grid.Column="1"
Grid.Row="0"/> Grid.Row="0"/>
<Entry <Entry
@ -88,17 +89,17 @@
<Label <Label
Text="IBAN" Text="IBAN"
FontSize="Subtitle" /> FontSize="16" />
<Entry <Entry
Text="FR " Text="FR"
CursorPosition="2"
x:Name="AccountIbanEntry" x:Name="AccountIbanEntry"
TextChanged="IbanChanged"
Placeholder="Entrez l'IBAN du compte" Placeholder="Entrez l'IBAN du compte"
Keyboard="Telephone"/> Keyboard="Numeric"/>
</StackLayout> </StackLayout>
<Button <Button
Text="Ajouter un compte" Text="Ajouter un compte"
HorizontalOptions="Center" HorizontalOptions="Center"

@ -8,14 +8,29 @@ public partial class CreateCustomerPage : ContentPage
int nbAccount = 1; 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() public CreateCustomerPage()
{ {
InitializeComponent(); 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 firstName = FirstNameEntry.Text;
string password = PasswordEntry.Text; string password = PasswordEntry.Text;
string accountName = AccountNameEntry.Text; string accountName = AccountNameEntry.Text;
@ -24,35 +39,50 @@ public partial class CreateCustomerPage : ContentPage
if(string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(password) if(string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(password)
|| double.IsNegative(accountBalance) || string.IsNullOrWhiteSpace(accountName) || 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 else
{ {
Customer customer = new Customer(name, firstName, password); Customer customer = new Customer(name, firstName, password);
Account account = new Account(accountBalance, accountName, accountIban); Account account1 = new Account(accountBalance, accountName, accountIban);
customer.AccountsList.Add(account); 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); Mgr.CustomersList.Add(customer);
Debug.WriteLine(customer.Id); Debug.WriteLine(customer.Id);
Debug.WriteLine(customer.Password); Debug.WriteLine(customer.Password);
Debug.WriteLine(account.IBAN); Debug.WriteLine(account1.IBAN);
DisplayAlert("Création", "Client " + customer.Name +" crée avec succès.", "OK"); Debug.WriteLine(customer.AccountsList[0].Balance);
Shell.Current.Navigation.PopAsync(); 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) public void Account_Clicked(object sender, EventArgs e)
{ {
Account2 = true;
nbAccount++; 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; return;
} }
Label account = new Label { Text = "Compte " + Convert.ToString(nbAccount)}; account.Text = "Compte " + Convert.ToString(nbAccount);
account.FontSize = 20; account.FontSize = 25;
Grid gridAccount = new Grid(); account.TextColor = Colors.DarkRed;
ColumnDefinition col1 = new ColumnDefinition(GridLength.Star); ColumnDefinition col1 = new ColumnDefinition(GridLength.Star);
ColumnDefinition col2 = new ColumnDefinition(GridLength.Star); ColumnDefinition col2 = new ColumnDefinition(GridLength.Star);
RowDefinition row1 = new RowDefinition(GridLength.Auto); RowDefinition row1 = new RowDefinition(GridLength.Auto);
@ -61,13 +91,18 @@ public partial class CreateCustomerPage : ContentPage
gridAccount.RowDefinitions.Add(row2); gridAccount.RowDefinitions.Add(row2);
gridAccount.ColumnDefinitions.Add(col1); gridAccount.ColumnDefinitions.Add(col1);
gridAccount.ColumnDefinitions.Add(col2); gridAccount.ColumnDefinitions.Add(col2);
Label balance = new Label { Text = "Solde" }; balance.Text = "Solde";
balance.FontSize = 12; balance.FontSize = 16;
Entry balanceEntry = new Entry { Placeholder = "Entrez le solde du compte" }; balanceEntry.Placeholder = "Entrez le solde du compte";
Label nameLabel = new Label { Text = "Nom du compte" }; balanceEntry.Keyboard = Keyboard.Numeric;
Entry nameEntry = new Entry { Placeholder = "Entrez le nom du compte" }; nameLabel.Text = "Nom du compte";
Label iban = new Label { Text = "IBAN" }; nameLabel.FontSize = 16;
Entry ibanEntry = new Entry { Placeholder = "Entrez l'IBAN du compte" }; 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); StackLayout.Add(account);
gridAccount.SetColumn(balance, 0); gridAccount.SetColumn(balance, 0);
gridAccount.SetRow(balance, 0); gridAccount.SetRow(balance, 0);
@ -82,12 +117,18 @@ public partial class CreateCustomerPage : ContentPage
gridAccount.Children.Add(nameLabel); gridAccount.Children.Add(nameLabel);
gridAccount.Children.Add(nameEntry); gridAccount.Children.Add(nameEntry);
StackLayout.Add(gridAccount); StackLayout.Add(gridAccount);
//StackLayout.Add(balance);
// StackLayout.Add(balanceEntry);
//StackLayout.Add(nameLabel);
//StackLayout.Add(nameEntry);
StackLayout.Add(iban); StackLayout.Add(iban);
StackLayout.Add(ibanEntry); 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"> Padding="15, 5, 15, 5">
<Editor Placeholder="Decrivez votre demande ici." <Editor Placeholder="Decrivez votre demande ici."
x:Name="Message"/> x:Name="Description"/>
</Frame> </Frame>

@ -11,9 +11,17 @@ public partial class HelpPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e) public async void Send_Clicked(Object sender, EventArgs e)
{ {
Message message = Account.AskForHelp(Subject.Text, Message.Text); if(Subject.Text.Length >= 50 || Description.Text.Length >= 200)
Mgr.Consultant.MessagesList.Add(message); {
await Shell.Current.GoToAsync("//balance"); 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> <VerticalStackLayout>
<!--<Label <ListView ItemsSource="{Binding Consultant.MessagesList}"
Text="rzklpkrz,e" SelectionMode="None"
Grid.Column="1" RowHeight="100">
VerticalOptions="Center"
Margin="10, 0, 0, 0"
BackgroundColor="Red"/>-->
<!--<Label Text="{Binding CustomersList[0].Name}" />--> <ListView.ItemTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding MessagesList}" <ViewCell>
SelectionMode="None">
<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> </DataTemplate>

@ -11,7 +11,8 @@ public partial class MessageListPage : ContentPage
public MessageListPage() public MessageListPage()
{ {
Debug.WriteLine(Mgr.Consultant.MessagesList[0].Subject); Debug.WriteLine(Mgr.Consultant.MessagesList[0].Subject);
InitializeComponent(); BindingContext = Mgr;
BindingContext = Mgr.Consultant; 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" xmlns:local="clr-namespace:Banquale.Views"
x:Class="Banquale.Views.SwitchAccountPage" x:Class="Banquale.Views.SwitchAccountPage"
Title="SwitchAccountPage" Title="SwitchAccountPage"
Shell.NavBarIsVisible="False"> Shell.NavBarIsVisible="False"
Shell.TabBarIsVisible="False">
<VerticalStackLayout <VerticalStackLayout
@ -13,7 +14,8 @@
<ListView <ListView
ItemsSource="{Binding AccountsList}" ItemsSource="{Binding AccountsList}"
SelectionMode="None"> SelectionMode="None"
RowHeight="100">
<ListView.ItemTemplate> <ListView.ItemTemplate>
@ -22,7 +24,7 @@
<ViewCell> <ViewCell>
<VerticalStackLayout <VerticalStackLayout
HeightRequest="84" HeightRequest="100"
Margin="10"> Margin="10">
<Button <Button

@ -1,4 +1,5 @@
using System.Diagnostics; using System.Diagnostics;
using Banquale.Views.Balance;
using Model; using Model;
namespace Banquale.Views; namespace Banquale.Views;
@ -13,6 +14,13 @@ public partial class SwitchAccountPage : ContentPage
BindingContext = Mgr.SelectedCustomer; BindingContext = Mgr.SelectedCustomer;
} }
protected override void OnAppearing()
{
base.OnAppearing();
RefreshData();
}
public async void Transfer_Clicked(object sender, EventArgs e) public async void Transfer_Clicked(object sender, EventArgs e)
{ {
var selectedItem = (sender as Button)?.BindingContext as Account; var selectedItem = (sender as Button)?.BindingContext as Account;
@ -27,6 +35,8 @@ public partial class SwitchAccountPage : ContentPage
else else
{ {
await Shell.Current.GoToAsync("//balance"); 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) if(Mgr.IsConsultant == true)
{ {
//await Shell.Current.GoToAsync(; await Shell.Current.Navigation.PopAsync();
Debug.WriteLine("Hello");
} }
else 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" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Banquale.Views.TransactionsPage" x:Class="Banquale.Views.TransactionsPage"
xmlns:conv="clr-namespace:Banquale.Views.Converters"
Title="TransactionsPage"> 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="*, *, *"> <ContentPage.Resources>
<Label Grid.Column="1" <conv:Bool2ColorConverters x:Key="bool2ColorConverters"/>
Text="poiuytreza" </ContentPage.Resources>
HorizontalOptions="Center"/>
</Grid>
<Grid Grid.Row="5" ColumnDefinitions="*, 4*, *"> <VerticalStackLayout
<Button Grid.Column="1" Text="Categorie" FontSize="Medium" /> VerticalOptions="Center">
</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>
<Grid Grid.Row="9" ColumnDefinitions="*, 4*, *">
<Button Grid.Column="1" Text="Faire opposition"/>
</Grid>
</Grid>-->
<VerticalStackLayout VerticalOptions="Center">
<Label <Label
Text="{Binding Sum, StringFormat='{0} €'}" Text="{Binding Sum, StringFormat='{0} €'}"
HorizontalOptions="Center" HorizontalOptions="Center"
TextColor="{Binding Type, Converter={StaticResource bool2ColorConverters}}"
FontSize="Large" FontSize="Large"
Margin="0, 0, 0, 20"/> Margin="0, 0, 0, 20"
x:Name="sum"/>
<Button <Button
Grid.Column="1" Grid.Column="1"
@ -86,7 +63,15 @@
<Button <Button
Text="Faire opposition" Text="Faire opposition"
Margin="0, 50, 0, 0" 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> </VerticalStackLayout>

@ -5,13 +5,38 @@ namespace Banquale.Views;
public partial class TransactionsPage : ContentPage public partial class TransactionsPage : ContentPage
{ {
public Manager Mgr => (App.Current as App).MyManager; public Manager Mgr => (App.Current as App).MyManager;
public TransactionsPage() public TransactionsPage()
{ {
InitializeComponent(); InitializeComponent();
BindingContext = Mgr.SelectedTransaction; 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) 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"> Padding="3">
<Entry <Entry
Text="FR " Text="FR"
Placeholder="IBAN (FR)" Placeholder="IBAN (FR)"
HorizontalOptions="Center" HorizontalOptions="Center"
WidthRequest="280" WidthRequest="280"
TextChanged="IbanChanged"
x:Name="IBAN" x:Name="IBAN"
Keyboard="Numeric"/> Keyboard="Numeric"/>
@ -54,7 +55,8 @@
Margin="0, 75, 0, 0" Margin="0, 75, 0, 0"
MinimumHeightRequest="80" MinimumHeightRequest="80"
WidthRequest="300" WidthRequest="300"
MaximumWidthRequest="400"/> MaximumWidthRequest="400"
Clicked="Send_Clicked"/>
</VerticalStackLayout> </VerticalStackLayout>

@ -14,7 +14,49 @@ public partial class RequestPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e) 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" Placeholder="IBAN"
HorizontalOptions="Center" HorizontalOptions="Center"
WidthRequest="280" WidthRequest="280"
TextChanged="IbanChanged"
x:Name="IBAN" x:Name="IBAN"
Keyboard="Numeric"/> Keyboard="Numeric"/>

@ -5,6 +5,7 @@ namespace Banquale.Views.Transfer;
public partial class TransferPage : ContentPage public partial class TransferPage : ContentPage
{ {
public Manager Mgr => (App.Current as App).MyManager; public Manager Mgr => (App.Current as App).MyManager;
public TransferPage() public TransferPage()
{ {
InitializeComponent(); InitializeComponent();
@ -12,13 +13,16 @@ public partial class TransferPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e) 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)) if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{ {
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK"); await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
return; 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) if(Name.Text == Mgr.SelectedAccount.Name && IBAN.Text == Mgr.SelectedAccount.IBAN)
{ {
await DisplayAlert("Erreur", "Vous ne pouvez vous faire de virement à vous même", "OK"); await DisplayAlert("Erreur", "Vous ne pouvez 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"); await DisplayAlert("Erreur", "Vous ne possèdez pas assez d'argent sur ce compte pour aboutir à la transaction", "OK");
return; 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(); await Shell.Current.Navigation.PopAsync();
return; return;
} }
@ -44,4 +49,13 @@ public partial class TransferPage : ContentPage
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)
{
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="involvedAccount">Compte tiers impliqué dans la transaction.</param>
/// <param name="sum">Somme de 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="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)
public void DoTransactions(Account involvedAccount, double sum, bool type, int nb)
{ {
if (type) // si le type est True => c'est un débit, on doit donc ajouter la transaction pour l'autre compte 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); Transaction transaction = new Transaction(type, sum, involvedAccount, DateTime.Now);
TransactionsList.Add(transaction); TransactionsList.Insert(0, transaction);
Balance = Balance - sum; 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 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; Balance = Balance + sum;
} }
} }

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

@ -15,14 +15,14 @@ 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 la liste des clients et le consultant.</returns> /// <returns>Un tuple contenant lle hashSet des clients et le consultant.</returns>
(List<Customer>, Consultant) DataLoad(); public (HashSet<Customer>, Consultant) DataLoad();
/// <summary> /// <summary>
/// Enregistre les données dans une source de persistance. /// Enregistre les données dans une source de persistance.
/// </summary> /// </summary>
/// <param name="cu">La liste des clients à enregistrer.</param> /// <param name="cu">La liste des clients à enregistrer.</param>
/// <param name="co">Le consultant à 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. /// Liste des clients gérés par le gestionnaire.
/// </summary> /// </summary>
[DataMember] [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)"}; 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é. /// Constructeur du gestionnaire avec un gestionnaire de persistance spécifié.
/// </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 List<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.
/// </summary> /// </summary>
public Manager() public Manager()
{ {
CustomersList = new List<Customer>(); CustomersList = new HashSet<Customer>();
} }
/// <summary> /// <summary>
@ -126,16 +126,6 @@ namespace Model
return true; 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> /// <summary>
/// Enregistre les données dans la source de persistance. /// Enregistre les données dans la source de persistance.
/// </summary> /// </summary>
@ -148,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.AddRange(data.Item1); CustomersList =data.Item1;
Consultant = data.Item2; Consultant = data.Item2;
} }

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

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

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

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

@ -22,7 +22,7 @@ namespace UnitTest
Account account = new Account(1000, "John Doe", "FR123456789"); Account account = new Account(1000, "John Doe", "FR123456789");
// Création d'une transaction // 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 // Affichage des informations de la transaction
Console.WriteLine("Transaction:"); Console.WriteLine("Transaction:");

Loading…
Cancel
Save