/// <summary> /// Lance l'import. /// </summary> /// <param name="ShouldEraseBase"><c>true</c> si la base doit être supprimée avant l'import.</param> private async Task PerformImport(bool ShouldEraseBase) { var ChosenFilePath = PathChoosedFile.Text; if (ChosenFilePath.Length != 0) { try { var Anomalies = new Dictionary <int, string>(); var ExistingArticlesCountByRef = new Dictionary <string, int>(); var ArticlesDtosRead = new List <ArticlesDto>(); //On ne donne pas d'étape de chargement pour la lecture du fichier. ImportProgress.Style = ProgressBarStyle.Marquee; ImportProgress.MarqueeAnimationSpeed = 30; ImportProgress.Maximum = 100; StatusText.Text = "Lecture du fichier en cours..."; ReadFile(ChosenFilePath, ExistingArticlesCountByRef, Anomalies, ArticlesDtosRead); //Si des anomalies sont présentes dans le fichier on demande une confirmation. if (Anomalies.Count > 0) { var AnomaliesErrors = new StringBuilder(); foreach (var Anomaly in Anomalies) { AnomaliesErrors.Append($" - Line {Anomaly.Key} : {Anomaly.Value}\n"); } StatusText.Text = "Résolution des annomalies..."; var ConfirmResult = MessageBox.Show("Il y a " + Anomalies.Count + " anomalies dans le fichier d'import, ces articles ne seront pas importés :\n" + AnomaliesErrors + "\n Voulez vous annuler l'opération ?", "Annomalies détéctées", MessageBoxButtons.OKCancel); if (ConfirmResult == DialogResult.Cancel) { StatusText.Text = "Import annulé"; DialogResult = DialogResult.Cancel; return; } } //On remet la barre de chargement à 0 en mode pas à pas. StatusText.Text = "Calcul des données à créer..."; ImportProgress.Style = ProgressBarStyle.Continuous; ImportProgress.Maximum = ArticlesDtosRead.Count; ImportProgress.Minimum = 0; ImportProgress.Value = 0; //Les données à sauvegarder. var NewBrands = new Dictionary <string, Marques>(); var NewFamilies = new Dictionary <string, Family>(); var NewSubFamilies = new Dictionary <string, SubFamily>(); //les articles à sauvegarder sous la forme de couple <reference, <Nouvelle donnée, doublon>>. var NewArticles = new Dictionary <string, Pair <Articles, Articles> >(); //dédoublonnage étape 1 : doublon de familles / sous-familles et marques. if (!ShouldEraseBase) { //comme la base n'a pas été encore touchée, on peut encore annuler. if (FindDuplicates(ArticlesDtosRead, NewFamilies, NewBrands, NewSubFamilies)) { return; } } var ArticleNameSakeCount = 0; //calcul des doublons d'articles foreach (var ArticleDto in ArticlesDtosRead) { //barre de chargement. ImportProgress.Value += 1; Articles ArticleNameSake; if (ShouldEraseBase) { ArticleNameSake = null; } else { ArticleNameSake = ArticleDao.GetArticleById(ArticleDto.ArticleRef); } if (ArticleNameSake != null) { ArticleNameSakeCount++; } NewArticles.Add(ArticleDto.ArticleRef, new Pair <Articles, Articles>(null, ArticleNameSake)); } var NamesakeStrategyChosen = NamesakeStrategy.Ignore; if (ShouldEraseBase) { DaoRegistry.GetInstance.ClearAll(); } else { //S'il y a des doublons. if (ArticleNameSakeCount > 0) { //on choisi la stratégie de dédoublonnage, comme la base n'a pas été encore touchée, //c'est le dernier moment pour annuler. if (ChooseNameSakeStategy(ArticleNameSakeCount, ref NamesakeStrategyChosen)) { return; } // on onleve les doublons de la liste des articles à sauvegarder if (NamesakeStrategyChosen == NamesakeStrategy.Ignore) { var KeysToRemove = new List <string>(); foreach (var ArticleNameSakePair in NewArticles) { if (ArticleNameSakePair.Value.Second != null) { KeysToRemove.Add(ArticleNameSakePair.Key); } } foreach (var Key in KeysToRemove) { NewArticles.Remove(Key); } } } } foreach (var NewArticleRef in new List <string>(NewArticles.Keys)) { var ArticlesDto = ArticlesDtosRead.Find(ArticleDto => ArticleDto.ArticleRef.Equals(NewArticleRef)); //résolution des dépendances des Marques. var Marque = CollectionsUtils.GetOrCreate(NewBrands, ArticlesDto.BrandName, () => new Marques(null, ArticlesDto.BrandName)); //résolution des dépendances des Familles. var Famille = CollectionsUtils.GetOrCreate(NewFamilies, ArticlesDto.FamilyName, () => new Family(null, ArticlesDto.FamilyName)); //résolution des dépendances des Sous-Familles. var SousFamille = CollectionsUtils.GetOrCreate(NewSubFamilies, ArticlesDto.SubFamilyName, () => new SubFamily(null, Famille, ArticlesDto.SubFamilyName)); if (NewArticles.TryGetValue(NewArticleRef, out var ArticleNameSakePair)) { ArticleNameSakePair.First = new Articles(ArticlesDto.ArticleRef, ArticlesDto.Description, SousFamille, Marque, ArticlesDto.Price, 0); } } //On enregistre les données. await SaveImportedData(NewBrands, NewFamilies, NewSubFamilies, NewArticles, NamesakeStrategyChosen); StatusText.Text = "Import terminé"; //On affiche le rapport d'import. MessageBox.Show("Import terminé :\n" + NewBrands.Values.Count + " nouvelles marques \n" + NewFamilies.Values.Count + " nouvelles familles \n" + NewSubFamilies.Values.Count + " nouvelles sous-familles\n" + NewArticles.Count + " nouveaux articles \n", "Import terminé avec succés.", MessageBoxButtons.OK); DialogResult = DialogResult.OK; Close(); } catch (Exception Exception) { Console.WriteLine(Exception.ToString()); MessageBox.Show(Exception.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("Veuillez choisir un fichier", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error); } }