public void Sync(Int32 id) { this.Semaphore.WaitOne(); List <string> log = new List <string>(); Model.Local.ArticleRepository ArticleRepository = new Model.Local.ArticleRepository(); Model.Local.Article ArticleCompo = ArticleRepository.ReadArticle(id); if (ArticleCompo != null) { Model.Local.CompositionArticleRepository CompositionArticleRepository = new Model.Local.CompositionArticleRepository(); List <Model.Local.CompositionArticle> ListCompo = CompositionArticleRepository.ListArticle(ArticleCompo.Art_Id); if (ListCompo.Count > 0) { Model.Local.CompositionArticle CompoDefaut = ListCompo.FirstOrDefault(c => c.ComArt_Default); if (CompoDefaut == null || CompoDefaut.ComArt_Id == 0) { CompoDefaut = ListCompo.First(); } // Si toutes les compos sont liées à la même réference Sage // ET qu'elles sont toutes liées à une gamme ou un conditionnement if (ListCompo.Count == ListCompo.Count(c => c.ComArt_F_ARTICLE_SagId == CompoDefaut.ComArt_F_ARTICLE_SagId && (c.ComArt_F_ARTENUMREF_SagId != null)))// ^ c.ComArt_F_CONDITION_SagId != null))) { // on récupère la liste des énumérés de l'article Sage Model.Sage.F_ARTICLERepository F_ARTICLERepository = new Model.Sage.F_ARTICLERepository(); List <Model.Sage.F_ARTICLE_Composition> ListF_ARTICLE_Composition = F_ARTICLERepository.ListComposition(CompoDefaut.F_ARTICLE_Light.AR_Ref); // si on n'affiche pas les données en sommeil alors on filtre les gammes if (!Core.Global.GetConfig().ArticleEnSommeil) { ListF_ARTICLE_Composition = ListF_ARTICLE_Composition.Where(c => c.AE_Sommeil == 0).ToList(); } ListF_ARTICLE_Composition = Core.Tools.FiltreImportSage.ImportSageFilter(ListF_ARTICLE_Composition); // on filtre sur ceux déjà présents dans les compos List <Int32?> listidsagecompo = new List <Int32?>(); if (CompoDefaut.ComArt_F_ARTENUMREF_SagId != null) { listidsagecompo = ListCompo.Select(c => c.ComArt_F_ARTENUMREF_SagId).ToList(); ListF_ARTICLE_Composition = ListF_ARTICLE_Composition.Where(c => !listidsagecompo.Contains(c.F_ARTENUMREF_SagId) && !string.IsNullOrWhiteSpace(c.EnumereGamme1)).ToList(); } //else if (CompoDefaut.ComArt_F_CONDITION_SagId != null) //{ // listidsagecompo = ListCompo.Select(c => c.ComArt_F_CONDITION_SagId).ToList(); // ListF_ARTICLE_Composition = ListF_ARTICLE_Composition.Where(c => !listidsagecompo.Contains(c.F_CONDITION_SagId)).ToList(); //} // si on a une déclinaison à créer if (ListF_ARTICLE_Composition.Count > 0) { // on identifie le groupe d'attribut Prestashop // fonctionne uniquement pour les articles mono-gamme Model.Prestashop.PsAttributeGroupLangRepository PsAttributeGroupLangRepository = new Model.Prestashop.PsAttributeGroupLangRepository(); Model.Prestashop.PsAttributeGroupLang PsAttributeGroupLang = null; if (ArticleCompo.CompositionArticleAttributeGroup != null && ArticleCompo.CompositionArticleAttributeGroup.Count == 1) { Model.Local.CompositionArticleAttributeGroup CAAG = ArticleCompo.CompositionArticleAttributeGroup.First(); if (PsAttributeGroupLangRepository.ExistAttributeGroupLang((uint)CAAG.Cag_AttributeGroup_PreId, Core.Global.Lang)) { PsAttributeGroupLang = PsAttributeGroupLangRepository.ReadAttributeGroupLang((uint)CAAG.Cag_AttributeGroup_PreId, Core.Global.Lang); } } if (PsAttributeGroupLang != null) { foreach (Model.Sage.F_ARTICLE_Composition F_ARTICLE_Composition in ListF_ARTICLE_Composition) { // création de la composition dans l'article Prestaconnect Model.Local.CompositionArticle CompositionArticle = new Model.Local.CompositionArticle() { ComArt_Active = false, ComArt_ArtId = ArticleCompo.Art_Id, ComArt_F_ARTICLE_SagId = F_ARTICLE_Composition.cbMarq, ComArt_F_ARTENUMREF_SagId = F_ARTICLE_Composition.F_ARTENUMREF_SagId, ComArt_F_CONDITION_SagId = F_ARTICLE_Composition.F_CONDITION_SagId, ComArt_Quantity = 1, ComArt_Sync = true, ComArt_Default = false, HasUpdated = false, }; CompositionArticleRepository.Add(CompositionArticle); log.Add("ICG10- Import auto déclinaison gamme [ " + CompoDefaut.F_ARTICLE_Light.AR_Ref + " / " + F_ARTICLE_Composition.EnumereGamme1 + " ] pour la composition : " + ArticleCompo.Art_Name + ""); // création et affectation automatique des attributs Model.Prestashop.PsAttributeLang PsAttributeLang = null; Model.Prestashop.PsAttributeLangRepository PsAttributeLangRepository = new Model.Prestashop.PsAttributeLangRepository(); lock (Core.Temp.ListAttributeGroupLocked) { // ajout de la gestion d'une liste de locked attribute group au moment de la création pour éviter les doublons // while (Core.Temp.ListAttributeGroupLocked.Contains(PsAttributeGroupLang.IDAttributeGroup)) { System.Threading.Thread.Sleep(20); } Core.Temp.ListAttributeGroupLocked.Add(PsAttributeGroupLang.IDAttributeGroup); if (PsAttributeLangRepository.ExistAttributeLang(F_ARTICLE_Composition.EnumereGamme1.Trim(), Core.Global.Lang, PsAttributeGroupLang.IDAttributeGroup)) { PsAttributeLang = PsAttributeLangRepository.ReadAttributeLang(F_ARTICLE_Composition.EnumereGamme1.Trim(), Core.Global.Lang, PsAttributeGroupLang.IDAttributeGroup); } else { Model.Prestashop.PsAttributeRepository PsAttributeRepository = new Model.Prestashop.PsAttributeRepository(); Model.Prestashop.PsAttribute PsAttribute = new Model.Prestashop.PsAttribute() { IDAttributeGroup = PsAttributeGroupLang.IDAttributeGroup, Color = string.Empty, Position = PsAttributeRepository.NextPosition(), }; PsAttributeRepository.Add(PsAttribute, Core.Global.CurrentShop.IDShop); foreach (Model.Prestashop.PsLang PsLang in new Model.Prestashop.PsLangRepository().ListActive(1, Core.Global.CurrentShop.IDShop)) { if (!PsAttributeLangRepository.ExistAttributeLang(PsAttribute.IDAttribute, PsLang.IDLang)) { PsAttributeLangRepository.Add(new Model.Prestashop.PsAttributeLang() { IDAttribute = PsAttribute.IDAttribute, IDLang = PsLang.IDLang, Name = F_ARTICLE_Composition.EnumereGamme1.Trim(), }); } } PsAttributeLang = PsAttributeLangRepository.ReadAttributeLang(PsAttribute.IDAttribute, Core.Global.Lang); } Core.Temp.ListAttributeGroupLocked.Remove(PsAttributeGroupLang.IDAttributeGroup); } if (PsAttributeLang != null) { // affectation composition if (CompositionArticle.CompositionArticleAttribute.Count(ag => ag.Caa_AttributeGroup_PreId == (int)PsAttributeGroupLang.IDAttributeGroup) == 0) { CompositionArticle.CompositionArticleAttribute.Add(new Model.Local.CompositionArticleAttribute() { Caa_ComArtId = CompositionArticle.ComArt_ArtId, Caa_AttributeGroup_PreId = (int)PsAttributeGroupLang.IDAttributeGroup, Caa_Attribute_PreId = (int)PsAttributeLang.IDAttribute, }); } else { Model.Local.CompositionArticleAttribute CompositionArticleAttribute = CompositionArticle.CompositionArticleAttribute.First(ag => ag.Caa_AttributeGroup_PreId == (int)PsAttributeGroupLang.IDAttributeGroup); CompositionArticleAttribute.Caa_Attribute_PreId = (int)PsAttributeLang.IDAttribute; } // si on a pu affecter l'attribut alors on active la déclinaison CompositionArticle.ComArt_Active = true; } CompositionArticleRepository.Save(); // Marquage maj article compo ArticleCompo.Art_Date = DateTime.Now; ArticleRepository.Save(); } } } } } } lock (Logs) { if (log != null && log.Count > 0) { Logs.AddRange(log); } this.CurrentCount += 1; } this.ReportProgress(this.CurrentCount * 100 / this.ListCount); this.Semaphore.Release(); }
public void Sync(Int32 ArticleSend) { this.Semaphore.WaitOne(); ReportInfosSynchro(ArticleSend, Core.Temp._action_information_synchro.debut); List <string> log = new List <string>(); try { Model.Local.ArticleRepository ArticleRepository = new Model.Local.ArticleRepository(); Model.Prestashop.PsProductRepository PsProductRepository; Model.Prestashop.PsProduct PsProduct; Model.Local.Article Article = ArticleRepository.ReadArticle(ArticleSend); int sag_id = Article.Sag_Id; Model.Sage.F_ARTICLERepository F_ARTICLERepository = new Model.Sage.F_ARTICLERepository(); if (!F_ARTICLERepository.ExistArticle(Article.Sag_Id) && Article.TypeArticle == Model.Local.Article.enum_TypeArticle.ArticleComposition && Article.CompositionArticle != null && Article.CompositionArticle.Count > 0) { sag_id = (from Table in Article.CompositionArticle orderby Table.ComArt_Default descending select Table.ComArt_F_ARTICLE_SagId).FirstOrDefault(); } Boolean check_attributes = ((Article.TypeArticle == Model.Local.Article.enum_TypeArticle.ArticleMonoGamme || Article.TypeArticle == Model.Local.Article.enum_TypeArticle.ArticleMultiGammes) && Article.AttributeArticle != null && Article.AttributeArticle.Count > 0); Boolean check_composition = (Article.TypeArticle == Model.Local.Article.enum_TypeArticle.ArticleComposition && Article.CompositionArticle != null && Article.CompositionArticle.Count > 0); if (F_ARTICLERepository.ExistArticle(sag_id)) { Model.Sage.F_ARTICLE F_ARTICLE = F_ARTICLERepository.ReadArticle(sag_id); bool importsagefilterexclusion = Core.Tools.FiltreImportSage.ImportSageFilterExclude(F_ARTICLE); // si on affiche pas les sommeil et que article en sommeil = True // si on affiche pas les non publie et que article non publie = True // si affiche sommeil ou non publie = False if (Article.Art_Active && ((!Sommeil && F_ARTICLE.AR_Sommeil == 1) || (!NonPublie && F_ARTICLE.AR_Publie == 0) || importsagefilterexclusion)) { Article.Art_Active = false; if (Article.Pre_Id != null) { PsProductRepository = new Model.Prestashop.PsProductRepository(); if (PsProductRepository.ExistId((uint)Article.Pre_Id)) { PsProduct = PsProductRepository.ReadId((uint)Article.Pre_Id); PsProduct.Active = 0; PsProductRepository.Save(); //<JG> 23/01/2014 ajout modif sur PsProductShop Model.Prestashop.PsProductShopRepository PsProductShopRepository = new Model.Prestashop.PsProductShopRepository(); if (PsProductShopRepository.ExistProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop)) { Model.Prestashop.PsProductShop PsProductShop = PsProductShopRepository.ReadProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop); PsProductShop.Active = PsProduct.Active; PsProductShopRepository.Save(); } } } ArticleRepository.Save(); log.Add("SA10- Passage à l'état \"Inactif\" pour l'article [ " + Article.Art_Ref + " - " + Article.Art_Name + " ]" + (importsagefilterexclusion ? "(filtre d'exclusion)" : string.Empty)); } else if (Article.Art_Active == false && ((F_ARTICLE.AR_Sommeil == 0 || Sommeil) && (F_ARTICLE.AR_Publie == 1 || NonPublie) && !importsagefilterexclusion)) { Article.Art_Active = true; if (Article.Pre_Id != null) { PsProductRepository = new Model.Prestashop.PsProductRepository(); if (PsProductRepository.ExistId((uint)Article.Pre_Id)) { PsProduct = PsProductRepository.ReadId((uint)Article.Pre_Id); PsProduct.Active = 1; PsProductRepository.Save(); //<JG> 23/01/2014 ajout modif sur PsProductShop Model.Prestashop.PsProductShopRepository PsProductShopRepository = new Model.Prestashop.PsProductShopRepository(); if (PsProductShopRepository.ExistProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop)) { Model.Prestashop.PsProductShop PsProductShop = PsProductShopRepository.ReadProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop); PsProductShop.Active = PsProduct.Active; PsProductShopRepository.Save(); } } } ArticleRepository.Save(); log.Add("SA11- Passage à l'état \"Actif\" pour l'article [ " + Article.Art_Ref + " - " + Article.Art_Name + " ]"); } Boolean ExistAECAttributeStatut = Core.Global.ExistAECAttributeStatut(); // 09/12/2016 si le module de désactivation des gammes est installé if (ExistAECAttributeStatut) { if (check_attributes) { Core.ImportSage.ImportArticle ImportArticle = new Core.ImportSage.ImportArticle(); bool onlyattributestatut = true; // gestion statuts en local ImportArticle.ExecAttribute(F_ARTICLE, Article, onlyattributestatut); // gestion statuts dans PrestaShop Model.Local.AttributeArticleRepository AttributeArticleRepository = new Model.Local.AttributeArticleRepository(); List <Model.Local.AttributeArticle> ListAttributeArticle = AttributeArticleRepository.ListArticle(Article.Art_Id); int cpt = 0; foreach (Model.Local.AttributeArticle AttributeArticle in ListAttributeArticle) { cpt++; if (AttributeArticle.Pre_Id != null) { string combination; if (CheckStatutProductAttribute((uint)AttributeArticle.Pre_Id, (sbyte)(AttributeArticle.AttArt_Active ? 1 : 0), out combination)) { log.Add("SA51- " + "Référence : " + Article.Art_Ref + " / " + (AttributeArticle.AttArt_Active ? "Activation" : "Désactivation") + " déclinaison [" + combination + "] dans Prestashop "); } } ReportInfosSynchro(ArticleSend, Core.Temp._action_information_synchro.refresh, "Déclinaison : " + cpt + "/" + ListAttributeArticle.Count); } } else if (check_composition) { List <Model.Sage.F_ARTICLE_Composition> list_temp_filtre = new List <Model.Sage.F_ARTICLE_Composition>(); Model.Local.CompositionArticleRepository CompositionArticleRepository = new Model.Local.CompositionArticleRepository(); List <Model.Local.CompositionArticle> ListCompositionArticle = CompositionArticleRepository.ListArticle(Article.Art_Id); int cpt = 0; foreach (Model.Local.CompositionArticle compo in ListCompositionArticle) { cpt++; List <Model.Sage.F_ARTICLE_Composition> list_temp = new List <Model.Sage.F_ARTICLE_Composition>(); Model.Sage.F_ARTICLE_Composition F_ARTICLE_Composition = compo.F_ARTICLE_Composition; list_temp.Add(F_ARTICLE_Composition); list_temp = Core.Tools.FiltreImportSage.ImportSageFilter(list_temp); bool filter_exclusion = (list_temp.Count == 0); bool enable = compo.ComArt_Active; if (compo.ComArt_F_ARTENUMREF_SagId == null && compo.ComArt_F_CONDITION_SagId == null) { enable = ((F_ARTICLE_Composition.AR_Sommeil == 0 || Sommeil) && (F_ARTICLE_Composition.AR_Publie == 1 || NonPublie) && !filter_exclusion); } else if (compo.ComArt_F_ARTENUMREF_SagId != null) { Model.Sage.F_ARTENUMREF F_ARTENUMREF = compo.EnumereF_ARTENUMREF; #if (SAGE_VERSION_16 || SAGE_VERSION_17) enable = ((F_ARTICLE_Composition.AR_Sommeil == 0 || Sommeil) && (F_ARTICLE_Composition.AR_Publie == 1 || NonPublie) && !filter_exclusion && (Sommeil)); #else enable = ((F_ARTICLE_Composition.AR_Sommeil == 0 || Sommeil) && (F_ARTICLE_Composition.AR_Publie == 1 || NonPublie) && !filter_exclusion && ((F_ARTENUMREF.AE_Sommeil != null && F_ARTENUMREF.AE_Sommeil == 0) || Sommeil)); #endif } if (enable != compo.ComArt_Active) { // gestion statut local compo.ComArt_Active = enable; CompositionArticleRepository.Save(); } // gestion statut PrestaShop if (compo.Pre_Id != null) { string combination; if (CheckStatutProductAttribute((uint)compo.Pre_Id, (sbyte)(compo.ComArt_Active ? 1 : 0), out combination)) { log.Add("SA51- " + "Composition : " + Article.Art_Name + " / " + (compo.ComArt_Active ? "Activation" : "Désactivation") + " déclinaison [" + combination + "] dans Prestashop "); } } ReportInfosSynchro(ArticleSend, Core.Temp._action_information_synchro.refresh, "Déclinaison : " + cpt + "/" + ListCompositionArticle.Count); } } } } else if (Article.Art_Active || Article.Art_Sync) { Article.Art_Active = false; Article.Art_Sync = false; if (Article.Pre_Id != null) { PsProductRepository = new Model.Prestashop.PsProductRepository(); if (PsProductRepository.ExistId((uint)Article.Pre_Id)) { PsProduct = PsProductRepository.ReadId((uint)Article.Pre_Id); PsProduct.Active = 0; PsProductRepository.Save(); //<JG> 23/01/2014 ajout modif sur PsProductShop Model.Prestashop.PsProductShopRepository PsProductShopRepository = new Model.Prestashop.PsProductShopRepository(); if (PsProductShopRepository.ExistProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop)) { Model.Prestashop.PsProductShop PsProductShop = PsProductShopRepository.ReadProductShop(PsProduct.IDProduct, Core.Global.CurrentShop.IDShop); PsProductShop.Active = PsProduct.Active; PsProductShopRepository.Save(); } } } ArticleRepository.Save(); log.Add("SA12- Article Sage introuvable désactivation complète de l'article [ " + Article.Art_Ref + " - " + Article.Art_Name + " ]"); } } catch (Exception ex) { log.Add("SA01- Gestion statut article : " + ex.Message); } if (log.Count > 0) { log.Add(Core.Log.LogLineSeparator); lock (this.logs) logs.AddRange(log); } lock (this) { this.CurrentCount += 1; } ReportInfosSynchro(ArticleSend, Core.Temp._action_information_synchro.fin); this.ReportProgress(this.CurrentCount * 100 / this.ListCount); this.Semaphore.Release(); }