/// \file
/// \brief Définition de la classe Account.
/// \author Votre nom
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading.Tasks;
namespace Model
{
///
/// Représente un compte bancaire.
///
[DataContract]
public class Account : INotifyPropertyChanged
{
///
/// Événement déclenché lorsqu'une propriété est modifiée.
///
public event PropertyChangedEventHandler? PropertyChanged;
///
/// Déclenche l'événement PropertyChanged pour une propriété donnée.
///
/// Nom de la propriété modifiée.
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
///
/// Obtient ou définit le solde du compte.
///
[DataMember(Order = 3)]
public double Balance
{
get => balance;
set
{
if (balance == value)
return;
balance = value;
OnPropertyChanged(nameof(Balance));
}
}
[DataMember]
private double balance;
///
/// Obtient ou définit le nom du titulaire du compte.
///
[DataMember(Order = 1)]
public string Name
{
get => name;
set
{
if (name == value)
return;
name = value;
OnPropertyChanged(nameof(Name));
}
}
[DataMember]
private string name;
///
/// Obtient ou définit le numéro IBAN du compte.
///
[DataMember(Order = 2)]
public string IBAN
{
get => iban;
set
{
if (iban == value)
return;
iban = value;
OnPropertyChanged(nameof(IBAN));
}
}
[DataMember]
private string iban;
///
/// Obtient une version masquée du numéro IBAN du compte.
///
[DataMember(Order = 4)]
public string IBANHide
{
get => ibanHide;
set
{
if (ibanHide == value)
return;
ibanHide = value;
OnPropertyChanged(nameof(IBANHide));
}
}
[DataMember]
private string ibanHide;
///
/// Obtient ou définit la liste des transactions effectuées sur le compte.
///
[DataMember(Order = 5)]
public List TransactionsList { get; set; } = new List();
///
/// Effectue une transaction entre le compte courant et un compte tiers.
///
/// Compte tiers impliqué dans la transaction.
/// Somme de la transaction.
/// Type de transaction (débit ou crédit).
/// Numéro de la transaction.
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
{
Transaction transaction = new Transaction(type, sum, involvedAccount, nb, DateTime.Now);
TransactionsList.Add(transaction);
Balance = Balance - sum;
involvedAccount.DoTransactions(this, sum, !type, nb + 1);
}
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));
Balance = Balance + sum;
}
}
///
/// Constructeur de la classe Account.
///
/// Solde initial du compte.
/// Nom du titulaire du compte.
/// Numéro IBAN du compte.
public Account(Double balance, string name, string iban)
{
Balance = balance;
Name = name;
IBAN = iban;
IBANHide = IBANToString();
}
///
/// Demande d'aide pour un compte.
///
/// Sujet de la demande d'aide.
/// Description de la demande d'aide.
/// Un message d'aide.
public static Message AskForHelp(string subject, string description)
{
Debug.WriteLine(subject);
Debug.WriteLine(description);
Debug.WriteLine("Help button pressed !");
Message message = new Message(subject, description);
return message;
}
///
/// Convertit le numéro IBAN en une version masquée.
///
/// Le numéro IBAN masqué.
public string IBANToString()
{
char[] res = IBAN.ToCharArray();
for (int i = 5; i < IBAN.Length - 4; i++)
{
if (res[i] == ' ')
continue;
res[i] = '*';
}
return new string(res);
}
///
/// Vérifie si deux comptes sont égaux en comparant leur numéro IBAN.
///
/// Compte à comparer.
/// True si les comptes sont égaux, False sinon.
public bool Equals(Account other)
{
if (other == null) return false;
else return other.IBAN.Equals(IBAN);
}
///
/// Obtient le code de hachage du compte basé sur le numéro IBAN.
///
/// Le code de hachage.
public override int GetHashCode()
{
return IBAN.GetHashCode();
}
}
}