From c945890625ce2dc2fc8cf9cc8d56e3c490ddc11c Mon Sep 17 00:00:00 2001 From: Valentin VERDIER Date: Sat, 5 Dec 2020 18:47:13 +0100 Subject: [PATCH] Restructuration de la fonction d'envoi de SMS --- App.config | 64 +++++------ Hermes.csproj | 20 +++- MainWindow.xaml.cs | 16 ++- ...gner.cs => 202012051414539_V1.Designer.cs} | 2 +- ...2032233531_V1.cs => 202012051414539_V1.cs} | 0 ...233531_V1.resx => 202012051414539_V1.resx} | 2 +- PreferencesModal.xaml | 2 +- SmsSendingStatus.cs | 49 ++++++++ SmsWindow.xaml | 28 ++++- SmsWindow.xaml.cs | 108 +++++++++++++++++- packages.config | 3 + 11 files changed, 241 insertions(+), 53 deletions(-) rename Migrations/{202012032233531_V1.Designer.cs => 202012051414539_V1.Designer.cs} (93%) rename Migrations/{202012032233531_V1.cs => 202012051414539_V1.cs} (100%) rename Migrations/{202012032233531_V1.resx => 202012051414539_V1.resx} (74%) create mode 100644 SmsSendingStatus.cs diff --git a/App.config b/App.config index ba49194..60cdb85 100644 --- a/App.config +++ b/App.config @@ -2,77 +2,77 @@ -
+
- + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + - - + + \ No newline at end of file diff --git a/Hermes.csproj b/Hermes.csproj index 04fce3f..398884d 100644 --- a/Hermes.csproj +++ b/Hermes.csproj @@ -65,6 +65,9 @@ packages\EntityFramework.SqlServerCompact.6.4.4\lib\net45\EntityFramework.SqlServerCompact.dll + + packages\iSendProSMS.1.1.3\lib\isendpro.dll + packages\Microsoft.Office.Interop.Outlook.15.0.4797.1003\lib\net20\Microsoft.Office.Interop.Outlook.dll True @@ -73,6 +76,12 @@ packages\Microsoft.Office.Interop.Word.15.0.4797.1003\lib\net20\Microsoft.Office.Interop.Word.dll True + + packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + + packages\RestSharp.Net2.1.1.11\lib\net20\RestSharp.Net2.dll + @@ -101,9 +110,9 @@ Designer - - - 202012032233531_V1.cs + + + 202012051414539_V1.cs @@ -112,6 +121,7 @@ PreferencesModal.xaml + SmsWindow.xaml @@ -159,8 +169,8 @@ Settings.settings True - - 202012032233531_V1.cs + + 202012051414539_V1.cs ResXFileCodeGenerator diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 94827cb..014764e 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -75,15 +75,23 @@ namespace Hermes { MessageBoxResult result = MessageBox.Show("Voulez-vous envoyer un SMS à ces citoyens ?", "Envoi de SMS", MessageBoxButton.YesNo, MessageBoxImage.Question); if(result == MessageBoxResult.Yes) { bool noTel = false; + List rcps = new List(); foreach(Citoyen citoyen in dgCitoyens.SelectedItems) { - if(String.IsNullOrWhiteSpace(citoyen.TelPort)) { + if(!String.IsNullOrWhiteSpace(citoyen.TelPort)) { + rcps.Add(citoyen); + } else { noTel = true; } } - if(noTel) { - MessageBox.Show("Certains des citoyens sélectionnés ne disposent pas d'un numéro de mobile", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Exclamation); + if(rcps.Count > 0) { + if(noTel) { + MessageBox.Show("Certains des citoyens sélectionnés ne disposent pas d'un numéro de mobile", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Exclamation); + } + smsModal.LoadCitoyens(rcps); + smsModal.ShowDialog(); + } else { + MessageBox.Show("Aucun des citoyens sélectionnés ne disposent d'un numéro de mobile", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Exclamation); } - smsModal.ShowDialog(); } } else { MessageBox.Show("Aucun citoyen sélectionné", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Exclamation); diff --git a/Migrations/202012032233531_V1.Designer.cs b/Migrations/202012051414539_V1.Designer.cs similarity index 93% rename from Migrations/202012032233531_V1.Designer.cs rename to Migrations/202012051414539_V1.Designer.cs index 2b8aa75..27f9010 100644 --- a/Migrations/202012032233531_V1.Designer.cs +++ b/Migrations/202012051414539_V1.Designer.cs @@ -13,7 +13,7 @@ namespace Hermes.Migrations string IMigrationMetadata.Id { - get { return "202012032233531_V1"; } + get { return "202012051414539_V1"; } } string IMigrationMetadata.Source diff --git a/Migrations/202012032233531_V1.cs b/Migrations/202012051414539_V1.cs similarity index 100% rename from Migrations/202012032233531_V1.cs rename to Migrations/202012051414539_V1.cs diff --git a/Migrations/202012032233531_V1.resx b/Migrations/202012051414539_V1.resx similarity index 74% rename from Migrations/202012032233531_V1.resx rename to Migrations/202012051414539_V1.resx index 780c8ea..37d41fc 100644 --- a/Migrations/202012032233531_V1.resx +++ b/Migrations/202012051414539_V1.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/PreferencesModal.xaml b/PreferencesModal.xaml index 2ac7c4e..9c52eff 100644 --- a/PreferencesModal.xaml +++ b/PreferencesModal.xaml @@ -26,7 +26,7 @@ - + diff --git a/SmsSendingStatus.cs b/SmsSendingStatus.cs new file mode 100644 index 0000000..e6076ca --- /dev/null +++ b/SmsSendingStatus.cs @@ -0,0 +1,49 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace Hermes { + class SmsSendingStatus : INotifyPropertyChanged { + private string _nom = null; + private string _prenom = null; + private string _mobile = null; + private string _status = null; + + public string Nom { + get => _nom; + set { + _nom = value; + OnPropertyChanged(); + } + } + + public string Prenom { + get => _prenom; + set { + _prenom = value; + OnPropertyChanged(); + } + } + + public string Mobile { + get => _mobile; + set { + _mobile = value; + OnPropertyChanged(); + } + } + + public string Status { + get => _status; + set { + _status = value; + OnPropertyChanged(); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName] string name = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + } + } +} diff --git a/SmsWindow.xaml b/SmsWindow.xaml index f06b7e7..a84e1f1 100644 --- a/SmsWindow.xaml +++ b/SmsWindow.xaml @@ -6,18 +6,34 @@ xmlns:local="clr-namespace:Hermes" mc:Ignorable="d" ResizeMode="NoResize" - Title="Envoi de SMS" Height="370" Width="500" + Title="Envoi de SMS" Height="490" Width="700" WindowStartupLocation="CenterOwner" + Loaded="Window_Loaded" Closing="Window_Closing"> - + + + + - - - - + + + + + + + + + + + + + + + + diff --git a/SmsWindow.xaml.cs b/SmsWindow.xaml.cs index 61a93e1..3170963 100644 --- a/SmsWindow.xaml.cs +++ b/SmsWindow.xaml.cs @@ -1,19 +1,121 @@ -using System.Windows; - +using Hermes.Model; +using IO.Swagger.Api; +using IO.Swagger.Client; +using IO.Swagger.Model; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Windows; +using System.Windows.Documents; namespace Hermes { public partial class SmsWindow : Window { + private ObservableCollection status = new ObservableCollection(); + private ModelContext dbContext = null; + private ApiClient apiClient = new ApiClient(); + private SmsApi smsApi = null; + private bool sending = false; + public SmsWindow() { + dbContext = ModelContext.Getinstance(); + smsApi = new SmsApi(apiClient); InitializeComponent(); } + private void Window_Loaded(object sender, RoutedEventArgs e) { + lvLog.ItemsSource = status; + } + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; + if(sending) { + return; + } + messageTextBox.Document.Blocks.Clear(); + status.Clear(); this.Hide(); } + public void LoadCitoyens(List citoyens) { + foreach(Citoyen citoyen in citoyens) { + SmsSendingStatus s = new SmsSendingStatus(); + s.Nom = citoyen.Nom; + s.Prenom = citoyen.Prenom; + s.Mobile = citoyen.TelPort.Replace(" ", ""); + s.Status = "En attente"; + status.Add(s); + } + } + public void Envoyer_Click(object sender, RoutedEventArgs e) { - MessageBox.Show("Erreur lors de la tentative d'envoi : Clé IsendPro invalide", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Error); + bool error = false; + string message = new TextRange(messageTextBox.Document.ContentStart, messageTextBox.Document.ContentEnd).Text; + string apiKey = dbContext.Preferences.Local[0].SmsApiKey; + + if(String.IsNullOrWhiteSpace(apiKey)) { + MessageBox.Show("Erreur lors de la tentative d'envoi : Clé ISendPro invalide", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if(String.IsNullOrWhiteSpace(message)) { + MessageBox.Show("Votre message est vide.", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + envoyerButton.IsEnabled = false; + annulerButton.IsEnabled = false; + messageTextBox.IsEnabled = false; + sending = true; + + foreach(SmsSendingStatus stat in status) { + if(!stat.Status.Equals("Envoyé")) { + SmsUniqueRequest req = new SmsUniqueRequest(); + req.Keyid = apiKey; + req.Sms = message; + req.Smslong = "999"; + req.Num = stat.Mobile; + try { + SMSReponse resp = smsApi.SendSms(req); + if(resp != null && resp.Etat != null && resp.Etat.Etat != null && resp.Etat.Etat.Count > 0) { + SMSReponseEtatEtat eta = resp.Etat.Etat[0]; + if(eta.Code != null && eta.Code == 0 && eta.Tel != null) { + stat.Status = "Envoyé"; + } else { + error = true; + stat.Status = eta.Message; + } + } else { + error = true; + stat.Status = "Erreur technique"; + } + } catch(ApiException ex) { + error = true; + SMSReponse resp = JsonConvert.DeserializeObject((String) ex.ErrorContent); + if(resp != null && resp.Etat != null && resp.Etat.Etat != null && resp.Etat.Etat.Count > 0) { + SMSReponseEtatEtat eta = resp.Etat.Etat[0]; + if(eta.Code != null && eta.Code == 0 && eta.Tel != null) { + stat.Status = "Envoyé"; + } else { + error = true; + stat.Status = eta.Message; + } + } else { + error = true; + stat.Status = "Erreur technique"; + } + } + } + } + + envoyerButton.IsEnabled = true; + annulerButton.IsEnabled = true; + messageTextBox.IsEnabled = true; + sending = false; + + if(error) { + MessageBox.Show("Plusieurs envois se sont mal déroulés. Vérifiez la validité des numéros de téléphone.", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Error); + } } public void Annuler_Click(object sender, RoutedEventArgs e) { diff --git a/packages.config b/packages.config index 50e7a5e..70648e9 100644 --- a/packages.config +++ b/packages.config @@ -2,7 +2,10 @@ + + + \ No newline at end of file