From f4aac126ebdf9515ed4c53a809457afc37c2c4d6 Mon Sep 17 00:00:00 2001 From: Valentin VERDIER Date: Mon, 28 Dec 2020 00:24:12 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9=C3=A9criture=20de=20l'envoi=20de=20SMS?= =?UTF-8?q?=20(OVH)=20+=20Ajout=20d'une=20fonction=20d'import=20depuis=20d?= =?UTF-8?q?es=20fichiers=20Excel=20+=20Ajout=20d'une=20donn=C3=A9e=20pour?= =?UTF-8?q?=20le=20num=C3=A9ro=20d'appartement.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CitoyenWindow.xaml | 22 +--- CitoyenWindow.xaml.cs | 3 - Hermes.csproj | 31 ++++- ImportWindow.xaml | 33 +++++ ImportWindow.xaml.cs | 151 ++++++++++++++++++++++ Installer/Installer.vdproj | 116 +---------------- MainWindow.xaml | 4 + MainWindow.xaml.cs | 42 +++++- Migrations/202012271642572_V2.Designer.cs | 29 +++++ Migrations/202012271642572_V2.cs | 18 +++ Migrations/202012271642572_V2.resx | 126 ++++++++++++++++++ Migrations/202012272059415_V3.Designer.cs | 29 +++++ Migrations/202012272059415_V3.cs | 26 ++++ Migrations/202012272059415_V3.resx | 126 ++++++++++++++++++ Migrations/Configuration.cs | 3 +- Model/Citoyen.cs | 9 ++ Model/Preferences.cs | 11 +- OVHQueryBody.cs | 28 ++++ OVHResponseBody.cs | 22 ++++ PreferencesWindow.xaml | 14 +- PreferencesWindow.xaml.cs | 16 ++- Properties/AssemblyInfo.cs | 4 +- SmsWindow.xaml.cs | 105 +++++++++------ packages.config | 3 +- 24 files changed, 778 insertions(+), 193 deletions(-) create mode 100644 ImportWindow.xaml create mode 100644 ImportWindow.xaml.cs create mode 100644 Migrations/202012271642572_V2.Designer.cs create mode 100644 Migrations/202012271642572_V2.cs create mode 100644 Migrations/202012271642572_V2.resx create mode 100644 Migrations/202012272059415_V3.Designer.cs create mode 100644 Migrations/202012272059415_V3.cs create mode 100644 Migrations/202012272059415_V3.resx create mode 100644 OVHQueryBody.cs create mode 100644 OVHResponseBody.cs diff --git a/CitoyenWindow.xaml b/CitoyenWindow.xaml index 660417f..2b5a2de 100644 --- a/CitoyenWindow.xaml +++ b/CitoyenWindow.xaml @@ -37,15 +37,7 @@ - - - - - - - - - + @@ -69,17 +61,11 @@ - - - - - - - - - + + + diff --git a/CitoyenWindow.xaml.cs b/CitoyenWindow.xaml.cs index e80c30e..3170e81 100644 --- a/CitoyenWindow.xaml.cs +++ b/CitoyenWindow.xaml.cs @@ -49,10 +49,7 @@ namespace Hermes { public void Save_Click(object sender, RoutedEventArgs e) { nomTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); - nomNaissanceTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); - prenomTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); ageTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); - adresseTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); if(_isInvalidElements.Count == 0) { ModelContext dbContext = ModelContext.Getinstance(); if(editRef == null) { diff --git a/Hermes.csproj b/Hermes.csproj index 67fe605..9fd4fec 100644 --- a/Hermes.csproj +++ b/Hermes.csproj @@ -65,8 +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.Excel.15.0.4795.1000\lib\net20\Microsoft.Office.Interop.Excel.dll + True packages\Microsoft.Office.Interop.Outlook.15.0.4797.1003\lib\net20\Microsoft.Office.Interop.Outlook.dll @@ -79,9 +80,6 @@ packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - packages\RestSharp.Net2.1.1.11\lib\net20\RestSharp.Net2.dll - @@ -110,6 +108,9 @@ Designer + + ImportWindow.xaml + InputWindow.xaml @@ -117,10 +118,20 @@ 202012051414539_V1.cs + + + 202012271642572_V2.cs + + + + 202012272059415_V3.cs + + + PreferencesWindow.xaml @@ -134,6 +145,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -179,6 +194,12 @@ 202012051414539_V1.cs + + 202012271642572_V2.cs + + + 202012272059415_V3.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/ImportWindow.xaml b/ImportWindow.xaml new file mode 100644 index 0000000..18cefef --- /dev/null +++ b/ImportWindow.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImportWindow.xaml.cs b/ImportWindow.xaml.cs new file mode 100644 index 0000000..2dabc5d --- /dev/null +++ b/ImportWindow.xaml.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Windows; +using Hermes.Model; +using Excel = Microsoft.Office.Interop.Excel; + +namespace Hermes { + public partial class ImportWindow : Window { + private bool importing = false; + private Excel.Application xlApp; + private Excel.Workbook xlWb; + private static Regex communeRgx = new Regex(@"(\d{5})(.*)"); + + private static string prepareValue(object value, bool notNull = false) { + if(value != null) { + return value.ToString().Trim(); + } + if(notNull) { + return ""; + } else { + return null; + } + } + + public ImportWindow(Window parent, string filepath) { + InitializeComponent(); + Owner = parent; + List sheets = new List(); + + adresseTextBox.Text = Path.GetFileNameWithoutExtension(filepath); + + xlApp = new Excel.Application(); + xlWb = xlApp.Workbooks.Open(filepath); + for(int i = 1; i <= xlWb.Sheets.Count; i++) { + Excel.Worksheet sheet = xlWb.Sheets.Item[i]; + sheets.Add(sheet.Name); + } + sheetComboBox.ItemsSource = sheets; + + if(sheets.Count == 0) { + importButton.IsEnabled = false; + } else { + sheetComboBox.SelectedIndex = 0; + } + } + + private void Importer_Click(object sender, RoutedEventArgs e) { + importing = true; + Excel.Worksheet sheet = xlWb.Sheets.Item[sheetComboBox.SelectedIndex + 1]; + string cell = prepareValue(sheet.Cells[1, "J"].Value); + bool complement = false; + string rue = adresseTextBox.Text == null ? "" : adresseTextBox.Text; + if(!string.IsNullOrEmpty(cell)) { + complement = true; + } + + for(int i = 2; string.IsNullOrEmpty(prepareValue(sheet.Cells[i, "A"].Value)) != true ; i++) { + Citoyen citoyen = new Citoyen(); + citoyen.Nom = prepareValue(sheet.Cells[i, "A"].Value); + citoyen.Prenom = prepareValue(sheet.Cells[i, "B"].Value); + if(complement) { + string num = prepareValue(sheet.Cells[i, "D"].Value); + if(residenceCheckBox.IsChecked == true) { + citoyen.Adresse = rue; + citoyen.AdresseNumeroBatiment = num; + } else { + citoyen.Adresse = $"{num} {rue}"; + } + citoyen.Mail = prepareValue(sheet.Cells[i, "E"].Value); + citoyen.Tel = prepareValue(sheet.Cells[i, "F"].Value); + if(citoyen.Tel != null) { + citoyen.Tel = citoyen.Tel.Replace(".", " "); + } + citoyen.TelPort = prepareValue(sheet.Cells[i, "G"].Value); + if(citoyen.TelPort != null) { + citoyen.TelPort = citoyen.TelPort.Replace(".", " "); + } + string res = prepareValue(sheet.Cells[i, "H"].Value, true); + if(res.ToLower().Equals("r.principale")) { + citoyen.TypeResidence = false; + } else { + citoyen.TypeResidence = true; + } + if(citoyen.TypeResidence == true) { + citoyen.AdresseExt = prepareValue(sheet.Cells[i, "I"].Value); + Match m = communeRgx.Match(prepareValue(sheet.Cells[i, "J"].Value, true)); + if(m.Success) { + citoyen.AdresseExtCP = m.Groups[1].Value.Trim(); + citoyen.AdresseExtVille = m.Groups[2].Value.Trim(); + } + } + } else { + string num = prepareValue(sheet.Cells[i, "C"].Value); + if(residenceCheckBox.IsChecked == true) { + citoyen.Adresse = rue; + citoyen.AdresseNumeroBatiment = num; + } else { + citoyen.Adresse = $"{num} {rue}"; + } + citoyen.Mail = prepareValue(sheet.Cells[i, "D"].Value); + citoyen.Tel = prepareValue(sheet.Cells[i, "E"].Value); + if(citoyen.Tel != null) { + citoyen.Tel = citoyen.Tel.Replace(".", " "); + } + citoyen.TelPort = prepareValue(sheet.Cells[i, "F"].Value); + if(citoyen.TelPort != null) { + citoyen.TelPort = citoyen.TelPort.Replace(".", " "); + } + string res = prepareValue(sheet.Cells[i, "G"].Value, true); + if(res.ToLower().Equals("r.principale")) { + citoyen.TypeResidence = false; + } else { + citoyen.TypeResidence = true; + } + if(citoyen.TypeResidence == true) { + citoyen.AdresseExt = prepareValue(sheet.Cells[i, "H"].Value); + Match m = communeRgx.Match(prepareValue(sheet.Cells[i, "I"].Value, true)); + if(m.Success) { + citoyen.AdresseExtCP = m.Groups[1].Value.Trim(); + citoyen.AdresseExtVille = m.Groups[2].Value.Trim(); + } + } + } + citoyen.AdresseBatiment = batimentTextBox.Text; + citoyen.Quartier = quartierTextBox.Text; + citoyen.DateCreation = DateTime.Now; + citoyen.DateModification = DateTime.Now; + ModelContext.Getinstance().CitoyenSet.Add(citoyen); + } + + ModelContext.Getinstance().SaveChanges(); + Marshal.FinalReleaseComObject(sheet); + importing = false; + } + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { + if(importing) { + e.Cancel = true; + return; + } + + xlWb.Close(); + Marshal.FinalReleaseComObject(xlWb); + xlApp.Quit(); + Marshal.FinalReleaseComObject(xlApp); + } + } +} diff --git a/Installer/Installer.vdproj b/Installer/Installer.vdproj index b28d986..ce49657 100644 --- a/Installer/Installer.vdproj +++ b/Installer/Installer.vdproj @@ -99,30 +99,12 @@ } "Entry" { - "MsmKey" = "8:_A0F83BCCDBA77804851DAAE18F54AC65" - "OwnerKey" = "8:_C4AD2B19587A5D3179211CF729B66A33" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_A0F83BCCDBA77804851DAAE18F54AC65" - "OwnerKey" = "8:_EDA497A114444E23814EEE023731C727" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_A3A39C8B97A947A09D3B1660AC88FF5E" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_C4AD2B19587A5D3179211CF729B66A33" - "OwnerKey" = "8:_EDA497A114444E23814EEE023731C727" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_C767BE5A43214C2C9E31CD47DB92AA96" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -166,37 +148,13 @@ "Entry" { "MsmKey" = "8:_F434633E0B073F068C7E19B9E5AB2EC4" - "OwnerKey" = "8:_C4AD2B19587A5D3179211CF729B66A33" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F434633E0B073F068C7E19B9E5AB2EC4" - "OwnerKey" = "8:_EDA497A114444E23814EEE023731C727" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F434633E0B073F068C7E19B9E5AB2EC4" - "OwnerKey" = "8:_A0F83BCCDBA77804851DAAE18F54AC65" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_EDA497A114444E23814EEE023731C727" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C4AD2B19587A5D3179211CF729B66A33" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_A0F83BCCDBA77804851DAAE18F54AC65" + "OwnerKey" = "8:_EDA497A114444E23814EEE023731C727" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -287,7 +245,7 @@ "InstallerBootstrapper" = "3:2" "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" { - "Enabled" = "11:TRUE" + "Enabled" = "11:FALSE" "PromptEnabled" = "11:TRUE" "PrerequisitesLocation" = "2:1" "Url" = "8:" @@ -603,37 +561,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A0F83BCCDBA77804851DAAE18F54AC65" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:RestSharp.Net2, Version=102.7.0.0, Culture=neutral, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_A0F83BCCDBA77804851DAAE18F54AC65" - { - "Name" = "8:RestSharp.Net2.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:RestSharp.Net2.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_358759A83B6F4CD5AEAA9CCDB02A52A0" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A3A39C8B97A947A09D3B1660AC88FF5E" { "SourcePath" = "8:..\\bin\\Release\\amd64\\sqlcecompact40.dll" @@ -654,37 +581,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4AD2B19587A5D3179211CF729B66A33" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:isendpro, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_C4AD2B19587A5D3179211CF729B66A33" - { - "Name" = "8:isendpro.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:isendpro.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_358759A83B6F4CD5AEAA9CCDB02A52A0" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C767BE5A43214C2C9E31CD47DB92AA96" { "SourcePath" = "8:..\\bin\\Release\\amd64\\sqlceqp40.dll" @@ -916,15 +812,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Hermes" - "ProductCode" = "8:{D2CA66FB-020C-41EF-BD0D-991FFC306669}" - "PackageCode" = "8:{89CBF16D-49D3-4DE5-9CEE-4CE55ADD05AE}" + "ProductCode" = "8:{47E0BBDE-B1C6-4BF8-8164-6E09BD69DBC8}" + "PackageCode" = "8:{AC7DFDAB-2DF2-41B7-9066-3253344EBC79}" "UpgradeCode" = "8:{A8FB75F3-57A5-4B7D-A0AE-9E87F69529B0}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:0.9.1" + "ProductVersion" = "8:1.0.0" "Manufacturer" = "8:Aztrom" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" @@ -1466,7 +1362,7 @@ { "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EDA497A114444E23814EEE023731C727" { - "SourcePath" = "8:..\\obj\\Debug\\Hermes.exe" + "SourcePath" = "8:..\\obj\\Release\\Hermes.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_358759A83B6F4CD5AEAA9CCDB02A52A0" diff --git a/MainWindow.xaml b/MainWindow.xaml index eb3ff44..5f1f493 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -20,11 +20,13 @@ + + @@ -41,6 +43,7 @@ + @@ -110,6 +113,7 @@ + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 32cb512..3722136 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -48,7 +48,7 @@ namespace Hermes { private void GroupEdit_Batiment(object sender, RoutedEventArgs e) { if(dgCitoyens.SelectedItems.Count == 0) { - MessageBox.Show("Aucun citoyen sélectionné.", "Édition groupée", MessageBoxButton.OK, MessageBoxImage.Exclamation); + MessageBox.Show("Aucun citoyen sélectionné.", "Édition multiple", MessageBoxButton.OK, MessageBoxImage.Exclamation); return; } @@ -64,7 +64,7 @@ namespace Hermes { private void GroupEdit_Quartier(object sender, RoutedEventArgs e) { if(dgCitoyens.SelectedItems.Count == 0) { - MessageBox.Show("Aucun citoyen sélectionné.", "Édition groupée", MessageBoxButton.OK, MessageBoxImage.Exclamation); + MessageBox.Show("Aucun citoyen sélectionné.", "Édition multiple", MessageBoxButton.OK, MessageBoxImage.Exclamation); return; } @@ -78,6 +78,22 @@ namespace Hermes { } } + private void GroupEdit_Adresse(object sender, RoutedEventArgs e) { + if(dgCitoyens.SelectedItems.Count == 0) { + MessageBox.Show("Aucun citoyen sélectionné.", "Édition multiple", MessageBoxButton.OK, MessageBoxImage.Exclamation); + return; + } + + InputWindow inputBox = new InputWindow("Associer une adresse :", "Entrez un numéro et un nom de rue :", this); + if(inputBox.ShowDialog() == true) { + foreach(Citoyen citoyen in dgCitoyens.SelectedItems) { + citoyen.Adresse = inputBox.InputText; + citoyen.DateModification = DateTime.Now; + } + dbContext.SaveChanges(); + } + } + private void Supprimer_Click(object sender, RoutedEventArgs e) { if(dgCitoyens.SelectedItems.Count > 0) { MessageBoxResult result = MessageBox.Show("Voulez-vous supprimer ces citoyens ?", "Suppression", MessageBoxButton.YesNo, MessageBoxImage.Question); @@ -165,7 +181,7 @@ namespace Hermes { MessageBoxResult result = MessageBox.Show("Voulez-vous réaliser une tâche de publipostage pour ces citoyens ?", "Publipostage", MessageBoxButton.YesNo, MessageBoxImage.Question); if(result == MessageBoxResult.Yes) { string csvPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "hermes_tmp_datasource.csv"); - string csvHeader = "\"Civilité\";\"Nom\";\"Nom de naissance\";\"Prénom\";\"Profession\";\"Type de résidence\";\"E-Mail\";\"Téléphone\";\"Mobile\";\"Quartier\";\"Bâtiment\";\"Adresse principale\";\"Code postal principal\";\"Ville principale\";\"Adresse secondaire\";\"Code postal secondaire\";\"Ville secondaire\""; + string csvHeader = "\"Civilité\";\"Nom\";\"Nom de naissance\";\"Prénom\";\"Profession\";\"Type de résidence\";\"E-Mail\";\"Téléphone\";\"Mobile\";\"Quartier\";\"Bâtiment\";\"Numéro appartement\";\"Adresse principale\";\"Code postal principal\";\"Ville principale\";\"Adresse secondaire\";\"Code postal secondaire\";\"Ville secondaire\""; StringBuilder sb = new StringBuilder(); sb.AppendLine(csvHeader); foreach(Citoyen citoyen in dgCitoyens.SelectedItems) { @@ -180,6 +196,7 @@ namespace Hermes { string telPort = citoyen.TelPort == null ? "" : citoyen.TelPort; string quartier = citoyen.Quartier == null ? "" : citoyen.Quartier; string batiment = citoyen.AdresseBatiment == null ? "" : citoyen.AdresseBatiment; + string numeroBatiment = citoyen.AdresseNumeroBatiment == null ? "" : citoyen.AdresseNumeroBatiment; string adressePrincipale = citoyen.AdressePrincipale == null ? "" : citoyen.AdressePrincipale; string cpPrincipal = citoyen.AdressePrincipaleCP == null ? "" : citoyen.AdressePrincipaleCP; string villePrincipale = citoyen.AdressePrincipaleVille == null ? "" : citoyen.AdressePrincipaleVille; @@ -187,7 +204,7 @@ namespace Hermes { string cpSecondaire = citoyen.AdresseSecondaireCP == null ? "" : citoyen.AdresseSecondaireCP; string villeSecondaire = citoyen.AdresseSecondaireVille == null ? "" : citoyen.AdresseSecondaireVille; - sb.AppendLine($"\"{civilite}\";\"{nom}\";\"{nomNaissance}\";\"{prenom}\";\"{profession}\";\"{typeResidence}\";\"{mail}\";\"{tel}\";\"{telPort}\";\"{quartier}\";\"{batiment}\";\"{adressePrincipale}\";\"{cpPrincipal}\";\"{villePrincipale}\";\"{adresseSecondaire}\";\"{cpSecondaire}\";\"{villeSecondaire}\""); + sb.AppendLine($"\"{civilite}\";\"{nom}\";\"{nomNaissance}\";\"{prenom}\";\"{profession}\";\"{typeResidence}\";\"{mail}\";\"{tel}\";\"{telPort}\";\"{quartier}\";\"{batiment}\";\"{numeroBatiment}\";\"{adressePrincipale}\";\"{cpPrincipal}\";\"{villePrincipale}\";\"{adresseSecondaire}\";\"{cpSecondaire}\";\"{villeSecondaire}\""); File.WriteAllText(csvPath, sb.ToString(), Encoding.GetEncoding("ISO-8859-1")); } @@ -207,6 +224,15 @@ namespace Hermes { } } + private void Importer_Click(object sender, RoutedEventArgs e) { + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Filter = "Classeur Excel|*.xls;*.xlsx;*.xlsm|Tous les ficiers|*.*"; + if(ofd.ShowDialog() == true) { + ImportWindow importWindow = new ImportWindow(this, ofd.FileName); + importWindow.ShowDialog(); + } + } + private void DgCitoyen_DoubleClick(object sender, MouseButtonEventArgs e) { if(dgCitoyens.SelectedItem != null) { CitoyenWindow citoyenWindow = new CitoyenWindow(this, (Citoyen) dgCitoyens.SelectedItem); @@ -275,10 +301,12 @@ namespace Hermes { } } - string addrBat = citoyen.AdresseBatiment == null ? "" : citoyen.AdresseBatiment; - string addr = $"{citoyen.Adresse} {addrBat}".ToLower(); if(!String.IsNullOrEmpty(adresseFilterTextBox.Text)) { - if(!addr.Contains(adresseFilterTextBox.Text.ToLower())) { + string addrNumBat = citoyen.AdresseNumeroBatiment == null ? "" : citoyen.AdresseNumeroBatiment; + string addrBat = citoyen.AdresseBatiment == null ? "" : citoyen.AdresseBatiment; + string addr = citoyen.Adresse == null ? "" : citoyen.Adresse; + string addrFull = $"{addr} {addrNumBat} {addrBat}".ToLower(); + if(!addrFull.Contains(adresseFilterTextBox.Text.ToLower())) { e.Accepted = false; return; } diff --git a/Migrations/202012271642572_V2.Designer.cs b/Migrations/202012271642572_V2.Designer.cs new file mode 100644 index 0000000..0da03ba --- /dev/null +++ b/Migrations/202012271642572_V2.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Hermes.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V2 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V2)); + + string IMigrationMetadata.Id + { + get { return "202012271642572_V2"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Migrations/202012271642572_V2.cs b/Migrations/202012271642572_V2.cs new file mode 100644 index 0000000..8c884eb --- /dev/null +++ b/Migrations/202012271642572_V2.cs @@ -0,0 +1,18 @@ +namespace Hermes.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class V2 : DbMigration + { + public override void Up() + { + AddColumn("dbo.Citoyens", "AdresseNumeroBatiment", c => c.String(maxLength: 4000)); + } + + public override void Down() + { + DropColumn("dbo.Citoyens", "AdresseNumeroBatiment"); + } + } +} diff --git a/Migrations/202012271642572_V2.resx b/Migrations/202012271642572_V2.resx new file mode 100644 index 0000000..1062b99 --- /dev/null +++ b/Migrations/202012271642572_V2.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1a3VLrNhC+70zfweNrThzgXPQwyTkDAVqmh59i4F6xN0FTWXYlmSHP1os+Ul+hK/9bNsEOjqfT6R1Zab9drVb7Z/7+86/Zt9eAWS8gJA353D6cTG0LuBf6lK/ndqxWn36yv3398YfZhR+8Wk/5vmO9Dzm5nNvPSkUnjiO9ZwiInATUE6EMV2rihYFD/NA5mk6/OIeHDiCEjViWNbuPuaIBJD/w5yLkHkQqJuw69IHJjI4rboJq3ZAAZEQ8mNu/gMC/J8lG2zpllKAOLrCVbRHOQ0UUanjyKMFVIuRrN0ICYQ+bCHDfijAJmeYn5fauh5ge6UM4JWMO5cVShUFPwMPjzCqOyb6Tbe3Cami3C7Sv2uhTJ7ab2wuqwg0gsinrZMGE3le37CTbf2Cl1IPi7qeTLxN0kwNrETMVC5hziJUg7MC6i5eMer/C5iH8Hficx4xVdUKtcK1GQNKdCCMQanMPq0zTK9+2nDqfYzIWbBWe9BBXXB0f2dYNCidLBsWVVw7sqlDAz8BBEAX+HVEKBNcYkBitId2QtaAvlFEFuUT0M3wstnVNXr8DX6vnuf15OsX3cUlfwc9JmRqPnOLjQi4lYnhP0k0YjCLkhlApCT7B/Uu7E8DHONU5Xm3jWJr4gGHnfSXDFUiZPMR9K6rx70FSdL5S0bMwZEB4ixtvB7smlI2gMowj5C4Uav+CfouJUBTE/iWd+gK9aoRHlgk6IzrH8hFsmAm8iQMQ4ehiL15HlbW4G1PaE2VsBJfRoXEhIKs+zHDZMwxpRqwi6Ip6uwDOnLJ62VrTYDJZgdCBU3auayo8/9c2DVmJt43h4CO5tRvI04iihYcWtd1HsZ9RhOIl5HlZu54mgg5VDU/FZiVzVpnJqh8qBXVB1Wt5JNhWqUbaBU2KQt/ZDlJ7PA2U2mrbwYsjlr2akzZreVPnvNHVza5JFOElVLq8jGK5aYu3+OT274CCFMPxZEsjVGhbSMJ3QtZgrKJo1PSSCqkwVpEl0V6w8IPGttqFvmHnXFTjzswwURo/Z9F/p2xtPZkJUBrwEs+kU29yPCg0Kbu/BmfSYhNGREvQWYQsDvhbgWsbd9kiVTFKanekpAWqgiSEXvyVNsAAqqx0R8w7mCpWTuuOYvQnVTBjqY9mZdtS166kd0czGpMqoLHUHTPtT6pQKaWHVmAAJIRe/GlbYWCkxO44ZddQBSqp3ZGKrqAKVBB745TVdwteudgb16ztW9DNLb1lJIV8C3BC3wVNVzLteHplF8SsbmkHzRb7RYGy6jaDQLnSD7Feepuo9dUm8swxkomZrpxGvjIKWjMDdsqP1YJj5wS5BaRDktzKvZ9EWdTbVYiC2BOnBaUPRqVWruJUyCM7S6PUNLcU0ouS0ygtZ1mZ9/5XhUbdl26xLTTSCyY6rPncjVQQTPSGifsHc0G8gFjA5LP+FpJvuyacYrJVaZtoJ2u1bxT/nu8FjpQ+6/bRYPROl+r88W4v23MsYQ7u+QsR3jMRLd1gidxzTj8kZmN+PRh4fQo/GGzr0N1HojKGPt10NIfwg+nZOnNfUvWheftw2sFeMKvT9MFwzeH5YMDGrHxoXHNGPTR++yR8aCmVwfceoMsx4B7Aa/O/QQOQOcVuiz8fmmJ3BNxpiv3fSLTGFHmw692P0zRmxDsi9xsJNweNnWa+2wa+acmKDroM8SipmtmibBjhA+PgNjlDzIubxfrMqf6j0Owcc/a6hND/NsTB02+zBM33XPFVmF80nrKqUb7FTOagCL5tcooZbUU8hcueLkD054InwmLcchEswb/it7GKYnWKkSxYslpfNHO2y0+G4nWdZ7eR/iWHOAKqSXV4uuVnMWV+ofdlS3h6A0L7ZRYKUCtX6ZCw3hRINyHvCJSZ7xwi4DqQPEAQMQSTt9wlL7CLbo8SvsOaeJu823ob5P2LqJt9dk7JWpBAZhglP/5EH/aD16//AK8jv/4vJwAA + + + dbo + + \ No newline at end of file diff --git a/Migrations/202012272059415_V3.Designer.cs b/Migrations/202012272059415_V3.Designer.cs new file mode 100644 index 0000000..65dcb91 --- /dev/null +++ b/Migrations/202012272059415_V3.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Hermes.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V3 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V3)); + + string IMigrationMetadata.Id + { + get { return "202012272059415_V3"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Migrations/202012272059415_V3.cs b/Migrations/202012272059415_V3.cs new file mode 100644 index 0000000..f5f695d --- /dev/null +++ b/Migrations/202012272059415_V3.cs @@ -0,0 +1,26 @@ +namespace Hermes.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class V3 : DbMigration + { + public override void Up() + { + AddColumn("dbo.Preferences", "ovhSmsServiceName", c => c.String(maxLength: 4000)); + AddColumn("dbo.Preferences", "ovhSmsApplicationName", c => c.String(maxLength: 4000)); + AddColumn("dbo.Preferences", "ovhSmsApplicationKey", c => c.String(maxLength: 4000)); + AddColumn("dbo.Preferences", "ovhSmsConsumerKey", c => c.String(maxLength: 4000)); + DropColumn("dbo.Preferences", "SmsApiKey"); + } + + public override void Down() + { + AddColumn("dbo.Preferences", "SmsApiKey", c => c.String(maxLength: 4000)); + DropColumn("dbo.Preferences", "ovhSmsConsumerKey"); + DropColumn("dbo.Preferences", "ovhSmsApplicationKey"); + DropColumn("dbo.Preferences", "ovhSmsApplicationName"); + DropColumn("dbo.Preferences", "ovhSmsServiceName"); + } + } +} diff --git a/Migrations/202012272059415_V3.resx b/Migrations/202012272059415_V3.resx new file mode 100644 index 0000000..9a0d921 --- /dev/null +++ b/Migrations/202012272059415_V3.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Migrations/Configuration.cs b/Migrations/Configuration.cs index 7f98cd1..f1a4a7e 100644 --- a/Migrations/Configuration.cs +++ b/Migrations/Configuration.cs @@ -3,7 +3,8 @@ namespace Hermes.Migrations { internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { - AutomaticMigrationsEnabled = false; + AutomaticMigrationsEnabled = true; + AutomaticMigrationDataLossAllowed = true; ContextKey = "Hermes"; } diff --git a/Model/Citoyen.cs b/Model/Citoyen.cs index fd059c5..9341816 100644 --- a/Model/Citoyen.cs +++ b/Model/Citoyen.cs @@ -20,6 +20,7 @@ namespace Hermes.Model { private string _quartier; private string _adresse; private string _adresseBatiment; + private string _adresseNumeroBatiment; private string _adresseExt; private string _adresseExtCP; private string _adresseExtVille; @@ -127,6 +128,13 @@ namespace Hermes.Model { OnPropertyChanged(); } } + public string AdresseNumeroBatiment { + get => _adresseNumeroBatiment; + set { + _adresseNumeroBatiment = value; + OnPropertyChanged(); + } + } public string AdresseExt { get => TypeResidence == false ? null : _adresseExt; set { @@ -294,6 +302,7 @@ namespace Hermes.Model { citoyen.Quartier = Quartier; citoyen.Adresse = Adresse; citoyen.AdresseBatiment = AdresseBatiment; + citoyen.AdresseNumeroBatiment = AdresseNumeroBatiment; citoyen.AdresseExt = AdresseExt; citoyen.AdresseExtCP = AdresseExtCP; citoyen.AdresseExtVille = AdresseExtVille; diff --git a/Model/Preferences.cs b/Model/Preferences.cs index f8a48d3..4106b4b 100644 --- a/Model/Preferences.cs +++ b/Model/Preferences.cs @@ -11,7 +11,16 @@ namespace Hermes.Model { public string Ville { get; set; } - public string SmsApiKey { + public string ovhSmsServiceName { + get; set; + } + public string ovhSmsApplicationName { + get; set; + } + public string ovhSmsApplicationKey { + get; set; + } + public string ovhSmsConsumerKey { get; set; } } diff --git a/OVHQueryBody.cs b/OVHQueryBody.cs new file mode 100644 index 0000000..1c1af4e --- /dev/null +++ b/OVHQueryBody.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hermes { + class OVHQueryBody { + public string charset { + get; set; + } + public string[] receivers { + get; set; + } + public string message { + get; set; + } + public string priority { + get; set; + } + public bool senderForResponse { + get; set; + } + /*public bool noStopClause { + get; set; + }*/ + } +} diff --git a/OVHResponseBody.cs b/OVHResponseBody.cs new file mode 100644 index 0000000..cb76c79 --- /dev/null +++ b/OVHResponseBody.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hermes { + class OVHResponseBody { + public int totalCreditsRemoved { + get; set; + } + public string[] invalidReceivers { + get; set; + } + public string[] validReceivers { + get; set; + } + public int[] ids { + get; set; + } + } +} diff --git a/PreferencesWindow.xaml b/PreferencesWindow.xaml index f71ca7b..bf87c8b 100644 --- a/PreferencesWindow.xaml +++ b/PreferencesWindow.xaml @@ -5,14 +5,14 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Hermes" mc:Ignorable="d" - Title="Options" Height="250" Width="300" + Title="Options" Height="330" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterOwner" Closing="Window_Closing"> - + @@ -25,8 +25,14 @@ - - + + + + + + + + diff --git a/PreferencesWindow.xaml.cs b/PreferencesWindow.xaml.cs index e8e18ea..4a890a3 100644 --- a/PreferencesWindow.xaml.cs +++ b/PreferencesWindow.xaml.cs @@ -16,7 +16,11 @@ namespace Hermes { Preferences pref = dbContext.Preferences.Local[0]; villeTextBox.Text = pref.Ville; villeCPTextBox.Text = pref.VilleCP; - cleApiISendProTextBox.Text = pref.SmsApiKey; + + ovhSmsServiceNameTextBox.Text = pref.ovhSmsServiceName; + ovhSmsApplicationNameTextBox.Text = pref.ovhSmsApplicationName; + ovhSmsApplicationKeyTextBox.Text = pref.ovhSmsApplicationKey; + ovhSmsConsumerKeyTextBox.Text = pref.ovhSmsConsumerKey; } } @@ -37,13 +41,19 @@ namespace Hermes { Preferences pref = new Preferences(); pref.Ville = villeTextBox.Text; pref.VilleCP = villeCPTextBox.Text; - pref.SmsApiKey = cleApiISendProTextBox.Text; + pref.ovhSmsServiceName = ovhSmsServiceNameTextBox.Text; + pref.ovhSmsApplicationName = ovhSmsApplicationNameTextBox.Text; + pref.ovhSmsApplicationKey = ovhSmsApplicationKeyTextBox.Text; + pref.ovhSmsConsumerKey = ovhSmsConsumerKeyTextBox.Text; dbContext.Preferences.Add(pref); } else { Preferences pref = dbContext.Preferences.Local[0]; pref.Ville = villeTextBox.Text; pref.VilleCP = villeCPTextBox.Text; - pref.SmsApiKey = cleApiISendProTextBox.Text; + pref.ovhSmsServiceName = ovhSmsServiceNameTextBox.Text; + pref.ovhSmsApplicationName = ovhSmsApplicationNameTextBox.Text; + pref.ovhSmsApplicationKey = ovhSmsApplicationKeyTextBox.Text; + pref.ovhSmsConsumerKey = ovhSmsConsumerKeyTextBox.Text; } dbContext.SaveChanges(); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 4619c6a..363d66b 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -51,6 +51,6 @@ using System.Windows; // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut // en utilisant '*', comme indiqué ci-dessous : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.9.1.0")] -[assembly: AssemblyFileVersion("0.9.1.0")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: NeutralResourcesLanguage("fr-FR")] diff --git a/SmsWindow.xaml.cs b/SmsWindow.xaml.cs index 6e659c0..26178b2 100644 --- a/SmsWindow.xaml.cs +++ b/SmsWindow.xaml.cs @@ -1,11 +1,13 @@ 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.IO; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; using System.Windows; using System.Windows.Documents; @@ -13,6 +15,20 @@ namespace Hermes { public partial class SmsWindow : Window { private ObservableCollection status = new ObservableCollection(); private bool sending = false; + private Regex numPrefixRgx = new Regex(@"^0"); + + + public static string HashSHA1(string input) { + SHA1 sha = SHA1.Create(); + byte[] bHash = sha.ComputeHash(Encoding.UTF8.GetBytes(input)); + StringBuilder sBuilder = new StringBuilder(); + + for(int i = 0; i < bHash.Length; i++) { + sBuilder.Append(bHash[i].ToString("x2")); + } + + return sBuilder.ToString(); + } public SmsWindow(Window parent, List rcps) { InitializeComponent(); @@ -22,7 +38,7 @@ namespace Hermes { SmsSendingStatus s = new SmsSendingStatus(); s.Nom = rcp.Nom; s.Prenom = rcp.Prenom; - s.Mobile = rcp.TelPort.Replace(" ", ""); + s.Mobile = numPrefixRgx.Replace(rcp.TelPort.Replace(" ", ""), "+33"); s.Status = "En attente"; status.Add(s); } @@ -41,10 +57,12 @@ namespace Hermes { ModelContext dbContext = ModelContext.Getinstance(); bool error = false; string message = new TextRange(messageTextBox.Document.ContentStart, messageTextBox.Document.ContentEnd).Text; - string apiKey = dbContext.Preferences.Local[0].SmsApiKey; + Preferences pref = dbContext.Preferences.Local[0]; - if(String.IsNullOrWhiteSpace(apiKey)) { - MessageBox.Show("Erreur lors de la tentative d'envoi : Clé ISendPro invalide.", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Error); + + if(String.IsNullOrWhiteSpace(pref.ovhSmsServiceName) || String.IsNullOrWhiteSpace(pref.ovhSmsApplicationName) + || String.IsNullOrWhiteSpace(pref.ovhSmsApplicationKey) || String.IsNullOrWhiteSpace(pref.ovhSmsConsumerKey)) { + MessageBox.Show("Erreur lors de la tentative d'envoi : Clés d'accès invalides.", "Envoi de SMS", MessageBoxButton.OK, MessageBoxImage.Error); return; } @@ -58,44 +76,57 @@ namespace Hermes { messageTextBox.IsEnabled = false; sending = true; - ApiClient apiClient = new ApiClient(); - SmsApi smsApi = new SmsApi(apiClient); + + string query = $"https://eu.api.ovh.com/1.0/sms/{pref.ovhSmsServiceName}/jobs"; 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"; + OVHQueryBody body = new OVHQueryBody(); + body.charset = "UTF-8"; + body.receivers = new string[] { stat.Mobile }; + body.message = message; + body.priority = "high"; + body.senderForResponse = true; + + string bodyStr = JsonConvert.SerializeObject(body); + + string ts = ((Int32) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds).ToString(); + string signature = "$1$" + HashSHA1(pref.ovhSmsApplicationKey + "+" + pref.ovhSmsConsumerKey + "+" + "POST" + "+" + query + "+" + bodyStr + "+" + ts); + + HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create(query); + req.Method = "POST"; + req.ContentType = "application/json"; + req.Headers.Add("X-Ovh-Application:" + pref.ovhSmsApplicationName); + req.Headers.Add("X-Ovh-Consumer:" + pref.ovhSmsConsumerKey); + req.Headers.Add("X-Ovh-Signature:" + signature); + req.Headers.Add("X-Ovh-Timestamp:" + ts); + + using(System.IO.Stream s = req.GetRequestStream()) { + using(System.IO.StreamWriter sw = new System.IO.StreamWriter(s)) { + sw.Write(bodyStr); } - } 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) { + } + + try { + HttpWebResponse resp = (HttpWebResponse) req.GetResponse(); + using(var stream = resp.GetResponseStream()) { + var reader = new StreamReader(stream); + OVHResponseBody rb = JsonConvert.DeserializeObject(reader.ReadToEnd().Trim()); + if(rb.validReceivers.Length > 0 && rb.validReceivers[0] != null && rb.validReceivers[0].Equals(stat.Mobile)) { stat.Status = "Envoyé"; } else { error = true; - stat.Status = eta.Message; + stat.Status = "Numéro de mobile invalide"; } - } else { - error = true; - stat.Status = "Erreur technique"; + } + resp.Close(); + } catch(WebException ex) { + error = true; + WebResponse resp = ex.Response; + using(var stream = resp.GetResponseStream()) { + var reader = new StreamReader(stream); + String result = reader.ReadToEnd().Trim(); + stat.Status = result; } } } diff --git a/packages.config b/packages.config index 70648e9..7ec68bb 100644 --- a/packages.config +++ b/packages.config @@ -2,10 +2,9 @@ - + - \ No newline at end of file