/// <summary>
        /// Tách sản phẩm khi so trùng trong database
        /// </summary>
        /// <returns></returns>
        public ActionResult tachdatabase(String valuestach)
        {
            using (CPS_SolutionEntities db = new CPS_SolutionEntities())
            {
                List<List<LapData>> listduplicatenew = (List<List<LapData>>)Session["listduplicatenewLapT"];
                String[] tachdup = valuestach.ToString().Split('@');
            //    List<String> listtrunglinhkien = (List<String>)Session["listtrunglinhkienT"];
                List<LapData> danhsachLaptrunglinhkien = (List<LapData>)Session["danhsachLaptrunglinhkienT"];
                // lấy cái id mới nhất trong db ra để khi lưu atribute biết hard mới hay là dùng lại hard cũ lưu true false
                int idBig = 0;
                var listHar = db.Hardwares.ToList();
                if (listHar.Count > 0)
                {
                    var hddBig = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                    idBig = hddBig.ID;
                }
                // duyệt hết list duplicate lớn
                for (int i = 0; i < listduplicatenew.Count; i++)
                {
                    // duyệt từng listduplicate nhỏ
                    for (int j = 0; j < listduplicatenew[i].Count; j++)
                    {
                        // nếu phát hiện list nào có chứa giá trị tách trả về
                        if (tachdup[2].Equals(listduplicatenew[i][j].stt))
                        {

                            //----------------------------- kiểm tra sản phẩm trong listpro có bị trùng linh kiện ko---------------------------
                            // lấy hết CPU trong db ra
                            var listCPUdb = (from a in db.Hardwares where a.CodetypeID.Equals("C") select a);
                            List<Hardware> listCPU = listCPUdb.ToList();
                            // lấy hết VGA trong db ra
                            var listVGAdb = (from a in db.Hardwares where a.CodetypeID.Equals("V") select a);
                            List<Hardware> listVGA = listVGAdb.ToList();
                            // lấy hết HDD trong db ra
                            var listHDDdb = (from a in db.Hardwares where a.CodetypeID.Equals("H") select a);
                            List<Hardware> listHDD = listHDDdb.ToList();
                            // lấy hết Display trong db ra
                            var listDisplaydb = (from a in db.Hardwares where a.CodetypeID.Equals("D") select a);
                            List<Hardware> listDisplay = listDisplaydb.ToList();
                            // lấy hết Ram trong db ra
                            var listRamdb = (from a in db.Hardwares where a.CodetypeID.Equals("R") select a);
                            List<Hardware> listRam = listRamdb.ToList();

                            #region Kiểm tra trùng link kiện không ghi lại những linh kiện trùng để ghilog txt
                            string errorCPU = "";
                            Hardware CPU = new Hardware();
                            string errorVGA = "";
                            Hardware VGA = new Hardware();
                            string errorHDD = "";
                            Hardware HDD = new Hardware();
                            string errorDisplay = "";
                            Hardware Display = new Hardware();
                            string errorRam = "";
                            Hardware Ram = new Hardware();

                            int errorCount = 0;
                            // trùng CPU 1
                            int c1 = 0;
                            for (int x = 0; x < listCPU.Count; x++)
                            {
                                if (listduplicatenew[i][j].CPU.Trim().Equals(listCPU[x].Name.Trim()))
                                {
                                    c1++;
                                    break;
                                }

                            }
                            if (c1 == 0)
                            {
                                for (int x = 0; x < listCPU.Count; x++)
                                {
                                    if (CompareStringHelper.CompareString(listduplicatenew[i][j].CPU.Trim(), listCPU[x].Name.Trim()) > 80)
                                    {
                                        CPU = listCPU[x];
                                        //listtrunglinhkien[1] += Convert.ToInt32(listduplicatenew[i][j].stt).ToString() + ",";
                                        errorCount++;
                                        errorCPU = listCPU[x].Name;
                                        break;
                                    }
                                }
                            }
                            // trùng VGA 2
                            int v2 = 0;
                            for (int x = 0; x < listVGA.Count; x++)
                            {
                                if (listduplicatenew[i][j].VGA.Trim().Equals(listVGA[x].Name.Trim()))
                                {
                                    v2++;
                                    break;
                                }

                            }
                            if (v2 == 0)
                            {
                                for (int x = 0; x < listVGA.Count; x++)
                                {
                                    if (CompareStringHelper.CompareString(listduplicatenew[i][j].VGA.Trim(), listVGA[x].Name.Trim()) > 80)
                                    {
                                        VGA = listVGA[x];
                                        //  listtrunglinhkien[2] += Convert.ToInt32(listduplicatenew[i][j].stt).ToString() + ",";
                                        errorCount++;
                                        errorVGA = listVGA[x].Name;
                                        break;
                                    }
                                }
                            }
                            // trùng HDD 3
                            int h3 = 0;
                            for (int x = 0; x < listHDD.Count; x++)
                            {
                                if (listduplicatenew[i][j].HDD.Trim().Equals(listHDD[x].Name.Trim()))
                                {
                                    h3++;
                                    break;
                                }

                            }
                            if (h3 == 0)
                            {
                                for (int x = 0; x < listHDD.Count; x++)
                                {
                                    if (CompareStringHelper.CompareString(listduplicatenew[i][j].HDD.Trim(), listHDD[x].Name.Trim()) > 80)
                                    {
                                        HDD = listHDD[x];
                                        //   listtrunglinhkien[3] += Convert.ToInt32(listduplicatenew[i][j].stt).ToString() + ",";
                                        errorCount++;
                                        errorHDD = listHDD[x].Name;
                                        break;
                                    }
                                }
                            }
                            // trùng Display 4
                            int d4 = 0;
                            for (int x = 0; x < listDisplay.Count; x++)
                            {
                                if (listduplicatenew[i][j].Display.Trim().Equals(listDisplay[x].Name.Trim()))
                                {
                                    d4++;
                                    break;
                                }

                            }
                            if (d4 == 0)
                            {
                                for (int x = 0; x < listDisplay.Count; x++)
                                {
                                    if (CompareStringHelper.CompareString(listduplicatenew[i][j].Display.Trim(), listDisplay[x].Name.Trim()) > 80)
                                    {
                                        Display = listDisplay[x];
                                        //   listtrunglinhkien[4] += Convert.ToInt32(listduplicatenew[i][j].stt).ToString() + ",";
                                        errorCount++;
                                        errorDisplay = listDisplay[x].Name;
                                        break;
                                    }
                                }
                            }
                            // trùng Ram
                            int r5 = 0;
                            for (int x = 0; x < listRam.Count; x++)
                            {
                                if (listduplicatenew[i][j].RAM.Trim().Equals(listRam[x].Name.Trim()))
                                {
                                    r5++;
                                    break;
                                }

                            }
                            if (r5 == 0)
                            {
                                for (int x = 0; x < listRam.Count; x++)
                                {
                                    if (CompareStringHelper.CompareString(listduplicatenew[i][j].RAM.Trim(), listRam[x].Name.Trim()) > 80)
                                    {
                                        Ram = listRam[x];
                                        //    listtrunglinhkien[5] += Convert.ToInt32(listduplicatenew[i][j].stt).ToString() + ",";
                                        errorCount++;
                                        errorRam = listRam[x].Name;
                                        break;
                                    }
                                }
                            }
                            #endregion
                            //-----------------------------------------------------------------------------------------------------------------
                            //------- lưu những sản phẩm có linh kiện trùng và lưu linh kiện trùng với id sản phẩm vào logfile-----------------
                            if (errorCount > 0)
                            {
                                #region  lưu product và product alias
                                Product p = new Product();
                                string urlServer = urlImageServer(listduplicatenew[i][j].Imagelink);
                                p.ImageURL = urlServer;
                                p.Price = 0;
                                p.TotalWeightPoint = 0;
                        //        p.IsActive = false;

                                // lưu vào database
                                db.Products.Add(p);
                                db.SaveChanges();
                                #region lấy id store hoặc lưu mới cho laptop
                                string urlcontent = listduplicatenew[i][j].Url;
                                var store = db.Stores.Where(x => urlcontent.Contains(x.StoreUrl)).FirstOrDefault();
                                int StoreID = 1;
                                string patter = "://|/";
                                Regex reg = new Regex(patter);
                                string host = reg.Split(listduplicatenew[i][j].Url)[1];
                                if (store != null)
                                {
                                    StoreID = store.ID;
                                }
                                else
                                {
                                    var newStore = new Store
                                    {
                                        IsActive = false,
                                        LogoImage = "default",
                                        StoreUrl = host,
                                        StoreName = "Chưa xác định",

                                    };
                                    db.Stores.Add(newStore);
                                    db.SaveChanges();
                                    StoreID = newStore.ID;
                                }
                                #endregion
                                // lấy id brand của Laptop
                                int brandID = BrandID(listduplicatenew[i][j].Name);

                                String[] mangten = listduplicatenew[i][j].Name.ToString().Split(';');
                                // nếu mảng tên >=2 thì lưu cái tên đầu tiên làm tên chính.
                                if (mangten.Length >= 2)
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);
                                    AliasProduct proAli = new AliasProduct();
                                    proAli.Name = mangten[0];
                                    proAli.ProductID = idinsert;
                                    proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                    proAli.StoreID = StoreID;
                                    proAli.UpdateTime = DateTime.Now;
                                    if (brandID > 0)
                                    {
                                        proAli.BrandID = brandID;
                                    }
                                    proAli.URL = listduplicatenew[i][j].Url;
                                    proAli.IsMain = true;
                                    proAli.IsActive = true;
                                    db.AliasProducts.Add(proAli);
                                    db.SaveChanges();
                                }
                                // nếu không thì lưu làm tên chính luôn.
                                else
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);
                                    AliasProduct proAli = new AliasProduct();
                                    proAli.Name = mangten[i];
                                    proAli.ProductID = idinsert;
                                    proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                    proAli.StoreID = StoreID;
                                    proAli.UpdateTime = DateTime.Now;
                                    if (brandID > 0)
                                    {
                                        proAli.BrandID = brandID;
                                    }
                                    proAli.URL = listduplicatenew[i][j].Url;
                                    proAli.IsMain = true;
                                    proAli.IsActive = true;
                                    db.AliasProducts.Add(proAli);
                                    db.SaveChanges();
                                }

                                // lấy max ID và thêm vào bảng alias tên phụ
                                if (mangten.Length >= 2)
                                {
                                    // lấy id của sản phẩm mới được insert vào db
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);
                                    // bỏ tên đầu tiên vì lưu làm tên chính rồi lưu tên phụ
                                    for (int h = 1; h < mangten.Length; h++)
                                    {
                                        AliasProduct proAli = new AliasProduct();
                                        proAli.Name = mangten[h];
                                        proAli.ProductID = idinsert;
                                        proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                        proAli.StoreID = StoreID;
                                        proAli.UpdateTime = DateTime.Now;
                                        if (brandID > 0)
                                        {
                                            proAli.BrandID = brandID;
                                        }
                                        proAli.URL = listduplicatenew[i][j].Url;
                                        proAli.IsMain = false;
                                        proAli.IsActive = true;
                                        db.AliasProducts.Add(proAli);
                                        db.SaveChanges();
                                    }

                                }
                                #endregion
                                string[] lines = null;
                                // lấy txt ra
                                string path = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
                                if (System.IO.File.Exists(path))
                                {
                                    lines = System.IO.File.ReadAllLines(path);
                                }
                                string[] newline = new string[errorCount];
                                // lấy id để lưu vào bảng productAtribute
                                int idCPU1 = 0;
                                int idVGA2 = 0;
                                int idHDD3 = 0;
                                int idDisplay4 = 0;
                                int idRam5 = 0;
                                // vị trí lưu trong mảng newline
                                int vitriluu = 0;
                                // id CPU 1
                                #region
                                for (int x = 0; x < listCPU.Count; x++)
                                {
                                    int dicID = listCPU[x].ID;
                                    var DictionaryCPU = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicCPU = DictionaryCPU.ToList();
                                    for (int z = 0; z < listDicCPU.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].CPU.Equals(listDicCPU[z].Name))
                                        {
                                            idCPU1 = listCPU[x].ID;
                                            break;
                                        }
                                    }

                                }

                                if (idCPU1 == 0)
                                {   // nếu trùng CPU thì ghi log CPU cùng với ID product
                                    if (!errorCPU.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + CPU.Name + '|' + CPU.CodetypeID.ToString() + '|' + CPU.WeightCriteraPoint + '|' + CPU.ID + '#' + listduplicatenew[i][j].CPU + '|' + '|' + '|';
                                        vitriluu++;

                                    }
                                    else
                                    {
                                        // Lưu mới CPU và get ID mới lưu
                                        Hardware atcpu = new Hardware();
                                        atcpu.CodetypeID = "C";
                                        atcpu.Name = listduplicatenew[i][j].CPU;
                                        atcpu.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(atcpu);
                                        db.SaveChanges();
                                        var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idCPU1 = Convert.ToInt32(cpunew.ID);
                                        // lưu name vào Attibute Alias và để isactive là false
                                        Dictionary atcpuMap = new Dictionary();
                                        atcpuMap.AttributeDicID = cpunew.ID;
                                        atcpuMap.Name = listduplicatenew[i][j].CPU;
                                        atcpuMap.IsActive = true;
                                        db.Dictionaries.Add(atcpuMap);
                                        db.SaveChanges();

                                    }
                                }
                                //nếu List CPU là rỗng
                                if (listCPU.Count == 0)
                                {
                                    if (!errorCPU.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[0] = idpro.ToString() + '~' + CPU.Name + '|' + CPU.CodetypeID.ToString() + '|' + CPU.WeightCriteraPoint + '|' + CPU.ID + '#' + listduplicatenew[i][j].CPU + '|' + '|' + '|';
                                        vitriluu++;
                                    }
                                    else
                                    {
                                        Hardware atcpu = new Hardware();
                                        atcpu.CodetypeID = "C";
                                        atcpu.Name = listduplicatenew[i][j].CPU;
                                        atcpu.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(atcpu);
                                        db.SaveChanges();
                                        var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idCPU1 = Convert.ToInt32(cpunew.ID);
                                        // lưu name vào Attibute Alias và để isactive là false
                                        Dictionary atcpuMap = new Dictionary();
                                        atcpuMap.AttributeDicID = cpunew.ID;
                                        atcpuMap.Name = listduplicatenew[i][j].CPU;
                                        atcpuMap.IsActive = true;
                                        db.Dictionaries.Add(atcpuMap);
                                        db.SaveChanges();

                                    }
                                }
                                #endregion
                                // id VGA 2
                                #region
                                for (int x = 0; x < listVGA.Count; x++)
                                {
                                    int dicID = listVGA[x].ID;
                                    var DictionaryVGA = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicVGA = DictionaryVGA.ToList();
                                    for (int z = 0; z < listDicVGA.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].VGA.Equals(listDicVGA[z].Name))
                                        {
                                            idVGA2 = listVGA[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idVGA2 == 0)
                                {
                                    // nếu VGA là trùng
                                    if (!errorVGA.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + VGA.Name + '|' + VGA.CodetypeID.ToString() + '|' + VGA.WeightCriteraPoint + '|' + VGA.ID + '#' + listduplicatenew[i][j].VGA + '|' + '|' + '|';
                                        vitriluu++;

                                    }
                                    // ko trùng thì lưu VGA mới vào database và lấy ID
                                    else
                                    {

                                        Hardware atvga = new Hardware();
                                        atvga.CodetypeID = "V";
                                        atvga.Name = listduplicatenew[i][j].VGA;
                                        atvga.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(atvga);
                                        db.SaveChanges();
                                        var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idVGA2 = Convert.ToInt32(vganew.ID);

                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary atvgaMap = new Dictionary();
                                        atvgaMap.AttributeDicID = vganew.ID;
                                        atvgaMap.Name = listduplicatenew[i][j].VGA;
                                        atvgaMap.IsActive = true;
                                        db.Dictionaries.Add(atvgaMap);

                                    }
                                }
                                // nếu list VGA là rỗng
                                if (listVGA.Count == 0)
                                {
                                    // nếu VGA là trùng
                                    if (!errorVGA.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + VGA.Name + '|' + VGA.CodetypeID.ToString() + '|' + VGA.WeightCriteraPoint + '|' + VGA.ID + '#' + listduplicatenew[i][j].VGA + '|' + '|' + '|';
                                        vitriluu++;
                                    }
                                    // ko trùng thì lưu VGA mới vào database và lấy ID
                                    else
                                    {
                                        Hardware atvga = new Hardware();
                                        atvga.CodetypeID = "V";
                                        atvga.Name = listduplicatenew[i][j].VGA;
                                        atvga.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(atvga);
                                        db.SaveChanges();
                                        var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idVGA2 = Convert.ToInt32(vganew.ID);
                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary atvgaMap = new Dictionary();
                                        atvgaMap.AttributeDicID = vganew.ID;
                                        atvgaMap.Name = listduplicatenew[i][j].VGA;
                                        atvgaMap.IsActive = true;
                                        db.Dictionaries.Add(atvgaMap);
                                    }
                                }
                                #endregion
                                // id HDD 3
                                #region
                                for (int x = 0; x < listHDD.Count; x++)
                                {
                                    int dicID = listHDD[x].ID;
                                    var DictionaryHDD = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicHDD = DictionaryHDD.ToList();
                                    for (int z = 0; z < listDicHDD.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].HDD.Equals(listDicHDD[z].Name))
                                        {
                                            idHDD3 = listHDD[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idHDD3 == 0)
                                {
                                    {
                                        // nếu HDD là trùng
                                        if (!errorHDD.Equals(""))
                                        {
                                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                            int idpro = Convert.ToInt32(pronew.ID);
                                            newline[vitriluu] = idpro.ToString() + '~' + HDD.Name + '|' + HDD.CodetypeID.ToString() + '|' + HDD.WeightCriteraPoint + '|' + HDD.ID + '#' + listduplicatenew[i][j].HDD + '|' + '|' + '|';
                                            vitriluu++;

                                        }
                                        // ko trùng thì lưu HDD mới vào database và lấy ID
                                        else
                                        {
                                            Hardware athddd = new Hardware();
                                            athddd.CodetypeID = "H";
                                            athddd.Name = listduplicatenew[i][j].HDD;
                                            athddd.WeightCriteraPoint = 0;
                                            db.Hardwares.Add(athddd);
                                            db.SaveChanges();
                                            var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                            idHDD3 = Convert.ToInt32(hddnew.ID);

                                            // lưu name vào Attibute Alias và để isactive là true
                                            Dictionary athdddMap = new Dictionary();
                                            athdddMap.AttributeDicID = hddnew.ID;
                                            athdddMap.Name = listduplicatenew[i][j].HDD;
                                            athdddMap.IsActive = true;
                                            db.Dictionaries.Add(athdddMap);

                                        }
                                    }
                                }
                                // nếu list HDD là rỗng
                                if (listHDD.Count == 0)
                                {
                                    // nếu HDD là trùng
                                    if (!errorHDD.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + HDD.Name + '|' + HDD.CodetypeID.ToString() + '|' + HDD.WeightCriteraPoint + '|' + HDD.ID + '#' + listduplicatenew[i][j].HDD + '|' + '|' + '|';
                                        vitriluu++;
                                    }
                                    // ko trùng thì lưu HDD mới vào database và lấy ID
                                    else
                                    {
                                        Hardware athddd = new Hardware();
                                        athddd.CodetypeID = "H";
                                        athddd.Name = listduplicatenew[i][j].HDD;
                                        athddd.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(athddd);
                                        db.SaveChanges();
                                        var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idHDD3 = Convert.ToInt32(hddnew.ID);
                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary athdddMap = new Dictionary();
                                        athdddMap.AttributeDicID = hddnew.ID;
                                        athdddMap.Name = listduplicatenew[i][j].HDD;
                                        athdddMap.IsActive = true;
                                        db.Dictionaries.Add(athdddMap);
                                    }
                                }
                                #endregion
                                // id Display 4
                                #region
                                for (int x = 0; x < listDisplay.Count; x++)
                                {

                                    int dicID = listDisplay[x].ID;
                                    var DictionaryDisplay = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicDisplay = DictionaryDisplay.ToList();
                                    for (int z = 0; z < listDicDisplay.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].Display.Equals(listDicDisplay[z].Name))
                                        {
                                            idDisplay4 = listDisplay[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idDisplay4 == 0)
                                {
                                    // nếu Display là trùng
                                    if (!errorDisplay.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + Display.Name + '|' + Display.CodetypeID.ToString() + '|' + Display.WeightCriteraPoint + '|' + Display.ID + '#' + listduplicatenew[i][j].Display + '|' + '|' + '|';
                                        vitriluu++;

                                    }
                                    // ko trùng thì lưu Display mới vào database và lấy ID
                                    else
                                    {
                                        Hardware athdisp = new Hardware();
                                        athdisp.CodetypeID = "D";
                                        athdisp.Name = listduplicatenew[i][j].Display;
                                        athdisp.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(athdisp);
                                        db.SaveChanges();
                                        var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idDisplay4 = Convert.ToInt32(dispnew.ID);

                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary athdispMap = new Dictionary();
                                        athdispMap.AttributeDicID = dispnew.ID;
                                        athdispMap.Name = listduplicatenew[i][j].Display;
                                        athdispMap.IsActive = true;
                                        db.Dictionaries.Add(athdispMap);
                                        db.SaveChanges();

                                    }
                                }
                                // nếu list Display là rỗng
                                if (listDisplay.Count == 0)
                                {
                                    // nếu Display là trùng
                                    if (!errorDisplay.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + Display.Name + '|' + Display.CodetypeID.ToString() + '|' + Display.WeightCriteraPoint + '|' + Display.ID + '#' + listduplicatenew[i][j].Display + '|' + '|' + '|';
                                        vitriluu++;
                                    }
                                    // ko trùng thì lưu Display mới vào database và lấy ID
                                    else
                                    {
                                        Hardware athdisp = new Hardware();
                                        athdisp.CodetypeID = "D";
                                        athdisp.Name = listduplicatenew[i][j].Display;
                                        athdisp.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(athdisp);
                                        db.SaveChanges();
                                        var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idDisplay4 = Convert.ToInt32(dispnew.ID);
                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary athdispMap = new Dictionary();
                                        athdispMap.AttributeDicID = dispnew.ID;
                                        athdispMap.Name = listduplicatenew[i][j].Display;
                                        athdispMap.IsActive = true;
                                        db.Dictionaries.Add(athdispMap);
                                        db.SaveChanges();
                                    }
                                }
                                #endregion
                                // id Ram
                                #region
                                for (int x = 0; x < listRam.Count; x++)
                                {
                                    int dicID = listRam[x].ID;
                                    var DictionaryRam = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicRam = DictionaryRam.ToList();
                                    for (int z = 0; z < listDicRam.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].RAM.Equals(listDicRam[z].Name))
                                        {
                                            idRam5 = listRam[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idRam5 == 0)
                                {
                                    // nếu Ram là trùng ghi log
                                    if (!errorRam.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + Ram.Name + '|' + Ram.CodetypeID.ToString() + '|' + Ram.WeightCriteraPoint + '|' + Ram.ID + '#' + listduplicatenew[i][j].RAM + '|' + '|' + '|';
                                        vitriluu++;

                                    }
                                    // ko trùng thì lưu Ram mới vào database và lấy ID
                                    else
                                    {
                                        Hardware athram = new Hardware();
                                        athram.CodetypeID = "R";
                                        athram.Name = listduplicatenew[i][j].RAM;
                                        athram.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(athram);
                                        db.SaveChanges();
                                        var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idRam5 = Convert.ToInt32(ramnew.ID);
                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary athramMap = new Dictionary();
                                        athramMap.AttributeDicID = ramnew.ID;
                                        athramMap.Name = listduplicatenew[i][j].RAM;
                                        athramMap.IsActive = true;
                                        db.Dictionaries.Add(athramMap);

                                    }
                                }

                                // nếu list Ram là rỗng
                                if (listRam.Count == 0)
                                {
                                    // nếu Ram là trùng ghi log
                                    if (!errorRam.Equals(""))
                                    {
                                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        int idpro = Convert.ToInt32(pronew.ID);
                                        newline[vitriluu] = idpro.ToString() + '~' + Ram.Name + '|' + Ram.CodetypeID.ToString() + '|' + Ram.WeightCriteraPoint + '|' + Ram.ID + '#' + listduplicatenew[i][j].RAM + '|' + '|' + '|';
                                        vitriluu++;
                                    }
                                    // ko trùng thì lưu Display mới vào database và lấy ID
                                    else
                                    {
                                        Hardware athram = new Hardware();
                                        athram.CodetypeID = "R";
                                        athram.Name = listduplicatenew[i][j].RAM;
                                        athram.WeightCriteraPoint = 0;
                                        db.Hardwares.Add(athram);
                                        db.SaveChanges();
                                        var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                        idRam5 = Convert.ToInt32(ramnew.ID);
                                        // lưu name vào Attibute Alias và để isactive là true
                                        Dictionary athramMap = new Dictionary();
                                        athramMap.AttributeDicID = ramnew.ID;
                                        athramMap.Name = listduplicatenew[i][j].RAM;
                                        athramMap.IsActive = true;
                                        db.Dictionaries.Add(athramMap);
                                    }
                                }
                                #endregion

                                #region  Gộp hai mảng lại thành một rồi ghi đè lại vào file txt
                                //Gộp hai bảng thành mảng mới và lưu vào txt lại
                                string[] save = new string[lines.Length + newline.Length];
                                for (int e = 0; e < lines.Length; e++)
                                {
                                    save[e] = lines[e];
                                }
                                for (int e = 0; e < newline.Length; e++)
                                {
                                    save[e + lines.Length] = newline[e];
                                }
                                // ghi lại vào txt
                                System.IO.File.WriteAllLines(path, save);
                                #endregion

                                #region Lưu vào bảng productAtribute
                                // lấy id của sản phẩm mới được insert vào db
                                var pronewinsert = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idinsertnew = Convert.ToInt32(pronewinsert.ID);

                                // nếu CPU không trùng database
                                if (errorCPU.Equals(""))
                                {
                                    //1 lưu idcpu vào bảng ProductAttribute
                                    ProductAttribute atProCPU = new ProductAttribute();
                                    atProCPU.AttributeID = idCPU1;
                                    if (idCPU1 > idBig)
                                    {
                                        atProCPU.IsActive = false;
                                    }
                                    else
                                    {
                                        atProCPU.IsActive = true;
                                    }
                                    atProCPU.ProductID = idinsertnew;
                                    db.ProductAttributes.Add(atProCPU);
                                    db.SaveChanges();
                                }
                                if (errorRam.Equals(""))
                                {
                                    //2 lưu idRam vào bảng ProductAttribute
                                    ProductAttribute atProRam = new ProductAttribute();
                                    atProRam.AttributeID = idRam5;
                                    if (idRam5 > idBig)
                                    {
                                        atProRam.IsActive = false;
                                    }
                                    else
                                    {
                                        atProRam.IsActive = true;
                                    }
                                    atProRam.ProductID = idinsertnew;
                                    db.ProductAttributes.Add(atProRam);
                                    db.SaveChanges();
                                }
                                if (errorHDD.Equals(""))
                                {
                                    //3 lưu idhdd vào bảng ProductAttribute
                                    ProductAttribute atProHDD = new ProductAttribute();
                                    atProHDD.AttributeID = idHDD3;
                                    if (idHDD3 > idBig)
                                    {
                                        atProHDD.IsActive = false;
                                    }
                                    else
                                    {
                                        atProHDD.IsActive = true;
                                    }
                                    atProHDD.ProductID = idinsertnew;
                                    db.ProductAttributes.Add(atProHDD);
                                    db.SaveChanges();
                                }
                                if (errorDisplay.Equals(""))
                                {
                                    //4 lưu idDisplay vào bảng ProductAttribute
                                    ProductAttribute atProDisp = new ProductAttribute();
                                    atProDisp.AttributeID = idDisplay4;
                                    if (idDisplay4 > idBig)
                                    {
                                        atProDisp.IsActive = false;
                                    }
                                    else
                                    {
                                        atProDisp.IsActive = true;
                                    }
                                    atProDisp.ProductID = idinsertnew;
                                    db.ProductAttributes.Add(atProDisp);
                                    db.SaveChanges();
                                }
                                if (errorVGA.Equals(""))
                                {
                                    //5 lưu idvag vào bảng ProductAttribute
                                    ProductAttribute atProVAG = new ProductAttribute();
                                    atProVAG.AttributeID = idVGA2;
                                    if (idVGA2 > idBig)
                                    {
                                        atProVAG.IsActive = false;
                                    }
                                    else
                                    {
                                        atProVAG.IsActive = true;
                                    }
                                    atProVAG.ProductID = idinsertnew;
                                    db.ProductAttributes.Add(atProVAG);
                                    db.SaveChanges();
                                }

                                #endregion
                                // thêm biến đếm số dòng lỗi được thêm vào.
                                listduplicatenew[i].RemoveAt(j);
                                j = j - 1;
                                if (listduplicatenew[i].Count < 2)
                                {
                                    listduplicatenew.RemoveAt(i);
                                    i = i--;
                                }
                            }
                            if (errorCount == 0)
                            {
                                //-------------- nếu không phát hiện trùng linh kiện thì cho add mới sản phẩm ---------------------------
                                Product p = new Product();

                                string urlServer = urlImageServer(listduplicatenew[i][j].Imagelink);
                                p.ImageURL = urlServer;
                                p.Price = 0;
                                p.TotalWeightPoint = 0;
                                p.IsActive = false;

                                // lưu vào database
                                db.Products.Add(p);
                                db.SaveChanges();
                                #region lấy id store hoặc lưu mới cho laptop
                                string urlcontent = listduplicatenew[i][j].Url;
                                var store = db.Stores.Where(x => urlcontent.Contains(x.StoreUrl)).FirstOrDefault();
                                int StoreID = 1;
                                string patter = "://|/";
                                Regex reg = new Regex(patter);
                                string host = reg.Split(listduplicatenew[i][j].Url)[1];
                                if (store != null)
                                {
                                    StoreID = store.ID;
                                }
                                else
                                {
                                    var newStore = new Store
                                    {
                                        IsActive = false,
                                        LogoImage = "default",
                                        StoreUrl = host,
                                        StoreName = "Chưa xác định",

                                    };
                                    db.Stores.Add(newStore);
                                    db.SaveChanges();
                                    StoreID = newStore.ID;
                                }
                                #endregion
                                // lấy id brand của Laptop
                                int brandID = BrandID(listduplicatenew[i][j].Name);

                                String[] mangten = listduplicatenew[i][j].Name.ToString().Split(';');
                                if (mangten.Length >= 2)
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);
                                    AliasProduct proAli = new AliasProduct();
                                    proAli.Name = mangten[0];
                                    proAli.ProductID = idinsert;
                                    proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                    proAli.StoreID = StoreID;
                                    proAli.UpdateTime = DateTime.Now;
                                    if (brandID > 0)
                                    {
                                        proAli.BrandID = brandID;
                                    }
                                    proAli.URL = listduplicatenew[i][j].Url;
                                    proAli.IsMain = true;
                                    proAli.IsActive = true;
                                    db.AliasProducts.Add(proAli);
                                    db.SaveChanges();
                                }
                                else
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);
                                    AliasProduct proAli = new AliasProduct();
                                    proAli.Name = mangten[i];
                                    proAli.ProductID = idinsert;
                                    proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                    proAli.StoreID = StoreID;
                                    proAli.UpdateTime = DateTime.Now;
                                    if (brandID > 0)
                                    {
                                        proAli.BrandID = brandID;
                                    }
                                    proAli.URL = listduplicatenew[i][j].Url;
                                    proAli.IsMain = true;
                                    proAli.IsActive = true;
                                    db.AliasProducts.Add(proAli);
                                    db.SaveChanges();
                                }

                                // lấy max ID và thêm vào bảng alias
                                if (mangten.Length >= 2)
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);

                                    for (int h = 1; h < mangten.Length; h++)
                                    {
                                        AliasProduct proAli = new AliasProduct();
                                        proAli.Name = mangten[h];
                                        proAli.ProductID = idinsert;
                                        proAli.Price = Convert.ToDouble(listduplicatenew[i][j].Price);
                                        proAli.StoreID = StoreID;
                                        if (brandID > 0)
                                        {
                                            proAli.BrandID = brandID;
                                        }
                                        proAli.URL = listduplicatenew[i][j].Url;
                                        proAli.IsMain = false;
                                        proAli.IsActive = true;
                                        db.AliasProducts.Add(proAli);
                                        db.SaveChanges();
                                    }

                                }

                                // lấy id để lưu vào bảng productAtribute
                                int idCPU1 = 0;
                                int idVGA2 = 0;
                                int idHDD3 = 0;
                                int idDisplay4 = 0;
                                int idRam5 = 0;
                                // id CPU 1
                                for (int x = 0; x < listCPU.Count; x++)
                                {
                                    int dicID = listCPU[x].ID;
                                    var DictionaryCPU = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicCPU = DictionaryCPU.ToList();
                                    for (int z = 0; z < listDicCPU.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].CPU.Equals(listDicCPU[z].Name))
                                        {
                                            idCPU1 = listCPU[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idCPU1 == 0)
                                {
                                    Hardware atcpu = new Hardware();
                                    atcpu.CodetypeID = "C";
                                    atcpu.Name = listduplicatenew[i][j].CPU;
                                    atcpu.WeightCriteraPoint = 0;
                                    db.Hardwares.Add(atcpu);
                                    db.SaveChanges();
                                    var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idCPU1 = Convert.ToInt32(cpunew.ID);

                                    // lưu name vào Attibute Alias và để isactive là false
                                    Dictionary atcpuMap = new Dictionary();
                                    atcpuMap.AttributeDicID = cpunew.ID;
                                    atcpuMap.Name = listduplicatenew[i][j].CPU;
                                    atcpuMap.IsActive = true;
                                    db.Dictionaries.Add(atcpuMap);
                                    db.SaveChanges();

                                }
                                // id VGA 2
                                for (int x = 0; x < listVGA.Count; x++)
                                {
                                    int dicID = listVGA[x].ID;
                                    var DictionaryVGA = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicVGA = DictionaryVGA.ToList();
                                    for (int z = 0; z < listDicVGA.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].VGA.Equals(listDicVGA[z].Name))
                                        {
                                            idVGA2 = listVGA[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idVGA2 == 0)
                                {
                                    Hardware atvga = new Hardware();
                                    atvga.CodetypeID = "V";
                                    atvga.Name = listduplicatenew[i][j].VGA;
                                    atvga.WeightCriteraPoint = 0;
                                    db.Hardwares.Add(atvga);
                                    db.SaveChanges();
                                    var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idVGA2 = Convert.ToInt32(vganew.ID);

                                    // lưu name vào Attibute Alias và để isactive là true
                                    Dictionary atvgaMap = new Dictionary();
                                    atvgaMap.AttributeDicID = vganew.ID;
                                    atvgaMap.Name = listduplicatenew[i][j].VGA;
                                    atvgaMap.IsActive = true;
                                    db.Dictionaries.Add(atvgaMap);

                                }
                                // id HDD 3
                                for (int x = 0; x < listHDD.Count; x++)
                                {
                                    int dicID = listHDD[x].ID;
                                    var DictionaryHDD = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicHDD = DictionaryHDD.ToList();
                                    for (int z = 0; z < listDicHDD.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].HDD.Equals(listDicHDD[z].Name))
                                        {
                                            idHDD3 = listHDD[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idHDD3 == 0)
                                {
                                    Hardware athddd = new Hardware();
                                    athddd.CodetypeID = "H";
                                    athddd.Name = listduplicatenew[i][j].HDD;
                                    athddd.WeightCriteraPoint = 0;
                                    db.Hardwares.Add(athddd);
                                    db.SaveChanges();
                                    var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idHDD3 = Convert.ToInt32(hddnew.ID);
                                    // lưu name vào Attibute Alias và để isactive là true
                                    Dictionary athdddMap = new Dictionary();
                                    athdddMap.AttributeDicID = hddnew.ID;
                                    athdddMap.Name = listduplicatenew[i][j].HDD;
                                    athdddMap.IsActive = true;
                                    db.Dictionaries.Add(athdddMap);

                                }
                                // id Display 4
                                for (int x = 0; x < listDisplay.Count; x++)
                                {
                                    int dicID = listDisplay[x].ID;
                                    var DictionaryDisplay = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicDisplay = DictionaryDisplay.ToList();
                                    for (int z = 0; z < listDicDisplay.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].Display.Equals(listDicDisplay[z].Name))
                                        {
                                            idDisplay4 = listDisplay[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idDisplay4 == 0)
                                {
                                    Hardware athdisp = new Hardware();
                                    athdisp.CodetypeID = "D";
                                    athdisp.Name = listduplicatenew[i][j].Display;
                                    athdisp.WeightCriteraPoint = 0;
                                    db.Hardwares.Add(athdisp);
                                    db.SaveChanges();
                                    var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idDisplay4 = Convert.ToInt32(dispnew.ID);

                                    // lưu name vào Attibute Alias và để isactive là true
                                    Dictionary athdispMap = new Dictionary();
                                    athdispMap.AttributeDicID = dispnew.ID;
                                    athdispMap.Name = listduplicatenew[i][j].Display;
                                    athdispMap.IsActive = true;
                                    db.Dictionaries.Add(athdispMap);
                                    db.SaveChanges();

                                }
                                // id Ram
                                for (int x = 0; x < listRam.Count; x++)
                                {
                                    int dicID = listRam[x].ID;
                                    var DictionaryRam = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                                    List<Dictionary> listDicRam = DictionaryRam.ToList();
                                    for (int z = 0; z < listDicRam.Count; z++)
                                    {
                                        if (listduplicatenew[i][j].RAM.Equals(listDicRam[z].Name))
                                        {
                                            idRam5 = listRam[x].ID;
                                            break;
                                        }
                                    }

                                }
                                if (idRam5 == 0)
                                {
                                    Hardware athram = new Hardware();
                                    athram.CodetypeID = "R";
                                    athram.Name = listduplicatenew[i][j].RAM;
                                    athram.WeightCriteraPoint = 0;
                                    db.Hardwares.Add(athram);
                                    db.SaveChanges();
                                    var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idRam5 = Convert.ToInt32(ramnew.ID);

                                    // lưu name vào Attibute Alias và để isactive là true
                                    Dictionary athramMap = new Dictionary();
                                    athramMap.AttributeDicID = ramnew.ID;
                                    athramMap.Name = listduplicatenew[i][j].RAM;
                                    athramMap.IsActive = true;
                                    db.Dictionaries.Add(athramMap);

                                }
                                // lấy id của sản phẩm mới được insert vào db
                                var pronewinsert = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idinsertnew = Convert.ToInt32(pronewinsert.ID);

                                //1 lưu idcpu vào bảng ProductAttribute
                                ProductAttribute atProCPU = new ProductAttribute();
                                atProCPU.AttributeID = idCPU1;
                                if (idCPU1 > idBig)
                                {
                                    atProCPU.IsActive = false;
                                }
                                else
                                {
                                    atProCPU.IsActive = true;
                                }
                                atProCPU.ProductID = idinsertnew;
                                db.ProductAttributes.Add(atProCPU);
                                db.SaveChanges();
                                //2 lưu idRam vào bảng ProductAttribute
                                ProductAttribute atProRam = new ProductAttribute();
                                atProRam.AttributeID = idRam5;
                                if (idRam5 > idBig)
                                {
                                    atProRam.IsActive = false;
                                }
                                else
                                {
                                    atProRam.IsActive = true;
                                }
                                atProRam.ProductID = idinsertnew;
                                db.ProductAttributes.Add(atProRam);
                                db.SaveChanges();
                                //3 lưu idhdd vào bảng ProductAttribute
                                ProductAttribute atProHDD = new ProductAttribute();
                                atProHDD.AttributeID = idHDD3;
                                if (idHDD3 > idBig)
                                {
                                    atProHDD.IsActive = false;
                                }
                                else
                                {
                                    atProHDD.IsActive = true;
                                }
                                atProHDD.ProductID = idinsertnew;
                                db.ProductAttributes.Add(atProHDD);
                                db.SaveChanges();
                                //4 lưu idDisplay vào bảng ProductAttribute
                                ProductAttribute atProDisp = new ProductAttribute();
                                atProDisp.AttributeID = idDisplay4;
                                if (idDisplay4 > idBig)
                                {
                                    atProDisp.IsActive = false;
                                }
                                else
                                {
                                    atProDisp.IsActive = true;
                                }
                                atProDisp.ProductID = idinsertnew;
                                db.ProductAttributes.Add(atProDisp);
                                db.SaveChanges();
                                //5 lưu idvag vào bảng ProductAttribute
                                ProductAttribute atProVAG = new ProductAttribute();
                                atProVAG.AttributeID = idVGA2;
                                if (idVGA2 > idBig)
                                {
                                    atProVAG.IsActive = false;
                                }
                                else
                                {
                                    atProVAG.IsActive = true;
                                }
                                atProVAG.ProductID = idinsertnew;
                                db.ProductAttributes.Add(atProVAG);
                                db.SaveChanges();
                                listduplicatenew[i].RemoveAt(j);
                                j = j - 1;
                                // xóa phần tử được add vào database ra khỏi list
                                if (listduplicatenew[i].Count < 2)
                                {
                                    listduplicatenew.RemoveAt(i);
                                    i = i--;
                                }
                            }
                            Session["listduplicatenewLapT"] = listduplicatenew;
                           // Session["listtrunglinhkienT"] = listtrunglinhkien;
                            Session["danhsachLaptrunglinhkienT"] = danhsachLaptrunglinhkien;

                            ViewBag.listduplicatenewLap = (List<List<LapData>>)Session["listduplicatenewLapT"];
                            break;
                        }
                    }
                }

                return View();
            }
        }
        public static int InserttoDb(IEnumerable<KeyValuePair<string, string>> data, string codetypeID)
        {
            int success = 0;
            double point = 0;
            using (var context = new CPS_SolutionEntities())
            {
                foreach (var pair in data)
                {

                    if (!String.IsNullOrEmpty(pair.Value.ToString()) || !String.IsNullOrWhiteSpace(pair.Value.ToString()))
                    {
                        point = Double.Parse(pair.Value);
                    }
                    else
                    {
                        point = 0;
                    }
                    ////Check good match
                    var goodMatch = new List<int>();
                    var averageMatch = new List<int>();
                    int pId = -1;
                    bool wholeMatch = false;
                    foreach (var attADalias in context.Dictionaries)
                    {
                        if (pair.Key == attADalias.Name)
                        {
                            wholeMatch = true;
                            pId = attADalias.AttributeDicID;
                            break;
                        }
                        double matchPercent = CompareStringHelper.CompareString(attADalias.Name, pair.Key);
                        if (matchPercent > 90.00)
                        {
                            // Good match
                            goodMatch.Add(attADalias.AttributeDicID);
                        }
                        if (matchPercent > 80.00)
                        {
                            // Normal match
                            averageMatch.Add(attADalias.AttributeDicID);
                        }
                    }
                    if (!wholeMatch)
                    {
                        if (goodMatch.Count == 1)
                        {
                            // Match well with only 1 product, take it
                            pId = goodMatch[0];
                        }
                        else if (goodMatch.Count > 1)
                        {
                            // Match well with more than 1 product, admin decide
                            ExportTrainingFile(goodMatch, pair.Key, PriceHelper.ConvertPrice(pair.Value).ToString());
                            continue;
                        }
                        else if (averageMatch.Count > 0 && pId == -1)
                        {
                            // Only average match, admin decide
                            ExportTrainingFile(averageMatch, pair.Key, PriceHelper.ConvertPrice(pair.Value).ToString());
                            continue;
                        }
                    }
                    // If attDic alr Existed?
                    if (pId != -1)
                    {
                        var att = context.Hardwares.Where(x => x.ID == pId).FirstOrDefault();
                        att.WeightCriteraPoint = point;
                        try
                        {
                            context.SaveChanges();
                            success++;
                        }
                        catch (DbUpdateException)
                        {
                            // Do nothing
                        }

                    }
                    else
                    {
                        //Add a new record
                        var newADitem = new Hardware { Name = pair.Key, CodetypeID = codetypeID, WeightCriteraPoint = point, IsActive = true };
                        context.Hardwares.Add(newADitem);
                        try
                        {
                            context.SaveChanges();
                            success++;
                            var aliasDic = new Dictionary
                            {
                                AttributeDicID = newADitem.ID,
                                Name = newADitem.Name,
                                IsActive = true,
                            };
                            context.Dictionaries.Add(aliasDic);
                            context.SaveChanges();
                        }
                        catch (DbUpdateException)
                        {
                            // Do nothing
                        }
                    }
                }
            }
            return success;
        }
        public ActionResult saveAllProduct(String checkval)
        {
            using (CPS_SolutionEntities db = new CPS_SolutionEntities())
            {
                // get list product in session.
                List<LapData> listpro = (List<LapData>)Session["listproductLapT"];
                List<LapData> listerror = (List<LapData>)Session["listerrorLapT"];
                List<List<LapData>> listduplicate = (List<List<LapData>>)Session["ListdupLaptraning"];
                //ghi logfile---------------------------------------------------------------------------------
                String[] ghilog = checkval.ToString().Split('@');

                // nếu có check  ghi log sản phẩm  Duplicate chờ traning sau
                #region ghilog Duplicate
                if (!ghilog[0].Equals("no"))
                {
                    // lấy dữ liệu trong file text traning ra LapDataTraning;
                    string path = Server.MapPath("~/UploadedExcelFiles/LapDataTraning.txt");
                    if (System.IO.File.Exists(path))
                    {   // lấy hết dòng trong file txt ra.
                        string[] lines = System.IO.File.ReadAllLines(path);
                        // tảo mảng mới chứa dữ dữ liệu trùng.
                        string[] newlines = new string[listduplicate.Count];
                        for (int i = 0; i < listduplicate.Count; i++)
                        {
                            string newline = "";
                            for (int j = 0; j < listduplicate[i].Count; j++)
                            {
                                newline += listduplicate[i][j].Name + "|" + listduplicate[i][j].Imagelink + "|" +
                                           listduplicate[i][j].CPU + "|" + listduplicate[i][j].VGA + "|" +
                                           listduplicate[i][j].HDD + "|" + listduplicate[i][j].Display + "|" +
                                           listduplicate[i][j].RAM + "|" + listduplicate[i][j].Price + "|" + listduplicate[i][j].Url + "#";
                            }
                            newline = newline.Substring(0, newline.Length - 1);
                            newlines[i] = newline;
                        }
                        //Gộp hai bảng thành mảng mới và lưu vào txt lại
                        string[] save = new string[lines.Length + newlines.Length];
                        for (int i = 0; i < lines.Length; i++)
                        {
                            save[i] = lines[i];
                        }
                        for (int i = 0; i < newlines.Length; i++)
                        {
                            save[i + lines.Length] = newlines[i];
                        }
                        // ghi lại vào txt
                        System.IO.File.WriteAllLines(path, save);
                    }

                }
                Session["ListdupLaptraning"] = null;
                #endregion
                // nếu có check ghilog Error
                #region ghilog ErrorProduct
                if (!ghilog[1].Equals("no"))
                {

                    // lấy dữ liệu trong file text traning ra LapDataTraning;
                    string path2 = Server.MapPath("~/UploadedExcelFiles/ErrorLap.txt");
                    if (System.IO.File.Exists(path2))
                    {   // lấy hết dòng trong file txt ra.
                        string[] lines = System.IO.File.ReadAllLines(path2);
                        // tảo mảng mới chứa dữ dữ liệu trùng.
                        string[] newlines = new string[listduplicate.Count];
                        for (int i = 0; i < listerror.Count; i++)
                        {
                            string newline = "";
                            newline += listerror[i].Name + "|" + listerror[i].Imagelink + "|" +
                                           listerror[i].CPU + "|" + listerror[i].VGA + "|" +
                                           listerror[i].HDD + "|" + listerror[i].Display + "|" +
                                           listerror[i].RAM;
                            newline = newline.Substring(0, newline.Length - 1);
                            newlines[i] = newline;
                        }
                        //Gộp hai bảng thành mảng mới và lưu vào txt lại
                        string[] save = new string[lines.Length + newlines.Length];
                        for (int i = 0; i < lines.Length; i++)
                        {
                            save[i] = lines[i];
                        }
                        for (int i = 0; i < newlines.Length; i++)
                        {
                            save[i + lines.Length] = newlines[i];
                        }
                        // ghi lại vào txt
                        System.IO.File.WriteAllLines(path2, save);
                    }

                }
                #endregion
                Session["listerrorLapT"] = null;

                // Tạo listduplicate mới chứa trùng giữa listpro và trong database
                List<List<LapData>> listduplicatenew = new List<List<LapData>>();

                //lấy product trong database ra.
                List<Product> listproindatabase = new List<Product>();
                var liproduct = (from x in db.Products select x);
                listproindatabase = liproduct.ToList();

                // tìm sản phẩm trùng cho vào list trùng hoặc xóa đi :|
                #region so trùng trong database
                for (int j = 0; j < listproindatabase.Count; j++)
                {
                    List<LapData> duplicateProduct = new List<LapData>();
                    for (int i = 0; i < listpro.Count; i++)
                    {
                        String Name = "";
                        String[] mangten = listpro[i].Name.ToString().Split(';');
                        if (mangten.Length >= 2)
                        {
                            Name = mangten[0];
                        }
                        else
                        {
                            Name = listpro[i].Name;
                        }

                        // Nếu product trong database không có tên cũng bỏ qua.
                        if (listproindatabase[j].Name == null)
                        {
                            listproindatabase.RemoveAt(j);
                            j--;
                            break;
                        }
                        //nếu đã có trong database thì xóa đi.
                        if (listproindatabase[j].Name.ToString().Equals(Name))
                        {
                            listproindatabase.RemoveAt(j);
                            listpro.RemoveAt(i);
                            i--;
                            j--;
                            break;
                        }

                        //---- lấy sản phầm trùng cho vào list trùng với sản phẩm trong database------------------------------------------------------------
                        if (CompareStringHelper.CompareString(Name, listproindatabase[j].Name.ToString()) >= 80)
                        {
                            LapData pro = new LapData();
                            pro.stt = listproindatabase[j].ID.ToString();
                            int stt = listproindatabase[j].ID;
                            pro.Imagelink = listproindatabase[j].ImageURL;
                            pro.Name = listproindatabase[j].Name;
                            pro.Price = listproindatabase[j].Price.ToString();
                            pro.Url = listproindatabase[j].URL;
                            // lấy CPU của product ra
                            var idAttrC = (from a in db.ProductAttributes where a.Hardware.CodetypeID.Equals("C") && a.ProductID == stt select a.AttributeID).SingleOrDefault();
                            if (idAttrC == 0)
                            {
                                pro.CPU = "Đang chờ xử lý";
                            }
                            else
                            {
                                int idCPU = Convert.ToInt32(idAttrC.ToString());
                                var CPU = (from a in db.Hardwares where a.ID.Equals(idCPU) select a.Name).FirstOrDefault();
                                pro.CPU = CPU.ToString();
                            }
                            // lấy VGA của product ra
                            var idAttrV = (from a in db.ProductAttributes where a.Hardware.CodetypeID.Equals("V") && a.ProductID == stt select a.AttributeID).FirstOrDefault();
                            if (idAttrV == 0)
                            {
                                pro.VGA = "Đang chờ xử lý";
                            }
                            else
                            {
                                int idVGA = Convert.ToInt32(idAttrV.ToString());
                                var VGA = (from a in db.Hardwares where a.ID.Equals(idVGA) select a.Name).FirstOrDefault();
                                pro.VGA = VGA.ToString();

                            }
                            // lấy HDD của product ra
                            var idAttrH = (from a in db.ProductAttributes where a.Hardware.CodetypeID.Equals("H") && a.ProductID == stt select a.AttributeID).FirstOrDefault();
                            if (idAttrH == 0)
                            {
                                pro.HDD = "Đang chờ xử lý";
                            }
                            else
                            {
                                int idHDD = Convert.ToInt32(idAttrH.ToString());
                                var HDD = (from a in db.Hardwares where a.ID.Equals(idHDD) select a.Name).FirstOrDefault();
                                pro.HDD = HDD.ToString();

                            }
                            // lấy Display  của product ra
                            var idAttrD = (from a in db.ProductAttributes where a.Hardware.CodetypeID.Equals("D") && a.ProductID == stt select a.AttributeID).FirstOrDefault();
                            if (idAttrD == 0)
                            {
                                pro.Display = "Đang chờ xử lý";
                            }
                            else
                            {
                                int idDisplay = Convert.ToInt32(idAttrD.ToString());
                                var Display = (from a in db.Hardwares where a.ID.Equals(idDisplay) select a.Name).FirstOrDefault();
                                pro.Display = Display.ToString();
                            }
                            // lấy RAM   của product ra
                            var idAttrR = (from a in db.ProductAttributes where a.Hardware.CodetypeID.Equals("R") && a.ProductID == stt select a.AttributeID).FirstOrDefault();
                            if (idAttrR == 0)
                            {
                                pro.RAM = "Đang chờ xử lý";
                            }
                            else
                            {
                                int idRAM = Convert.ToInt32(idAttrR.ToString());
                                var RAM = (from a in db.Hardwares where a.ID.Equals(idRAM) select a.Name).FirstOrDefault();
                                pro.RAM = RAM.ToString();
                            }
                            // add list dup
                            duplicateProduct.Add(pro);
                            listpro[i].stt = "z" + listpro[i].stt;
                            duplicateProduct.Add(listpro[i]);
                            listpro.RemoveAt(i);
                            i--;
                            break;
                        }

                    }
                    if (duplicateProduct.Count >= 2)
                    {
                        listduplicatenew.Add(duplicateProduct);
                        Session["listduplicatenewLapT"] = listduplicatenew;
                    }
                }
                #endregion

                // lấy cái id mới nhất trong db ra để khi lưu atribute biết hard mới hay là dùng lại hard cũ lưu true false
                int idBig = 0;
                var listHar = db.Hardwares.ToList();
                if (listHar.Count > 0)
                {
                    var hddBig = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                    idBig = hddBig.ID;
                }
                // -----sản phẩm còn lại lưu vào database-------------------------------------------------------
                for (int i = 0; i < listpro.Count; i++)
                {
                    //----------------------------- kiểm tra sản phẩm trong listpro có bị trùng linh kiện ko---------------------------
                    #region Lấy CPU VGA HDD Display Ram cho vào danh sách riêng để kiểm tra trùng linh kiện
                    // lấy hết CPU trong db ra
                    var listCPUdb = (from a in db.Hardwares where a.CodetypeID.Equals("C") && a.IsActive == true select a);
                    List<Hardware> listCPU = listCPUdb.ToList();
                    // lấy hết VGA trong db ra
                    var listVGAdb = (from a in db.Hardwares where a.CodetypeID.Equals("V") && a.IsActive == true select a);
                    List<Hardware> listVGA = listVGAdb.ToList();
                    // lấy hết HDD trong db ra
                    var listHDDdb = (from a in db.Hardwares where a.CodetypeID.Equals("H") && a.IsActive == true select a);
                    List<Hardware> listHDD = listHDDdb.ToList();
                    // lấy hết Display trong db ra
                    var listDisplaydb = (from a in db.Hardwares where a.CodetypeID.Equals("D") && a.IsActive == true select a);
                    List<Hardware> listDisplay = listDisplaydb.ToList();
                    // lấy hết Ram trong db ra
                    var listRamdb = (from a in db.Hardwares where a.CodetypeID.Equals("R") && a.IsActive == true select a);
                    List<Hardware> listRam = listRamdb.ToList();
                    #endregion

                    #region Kiểm tra trùng link kiện để ghilog txt
                    string errorCPU = "";
                    Hardware CPU = new Hardware();
                    string errorVGA = "";
                    Hardware VGA = new Hardware();
                    string errorHDD = "";
                    Hardware HDD = new Hardware();
                    string errorDisplay = "";
                    Hardware Display = new Hardware();
                    string errorRam = "";
                    Hardware Ram = new Hardware();
                    int errorCount = 0;
                    // trùng CPU 1
                    int c1 = 0;
                    var DictionaryC1 = (from a in db.Dictionaries where a.Hardware.CodetypeID == "C" select a);
                    List<Dictionary> listDicC1 = DictionaryC1.ToList();
                    for (int x = 0; x < listDicC1.Count; x++)
                    {
                        if (listpro[i].CPU.Trim().Equals(listDicC1[x].Name.Trim()))
                        {
                            c1++;
                            break;
                        }

                    }
                    if (c1 == 0)
                    {
                        for (int x = 0; x < listCPU.Count; x++)
                        {
                            if (CompareStringHelper.CompareString(listpro[i].CPU.Trim(), listCPU[x].Name.Trim()) >= 80)
                            {
                                CPU = listCPU[x];
                                errorCount++;
                                errorCPU = listCPU[x].Name;
                                break;
                            }
                        }
                    }

                    // trùng VGA 2
                    int v2 = 0;
                    var DictionaryV2 = (from a in db.Dictionaries where a.Hardware.CodetypeID == "V" select a);
                    List<Dictionary> listDicV2 = DictionaryV2.ToList();
                    for (int x = 0; x < listDicV2.Count; x++)
                    {
                        if (listpro[i].VGA.Trim().Equals(listDicV2[x].Name.Trim()))
                        {
                            v2++;
                            break;
                        }
                    }
                    if (v2 == 0)
                    {
                        for (int x = 0; x < listVGA.Count; x++)
                        {
                            if (CompareStringHelper.CompareString(listpro[i].VGA.Trim(), listVGA[x].Name.Trim()) >= 80)
                            {
                                VGA = listVGA[x];
                                errorCount++;
                                errorVGA = listVGA[x].Name;
                                break;
                            }
                        }
                    }
                    // trùng HDD 3
                    int h3 = 0;
                    var DictionaryH3 = (from a in db.Dictionaries where a.Hardware.CodetypeID == "H" select a);
                    List<Dictionary> listDicH3 = DictionaryH3.ToList();
                    for (int x = 0; x < listDicH3.Count; x++)
                    {
                        if (listpro[i].HDD.Trim().Equals(listDicH3[x].Name.Trim()))
                        {
                            h3++;
                            break;
                        }
                    }
                    if (h3 == 0)
                    {
                        for (int x = 0; x < listHDD.Count; x++)
                        {
                            if (CompareStringHelper.CompareString(listpro[i].HDD.Trim(), listHDD[x].Name.Trim()) >= 80)
                            {
                                HDD = listHDD[x];
                                errorCount++;
                                errorHDD = listHDD[x].Name;
                                break;
                            }
                        }
                    }
                    // trùng Display 4
                    int d4 = 0;
                    var DictionaryD4 = (from a in db.Dictionaries where a.Hardware.CodetypeID == "D" select a);
                    List<Dictionary> listDicD4 = DictionaryD4.ToList();
                    for (int x = 0; x < listDicD4.Count; x++)
                    {
                        if (listpro[i].Display.Trim().Equals(listDicD4[x].Name.Trim()))
                        {
                            d4++;
                            break;
                        }

                    }
                    if (d4 == 0)
                    {
                        for (int x = 0; x < listDisplay.Count; x++)
                        {
                            if (CompareStringHelper.CompareString(listpro[i].Display.Trim(), listDisplay[x].Name.Trim()) >= 80)
                            {
                                Display = listDisplay[x];
                                errorCount++;
                                errorDisplay = listDisplay[x].Name;
                                break;
                            }
                        }
                    }
                    // trùng Ram
                    int r5 = 0;
                    var DictionaryR5 = (from a in db.Dictionaries where a.Hardware.CodetypeID == "R" select a);
                    List<Dictionary> listDicR5 = DictionaryR5.ToList();
                    for (int x = 0; x < listDicR5.Count; x++)
                    {
                        if (listpro[i].RAM.Trim().Equals(listDicR5[x].Name.Trim()))
                        {
                            r5++;
                            break;
                        }

                    }
                    if (r5 == 0)
                    {
                        for (int x = 0; x < listRam.Count; x++)
                        {
                            if (CompareStringHelper.CompareString(listpro[i].RAM.Trim(), listRam[x].Name.Trim()) >= 80)
                            {
                                Ram = listRam[x];
                                errorCount++;
                                errorRam = listRam[x].Name;
                                break;
                            }
                        }
                    }

                    #endregion
                    //-----------------------------------------------------------------------------------------------------------------
                    //------- lưu những sản phẩm có linh kiện trùng và lưu linh kiện trùng với id sản phẩm vào logfile-----------------
                    if (errorCount > 0)
                    {
                        #region  lưu product và product alias
                        Product p = new Product();
                        string urlServer = urlImageServer(listpro[i].Imagelink);
                        p.ImageURL = urlServer;
                        p.Price = 0;
                        p.TotalWeightPoint = 0;
                     //   p.IsActive = false;

                        // lưu vào database
                        db.Products.Add(p);
                        db.SaveChanges();
                        #region lấy id store hoặc lưu mới cho laptop
                        string urlcontent = listpro[i].Url;
                        var store = db.Stores.Where(x => urlcontent.Contains(x.StoreUrl)).FirstOrDefault();
                        int StoreID = 1;
                        string patter = "://|/";
                        Regex reg = new Regex(patter);
                        string host = reg.Split(listpro[i].Url)[1];
                        if (store != null)
                        {
                            StoreID = store.ID;
                        }
                        else
                        {
                            var newStore = new Store
                            {
                                IsActive = false,
                                LogoImage = "default",
                                StoreUrl = host,
                                StoreName = "Chưa xác định",

                            };
                            db.Stores.Add(newStore);
                            db.SaveChanges();
                            StoreID = newStore.ID;
                        }
                        #endregion
                        // lấy id brand của Laptop
                        int brandID = BrandID(listpro[i].Name);
                        String[] mangten = listpro[i].Name.ToString().Split(';');
                        // nếu mảng tên >=2 thì lưu cái tên đầu tiên làm tên chính.
                        if (mangten.Length >= 2)
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            AliasProduct proAli = new AliasProduct();
                            proAli.Name = mangten[0];
                            proAli.ProductID = idinsert;
                            proAli.Price = Convert.ToDouble(listpro[i].Price);
                            proAli.StoreID = StoreID;
                            proAli.UpdateTime = DateTime.Now;
                            if (brandID > 0)
                            {
                                proAli.BrandID = brandID;
                            }
                            proAli.URL = listpro[i].Url;
                            proAli.IsMain = true;
                            proAli.IsActive = true;
                            db.AliasProducts.Add(proAli);
                            db.SaveChanges();
                        }
                        // nếu không thì lưu làm tên chính luôn.
                        else
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            AliasProduct proAli = new AliasProduct();
                            proAli.Name = mangten[0];
                            proAli.ProductID = idinsert;
                            proAli.Price = Convert.ToDouble(listpro[i].Price);
                            proAli.StoreID = StoreID;
                            proAli.UpdateTime = DateTime.Now;
                            if (brandID > 0)
                            {
                                proAli.BrandID = brandID;
                            }
                            proAli.URL = listpro[i].Url;
                            proAli.IsMain = true;
                            proAli.IsActive = true;
                            db.AliasProducts.Add(proAli);
                            db.SaveChanges();
                        }

                        // lấy max ID và thêm vào bảng alias tên phụ
                        if (mangten.Length >= 2)
                        {
                            // lấy id của sản phẩm mới được insert vào db
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            // bỏ tên đầu tiên vì lưu làm tên chính rồi lưu tên phụ
                            for (int h = 1; h < mangten.Length; h++)
                            {
                                AliasProduct proAli = new AliasProduct();
                                proAli.Name = mangten[h];
                                proAli.ProductID = idinsert;
                                proAli.Price = Convert.ToDouble(listpro[i].Price);
                                proAli.StoreID = StoreID;
                                proAli.UpdateTime = DateTime.Now;
                                if (brandID > 0)
                                {
                                    proAli.BrandID = brandID;
                                }
                                proAli.URL = listpro[i].Url;
                                proAli.IsMain = false;
                                proAli.IsActive = true;
                                db.AliasProducts.Add(proAli);
                                db.SaveChanges();
                            }

                        }
                        #endregion
                        string[] lines = null;
                        // lấy txt ra
                        string path = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
                        if (System.IO.File.Exists(path))
                        {
                            lines = System.IO.File.ReadAllLines(path);
                        }
                        string[] newline = new string[errorCount];
                        // lấy id để lưu vào bảng productAtribute
                        int idCPU1 = 0;
                        int idVGA2 = 0;
                        int idHDD3 = 0;
                        int idDisplay4 = 0;
                        int idRam5 = 0;
                        // vị trí lưu trong mảng newline
                        int vitriluu = 0;
                        // id CPU 1
                        #region
                        // nếu có trong database rồi thì lấy ID sản phẩm có rồi
                        for (int x = 0; x < listCPU.Count; x++)
                        {
                            int dicID = listCPU[x].ID;
                            var DictionaryCPU = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicCPU = DictionaryCPU.ToList();
                            for (int z = 0; z < listDicCPU.Count; z++)
                            {
                                if (listpro[i].CPU.Trim().Equals(listDicCPU[z].Name.Trim()))
                                {
                                    idCPU1 = listCPU[x].ID;
                                    break;
                                }
                            }

                        }
                        // nếu chưa có
                        if (idCPU1 == 0)
                        {   // chưa có mà bị trùng trong database thì ghi log
                            if (!errorCPU.Equals(""))
                            {
                                var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idpro = Convert.ToInt32(pronew.ID);
                                newline[vitriluu] = idpro.ToString() + '~' + CPU.Name + '|' + CPU.CodetypeID.ToString() + '|' + CPU.WeightCriteraPoint + '|' + CPU.ID + '#' + listpro[i].CPU + '|' + '|' + '|';
                                vitriluu++;
                            }
                            else
                            {
                                // Lưu mới CPU và get ID mới lưu
                                Hardware atcpu = new Hardware();
                                atcpu.CodetypeID = "C";
                                atcpu.Name = listpro[i].CPU;
                                atcpu.WeightCriteraPoint = 0;
                          //      atcpu.IsActive = false;
                                db.Hardwares.Add(atcpu);
                                db.SaveChanges();
                                //get id vừa mới lưu

                                var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                idCPU1 = Convert.ToInt32(cpunew.ID);

                                // lưu name vào Attibute Alias và để isactive là false
                                Dictionary atcpuMap = new Dictionary();
                                atcpuMap.AttributeDicID = cpunew.ID;
                                atcpuMap.Name = listpro[i].CPU;
                                atcpuMap.IsActive = true;
                                db.Dictionaries.Add(atcpuMap);
                                db.SaveChanges();

                            }
                        }
                        #endregion
                        #region //nếu List CPU là rỗng code comment

                        //if (listCPU.Count == 0)
                        //{
                        //    if (!errorCPU.Equals(""))
                        //    {
                        //        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        int idpro = Convert.ToInt32(pronew.ID);
                        //        newline[0] = idpro.ToString() + '~' + errorCPU + ';' + listpro[i].CPU;
                        //        vitriluu++;
                        //    }
                        //    else
                        //    {
                        //        // Lưu mới CPU và get ID mới lưu
                        //        AttributeDictionary atcpu = new AttributeDictionary();
                        //        atcpu.CodetypeID = "C";
                        //        atcpu.Name = listpro[i].CPU;
                        //        atcpu.WeightCriteraPoint = 0;
                        //        db.AttributeDictionaries.Add(atcpu);
                        //        db.SaveChanges();
                        //        //get id vừa mới lưu
                        //        var cpunew = db.AttributeDictionaries.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        idCPU1 = Convert.ToInt32(cpunew.ID);

                        //        // lưu name vào Attibute Alias và để isactive là false
                        //        AttributeMapping atcpuMap = new AttributeMapping();
                        //        atcpuMap.AttributeDicID = cpunew.ID;
                        //        atcpuMap.Name = listpro[i].CPU;
                        //        atcpuMap.IsActive = true;
                        //        db.AttributeMappings.Add(atcpuMap);
                        //        db.SaveChanges();
                        //    }
                        //}
                        #endregion
                        // id VGA 2
                        #region
                        // kiểm tra xem có trong database chưa có rồi thì lấy ID đã có
                        for (int x = 0; x < listVGA.Count; x++)
                        {

                            int dicID = listVGA[x].ID;
                            var DictionaryVGA = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicVGA = DictionaryVGA.ToList();
                            for (int z = 0; z < listDicVGA.Count; z++)
                            {
                                if (listpro[i].VGA.Trim().Equals(listDicVGA[z].Name.Trim()))
                                {
                                    idVGA2 = listVGA[x].ID;
                                    break;
                                }
                            }

                        }
                        // nếu chưa có trong database
                        if (idVGA2 == 0)
                        {
                            // nếu VGA là trùng
                            if (!errorVGA.Equals(""))
                            {
                                var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idpro = Convert.ToInt32(pronew.ID);
                                newline[vitriluu] = idpro.ToString() + '~' + VGA.Name + '|' + VGA.CodetypeID.ToString() + '|' + VGA.WeightCriteraPoint + '|' + VGA.ID + '#' + listpro[i].VGA + '|' + '|' + '|';
                                vitriluu++;
                            }
                            // ko trùng thì lưu VGA mới vào database và lấy ID
                            else
                            {
                                // lưu VGA mới và get id mới lưu
                                Hardware atvga = new Hardware();
                                atvga.CodetypeID = "V";
                                atvga.Name = listpro[i].VGA;
                                atvga.WeightCriteraPoint = 0;
                      //          atvga.IsActive = false;
                                db.Hardwares.Add(atvga);
                                db.SaveChanges();
                                var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                idVGA2 = Convert.ToInt32(vganew.ID);

                                // lưu name vào Attibute Alias và để isactive là true
                                Dictionary atvgaMap = new Dictionary();
                                atvgaMap.AttributeDicID = vganew.ID;
                                atvgaMap.Name = listpro[i].VGA;
                                atvgaMap.IsActive = true;
                                db.Dictionaries.Add(atvgaMap);
                            }
                        }
                        #endregion
                        #region // nếu list VGA là rỗng code comment

                        // if (listVGA.Count == 0)
                        //{
                        //     // nếu VGA là trùng
                        //    if (!errorVGA.Equals(""))
                        //    {
                        //        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        int idpro = Convert.ToInt32(pronew.ID);
                        //        newline[vitriluu] = idpro.ToString() + '~' + errorVGA + ';' + listpro[i].VGA;
                        //        vitriluu++;
                        //    }
                        //    // ko trùng thì lưu VGA mới vào database và lấy ID
                        //    else
                        //    {
                        //        AttributeDictionary atvga = new AttributeDictionary();
                        //        atvga.CodetypeID = "V";
                        //        atvga.Name = listpro[i].VGA;
                        //        atvga.WeightCriteraPoint = 0;
                        //        db.AttributeDictionaries.Add(atvga);
                        //        db.SaveChanges();
                        //        var vganew = db.AttributeDictionaries.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        idVGA2 = Convert.ToInt32(vganew.ID);

                        //        // lưu name vào Attibute Alias và để isactive là true
                        //        AttributeMapping atvgaMap = new AttributeMapping();
                        //        atvgaMap.AttributeDicID = vganew.ID;
                        //        atvgaMap.Name = listpro[i].VGA;
                        //        atvgaMap.IsActive = true;
                        //        db.AttributeMappings.Add(atvgaMap);
                        //        db.SaveChanges();
                        //    }
                        //}
                        #endregion
                        // id HDD 3
                        #region
                        // nếu có rồi trong database thì lấy ID ra
                        for (int x = 0; x < listHDD.Count; x++)
                        {
                            int dicID = listHDD[x].ID;
                            var DictionaryHDD = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicHDD = DictionaryHDD.ToList();
                            for (int z = 0; z < listDicHDD.Count; z++)
                            {
                                if (listpro[i].HDD.Trim().Equals(listDicHDD[z].Name.Trim()))
                                {
                                    idHDD3 = listHDD[x].ID;
                                    break;
                                }
                            }

                        }
                        // nếu chưa có trong database
                        if (idHDD3 == 0)
                        {
                            // nếu HDD là trùng
                            if (!errorHDD.Equals(""))
                            {
                                var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idpro = Convert.ToInt32(pronew.ID);
                                newline[vitriluu] = idpro.ToString() + '~' + HDD.Name + '|' + HDD.CodetypeID.ToString() + '|' + HDD.WeightCriteraPoint + '|' + HDD.ID + '#' + listpro[i].HDD + '|' + '|' + '|';
                                vitriluu++;
                            }
                            // ko trùng thì lưu HDD mới vào database và lấy ID
                            else
                            {
                                Hardware athddd = new Hardware();
                                athddd.CodetypeID = "H";
                                athddd.Name = listpro[i].HDD;
                                athddd.WeightCriteraPoint = 0;
                    //            athddd.IsActive = false;
                                db.Hardwares.Add(athddd);
                                db.SaveChanges();
                                var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                idHDD3 = Convert.ToInt32(hddnew.ID);

                                // lưu name vào Attibute Alias và để isactive là true
                                Dictionary athdddMap = new Dictionary();
                                athdddMap.AttributeDicID = hddnew.ID;
                                athdddMap.Name = listpro[i].HDD;
                                athdddMap.IsActive = true;
                                db.Dictionaries.Add(athdddMap);
                            }
                        }
                        #endregion
                        #region   // nếu list HDD là rỗng code comment

                        // if (listHDD.Count == 0)
                        //{
                        //    // nếu HDD là trùng
                        //    if (!errorHDD.Equals(""))
                        //    {
                        //        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        int idpro = Convert.ToInt32(pronew.ID);
                        //        newline[vitriluu] = idpro.ToString() + '~' + errorHDD + ';' + listpro[i].HDD;
                        //        vitriluu++;
                        //    }
                        //    // ko trùng thì lưu HDD mới vào database và lấy ID
                        //    else
                        //    {
                        //        AttributeDictionary athddd = new AttributeDictionary();
                        //        athddd.CodetypeID = "H";
                        //        athddd.Name = listpro[i].HDD;
                        //        athddd.WeightCriteraPoint = 0;
                        //        db.AttributeDictionaries.Add(athddd);
                        //        db.SaveChanges();
                        //        var hddnew = db.AttributeDictionaries.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        idHDD3 = Convert.ToInt32(hddnew.ID);
                        //        // lưu name vào Attibute Alias và để isactive là true
                        //        AttributeMapping athdddMap = new AttributeMapping();
                        //        athdddMap.AttributeDicID = hddnew.ID;
                        //        athdddMap.Name = listpro[i].HDD;
                        //        athdddMap.IsActive = true;
                        //        db.AttributeMappings.Add(athdddMap);
                        //        db.SaveChanges();

                        //    }
                        //}
                        #endregion
                        // id Display 4
                        #region
                        // nếu có rồi trong database thì lấy id ra
                        for (int x = 0; x < listDisplay.Count; x++)
                        {

                            int dicID = listDisplay[x].ID;
                            var DictionaryDisplay = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicDisplay = DictionaryDisplay.ToList();
                            for (int z = 0; z < listDicDisplay.Count; z++)
                            {
                                if (listpro[i].Display.Trim().Equals(listDicDisplay[z].Name.Trim()))
                                {
                                    idDisplay4 = listDisplay[x].ID;
                                    break;
                                }
                            }

                        }
                        // nếu chưa có trong database
                        if (idDisplay4 == 0)
                        {
                            {
                                // nếu Display là trùng
                                if (!errorDisplay.Equals(""))
                                {
                                    var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idpro = Convert.ToInt32(pronew.ID);
                                    newline[vitriluu] = idpro.ToString() + '~' + Display.Name + '|' + Display.CodetypeID.ToString() + '|' + Display.WeightCriteraPoint + '|' + Display.ID + '#' + listpro[i].Display + '|' + '|' + '|';
                                    vitriluu++;
                                }
                                // ko trùng thì lưu Display mới vào database và lấy ID
                                else
                                {
                                    Hardware athdisp = new Hardware();
                                    athdisp.CodetypeID = "D";
                                    athdisp.Name = listpro[i].Display;
                                    athdisp.WeightCriteraPoint = 0;
                            //        athdisp.IsActive = false;
                                    db.Hardwares.Add(athdisp);
                                    db.SaveChanges();
                                    var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    idDisplay4 = Convert.ToInt32(dispnew.ID);

                                    // lưu name vào Attibute Alias và để isactive là true
                                    Dictionary athdispMap = new Dictionary();
                                    athdispMap.AttributeDicID = dispnew.ID;
                                    athdispMap.Name = listpro[i].Display;
                                    athdispMap.IsActive = true;
                                    db.Dictionaries.Add(athdispMap);
                                    db.SaveChanges();
                                }
                            }
                        }
                        #endregion
                        #region  // nếu list Display là rỗng code comment
                        //if (listDisplay.Count == 0)
                        //{
                        //       // nếu Display là trùng
                        //    if (!errorDisplay.Equals(""))
                        //    {
                        //        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        int idpro = Convert.ToInt32(pronew.ID);
                        //        newline[vitriluu] = idpro.ToString() + '~' + errorDisplay + ';' + listpro[i].Display;
                        //        vitriluu++;
                        //    }
                        //    // ko trùng thì lưu Display mới vào database và lấy ID
                        //    else
                        //    {
                        //        AttributeDictionary athdisp = new AttributeDictionary();
                        //        athdisp.CodetypeID = "D";
                        //        athdisp.Name = listpro[i].Display;
                        //        athdisp.WeightCriteraPoint = 0;
                        //        db.AttributeDictionaries.Add(athdisp);
                        //        db.SaveChanges();
                        //        var dispnew = db.AttributeDictionaries.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        idDisplay4 = Convert.ToInt32(dispnew.ID);

                        //        // lưu name vào Attibute Alias và để isactive là true
                        //        AttributeMapping athdispMap = new AttributeMapping();
                        //        athdispMap.AttributeDicID = dispnew.ID;
                        //        athdispMap.Name = listpro[i].Display;
                        //        athdispMap.IsActive = true;
                        //        db.AttributeMappings.Add(athdispMap);
                        //        db.SaveChanges();
                        //    }
                        //}
                        #endregion
                        // id Ram 5
                        #region
                        // nếu có rồi trong database thì lấy id ra
                        for (int x = 0; x < listRam.Count; x++)
                        {
                            int dicID = listRam[x].ID;
                            var DictionaryRam = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicRam = DictionaryRam.ToList();
                            for (int z = 0; z < listDicRam.Count; z++)
                            {
                                if (listpro[i].RAM.Trim().Equals(listDicRam[z].Name.Trim()))
                                {
                                    idRam5 = listRam[x].ID;
                                    break;
                                }
                            }
                        }
                        // nếu chưa có trong database
                        if (idRam5 == 0)
                        {
                            // nếu Ram là trùng ghi log
                            if (!errorRam.Equals(""))
                            {
                                var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idpro = Convert.ToInt32(pronew.ID);
                                newline[vitriluu] = idpro.ToString() + '~' + Ram.Name + '|' + Ram.CodetypeID.ToString() + '|' + Ram.WeightCriteraPoint + '|' + Ram.ID + '#' + listpro[i].RAM + '|' + '|' + '|';
                                vitriluu++;
                            }
                            // ko trùng thì lưu Ram mới vào database và lấy ID
                            else
                            {
                                Hardware athram = new Hardware();
                                athram.CodetypeID = "R";
                                athram.Name = listpro[i].RAM;
                                athram.WeightCriteraPoint = 0;
                     //           athram.IsActive = false;
                                db.Hardwares.Add(athram);
                                db.SaveChanges();
                                var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                idRam5 = Convert.ToInt32(ramnew.ID);

                                // lưu name vào Attibute Alias và để isactive là true
                                Dictionary athramMap = new Dictionary();
                                athramMap.AttributeDicID = ramnew.ID;
                                athramMap.Name = listpro[i].RAM;
                                athramMap.IsActive = true;
                                db.Dictionaries.Add(athramMap);
                            }
                        }
                        #endregion
                        #region  // nếu list Ram là rỗng code comment

                        //if (listRam.Count == 0)
                        //{
                        //           // nếu Ram là trùng ghi log
                        //    if (!errorRam.Equals(""))
                        //    {
                        //        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        int idpro = Convert.ToInt32(pronew.ID);
                        //        newline[vitriluu] = idpro.ToString() + '~' + errorRam + ';' + listpro[i].RAM;
                        //        vitriluu++;
                        //    }
                        //    // ko trùng thì lưu Display mới vào database và lấy ID
                        //    else
                        //    {
                        //        AttributeDictionary athram = new AttributeDictionary();
                        //        athram.CodetypeID = "R";
                        //        athram.Name = listpro[i].RAM;
                        //        athram.WeightCriteraPoint = 0;
                        //        db.AttributeDictionaries.Add(athram);
                        //        db.SaveChanges();
                        //        var ramnew = db.AttributeDictionaries.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        //        idRam5 = Convert.ToInt32(ramnew.ID);
                        //        // lưu name vào Attibute Alias và để isactive là true
                        //        AttributeMapping athramMap = new AttributeMapping();
                        //        athramMap.AttributeDicID = ramnew.ID;
                        //        athramMap.Name = listpro[i].RAM;
                        //        athramMap.IsActive = true;
                        //        db.AttributeMappings.Add(athramMap);
                        //        db.SaveChanges();
                        //    }
                        //}
                        #endregion

                        #region  Gộp hai mảng lại thành một rồi ghi đè lại vào file txt
                        //Gộp hai bảng thành mảng mới và lưu vào txt lại
                        string[] save = new string[lines.Length + newline.Length];
                        for (int e = 0; e < lines.Length; e++)
                        {
                            save[e] = lines[e];
                        }
                        for (int e = 0; e < newline.Length; e++)
                        {
                            save[e + lines.Length] = newline[e];
                        }
                        // ghi lại vào txt
                        System.IO.File.WriteAllLines(path, save);
                        #endregion

                        #region Lưu vào bảng productAtribute
                        // lấy id của sản phẩm mới được insert vào db
                        var pronewinsert = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        int idinsertnew = Convert.ToInt32(pronewinsert.ID);

                        // nếu CPU không trùng database
                        if (errorCPU.Equals(""))
                        {
                            //1 lưu idcpu vào bảng ProductAttribute
                            ProductAttribute atProCPU = new ProductAttribute();
                            atProCPU.AttributeID = idCPU1;
                            atProCPU.ProductID = idinsertnew;
                            if (idCPU1 > idBig)
                            {
                                atProCPU.IsActive = false;
                            }
                            else
                            {
                                atProCPU.IsActive = true;
                            }
                            db.ProductAttributes.Add(atProCPU);
                            db.SaveChanges();
                        }
                        if (errorRam.Equals(""))
                        {
                            //2 lưu idRam vào bảng ProductAttribute
                            ProductAttribute atProRam = new ProductAttribute();
                            atProRam.AttributeID = idRam5;
                            if (idRam5 > idBig)
                            {
                                atProRam.IsActive = false;
                            }
                            else
                            {
                                atProRam.IsActive = true;
                            }
                            atProRam.ProductID = idinsertnew;
                            db.ProductAttributes.Add(atProRam);
                            db.SaveChanges();
                        }
                        if (errorHDD.Equals(""))
                        {
                            //3 lưu idhdd vào bảng ProductAttribute
                            ProductAttribute atProHDD = new ProductAttribute();
                            atProHDD.AttributeID = idHDD3;
                            if (idHDD3 > idBig)
                            {
                                atProHDD.IsActive = false;
                            }
                            else
                            {
                                atProHDD.IsActive = true;
                            }
                            atProHDD.ProductID = idinsertnew;
                            db.ProductAttributes.Add(atProHDD);
                            db.SaveChanges();
                        }
                        if (errorDisplay.Equals(""))
                        {
                            //4 lưu idDisplay vào bảng ProductAttribute
                            ProductAttribute atProDisp = new ProductAttribute();
                            atProDisp.AttributeID = idDisplay4;
                            if (idDisplay4 > idBig)
                            {
                                atProDisp.IsActive = false;
                            }
                            else
                            {
                                atProDisp.IsActive = true;
                            }

                            atProDisp.ProductID = idinsertnew;
                            db.ProductAttributes.Add(atProDisp);
                            db.SaveChanges();
                        }
                        if (errorVGA.Equals(""))
                        {
                            //5 lưu idvag vào bảng ProductAttribute
                            ProductAttribute atProVAG = new ProductAttribute();
                            atProVAG.AttributeID = idVGA2;
                            if (idVGA2 > idBig)
                            {
                                atProVAG.IsActive = false;
                            }
                            else
                            {
                                atProVAG.IsActive = true;
                            }
                            atProVAG.ProductID = idinsertnew;
                            db.ProductAttributes.Add(atProVAG);
                            db.SaveChanges();
                        }

                        #endregion
                        // thêm biến đếm số dòng lỗi được thêm vào.
                        listpro.RemoveAt(i);
                        i = i - 1;
                    }
                    //-------------------------------------------------------------------------------------------------------------------------------------------------------
                    //------------------ Nếu không phát hiện trùng linh kiện thì cho add mới sản phẩm -----------------------------------------------------------------------
                    #region Lưu sản phẩm không có linh kiện nào bị trùng
                    if (errorCount == 0)
                    {
                        Product p = new Product();

                        string urlServer = urlImageServer(listpro[i].Imagelink);
                        p.ImageURL = urlServer;
                        p.Price = 0;
                        p.TotalWeightPoint = 0;
                    //    p.IsActive = false;

                        // lưu vào database
                        db.Products.Add(p);
                        db.SaveChanges();
                        #region lấy id store hoặc lưu mới cho laptop
                        string urlcontent = listpro[i].Url;
                        var store = db.Stores.Where(x => urlcontent.Contains(x.StoreUrl)).FirstOrDefault();
                        int StoreID = 1;
                        string patter = "://|/";
                        Regex reg = new Regex(patter);
                        string host = reg.Split(listpro[i].Url)[1];
                        if (store != null)
                        {
                            StoreID = store.ID;
                        }
                        else
                        {
                            var newStore = new Store
                            {
                                IsActive = false,
                                LogoImage = "default",
                                StoreUrl = host,
                                StoreName = "Chưa xác định",

                            };
                            db.Stores.Add(newStore);
                            db.SaveChanges();
                            StoreID = newStore.ID;
                        }
                        #endregion
                        // lấy id brand của Laptop
                        int brandID = BrandID(listpro[i].Name);

                        String[] mangten = listpro[i].Name.ToString().Split(';');
                        if (mangten.Length >= 2)
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            AliasProduct proAli = new AliasProduct();
                            proAli.Name = mangten[0];
                            proAli.ProductID = idinsert;
                            proAli.Price = Convert.ToDouble(listpro[i].Price);
                            proAli.StoreID = StoreID;
                            proAli.UpdateTime = DateTime.Now;
                            if (brandID > 0)
                            {
                                proAli.BrandID = brandID;
                            }
                            proAli.URL = listpro[i].Url;
                            proAli.IsMain = true;
                            proAli.IsActive = true;
                            db.AliasProducts.Add(proAli);
                            db.SaveChanges();
                        }
                        else
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            AliasProduct proAli = new AliasProduct();
                            proAli.Name = mangten[i];
                            proAli.ProductID = idinsert;
                            proAli.Price = Convert.ToDouble(listpro[i].Price);
                            proAli.StoreID = StoreID;
                            proAli.UpdateTime = DateTime.Now;
                            if (brandID > 0)
                            {
                                proAli.BrandID = brandID;
                            }
                            proAli.URL = listpro[i].Url;
                            proAli.IsMain = true;
                            proAli.IsActive = true;
                            db.AliasProducts.Add(proAli);
                            db.SaveChanges();
                        }

                        // lấy max ID và thêm vào bảng alias
                        if (mangten.Length >= 2)
                        {
                            // lấy id của sản phẩm mới được insert vào db
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);

                            for (int h = 1; h < mangten.Length; h++)
                            {
                                AliasProduct proAli = new AliasProduct();
                                proAli.Name = mangten[h];
                                proAli.ProductID = idinsert;
                                proAli.Price = Convert.ToDouble(listpro[i].Price);
                                proAli.StoreID = StoreID;
                                proAli.UpdateTime = DateTime.Now;
                                if (brandID > 0)
                                {
                                    proAli.BrandID = brandID;
                                }
                                proAli.URL = listpro[i].Url;
                                proAli.IsMain = false;
                                proAli.IsActive = true;
                                db.AliasProducts.Add(proAli);
                                db.SaveChanges();
                            }

                        }

                        // lấy id để lưu vào bảng productAtribute
                        int idCPU1 = 0;
                        int idVGA2 = 0;
                        int idHDD3 = 0;
                        int idDisplay4 = 0;
                        int idRam5 = 0;
                        // id CPU 1
                        for (int x = 0; x < listCPU.Count; x++)
                        {
                            int dicID = listCPU[x].ID;
                            var DictionaryCPU = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicCPU = DictionaryCPU.ToList();
                            for (int z = 0; z < listDicCPU.Count; z++)
                            {
                                if (listpro[i].CPU.Trim().Equals(listDicCPU[z].Name.Trim()))
                                {
                                    idCPU1 = listCPU[x].ID;
                                    break;
                                }
                            }

                        }
                        if (idCPU1 == 0)
                        {
                            Hardware atcpu = new Hardware();
                            atcpu.CodetypeID = "C";
                            atcpu.Name = listpro[i].CPU;
                            atcpu.WeightCriteraPoint = 0;
                        //    atcpu.IsActive = false;
                            db.Hardwares.Add(atcpu);
                            db.SaveChanges();
                            var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idCPU1 = Convert.ToInt32(cpunew.ID);

                            // lưu name vào Attibute Alias và để isactive là false
                            Dictionary atcpuMap = new Dictionary();
                            atcpuMap.AttributeDicID = cpunew.ID;
                            atcpuMap.Name = listpro[i].CPU;
                            atcpuMap.IsActive = true;
                            db.Dictionaries.Add(atcpuMap);
                            db.SaveChanges();

                        }
                        //nếu List CPU là rỗng
                        if (listCPU.Count == 0 && idCPU1 == 0)
                        {
                            Hardware atcpu = new Hardware();
                            atcpu.CodetypeID = "C";
                            atcpu.Name = listpro[i].CPU;
                         //   atcpu.IsActive = false;
                            atcpu.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atcpu);
                            db.SaveChanges();
                            var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idCPU1 = Convert.ToInt32(cpunew.ID);

                            // lưu name vào Attibute Alias và để isactive là false
                            Dictionary atcpuMap = new Dictionary();
                            atcpuMap.AttributeDicID = cpunew.ID;
                            atcpuMap.Name = listpro[i].CPU;
                            atcpuMap.IsActive = true;
                            db.Dictionaries.Add(atcpuMap);
                            db.SaveChanges();

                        }
                        // id VGA 2
                        for (int x = 0; x < listVGA.Count; x++)
                        {
                            int dicID = listVGA[x].ID;
                            var DictionaryVGA = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicVGA = DictionaryVGA.ToList();
                            for (int z = 0; z < listDicVGA.Count; z++)
                            {
                                if (listpro[i].VGA.Trim().Equals(listDicVGA[z].Name.Trim()))
                                {
                                    idVGA2 = listVGA[x].ID;
                                    break;
                                }
                            }

                        }
                        if (idVGA2 == 0)
                        {
                            Hardware atvga = new Hardware();
                            atvga.CodetypeID = "V";
                            atvga.Name = listpro[i].VGA;
                       //     atvga.IsActive = false;
                            atvga.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atvga);
                            db.SaveChanges();
                            var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idVGA2 = Convert.ToInt32(vganew.ID);

                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary atvgaMap = new Dictionary();
                            atvgaMap.AttributeDicID = vganew.ID;
                            atvgaMap.Name = listpro[i].VGA;
                            atvgaMap.IsActive = true;
                            db.Dictionaries.Add(atvgaMap);

                        }
                        // nếu list VGA là rỗng
                        if (listVGA.Count == 0 && idVGA2 == 0)
                        {
                            Hardware atvga = new Hardware();
                            atvga.CodetypeID = "V";
                            atvga.Name = listpro[i].VGA;
                      //      atvga.IsActive = false;
                            atvga.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atvga);
                            db.SaveChanges();
                            var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idVGA2 = Convert.ToInt32(vganew.ID);

                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary atvgaMap = new Dictionary();
                            atvgaMap.AttributeDicID = vganew.ID;
                            atvgaMap.Name = listpro[i].VGA;
                            atvgaMap.IsActive = true;
                            db.Dictionaries.Add(atvgaMap);

                        }
                        // id HDD 3
                        for (int x = 0; x < listHDD.Count; x++)
                        {
                            int dicID = listHDD[x].ID;
                            var DictionaryHDD = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicHDD = DictionaryHDD.ToList();
                            for (int z = 0; z < listDicHDD.Count; z++)
                            {
                                if (listpro[i].HDD.Trim().Equals(listDicHDD[z].Name.Trim()))
                                {
                                    idHDD3 = listHDD[x].ID;
                                    break;
                                }
                            }

                        }
                        if (idHDD3 == 0)
                        {
                            Hardware athddd = new Hardware();
                            athddd.CodetypeID = "H";
                            athddd.Name = listpro[i].HDD;
                       //     athddd.IsActive = false;
                            athddd.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athddd);
                            db.SaveChanges();
                            var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idHDD3 = Convert.ToInt32(hddnew.ID);

                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athdddMap = new Dictionary();
                            athdddMap.AttributeDicID = hddnew.ID;
                            athdddMap.Name = listpro[i].HDD;
                            athdddMap.IsActive = true;
                            db.Dictionaries.Add(athdddMap);

                        }
                        // nếu list HDD là rỗng
                        if (listHDD.Count == 0 && idHDD3 == 0)
                        {
                            Hardware athddd = new Hardware();
                            athddd.CodetypeID = "H";
                            athddd.Name = listpro[i].HDD;
                            athddd.WeightCriteraPoint = 0;
                      //      athddd.IsActive = false;
                            db.Hardwares.Add(athddd);
                            db.SaveChanges();
                            var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idHDD3 = Convert.ToInt32(hddnew.ID);

                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athdddMap = new Dictionary();
                            athdddMap.AttributeDicID = hddnew.ID;
                            athdddMap.Name = listpro[i].HDD;
                            athdddMap.IsActive = true;
                            db.Dictionaries.Add(athdddMap);

                        }
                        // id Display 4
                        for (int x = 0; x < listDisplay.Count; x++)
                        {
                            int dicID = listDisplay[x].ID;
                            var DictionaryDisplay = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicDisplay = DictionaryDisplay.ToList();
                            for (int z = 0; z < listDicDisplay.Count; z++)
                            {
                                if (listpro[i].Display.Trim().Equals(listDicDisplay[z].Name.Trim()))
                                {
                                    idDisplay4 = listDisplay[x].ID;
                                    break;
                                }
                            }

                        }
                        if (idDisplay4 == 0)
                        {
                            Hardware athdisp = new Hardware();
                            athdisp.CodetypeID = "D";
                            athdisp.Name = listpro[i].Display;
                            athdisp.WeightCriteraPoint = 0;
                     //       athdisp.IsActive = false;
                            db.Hardwares.Add(athdisp);
                            db.SaveChanges();
                            var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idDisplay4 = Convert.ToInt32(dispnew.ID);

                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athdispMap = new Dictionary();
                            athdispMap.AttributeDicID = dispnew.ID;
                            athdispMap.Name = listpro[i].Display;
                            athdispMap.IsActive = true;
                            db.Dictionaries.Add(athdispMap);
                            db.SaveChanges();

                        }
                        // nếu list Display là rỗng
                        if (listDisplay.Count == 0 && idDisplay4 == 0)
                        {

                            Hardware athdisp = new Hardware();
                            athdisp.CodetypeID = "D";
                            athdisp.Name = listpro[i].Display;
                            athdisp.WeightCriteraPoint = 0;
                   //         athdisp.IsActive = false;
                            db.Hardwares.Add(athdisp);
                            db.SaveChanges();
                            var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idDisplay4 = Convert.ToInt32(dispnew.ID);
                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athdispMap = new Dictionary();
                            athdispMap.AttributeDicID = dispnew.ID;
                            athdispMap.Name = listpro[i].Display;
                            athdispMap.IsActive = true;
                            db.Dictionaries.Add(athdispMap);
                            db.SaveChanges();

                        }
                        // id Ram
                        for (int x = 0; x < listRam.Count; x++)
                        {
                            int dicID = listRam[x].ID;
                            var DictionaryRam = (from a in db.Dictionaries where a.AttributeDicID == dicID select a);
                            List<Dictionary> listDicRam = DictionaryRam.ToList();
                            for (int z = 0; z < listDicRam.Count; z++)
                            {
                                if (listpro[i].RAM.Trim().Equals(listDicRam[z].Name.Trim()))
                                {
                                    idRam5 = listRam[x].ID;
                                    break;
                                }
                            }

                        }
                        if (idRam5 == 0)
                        {
                            Hardware athram = new Hardware();
                            athram.CodetypeID = "R";
                            athram.Name = listpro[i].RAM;
                            athram.WeightCriteraPoint = 0;
                  //          athram.IsActive = false;
                            db.Hardwares.Add(athram);
                            db.SaveChanges();
                            var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idRam5 = Convert.ToInt32(ramnew.ID);
                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athramMap = new Dictionary();
                            athramMap.AttributeDicID = ramnew.ID;
                            athramMap.Name = listpro[i].RAM;
                            athramMap.IsActive = true;
                            db.Dictionaries.Add(athramMap);

                        }
                        // nếu list Ram là rỗng
                        if (listRam.Count == 0 && idRam5 == 0)
                        {
                            Hardware athram = new Hardware();
                            athram.CodetypeID = "R";
                            athram.Name = listpro[i].RAM;
                            athram.WeightCriteraPoint = 0;
                  //          athram.IsActive = false;
                            db.Hardwares.Add(athram);
                            db.SaveChanges();
                            var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idRam5 = Convert.ToInt32(ramnew.ID);
                            // lưu name vào Attibute Alias và để isactive là true
                            Dictionary athramMap = new Dictionary();
                            athramMap.AttributeDicID = ramnew.ID;
                            athramMap.Name = listpro[i].RAM;
                            athramMap.IsActive = true;
                            db.Dictionaries.Add(athramMap);

                        }
                        // lấy id của sản phẩm mới được insert vào db
                        var pronewinsert = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        int idinsertnew = Convert.ToInt32(pronewinsert.ID);

                        //1 lưu idcpu vào bảng ProductAttribute
                        ProductAttribute atProCPU = new ProductAttribute();
                        atProCPU.AttributeID = idCPU1;
                        if (idCPU1 > idBig)
                        {
                            atProCPU.IsActive = false;
                        }
                        else
                        {
                            atProCPU.IsActive = true;
                        }
                        atProCPU.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProCPU);
                        db.SaveChanges();
                        //2 lưu idRam vào bảng ProductAttribute
                        ProductAttribute atProRam = new ProductAttribute();
                        atProRam.AttributeID = idRam5;
                        if (idRam5 > idBig)
                        {
                            atProRam.IsActive = false;
                        }
                        else
                        {
                            atProRam.IsActive = true;
                        }
                        atProRam.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProRam);
                        db.SaveChanges();
                        //3 lưu idhdd vào bảng ProductAttribute
                        ProductAttribute atProHDD = new ProductAttribute();
                        atProHDD.AttributeID = idHDD3;
                        if (idHDD3 > idBig)
                        {
                            atProHDD.IsActive = false;
                        }
                        else
                        {
                            atProHDD.IsActive = true;
                        }
                        atProHDD.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProHDD);
                        db.SaveChanges();
                        //4 lưu idDisplay vào bảng ProductAttribute
                        ProductAttribute atProDisp = new ProductAttribute();
                        atProDisp.AttributeID = idDisplay4;
                        if (idDisplay4 > idBig)
                        {
                            atProDisp.IsActive = false;
                        }
                        else
                        {
                            atProDisp.IsActive = true;
                        }
                        atProDisp.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProDisp);
                        db.SaveChanges();
                        //5 lưu idvag vào bảng ProductAttribute
                        ProductAttribute atProVAG = new ProductAttribute();
                        atProVAG.AttributeID = idVGA2;
                        if (idVGA2 > idBig)
                        {
                            atProVAG.IsActive = false;
                        }
                        else
                        {
                            atProVAG.IsActive = true;
                        }
                        atProVAG.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProVAG);
                        db.SaveChanges();

                        // xóa phần tử được add vào database ra khỏi list
                        listpro.Remove(listpro[i]);
                        i = i - 1;
                    }
                    #endregion
                }
                return RedirectToAction("index");
            }
        }
        /// <summary>
        /// Tách sản phẩm khi so trùng trong database
        /// </summary>
        /// <returns></returns>
        public ActionResult tachdatabase(String valuestach)
        {
            List<List<ProductMap>> listduplicatenew = (List<List<ProductMap>>)Session["listduplicatenew"];
            String[] tachdup = valuestach.ToString().Split('@');
            ProductMap proTach = new ProductMap();
            proTach.stt = tachdup[0];
            proTach.ten = tachdup[1];
            proTach.trongso = tachdup[2];
            proTach.loai = tachdup[3];

            int count11 = 0;
            // duyệt hết list duplicate lớn
            for (int i = 0; i < listduplicatenew.Count; i++)
            {
                // duyệt từng listduplicate nhỏ
                for (int j = 0; j < listduplicatenew[i].Count; j++)
                {
                    // nếu phát hiện list nào có chứa giá trị tách trả về
                    if (proTach.stt.Equals(listduplicatenew[i][j].stt))
                    {

                        // nếu tên thành phần bị thanh đổi thì
                        if (!proTach.ten.Equals(listduplicatenew[i][j].ten))
                        {
                            //----------------------------------------------------------------------------------------
                            // lấy database ra so trùng tên mới nếu trùng cho vào list trùng mới
                            List<Hardware> listproindatabase = new List<Hardware>();
                            var resource = (from x in db.Hardwares select x);
                            listproindatabase = resource.ToList();

                          // tìm sản phẩm trùng cho vào list trùng hoặc xóa đi :|
                            for (int h = 0; h < listproindatabase.Count; h++)
                            {
                                List<ProductMap> duplicateProduct = new List<ProductMap>();
                                    String Name = "";
                                    String[] mangten = proTach.ten.ToString().Split(';');
                                    if (mangten.Length >= 2)
                                    {
                                        Name = mangten[0];
                                    }
                                    else
                                    {
                                        Name = proTach.ten;
                                    }
                                    // nếu đã có trong database rồi thì xóa đi.
                                    if (listproindatabase[h].Name.ToString().Equals(Name))
                                    {
                                        listproindatabase.RemoveAt(h);
                                        listduplicatenew.RemoveAt(i);
                                        i--;
                                        break;
                                    }

                                    // lấy sản phầm trùng cho vào list trùng mới
                                    if (CompareStringHelper.CompareString(Name, listproindatabase[h].Name.ToString()) >= 80)
                                    {
                                        count11++;
                                        ProductMap pro = new ProductMap();
                                        pro.stt = listproindatabase[h].ID.ToString();
                                        pro.ten = listproindatabase[h].Name;
                                        pro.loai = listproindatabase[h].Codetype.Name;
                                        pro.trongso = listproindatabase[h].WeightCriteraPoint.ToString();

                                        //add list dup.
                                        duplicateProduct.Add(pro);
                                        duplicateProduct.Add(proTach);
                                        listduplicatenew.RemoveAt(i);
                                        i--;
                                    }

                                if (duplicateProduct.Count >= 2)
                                {
                                    listduplicatenew.Add(duplicateProduct);
                                    Session["listduplicatenew"] = listduplicatenew;
                                    break;
                                }
                            }
                            if(count11==0){
                                Hardware p = new Hardware();
                                p.IsActive = true;
                                String[] mangten = proTach.ten.ToString().Split(';');
                                if (mangten.Length >= 2)
                                {
                                    p.Name = mangten[0];
                                }
                                else
                                {
                                    p.Name = proTach.ten;
                                }
                                p.CodetypeID = proTach.loai;
                                p.WeightCriteraPoint = Convert.ToInt32(proTach.trongso);
                                db.Hardwares.Add(p);
                                db.SaveChanges();
                                // lấy max ID và thêm vào bảng alias
                                if (mangten.Length >= 1)
                                {
                                    var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                    int idinsert = Convert.ToInt32(pronew.ID);

                                    for (int h = 0; h < mangten.Length; h++)
                                    {
                                        Dictionary a = new Dictionary();
                                        a.Name = mangten[h];
                                        a.AttributeDicID = idinsert;
                                        db.Dictionaries.Add(a);
                                        db.SaveChanges();
                                    }

                                }
                                // xóa phần tử được add vào database ra khỏi list
                                listduplicatenew.RemoveAt(i);
                                i--;
                            }
                        }
                        // nếu vẫn là tên cũ thì lưu vào database
                        else
                        {
                            Hardware p = new Hardware();
                            p.IsActive = true;
                            String[] mangten = listduplicatenew[i][1].ten.ToString().Split(';');
                            if (mangten.Length >= 2)
                            {
                                p.Name = mangten[0];
                            }
                            else
                            {
                                p.Name = listduplicatenew[i][1].ten;
                            }

                            //lấy product trong database ra chỉ lấy Codetype bằng loai kiểm tra xem có trong database chưa @@.
                            List<Hardware> listproindatabase = new List<Hardware>();
                            String loai = listduplicatenew[i][1].loai;
                          var resource = (from x in db.Hardwares select x);
                         listproindatabase = resource.ToList();
                            int count = 0;
                            for (int t = 0; t < listproindatabase.Count; t++)
                            {
                                if (listproindatabase[t].Name.Equals(p.Name))
                                {
                                    count++;
                                }
                            }

                            if (count > 0)
                            {
                                listduplicatenew.RemoveAt(i);
                                Session["listduplicatenew"] = listduplicatenew;
                                break;
                            }
                            p.CodetypeID = listduplicatenew[i][1].loai;
                            p.WeightCriteraPoint = Convert.ToInt32(listduplicatenew[i][1].trongso);
                            db.Hardwares.Add(p);
                            db.SaveChanges();
                            // lấy max ID và thêm vào bảng alias
                            if (mangten.Length >= 2)
                            {
                                var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idinsert = Convert.ToInt32(pronew.ID);

                                for (int h = 1; h < mangten.Length; h++)
                                {

                                    //lấy product trong database ra chỉ lấy Codetype bằng loai kiểm tra xem có trong database chưa @@.
                                     List<Dictionary> listmap = new List<Dictionary>();
                                    var resource1 = (from x in db.Dictionaries  select x);
                                    listmap = resource1.ToList();
                                    int count1 = 0;
                                    for (int r = 0; r < listmap.Count; r++)
                                    {
                                        if (listmap[r].Name.Equals(mangten[h]))
                                        {
                                            count1++;
                                        }
                                    }
                                    if (count1 > 0)
                                    {
                                        break;
                                    }

                                    for (int t = 0; t < listproindatabase.Count; t++)
                                    {
                                        if (listproindatabase[t].Name.Equals(p.Name))
                                        {
                                            count++;
                                        }
                                    }
                                    Dictionary a = new Dictionary();
                                    a.Name = mangten[h];
                                    a.AttributeDicID = idinsert;
                                    a.IsActive = true;
                                    db.Dictionaries.Add(a);
                                    db.SaveChanges();
                                }

                            }
                            listduplicatenew.RemoveAt(i);
                            Session["listduplicatenew"] = listduplicatenew;
                            break;
                        }
                    }
                    if (count11 > 0)
                    {
                        break;
                    }
                }
                if (count11 > 0)
                {
                    break;
                }
            }
            ViewBag.listduplicatenew = (List<List<ProductMap>>)Session["listduplicatenew"];
            return View();
        }
        public static void InsertProductToDb(ProductData data, ProductParserCreator model)
        {
            //create list of Att
            List<Hardware> listAttDic = new List<Hardware>();
            if (data != null)
            {
                //Convert Price
                double valPrice = 0;
                if (!String.IsNullOrEmpty(data.Price))
                {
                    valPrice = PriceHelper.ConvertPrice(data.Price);
                }
                else
                {
                    valPrice = 0;
                }
                if (data.Image.Contains("default.jpg"))
                {
                    data.Image = "Images/I/default.jpg";
                }

                if (!String.IsNullOrEmpty(data.Name) && !String.IsNullOrEmpty(data.CPU) &&
                    !String.IsNullOrEmpty(data.HDD) && !String.IsNullOrEmpty(data.RAM) &&
                    !String.IsNullOrEmpty(data.VGA) && !String.IsNullOrEmpty(data.Display))
                {
                    using (var context = new CPS_SolutionEntities())
                    {
                        //Add table product
                        var prod = new Product
                        {
                            Description = "Chưa cập nhật ",
                            ImageURL = data.Image,
                            TotalWeightPoint = 0,
                            IsActive = null,
                        };
                        //Check for Store

                        var store = context.Stores.Where(x => model.ParseProductLink.Contains(x.StoreUrl)).FirstOrDefault();
                        int StoreID = 1;
                        string patter = "://|/";
                        Regex reg = new Regex(patter);
                        string host = reg.Split(model.ParseProductLink)[1];
                        if (store != null)
                        {
                            StoreID = store.ID;
                        }
                        else
                        {
                            var newStore = new Store
                            {
                                IsActive = false,
                                LogoImage = "default",
                                StoreUrl = host,
                                StoreName = "Chưa xác định",

                            };
                            context.Stores.Add(newStore);
                            context.SaveChanges();
                            StoreID = newStore.ID;
                        }

                        int brand = 13;
                        var allBrands = context.Brands.ToList();
                        foreach (var item in allBrands)
                        {
                            if (model.ParseProductLink.ToUpper().Contains(item.BrandName.ToUpper()))
                            {
                                brand = item.ID;
                            }
                            else if (model.ParseProductLink.ToUpper().Contains("MACBOOK"))
                            {
                                brand = 3;
                            }
                            else
                            {
                                brand = 12;
                            }
                        }

                        prod.AliasProducts.Add(new AliasProduct()
                                        {
                                            Name = data.Name,
                                            URL = model.ParseProductLink,
                                            Price = valPrice,
                                            StoreID = StoreID,
                                            IsMain = true,
                                            IsActive = true,
                                            UpdateTime = DateTime.Now,
                                            BrandID = brand
                                        });
                        context.Products.Add(prod);
                        context.SaveChanges();

                        List<KeyValuePair<string, string>> listofAttributes = new List<KeyValuePair<string, string>>();

                        var cpu = new KeyValuePair<string, string>(data.CPU, "C");
                        var ram = new KeyValuePair<string, string>(data.RAM, "R");
                        var vga = new KeyValuePair<string, string>(data.VGA, "V");
                        var hdd = new KeyValuePair<string, string>(data.HDD, "H");
                        var display = new KeyValuePair<string, string>(data.Display, "D");

                        listofAttributes.Add(cpu);
                        listofAttributes.Add(ram);
                        listofAttributes.Add(hdd);
                        listofAttributes.Add(vga);
                        listofAttributes.Add(display);
                        int count = 0;

                        //add 5 attribute for 1 product
                        foreach (var attribute in listofAttributes)
                        {

                            ////Check good match
                            var goodMatch = new List<int>();
                            var averageMatch = new List<int>();
                            int pId = -1;
                            bool wholeMatch = false;
                            string codeType = "C";

                            if (count == 1)
                            {
                                codeType = "R";
                            }
                            else if (count == 2)
                            {
                                codeType = "H";
                            }
                            else if (count == 3)
                            {
                                codeType = "V";
                            }
                            else if (count == 4)
                            {
                                codeType = "D";
                            }
                            count++;
                            foreach (var alias in context.Dictionaries.Where(x => x.Hardware.IsActive == true && x.Hardware.CodetypeID.Equals(codeType)))
                            {
                                if (attribute.Key == alias.Name)
                                {
                                    wholeMatch = true;
                                    pId = alias.AttributeDicID;

                                    break;
                                }
                                double matchPercent = CompareStringHelper.CompareString(attribute.Key, alias.Name);
                                //good match
                                if (matchPercent > 90)
                                {
                                    goodMatch.Add(alias.AttributeDicID);
                                }
                                // normal Match
                                if (matchPercent > 80)
                                {
                                    averageMatch.Add(alias.AttributeDicID);
                                }

                            }
                            if (!wholeMatch)
                            {
                                if (goodMatch.Count == 1)
                                {
                                    // Match well with only 1 product, take it
                                    pId = goodMatch[0];

                                }
                                else if (goodMatch.Count > 1)
                                {
                                    // Match well with more than 1 product, admin decide
                                    ExportTrainingFileForProduct(goodMatch, attribute.Key, prod.ID);
                                    continue;
                                }
                                else if (averageMatch.Count > 0 && pId == -1)
                                {
                                    // Only average match, admin decide
                                    ExportTrainingFileForProduct(averageMatch, attribute.Key, prod.ID);
                                    continue;
                                }
                            }

                            // If attDic alr Existed?
                            if (pId != -1)
                            {
                                var productAtt = new ProductAttribute
                                {
                                    ProductID = prod.ID,
                                    AttributeID = pId,
                                    IsActive = true
                                };
                                context.ProductAttributes.Add(productAtt);
                                context.SaveChanges();
                            }
                            else
                            {
                                //Add a new record
                                var newADitem = new Hardware { Name = attribute.Key, CodetypeID = attribute.Value, WeightCriteraPoint = 0 };

                                // Add new item for Product Attribute
                                var productAtt = new ProductAttribute
                                {
                                    ProductID = prod.ID,
                                    AttributeID = newADitem.ID,
                                };
                                try
                                {
                                    // Save change into DB
                                    context.Hardwares.Add(newADitem);
                                    context.ProductAttributes.Add(productAtt);
                                    context.SaveChanges();
                                    var aliasDic = new Dictionary
                                    {
                                        AttributeDicID = newADitem.ID,
                                        Name = newADitem.Name,
                                        IsActive = true,
                                    };
                                    context.Dictionaries.Add(aliasDic);
                                    context.SaveChanges();
                                }
                                catch (DbUpdateException)
                                {
                                    // Do nothing
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Sản phẩm lỗi đã được sửa.
        /// </summary>
        /// <param name="delstt"></param>
        /// <returns></returns>
        public ActionResult fixedErrorProduct(String stringpro)
        {
            if (!stringpro.Equals("nothing"))
            {
                // get list product in session.
                List<LapData> listpro = (List<LapData>)Session["listproductLap"];
                List<LapData> listerror = (List<LapData>)Session["ListerrorTraning"];
                // số sản phẩm lỗi trước khi được test
                int count1 = listerror.Count;
                List<List<LapData>> listduplicate = (List<List<LapData>>)Session["listduplicateLap"];
                String[] info = stringpro.ToString().Split('@');
                string stt = info[0]
                    ;
                string Name = info[1];
                string ImageLink = info[2];
                string CPU = info[3];
                string VGA = info[4];
                string HDD = info[5];
                string Display = info[6];
                string Ram = info[7];
                //gán vào list mới để kiểm tra
                List<LapData> newlisterror = listerror;
                foreach (LapData l in newlisterror)
                {
                    if (l.stt.Equals(stt))
                    {
                        l.Name = Name;
                        l.Imagelink = ImageLink;
                        l.CPU = CPU;
                        l.VGA = VGA;
                        l.HDD = HDD;
                        l.Display = Display;
                        l.RAM = Ram;
                        break;
                    }
                }
                List<LapData> newlisterror1 = ListErrorProduct(newlisterror);
                // gọi hàm kiểm tra lỗi và đếm xem có bao nhiêu sản phẩm lỗi
                int count2 = newlisterror1.Count;
                // nếu phát hiện số sản phẩm lỗi giảm đi 1 thì kiểm tra trùng với list pro và list dup, xóa trong list error
                if ((count1 - count2) == 1)
                {
                    // xóa sản phẩm trong list error và cập nhập vào session
                    LapData delpro = new LapData();
                    foreach (LapData p in newlisterror1)
                    {
                        if (p.stt.Equals(stt))
                        {
                            delpro = p;
                            break;
                        }
                    }
                    newlisterror1.Remove(delpro);
                    Session["ListerrorTraning"] = newlisterror1;
                    // xử lý sản phẩm lỗi đã được update.
                    LapData update = new LapData();
                    update.stt = stt;
                    update.Name = Name;
                    update.Imagelink = ImageLink;
                    update.CPU = CPU;
                    update.VGA = VGA;
                    update.HDD = HDD;
                    update.Display = Display;
                    update.RAM = Ram;

                    //----------------------------- kiểm tra sản phẩm trong listpro có bị trùng linh kiện ko---------------------------
                    #region Lấy CPU VGA HDD Display Ram cho vào danh sách riêng để kiểm tra trùng linh kiện
                    // lấy hết CPU trong db ra
                    var listCPUdb = (from a in db.Hardwares where a.CodetypeID.Equals("C") select a);
                    List<Hardware> listCPU = listCPUdb.ToList();
                    // lấy hết VGA trong db ra
                    var listVGAdb = (from a in db.Hardwares where a.CodetypeID.Equals("V") select a);
                    List<Hardware> listVGA = listVGAdb.ToList();
                    // lấy hết HDD trong db ra
                    var listHDDdb = (from a in db.Hardwares where a.CodetypeID.Equals("H") select a);
                    List<Hardware> listHDD = listHDDdb.ToList();
                    // lấy hết Display trong db ra
                    var listDisplaydb = (from a in db.Hardwares where a.CodetypeID.Equals("D") select a);
                    List<Hardware> listDisplay = listDisplaydb.ToList();
                    // lấy hết Ram trong db ra
                    var listRamdb = (from a in db.Hardwares where a.CodetypeID.Equals("R") select a);
                    List<Hardware> listRam = listRamdb.ToList();
                    #endregion

                    #region Kiểm tra trùng link kiện để ghilog txt
                    string errorCPU = "";
                    string errorVGA = "";
                    string errorHDD = "";
                    string errorDisplay = "";
                    string errorRam = "";
                    int errorCount = 0;
                    // trùng CPU 1
                    for (int x = 0; x < listCPU.Count; x++)
                    {
                        if (update.CPU.Equals(listCPU[x].Name))
                        {
                            break;
                        }
                        else if (CompareStringHelper.CompareString(update.CPU, listCPU[x].Name) >= 80)
                        {
                            //  listtrunglinhkien[1] += Convert.ToInt32(listpro[i].stt).ToString() + ",";
                            errorCount++;
                            errorCPU = listCPU[x].Name;
                            break;
                        }
                    }
                    // trùng VGA 2
                    for (int x = 0; x < listVGA.Count; x++)
                    {
                        if (update.VGA.Equals(listVGA[x].Name))
                        {
                            break;
                        }
                        else if (CompareStringHelper.CompareString(update.VGA, listVGA[x].Name) >= 80)
                        {
                            //  listtrunglinhkien[2] += Convert.ToInt32(listpro[i].stt).ToString() + ",";
                            errorCount++;
                            errorVGA = listVGA[x].Name;
                            break;
                        }
                    }
                    // trùng HDD 3
                    for (int x = 0; x < listHDD.Count; x++)
                    {
                        if (update.HDD.Equals(listHDD[x].Name))
                        {
                            break;
                        }
                        else if (CompareStringHelper.CompareString(update.HDD, listHDD[x].Name) >= 80)
                        {
                            //   listtrunglinhkien[3] += Convert.ToInt32(listpro[i].stt).ToString() + ",";
                            errorCount++;
                            errorHDD = listHDD[x].Name;
                            break;
                        }
                    }
                    // trùng Display 4
                    for (int x = 0; x < listDisplay.Count; x++)
                    {
                        if (update.Display.Equals(listDisplay[x].Name))
                        {
                            break;
                        }
                        else if (CompareStringHelper.CompareString(update.Display, listDisplay[x].Name) >= 80)
                        {
                            // listtrunglinhkien[4] += Convert.ToInt32(listpro[i].stt).ToString() + ",";
                            errorCount++;
                            errorDisplay = listDisplay[x].Name;
                            break;
                        }
                    }
                    // trùng Ram
                    for (int x = 0; x < listRam.Count; x++)
                    {
                        if (update.RAM.Equals(listRam[x].Name))
                        {
                            break;
                        }
                        else if (CompareStringHelper.CompareString(update.RAM, listRam[x].Name) >= 80)
                        {
                            // listtrunglinhkien[5] += Convert.ToInt32(listpro[i].stt).ToString() + ",";
                            errorCount++;
                            errorRam = listRam[x].Name;
                            break;
                        }
                    }
                    #endregion
                    #region  lưu product và product alias
                    Product pro1 = new Product();
                    pro1.ImageURL = update.Imagelink;
                    pro1.Price = 0;
                    pro1.TotalWeightPoint = 0;
                    pro1.IsActive = false;

                    // lưu vào database
                    db.Products.Add(pro1);
                    db.SaveChanges();

                    String[] mangten = update.Name.ToString().Split(';');
                    // nếu mảng tên >=2 thì lưu cái tên đầu tiên làm tên chính.
                    if (mangten.Length >= 2)
                    {
                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        int idinsert = Convert.ToInt32(pronew.ID);
                        AliasProduct proAli = new AliasProduct();
                        proAli.Name = mangten[0];
                        proAli.ProductID = idinsert;
                        proAli.IsMain = true;
                        proAli.IsActive = true;
                        db.AliasProducts.Add(proAli);
                        db.SaveChanges();
                    }
                    // nếu không thì lưu làm tên chính luôn.
                    else
                    {
                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        int idinsert = Convert.ToInt32(pronew.ID);
                        AliasProduct proAli = new AliasProduct();
                        proAli.Name = mangten[0];
                        proAli.ProductID = idinsert;
                        proAli.IsMain = true;
                        proAli.IsActive = true;
                        db.AliasProducts.Add(proAli);
                        db.SaveChanges();
                    }

                    // lấy max ID và thêm vào bảng alias tên phụ
                    if (mangten.Length >= 2)
                    {
                        // lấy id của sản phẩm mới được insert vào db
                        var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        int idinsert = Convert.ToInt32(pronew.ID);
                        // bỏ tên đầu tiên vì lưu làm tên chính rồi lưu tên phụ
                        for (int h = 1; h < mangten.Length; h++)
                        {
                            AliasProduct proAli = new AliasProduct();
                            proAli.Name = mangten[h];
                            proAli.ProductID = idinsert;
                            proAli.IsMain = false;
                            proAli.IsActive = true;
                            db.AliasProducts.Add(proAli);
                            db.SaveChanges();
                        }

                    }
                    #endregion
                    string[] lines = null;
                    // lấy txt ra
                    string path = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
                    if (System.IO.File.Exists(path))
                    {
                        lines = System.IO.File.ReadAllLines(path);
                    }
                    string[] newline = new string[errorCount];
                    // lấy id để lưu vào bảng productAtribute
                    int idCPU1 = 0;
                    int idVGA2 = 0;
                    int idHDD3 = 0;
                    int idDisplay4 = 0;
                    int idRam5 = 0;
                    // vị trí lưu trong mảng newline
                    int vitriluu = 0;
                    // id CPU 1
                    #region
                    // nếu có trong database rồi thì lấy ID sản phẩm có rồi
                    for (int x = 0; x < listCPU.Count; x++)
                    {
                        if (update.CPU.Equals(listCPU[x].Name))
                        {
                            idCPU1 = listCPU[x].ID;
                            break;
                        }
                    }
                    // nếu chưa có
                    if (idCPU1 == 0)
                    {   // chưa có mà bị trùng trong database thì ghi log
                        if (!errorCPU.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorCPU + ';' + update.CPU;
                            vitriluu++;
                            //   break;
                        }
                        else
                        {
                            // Lưu mới CPU và get ID mới lưu
                            Hardware atcpu = new Hardware();
                            atcpu.CodetypeID = "C";
                            atcpu.Name = update.CPU;
                            atcpu.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atcpu);
                            db.SaveChanges();
                            var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idCPU1 = Convert.ToInt32(cpunew.ID);
                            //  break;
                        }
                    }

                    //nếu List CPU là rỗng
                    if (listCPU.Count == 0)
                    {
                        if (!errorCPU.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[0] = idpro.ToString() + '~' + errorCPU + ';' + update.CPU;
                            vitriluu++;
                        }
                        else
                        {
                            Hardware atcpu = new Hardware();
                            atcpu.CodetypeID = "C";
                            atcpu.Name = update.CPU;
                            atcpu.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atcpu);
                            db.SaveChanges();
                            var cpunew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idCPU1 = Convert.ToInt32(cpunew.ID);
                        }
                    }
                    #endregion
                    // id VGA 2
                    #region
                    // kiểm tra xem có trong database chưa có rồi thì lấy ID đã có
                    for (int x = 0; x < listVGA.Count; x++)
                    {
                        if (update.VGA.Equals(listVGA[x].Name))
                        {
                            idVGA2 = listVGA[x].ID;
                            break;
                        }
                    }
                    // nếu chưa có trong database
                    if (idVGA2 == 0)
                    {
                        // nếu VGA là trùng
                        if (!errorVGA.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorVGA + ';' + update.VGA;
                            vitriluu++;
                            //  break;
                        }
                        // ko trùng thì lưu VGA mới vào database và lấy ID
                        else
                        {

                            Hardware atvga = new Hardware();
                            atvga.CodetypeID = "V";
                            atvga.Name = update.VGA;
                            atvga.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atvga);
                            db.SaveChanges();
                            var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idVGA2 = Convert.ToInt32(vganew.ID);
                            // break;
                        }
                    }
                    // nếu list VGA là rỗng
                    if (listVGA.Count == 0)
                    {
                        // nếu VGA là trùng
                        if (!errorVGA.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorVGA + ';' + update.VGA;
                            vitriluu++;
                        }
                        // ko trùng thì lưu VGA mới vào database và lấy ID
                        else
                        {
                            Hardware atvga = new Hardware();
                            atvga.CodetypeID = "V";
                            atvga.Name = update.VGA;
                            atvga.WeightCriteraPoint = 0;
                            db.Hardwares.Add(atvga);
                            db.SaveChanges();
                            var vganew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idVGA2 = Convert.ToInt32(vganew.ID);
                        }
                    }
                    #endregion
                    // id HDD 3
                    #region
                    // nếu có rồi trong database thì lấy ID ra
                    for (int x = 0; x < listHDD.Count; x++)
                    {
                        if (update.HDD.Equals(listHDD[x].Name))
                        {
                            idHDD3 = listHDD[x].ID;
                            break;
                        }
                    }
                    // nếu chưa có trong database
                    if (idHDD3 == 0)
                    {
                        // nếu HDD là trùng
                        if (!errorHDD.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorHDD + ';' + update.HDD;
                            vitriluu++;
                            //  break;
                        }
                        // ko trùng thì lưu HDD mới vào database và lấy ID
                        else
                        {
                            Hardware athddd = new Hardware();
                            athddd.CodetypeID = "H";
                            athddd.Name = update.HDD;
                            athddd.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athddd);
                            db.SaveChanges();
                            var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idHDD3 = Convert.ToInt32(hddnew.ID);
                            // break;
                        }
                    }
                    // nếu list HDD là rỗng
                    if (listHDD.Count == 0)
                    {
                        // nếu HDD là trùng
                        if (!errorHDD.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorHDD + ';' + update.HDD;
                            vitriluu++;
                        }
                        // ko trùng thì lưu HDD mới vào database và lấy ID
                        else
                        {
                            Hardware athddd = new Hardware();
                            athddd.CodetypeID = "H";
                            athddd.Name = update.HDD;
                            athddd.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athddd);
                            db.SaveChanges();
                            var hddnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idHDD3 = Convert.ToInt32(hddnew.ID);
                        }
                    }
                    #endregion
                    // id Display 4
                    #region
                    // nếu có rồi trong database thì lấy id ra
                    for (int x = 0; x < listDisplay.Count; x++)
                    {
                        if (update.Display.Equals(listDisplay[x].Name))
                        {
                            idDisplay4 = listDisplay[x].ID;
                            break;
                        }
                    }
                    // nếu chưa có trong database
                    if (idDisplay4 == 0)
                    {
                        {
                            // nếu Display là trùng
                            if (!errorDisplay.Equals(""))
                            {
                                var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                int idpro = Convert.ToInt32(pronew.ID);
                                newline[vitriluu] = idpro.ToString() + '~' + errorDisplay + ';' + update.Display;
                                vitriluu++;
                                // break;
                            }
                            // ko trùng thì lưu Display mới vào database và lấy ID
                            else
                            {
                                Hardware athdisp = new Hardware();
                                athdisp.CodetypeID = "D";
                                athdisp.Name = update.Display;
                                athdisp.WeightCriteraPoint = 0;
                                db.Hardwares.Add(athdisp);
                                db.SaveChanges();
                                var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                                idDisplay4 = Convert.ToInt32(dispnew.ID);
                                //  break;
                            }
                        }
                    }
                    // nếu list Display là rỗng
                    if (listDisplay.Count == 0)
                    {
                        // nếu Display là trùng
                        if (!errorDisplay.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorDisplay + ';' + update.Display;
                            vitriluu++;
                        }
                        // ko trùng thì lưu Display mới vào database và lấy ID
                        else
                        {
                            Hardware athdisp = new Hardware();
                            athdisp.CodetypeID = "D";
                            athdisp.Name = update.Display;
                            athdisp.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athdisp);
                            db.SaveChanges();
                            var dispnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idDisplay4 = Convert.ToInt32(dispnew.ID);
                        }
                    }
                    #endregion
                    // id Ram
                    #region
                    // nếu có rồi trong database thì lấy id ra
                    for (int x = 0; x < listRam.Count; x++)
                    {
                        if (update.RAM.Equals(listRam[x].Name))
                        {
                            idRam5 = listRam[x].ID;
                            break;
                        }
                    }
                    // nếu chưa có trong database
                    if (idRam5 == 0)
                    {
                        // nếu Ram là trùng ghi log
                        if (!errorRam.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorRam + ';' + update.RAM;
                            vitriluu++;
                            // break;
                        }
                        // ko trùng thì lưu Ram mới vào database và lấy ID
                        else
                        {
                            Hardware athram = new Hardware();
                            athram.CodetypeID = "R";
                            athram.Name = update.RAM;
                            athram.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athram);
                            db.SaveChanges();
                            var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idRam5 = Convert.ToInt32(ramnew.ID);
                            //  break;
                        }
                    }

                    // nếu list Ram là rỗng
                    if (listRam.Count == 0)
                    {
                        // nếu Ram là trùng ghi log
                        if (!errorRam.Equals(""))
                        {
                            var pronew = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idpro = Convert.ToInt32(pronew.ID);
                            newline[vitriluu] = idpro.ToString() + '~' + errorRam + ';' + update.RAM;
                            vitriluu++;
                        }
                        // ko trùng thì lưu Display mới vào database và lấy ID
                        else
                        {
                            Hardware athram = new Hardware();
                            athram.CodetypeID = "R";
                            athram.Name = update.RAM;
                            athram.WeightCriteraPoint = 0;
                            db.Hardwares.Add(athram);
                            db.SaveChanges();
                            var ramnew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            idRam5 = Convert.ToInt32(ramnew.ID);
                        }
                    }
                    #endregion
                    #region  Gộp hai mảng lại thành một rồi ghi đè lại vào file txt
                    //Gộp hai bảng thành mảng mới và lưu vào txt lại
                    string[] save = new string[lines.Length + newline.Length];
                    for (int e = 0; e < lines.Length; e++)
                    {
                        save[e] = lines[e];
                    }
                    for (int e = 0; e < newline.Length; e++)
                    {
                        save[e + lines.Length] = newline[e];
                    }
                    // ghi lại vào txt
                    System.IO.File.WriteAllLines(path, save);
                    #endregion

                    #region Lưu vào bảng productAtribute
                    // lấy id của sản phẩm mới được insert vào db
                    var pronewinsert = db.Products.OrderByDescending(pro => pro.ID).FirstOrDefault();
                    int idinsertnew = Convert.ToInt32(pronewinsert.ID);

                    // nếu CPU không trùng database
                    if (errorCPU.Equals(""))
                    {
                        //1 lưu idcpu vào bảng ProductAttribute
                        ProductAttribute atProCPU = new ProductAttribute();
                        atProCPU.AttributeID = idCPU1;
                        atProCPU.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProCPU);
                        db.SaveChanges();
                    }
                    if (errorRam.Equals(""))
                    {
                        //2 lưu idRam vào bảng ProductAttribute
                        ProductAttribute atProRam = new ProductAttribute();
                        atProRam.AttributeID = idRam5;
                        atProRam.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProRam);
                        db.SaveChanges();
                    }
                    if (errorHDD.Equals(""))
                    {
                        //3 lưu idhdd vào bảng ProductAttribute
                        ProductAttribute atProHDD = new ProductAttribute();
                        atProHDD.AttributeID = idHDD3;
                        atProHDD.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProHDD);
                        db.SaveChanges();
                    }
                    if (errorDisplay.Equals(""))
                    {
                        //4 lưu idDisplay vào bảng ProductAttribute
                        ProductAttribute atProDisp = new ProductAttribute();
                        atProDisp.AttributeID = idDisplay4;
                        atProDisp.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProDisp);
                        db.SaveChanges();
                    }
                    if (errorVGA.Equals(""))
                    {
                        //5 lưu idvag vào bảng ProductAttribute
                        ProductAttribute atProVAG = new ProductAttribute();
                        atProVAG.AttributeID = idVGA2;
                        atProVAG.ProductID = idinsertnew;
                        db.ProductAttributes.Add(atProVAG);
                        db.SaveChanges();
                    }

                    #endregion

                }
                // update listerrorLap
                if ((count1 - count2) == 0)
                {
                    Session["ListerrorTraning"] = newlisterror1;
                }

            }

            ViewBag.ListerrorTraning = (List<LapData>)Session["ListerrorTraning"];
            // quá nhiều lỗi hiện thị ra dòng và sản phẩm bị lỗi.
            ViewBag.danhsachlaploi = (List<LapData>)Session["danhsachlaploi"];
            // dòng chứa lỗi
            ViewBag.errorLineLap = Session["errorLineLap1"];
            return View();
        }
        public ActionResult saveAllProduct(String checkval)
        {
            // get list product in session.
            List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
            List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];

            //ghi logfile---------------------------------------------------------------------------------
            String[] ghilog = checkval.ToString().Split('@');

            // nếu có check  ghilog Duplicate
            #region ghilog Duplicate
            if (!ghilog[0].Equals("no")&&listduplicate!=null)
            {
                // lấy dữ liệu trong file text traning ra LapDataTraning;
                string path = Server.MapPath("~/UploadedExcelFiles/ProductName.txt");
                if (System.IO.File.Exists(path))
                {   // lấy hết dòng trong file txt ra.
                    string[] lines = System.IO.File.ReadAllLines(path);
                    // tảo mảng mới chứa dữ dữ liệu trùng.
                    string[] newlines = new string[listduplicate.Count];
                    for (int i = 0; i < listduplicate.Count; i++)
                    {
                        string newline = "";
                        for (int j = 0; j < listduplicate[i].Count; j++)
                        {
                            newline += listduplicate[i][j].ten + "|" + listduplicate[i][j].loai + "|" +
                                       listduplicate[i][j].trongso + "#";
                        }
                        newline = newline.Substring(0, newline.Length - 1);
                        newlines[i] = newline;
                    }
                    //Gộp hai bảng thành mảng mới và lưu vào txt lại
                    string[] save = new string[lines.Length + newlines.Length];
                    for (int i = 0; i < lines.Length; i++)
                    {
                        save[i] = lines[i];
                    }
                    for (int i = 0; i < newlines.Length; i++)
                    {
                        save[i + lines.Length] = newlines[i];
                    }
                    // ghi lại vào txt
                    System.IO.File.WriteAllLines(path, save);
                }

            }
            #endregion
            Session["listduplicate"] = null;
            // nếu có check ghilog Error
            if (!ghilog[1].Equals("no"))
            {
                // LogFileHelper.LogfileThanhPhanloi(listerror);
                // xóa session error

            }
            Session["listerror"] = null;

            // Tạo listduplicate mới chứa trùng giữa listpro và trong database
            List<List<ProductMap>> listduplicatenew = new List<List<ProductMap>>();

            //lấy product trong database ra chỉ lấy Codetype bằng loai.
            List<Hardware> listproindatabase = new List<Hardware>();
            var resource = (from x in db.Hardwares select x);
            listproindatabase = resource.ToList();

            // tìm sản phẩm trùng với database cho vào list trùng hoặc xóa đi :|
            for (int j = 0; j < listproindatabase.Count; j++)
            {

                List<ProductMap> duplicateProduct = new List<ProductMap>();
                for (int i = 0; i < listpro.Count; i++)
                {
                    String Name = "";
                    String[] mangten = listpro[i].ten.ToString().Split(';');
                    if (mangten.Length >= 2)
                    {
                        Name = mangten[0];
                    }
                    else
                    {
                        Name = listpro[i].ten;
                    }
                    // nếu đã có trong database rồi thì xóa đi.
                    if (listproindatabase[j].Name.Trim().ToString().Equals(Name.Trim()))
                    {
                        listproindatabase.RemoveAt(j);
                        listpro.RemoveAt(i);
                        i--;
                        j--;
                        break;
                    }

                    // lấy sản phầm trùng cho vào list trùng mới
                    if (CompareStringHelper.CompareString(Name, listproindatabase[j].Name.ToString()) >= 80)
                    {
                        ProductMap pro = new ProductMap();
                        pro.stt = listproindatabase[j].ID.ToString();
                        pro.ten = listproindatabase[j].Name;
                        pro.loai = listproindatabase[j].CodetypeID;
                        pro.trongso = listproindatabase[j].WeightCriteraPoint.ToString();

                        //add list dup.
                        duplicateProduct.Add(pro);
                        listpro[i].stt = "z" + listpro[i].stt;
                        duplicateProduct.Add(listpro[i]);
                        listpro.RemoveAt(i);
                        i--;
                    }

                }
                if (duplicateProduct.Count >= 2)
                {
                    listduplicatenew.Add(duplicateProduct);
                    Session["listduplicatenew"] = listduplicatenew;
                }
            }

            // lưu vào database
            for (int i = 0; i < listpro.Count; i++)
            {
                Hardware p = new Hardware();

                String[] mangten = listpro[i].ten.ToString().Split(';');
                if (mangten.Length >= 2)
                {
                    p.Name = mangten[0];
                }
                else
                {
                    p.Name = listpro[i].ten;
                }
                p.CodetypeID = listpro[i].loai;
                p.WeightCriteraPoint = Convert.ToInt32(listpro[i].trongso);
                p.IsActive = true;
                db.Hardwares.Add(p);
                db.SaveChanges();
                // lấy max ID và thêm vào bảng alias
                if (mangten.Length >= 1)
                {
                    var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                    int idinsert = Convert.ToInt32(pronew.ID);

                    for (int h = 0; h < mangten.Length; h++)
                    {
                        Dictionary a = new Dictionary();
                        a.Name = mangten[h];
                        a.AttributeDicID = idinsert;
                        a.IsActive = true;
                        db.Dictionaries.Add(a);
                        db.SaveChanges();
                    }

                }
                // xóa phần tử được add vào database ra khỏi list
                listpro.Remove(listpro[i]);
                i = i - 1;
            }
            Session["listduplicatenew"] = listduplicatenew;
            ViewBag.listduplicatenew = (List<List<ProductMap>>)Session["listduplicatenew"];
            return RedirectToAction("index");
        }
        public string MappingLaptop(String HardInfo)
        {
            String[] info = HardInfo.ToString().Split('@');
            string stt = info[0].Trim();
            int numstt = Convert.ToInt32(stt);
            string newstt = info[1];
            string newName = info[2];

            // Trường hợp mapping
            if (!newstt.Trim().Equals("0"))
            {
                // những hardware mới vào chưa kích hoạt.
                var unConfrimedProducts = db.Hardwares.Where(x => x.IsActive == null).ToList();
                // tìm tới hardware có id = stt

                var product = db.Products.Where(x => x.ID.Equals(numstt)).SingleOrDefault();
                product.Name = newName;
                product.IsActive = false;
                db.SaveChanges();
                int id = product.ID;
                var aliasPro = db.AliasProducts.Where(x => x.ProductID.Equals(id)).ToList();
                foreach (AliasProduct ali in aliasPro)
                {
                    ali.ProductID = Convert.ToInt32(newstt);
                    ali.IsMain = false;
                    ali.Name = newName;
                    db.SaveChanges();
                }
            }
            // trường hợp kích hoạt cả product cả hardware.
            else
            {
                // đổi tên laptop.
                var product = db.Products.Where(x => x.ID.Equals(numstt)).SingleOrDefault();
                product.Name = newName;
                int id12 = product.ID;
                db.SaveChanges();
                var aliasPro = db.AliasProducts.Where(x => x.ProductID.Equals(id12)).ToList();
                foreach (AliasProduct ali in aliasPro)
                {
                    ali.Name = newName;
                    db.SaveChanges();
                }
                for (int i = 3; i < info.Length; i++)
                {
                    String[] list = info[i].ToString().Split('|');
                    int numstt1 = Convert.ToInt32(list[0]);
                    string newstt1 = list[1];
                    string productid1 = stt;
                    int numProductid = Convert.ToInt32(stt);
                    string newNameHard = list[2].Trim();
                    // nếu không chọn hardware để map thì active nó
                    if (newstt1.Trim().Equals("0"))
                    {
                        int id = Convert.ToInt32(list[0]);
                        var hardware = db.Hardwares.FirstOrDefault(x => x.ID == id);
                        // Nếu hardware chưa map gì cả
                        if (hardware.IsActive == null)
                        {
                            // khi active thì tìm tất cả các sản phẩm có tên tương tự để kích hoạt trong bảng product atribute.
                            var ProAtt = db.ProductAttributes.Where(x => x.AttributeID == id).ToList();
                            if (ProAtt != null)
                            {
                                foreach (ProductAttribute pro in ProAtt)
                                {
                                    pro.IsActive = true;
                                }
                            }
                            if (hardware != null)
                            {
                                if (hardware.IsActive == null)
                                {
                                    hardware.Name = newNameHard;
                                    hardware.IsActive = true;

                                }
                            }
                            db.SaveChanges();
                        }
                         // nếu hardware đã map giờ bỏ map để tạo mới @@
                        else
                        {
                            // tạo ra 1 hardware mới.
                            Hardware newH = new Hardware();
                            newH.CodetypeID = hardware.CodetypeID;
                            newH.Name = newNameHard;
                            newH.WeightCriteraPoint = 0;
                            newH.IsActive = true;
                            db.Hardwares.Add(newH);
                            db.SaveChanges();
                            var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            Dictionary newD = new Dictionary();
                            newD.AttributeDicID = pronew.ID;
                            newD.Name = pronew.Name;
                            newD.IsActive = true;
                            db.Dictionaries.Add(newD);
                            db.SaveChanges();
                            // map lại vào attribute sản phẩm
                            var ProAtt = db.ProductAttributes.Where(x => x.AttributeID.Equals(id) && x.ProductID.Equals(numProductid)).SingleOrDefault();
                            ProAtt.AttributeID = Convert.ToInt32(pronew.ID);
                            ProAtt.IsActive = true;
                            db.SaveChanges();
                        }
                    }
                    // trường hợp staff mapping với 1 sản phẩm có sẵn
                    else
                    {
                        //// những hardware mới vào chưa kích hoạt.
                        //var unConfrimedProducts = db.Hardwares.Where(x => x.IsActive == null).ToList();
                        // tìm tới hardware có id = stt

                        //if (productid1.Trim().Equals("0"))
                        //{
                        //    var Hardware = db.Hardwares.Where(x => x.ID.Equals(numstt1)).SingleOrDefault();
                        //    Hardware.Name = newNameHard;
                        //    Hardware.IsActive = false;
                        //    db.SaveChanges();
                        //    Dictionary newDic = new Dictionary();
                        //    newDic.AttributeDicID = Convert.ToInt32(newstt1);
                        //    newDic.Name = Hardware.Name;
                        //    newDic.IsActive = true;
                        //}
                        //else
                        //{
                            var Hardware = db.Hardwares.Where(x => x.ID.Equals(numstt1)).SingleOrDefault();
                            if (Hardware.IsActive == null)
                            {
                                Hardware.Name = newNameHard;
                                Hardware.IsActive = false;
                                string name = Hardware.Name;
                                db.SaveChanges();
                                Dictionary newDic = new Dictionary();
                                newDic.AttributeDicID = Convert.ToInt32(newstt1);
                                newDic.Name = newNameHard;
                                newDic.IsActive = true;
                                db.Dictionaries.Add(newDic);
                                db.SaveChanges();
                                //  lấy proAttribute ra sửa
                                var ProAtt = db.ProductAttributes.Where(x => x.AttributeID.Equals(numstt1) && x.ProductID.Equals(numProductid)).SingleOrDefault();
                                ProAtt.AttributeID = Convert.ToInt32(newstt1);
                                ProAtt.IsActive = true;
                                db.SaveChanges();

                                var ListHardware = db.Hardwares.Where(x => x.Name.Trim().Equals(name.Trim()) && x.IsActive == null).ToList();

                                foreach (Hardware hard in ListHardware)
                                {
                                    int id = hard.ID;
                                    var ProAtt1 = db.ProductAttributes.Where(x => x.AttributeID == id && x.IsActive != true).SingleOrDefault();
                                    if (ProAtt1 != null)
                                    {
                                        ProAtt1.AttributeID = Convert.ToInt32(newstt1);
                                        ProAtt1.IsActive = true;
                                        db.SaveChanges();
                                    }
                                }
                            }
                            else
                            {
                                // map lại vào attribute sản phẩm
                                var ProAtt = db.ProductAttributes.Where(x => x.AttributeID.Equals(numstt1) && x.ProductID.Equals(numProductid)).SingleOrDefault();
                                ProAtt.AttributeID = Convert.ToInt32(newstt1);
                                ProAtt.IsActive = true;
                                db.SaveChanges();

                            }
                        //}
                    }
                }

               int id1 = Convert.ToInt32(stt);
               var laptop = db.Products.FirstOrDefault(x => x.ID == id1);
               laptop.IsActive = true;
               db.SaveChanges();
            }
            return "";
        }
        /// <summary>
        /// Tách sản phẩm khi so trùng trong database
        /// </summary>
        /// <returns></returns>
        public ActionResult tachdatabase(String valuestach)
        {
            List<List<ProductMap>> listduplicatenew = (List<List<ProductMap>>)Session["ListduptraningProduct"];
            String[] tachdup = valuestach.ToString().Split('@');
            int dem = 0;
            // duyệt hết list duplicate lớn
            for (int i = 0; i < listduplicatenew.Count; i++)
            {
                // duyệt từng listduplicate nhỏ
                for (int j = 0; j < listduplicatenew[i].Count; j++)
                {
                    // nếu phát hiện list nào có chứa giá trị tách trả về
                    if (tachdup[1].Equals(listduplicatenew[i][j].stt) && tachdup[2].Equals(listduplicatenew[i][1].stt))
                    {

                        Hardware p = new Hardware();

                        String[] mangten = listduplicatenew[i][1].ten.ToString().Split(';');
                        if (mangten.Length >= 2)
                        {
                            p.Name = mangten[0];
                        }
                        else
                        {
                            p.Name = listduplicatenew[i][1].ten;
                        }

                        //lấy product trong database ra chỉ lấy Codetype bằng loai kiểm tra xem có trong database chưa @@.
                        List<Dictionary> listproindatabase = new List<Dictionary>();
                        String loai = listduplicatenew[i][1].loai;
                        var resource = (from x in db.Dictionaries where x.Hardware.CodetypeID.Equals(loai) select x);
                        listproindatabase = resource.ToList();
                        int count = 0;
                        int existId = 0;
                        for (int t = 0; t < listproindatabase.Count; t++)
                        {
                            if (listproindatabase[t].Name.Equals(p.Name))
                            {
                                existId = listproindatabase[t].AttributeDicID;
                                count++ ;
                            }
                        }

                        if (count > 0)
                        {
                            //lấy id vừa mới insert cho vào bảng ProductAttibute------------------------------------------
                            if (!listduplicatenew[i][0].productid.Equals("0"))
                            {
                                ProductAttribute proatt = new ProductAttribute();
                                proatt.AttributeID = existId;
                                proatt.ProductID = Convert.ToInt32(listduplicatenew[i][0].productid);
                                proatt.IsActive = true;
                                db.ProductAttributes.Add(proatt);
                                db.SaveChanges();

                            }
                            listduplicatenew.RemoveAt(i);
                            Session["ListduptraningProduct"] = listduplicatenew;
                            dem++;
                            break;
                        }

                        var LCodeType = (from c in db.Codetypes select c);

                        List<Codetype> Listcodetype = LCodeType.ToList();

                        //foreach (Codetype codety in Listcodetype)
                        //{
                        //    codety.Name.Equals(listduplicatenew[i][1].loai);
                        p.CodetypeID = listduplicatenew[i][1].loai;
                        //    break;
                        //}
                        p.WeightCriteraPoint = Convert.ToInt32(listduplicatenew[i][1].trongso);
                        // nếu có trọng số rồi thì cho isactive = true
                        if (Convert.ToInt32(listduplicatenew[i][1].trongso) > 0)
                        {
                            p.IsActive = true;
                        }
                        db.Hardwares.Add(p);
                        db.SaveChanges();

                        // Lưu vào Dictionary
                        var Pronewid = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                        Dictionary newdiction = new Dictionary();
                        newdiction.AttributeDicID = Pronewid.ID;
                        newdiction.Name = Pronewid.Name;
                        newdiction.IsActive = true;
                        db.Dictionaries.Add(newdiction);
                        db.SaveChanges();

                        //lấy id vừa mới insert cho vào bảng ProductAttibute------------------------------------------
                        if (!listduplicatenew[i][0].productid.Equals("0"))
                        {
                            // lấy id hardware vừa insert
                            var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);
                            ProductAttribute proatt = new ProductAttribute();
                            proatt.AttributeID = idinsert;
                            proatt.ProductID = Convert.ToInt32(listduplicatenew[i][0].productid);
                            proatt.IsActive = true;
                            db.ProductAttributes.Add(proatt);
                            db.SaveChanges();

                        }

                        // lấy max ID và thêm vào bảng alias
                        if (mangten.Length >= 2)
                        {
                            var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                            int idinsert = Convert.ToInt32(pronew.ID);

                            for (int h = 1; h < mangten.Length; h++)
                            {

                                //lấy product trong database ra chỉ lấy Codetype bằng loai kiểm tra xem có trong database chưa @@.
                                List<Dictionary> listmap = new List<Dictionary>();
                                var resource1 = (from x in db.Dictionaries select x);
                                listmap = resource1.ToList();
                                int count1 = 0;
                                for (int r = 0; r < listmap.Count; r++)
                                {
                                    if (listmap[r].Name.Equals(mangten[h]))
                                    {
                                        count1++;
                                    }
                                }
                                if (count1 > 0)
                                {
                                    break;
                                }

                                for (int t = 0; t < listproindatabase.Count; t++)
                                {
                                    if (listproindatabase[t].Name.Equals(p.Name))
                                    {
                                        count++;
                                    }
                                }
                                Dictionary a = new Dictionary();
                                a.Name = mangten[h];
                                a.AttributeDicID = idinsert;
                                db.Dictionaries.Add(a);
                                db.SaveChanges();
                            }

                        }
                        listduplicatenew.RemoveAt(i);
                        Session["ListduptraningProduct"] = listduplicatenew;
                        break;
                    }
                }
                if (dem > 0)
                {
                    break;
                }
            }
            // ghi lại vào txt
            string path = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
            listduplicatenew = (List<List<ProductMap>>)Session["ListduptraningProduct"];
            string[] lines = new string[listduplicatenew.Count];
            for (int i = 0; i < listduplicatenew.Count; i++)
            {
                string line = listduplicatenew[i][0].productid + '~';
                for (int j = 0; j < listduplicatenew[i].Count; j++)
                {
                    line += listduplicatenew[i][j].ten + "|" + listduplicatenew[i][j].loai + "|" + listduplicatenew[i][j].trongso + "|" + listduplicatenew[i][j].stt + "#";
                }
                line = line.Substring(0, line.Length - 1);
                lines[i] = line;

            }
            System.IO.File.WriteAllLines(path, lines);
            ViewBag.Listduptraning = (List<List<ProductMap>>)Session["ListduptraningProduct"];
            return View();
        }
        /// <summary>
        /// Gộp sản phẩm khi so trùng trong database
        /// </summary>
        /// <returns></returns>
        public ActionResult gopdatabase(String valuesgop)
        {
            if (!valuesgop.Equals("nothing"))
            {
                List<List<ProductMap>> listduplicatenew = (List<List<ProductMap>>)Session["ListduptraningProduct"];

                List<String> listID = (List<String>)Session["listID"];
                String[] tachdup = valuesgop.ToString().Split('@');
                int count = 0;
                // duyệt hết list duplicate lớn
                for (int i = 0; i < listduplicatenew.Count; i++)
                {
                    // duyệt từng listduplicate nhỏ
                    for (int j = 0; j < listduplicatenew[i].Count; j++)
                    {
                        // nếu phát hiện list nào có chứa giá trị tách trả về
                        if (tachdup[1].Equals(listduplicatenew[i][j].stt) && tachdup[2].Equals(listduplicatenew[i][1].stt))
                        {

                            Hardware p = new Hardware();

                            String[] mangten = listduplicatenew[i][1].ten.ToString().Split(';');

                            for (int h = 0; h < mangten.Length; h++)
                            {

                                //lấy product trong database ra kiểm tra xem có trong database chưa.
                                List<Dictionary> listmap = new List<Dictionary>();
                                var resource1 = (from x in db.Dictionaries select x);
                                listmap = resource1.ToList();
                                int count1 = 0;
                                for (int r = 0; r < listmap.Count; r++)
                                {
                                    if (listmap[r].Name.Equals(mangten[h]))
                                    {
                                        count++;
                                        if (!listduplicatenew[i][0].productid.Equals("0"))
                                        {
                                            // thêm ProductAtribute khi add sản phẩm :|
                                            ProductAttribute proAttr = new ProductAttribute();
                                            // proAttr.ProductID = Convert.ToInt32(listID[i]);
                                            proAttr.ProductID = Convert.ToInt32(listduplicatenew[i][1].productid);
                                            proAttr.AttributeID = listmap[r].AttributeDicID;
                                            proAttr.IsActive = true;
                                            db.ProductAttributes.Add(proAttr);
                                            db.SaveChanges();
                                        }
                                        listduplicatenew.RemoveAt(i);
                                        //listID.RemoveAt(i);
                                        i = i - 1;
                                        break;
                                    }
                                }
                                if (count > 0)
                                {
                                    break;
                                }

                                Dictionary a = new Dictionary();
                                a.Name = mangten[h];
                                a.AttributeDicID = Convert.ToInt32(listduplicatenew[i][0].stt);
                                a.IsActive = true;
                                db.Dictionaries.Add(a);
                                db.SaveChanges();

                                if (!listduplicatenew[i][0].productid.Equals("0"))
                                {
                                    // thêm ProductAtribute khi add sản phẩm :|
                                    ProductAttribute proAttr = new ProductAttribute();
                                    // proAttr.ProductID = Convert.ToInt32(listID[i]);
                                    proAttr.ProductID = Convert.ToInt32(listduplicatenew[i][1].productid);
                                    proAttr.AttributeID = Convert.ToInt32(listduplicatenew[i][0].stt);
                                    proAttr.IsActive = true;
                                    db.ProductAttributes.Add(proAttr);
                                    db.SaveChanges();
                                }
                                listduplicatenew.RemoveAt(i);
                                //listID.RemoveAt(i);
                                i = i - 1;
                                count++;
                                break;
                            }
                        }

                        Session["ListduptraningProduct"] = listduplicatenew;
                        if (count > 0)
                        {

                            break;
                        }

                    }
                    if (count > 0)
                    {

                        break;
                    }

                }

                // ghi lại vào txt
                string path = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
                listduplicatenew = (List<List<ProductMap>>)Session["ListduptraningProduct"];
                string[] lines = new string[listduplicatenew.Count];
                for (int i = 0; i < listduplicatenew.Count; i++)
                {
                    //string line = listID[i]+'~';
                    string line = listduplicatenew[i][1].productid + '~';
                    for (int j = 0; j < listduplicatenew[i].Count; j++)
                    {
                        //  line += listduplicatenew[i][j].ten + "#";
                        line += listduplicatenew[i][j].ten + "|" + listduplicatenew[i][j].loai + "|" + listduplicatenew[i][j].trongso + "|" + listduplicatenew[i][j].stt + "#";
                    }
                    line = line.Substring(0, line.Length - 1);
                    lines[i] = line;

                }
                System.IO.File.WriteAllLines(path, lines);
                ViewBag.Listduptraning = (List<List<ProductMap>>)Session["ListduptraningProduct"];
            }
            else
            {
                ViewBag.Listduptraning = LoadThanhPhanTrungDB();
            }

            return View();
        }
        /// <summary>
        /// Gộp 1 table trùng
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        public ActionResult getGop(String valuest)
        {
            List<String> values = new List<String>();
            String[] value = valuest.ToString().Split('@');
            for (int j = 1; j < value.Length; j++)
            {
                values.Add(value[j]);
            }
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["ListdupProduct"];
            // tạo list chứa sản phẩm để lưu hoặc so trùng với db
            List<ProductMap> listpro = new List<ProductMap>();
            // lấy tên chính ở cuối list ra và remove
            string sttTenchinh = values.Last();
            values.Remove(values.Last());

            // value chỉ chứa các giá trị khác ngoài tên chính
            for (int t = 0; t < values.Count; t++)
            {
                if (values[t].Trim().Equals(sttTenchinh.Trim()))
                {
                    values.RemoveAt(t);
                    break;
                }
            }

            // tên sản phẩm gộp
            string tenmoi = "";
            string tenchinh = "";
            ProductMap sanphamgop = new ProductMap();
            int check = 0;
            int count = 0;
            for (int i = 0; i < listduplicate.Count; i++)
            {
                // duyệt list nhỏ
                for (int j = 0; j < listduplicate[i].Count; j++)
                {
                    // nếu stt của listdup = stt của tên chính thì cho nó thành sản phẩm gộp.
                    if (listduplicate[i][j].stt.ToString().Equals(sttTenchinh))
                    {
                        count++;
                        tenmoi = listduplicate[i][j].ten;
                        tenchinh = listduplicate[i][j].ten;
                        sanphamgop = listduplicate[i][j];
                        listduplicate[i].Remove(listduplicate[i][j]);
                    }
                    if (count > 0)
                    {

                        break;
                    }
                }
                if (count > 0)
                {

                    break;
                }
            }
            // duyệt để tim thấy list có chưa id tách được gửi về.
            for (int t = 0; t < values.Count; t++)
            {
                // duyệt list bự lấy tên phụ
                for (int i = 0; i < listduplicate.Count; i++)
                {
                    // duyệt list nhỏ
                    for (int j = 0; j < listduplicate[i].Count; j++)
                    {

                        // nếu stt của listdup = stt của tên chính thì cho nó thành sản phẩm gộp.
                        if (listduplicate[i][j].stt.ToString().Equals(values[t]))
                        {

                            tenmoi += ";" + listduplicate[i][j].ten;
                            listduplicate[i].Remove(listduplicate[i][j]);
                            break;
                        }
                    }
                }
            }
            // duyệt list bự xóa list rỗng hoặc list có 1 phần tử cho vào phần tử đúng
            for (int i = 0; i < listduplicate.Count; i++)
            {
                // kiểm tra trong list nhỏ còn có 1 phần tử thì tách nó luôn cho vào list correct
                if (listduplicate[i].Count == 1)
                {
                    listpro.Add(listduplicate[i].First());
                    listduplicate[i].Remove(listduplicate[i].First());
                    //Xóa list rỗng trong list bự duplicate
                    listduplicate.Remove(listduplicate[i]);
                }
                else if (listduplicate[i].Count == 0)
                {
                    //Xóa list rỗng trong list bự duplicate
                    listduplicate.Remove(listduplicate[i]);
                }
            }

            sanphamgop.ten = tenmoi;
            // cho vào listpro
            listpro.Add(sanphamgop);
            // Tạo listduplicate mới chứa trùng giữa listpro và trong database
            List<List<ProductMap>> listduplicatenew = new List<List<ProductMap>>();

            //lấy product trong database ra chỉ lấy Codetype bằng loai.
            List<Hardware> listproindatabase = new List<Hardware>();
            String loai = sanphamgop.loai;
            var resource = (from x in db.Hardwares select x);
            listproindatabase = resource.ToList();

            // tìm sản phẩm trùng cho vào list trùng hoặc xóa đi :|
            for (int j = 0; j < listproindatabase.Count; j++)
            {
                for (int i = 0; i < listpro.Count; i++)
                {
                    List<ProductMap> duplicateProduct = new List<ProductMap>();

                    String Name = "";
                    String[] mangten = listpro[i].ten.ToString().Split(';');
                    if (mangten.Length >= 2)
                    {
                        Name = mangten[0];
                    }
                    else
                    {
                        Name = listpro[i].ten;
                    }

                    if (listproindatabase[j].Name.ToString().Equals(Name))
                    {
                        listproindatabase.RemoveAt(j);

                        j--;
                    }

                    // lấy sản phầm trùng cho vào list trùng mới
                    if (CompareStringHelper.CompareString(tenchinh, listproindatabase[j].Name.ToString()) >= 80)
                    {
                        ProductMap pro = new ProductMap();
                        pro.stt = listproindatabase[j].ID.ToString();
                        pro.ten = listproindatabase[j].Name;
                        pro.loai = listproindatabase[j].CodetypeID;
                        pro.trongso = listproindatabase[j].WeightCriteraPoint.ToString();
                        duplicateProduct.Add(pro);
                        listpro[i].stt = "z" + listpro[i].stt;
                        duplicateProduct.Add(listpro[i]);
                        listpro.RemoveAt(i);
                        i = i--;
                        //lấy dữ liệu trong file text traning ra ProductNameTraining;
                        string path1 = Server.MapPath("~/UploadedExcelFiles/ProductNameTraining.txt");
                        if (System.IO.File.Exists(path1))
                        {   // lấy hết dòng trong file txt ra.
                            string[] lines1 = System.IO.File.ReadAllLines(path1);
                            // tảo mảng mới chứa dữ dữ liệu trùng.
                            string[] newlines = new string[1];
                            string newline = "0" + '~';
                            for (int h = 0; h < duplicateProduct.Count; h++)
                            {
                                newline += duplicateProduct[h].ten + "|" + duplicateProduct[h].loai + "|" +
                                           duplicateProduct[h].trongso + "|" + duplicateProduct[h].stt + "#";
                            }
                            newline = newline.Substring(0, newline.Length - 1);
                            newlines[0] = newline;
                            //Gộp hai bảng thành mảng mới và lưu vào txt lại
                            string[] save = new string[lines1.Length + newlines.Length];
                            for (int h = 0; h < lines1.Length; h++)
                            {
                                save[h] = lines1[h];
                            }
                            for (int h = 0; h < newlines.Length; h++)
                            {
                                save[h + lines1.Length] = newlines[h];
                            }
                            // ghi lại vào txt
                            System.IO.File.WriteAllLines(path1, save);
                        }
                    }

                    if (duplicateProduct.Count >= 2)
                    {

                        listduplicatenew.Add(duplicateProduct);
                        check++;
                    }
                }
            }

            // lưu vào database
            if (check == 0)
            {
                Hardware p = new Hardware();

                String[] mangten = sanphamgop.ten.ToString().Split(';');
                if (mangten.Length >= 2)
                {
                    p.Name = mangten[0];
                }
                else
                {
                    p.Name = sanphamgop.ten;
                }
                p.CodetypeID = sanphamgop.loai;
                p.WeightCriteraPoint = Convert.ToInt32(sanphamgop.trongso);
                db.Hardwares.Add(p);
                db.SaveChanges();
                // lấy max ID và thêm vào bảng alias
                if (mangten.Length >= 1)
                {
                    var pronew = db.Hardwares.OrderByDescending(pro => pro.ID).FirstOrDefault();
                    int idinsert = Convert.ToInt32(pronew.ID);

                    for (int h = 0; h < mangten.Length; h++)
                    {
                        Dictionary a = new Dictionary();
                        a.Name = mangten[h];
                        a.AttributeDicID = idinsert;
                        a.IsActive = true;
                        db.Dictionaries.Add(a);
                        db.SaveChanges();
                    }

                }
            }

            // ghi lại vào txt
            string path = Server.MapPath("~/UploadedExcelFiles/ProductName.txt");
            string[] lines = new string[listduplicate.Count];
            for (int i = 0; i < listduplicate.Count; i++)
            {
                string line = "";
                for (int j = 0; j < listduplicate[i].Count; j++)
                {
                    line += listduplicate[i][j].ten + "|" + listduplicate[i][j].loai + "|" + listduplicate[i][j].trongso + "#";
                }
                line = line.Substring(0, line.Length - 1);
                lines[i] = line;

            }
            System.IO.File.WriteAllLines(path, lines);
            Session["ListdupProduct"] = listduplicate;
            ViewBag.ListdupProduct = (List<List<ProductMap>>)Session["ListdupProduct"];

            //    Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
            return View();
        }
        /// <summary>
        /// tạo một hardware mới
        /// </summary>
        /// <returns></returns>
        public ActionResult CreateNewHardware()
        {
            string name = Request.Params["idHardwareName"];
            string trongso = Request.Params["IdTrongSo"];
            string loai = Request.Params["idLoai"];

            Hardware hard = new Hardware();

            hard.Name = name;
            hard.WeightCriteraPoint = Convert.ToDouble(trongso);
            hard.CodetypeID = loai;
            hard.IsActive = true;
            db.Hardwares.Add(hard);
            db.SaveChanges();

            return RedirectToAction("index", "ManagerHardware");
        }