private void sb_readAndSavePartsToDB(int idGroup, string groupName, bool getAttach, string attachmentDirPath)
        {
            wagonPartsDataTable dt = new wagonPartsDataTable(1, 0, false);
            string html;

            try
            {
                this.v_webBrowser.FindElement(By.Id("__tab_ContentPlaceHolder1_TabContainer1_PartPanel")).Click();
            }
            catch
            {
                return;
            }
            html = this.v_webBrowser.PageSource;

            if (!string.IsNullOrEmpty(html))
            {
                dt.Rows.Clear();
                Functions.sb_fillDatatableWithHtmlTableId(html, v_tableIdParts, dt);
                if (getAttach)
                {
                    this.sb_getAttach(dt, attachmentDirPath, groupName);
                }
                if (dt.Rows.Count > 0)
                {
                    this.sb_savePartsToDB(dt, idGroup);
                }
            }
        }
        private void sb_savePartsToDB(wagonPartsDataTable dt, int?idGroup)
        {
            if (dt == null)
            {
                return;
            }
            int    i;
            bool   add;
            string partName;

            Model.rwmmsWagonPart entry_wagonParts;
            using (var entityLogistic = new Model.logisticEntities())
            {
                for (i = 0; i <= dt.Rows.Count - 1; i++)
                {
                    add = false;
                    if (!Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_partName]) &&
                        idGroup.HasValue)
                    {
                        partName         = dt.Rows[i][wagonPartsDataTable.fld_partName].ToString();
                        entry_wagonParts = entityLogistic.rwmmsWagonParts.FirstOrDefault(o => o.IdGroup == idGroup &&
                                                                                         o.wPartName == partName);
                        if (entry_wagonParts == null)
                        {
                            add = true;
                            entry_wagonParts = new Model.rwmmsWagonPart();
                        }
                    }
                    else
                    {
                        entry_wagonParts = new Model.rwmmsWagonPart();
                    }

                    entry_wagonParts.FetchTime = DateTime.Now;
                    entry_wagonParts.IdGroup   = idGroup;

                    entry_wagonParts.wCountInGroup = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_countInGroup]) ? null : (int?)int.Parse(dt.Rows[i][wagonPartsDataTable.fld_countInGroup].ToString());
                    entry_wagonParts.wCountInWagon = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_countInWagon]) ? null : (int?)int.Parse(dt.Rows[i][wagonPartsDataTable.fld_countInWagon].ToString());
                    entry_wagonParts.wMapNumber    = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapNumber]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapNumber].ToString();
                    entry_wagonParts.wMapPic1Path  = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapPic1Path]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapPic1Path].ToString();
                    entry_wagonParts.wMapPic2Path  = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapPic2Path]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapPic2Path].ToString();
                    entry_wagonParts.wMapPic3Path  = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapPic3Path]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapPic3Path].ToString();
                    entry_wagonParts.wMapPic4Path  = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapPic4Path]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapPic4Path].ToString();

                    entry_wagonParts.wMapPicPath    = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_mapPicPath]) ? null : dt.Rows[i][wagonPartsDataTable.fld_mapPicPath].ToString();
                    entry_wagonParts.wPartName      = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_partName]) ? null : dt.Rows[i][wagonPartsDataTable.fld_partName].ToString();
                    entry_wagonParts.wPartNameLatin = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_partNameLatin]) ? null : dt.Rows[i][wagonPartsDataTable.fld_partNameLatin].ToString();
                    entry_wagonParts.wWeight        = Functions.IsNull(dt.Rows[i][wagonPartsDataTable.fld_weight]) ? null : (decimal?)decimal.Parse(dt.Rows[i][wagonPartsDataTable.fld_weight].ToString());
                    if (add)
                    {
                        entityLogistic.rwmmsWagonParts.Add(entry_wagonParts);
                    }
                    else
                    {
                        entityLogistic.Entry(entry_wagonParts).State = System.Data.Entity.EntityState.Modified;
                    }
                    try
                    {
                        entityLogistic.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
        }
        private void sb_getAttach(wagonPartsDataTable dt, string directoryPath, string groupName)
        {
            System.Collections.ObjectModel.ReadOnlyCollection <IWebElement> rows;
            int htmlRowIndex = dt.prp_skipRowTop;
            int dtRowIndex   = 0;
            int fileExistCounter;

            char[] chArrInvalidFileChars = Path.GetInvalidFileNameChars();
            char[] chArrInvalidPathChars = Path.GetInvalidPathChars();
            groupName = string.Join("_", groupName.Split(chArrInvalidFileChars));
            groupName = string.Join("_", groupName.Split(chArrInvalidPathChars));

            string downloadPath = directoryPath + (directoryPath.EndsWith("\\") ? "" : "\\")
                                  + groupName;

            if (!Directory.Exists(downloadPath))
            {
                Directory.CreateDirectory(downloadPath);
            }

            do
            {
                try
                {
                    rows = Functions.fnc_getSeleniumTableRows(this.v_webBrowser, this.v_tableIdParts);
                }
                catch
                {
                    return;
                }
                if (!Functions.IsNull(dt.Rows[dtRowIndex][wagonPartsDataTable.fld_partName]))
                {
                    var cells = rows[htmlRowIndex].FindElements(By.TagName("td"));
                    if (cells.Count >= 6)
                    {
                        if (!Functions.IsNull(cells[6].Text))
                        {
                            cells[6].Click();
                            SharedFunctions.sb_waitForReady(this.v_webBrowser);

                            FileInfo myFile;
                            do
                            {
                                fileExistCounter = 0;
                                myFile           = (new DirectoryInfo(this.v_downloadPath)).GetFiles("*.*").OrderByDescending(o => o.LastWriteTime).FirstOrDefault();
                                #region wait for download completion
                                while (myFile == null || myFile.LastWriteTime < DateTime.Now.AddMinutes(-5))
                                {
                                    Thread.Sleep(1000);
                                    myFile = (new DirectoryInfo(this.v_downloadPath)).GetFiles("*.*").OrderByDescending(o => o.LastWriteTime).FirstOrDefault();
                                    fileExistCounter++;
                                    if (fileExistCounter > 30)
                                    {
                                        break;
                                    }
                                }
                                #endregion

                                if (myFile == null || myFile.LastWriteTime < DateTime.Now.AddMinutes(-5))
                                {
                                    //there is error
                                    throw new Exception("File cannot be downloaded");
                                }
                                else if (myFile.Extension != ".crdownload" && myFile.Extension != ".tmp")
                                {
                                    string fileName = "map_" + dt.Rows[dtRowIndex][wagonPartsDataTable.fld_partName].ToString();

                                    fileName = string.Join("_", fileName.Split(chArrInvalidFileChars));
                                    fileName = string.Join("_", fileName.Split(chArrInvalidPathChars));
                                    fileName = downloadPath + "\\" + fileName + myFile.Extension;
                                    try
                                    {
                                        if (File.Exists(fileName))
                                        {
                                            File.Delete(fileName);
                                        }

                                        myFile.MoveTo(fileName);

                                        dt.Rows[dtRowIndex][wagonPartsDataTable.fld_mapPicPath] = fileName;
                                    }
                                    catch (Exception ex)
                                    {
                                    }
                                    break;
                                }
                            } while (myFile.Extension == ".crdownload" || myFile.Extension == ".tmp" /*wait till .crdownload or .tmp to change to .pdf*/);
                        }
                    }
                }
                htmlRowIndex++;
                dtRowIndex++;
            } while (htmlRowIndex < rows.Count - dt.prp_skipRowBottom);
        }