Example #1
0
        public async Task <ExcelDataResult> ExportExcelDataToDBAsync(ImportDataRequestArgs requestArgs)
        {
            var tcs = new TaskCompletionSource <ExcelDataResult>();

            try
            {
                var result      = new ExcelDataResult();
                var xssfwb      = new XSSFWorkbook(requestArgs.DataStream);
                var sheet       = xssfwb.GetSheetAt(0);
                var screeningNr = sheet.GetRow(0);
                var headerText  = sheet.GetRow(1);

                var stylesTable = xssfwb.GetStylesSource();

                /*var cell = sheet.GetRow(1).GetCell(4);
                 * var stylesTable = xssfwb.GetStylesSource();
                 * var name = stylesTable.GetCellStyleName(cell);
                 */

                if (screeningNr == null || headerText == null)
                {
                    result.Errors.Add("Invalid Excel format.");
                    result.Success = false;
                    return(result);
                }
                var cropRow         = sheet.GetRow(3);
                var crop            = string.Empty;
                var syncCode        = string.Empty;
                var breedingStation = string.Empty;
                if (cropRow == null)
                {
                    result.Success = false;
                    result.Errors.Add("No Crop Record Found.");
                    return(result);
                }

                for (int i = 0; i < headerText.Cells.Count; i++)
                {
                    if (headerText.GetCell(i).ToText().ToLower() == "crop" ||
                        headerText.GetCell(i).ToText().ToLower() == "cropcode")
                    {
                        crop = cropRow.GetCell(i)?.ToString();
                    }
                    if (headerText.GetCell(i).ToText().ToLower().Trim() == "brstation")
                    {
                        breedingStation = cropRow.GetCell(i)?.ToString();
                    }
                    if (!string.IsNullOrWhiteSpace(crop) && !string.IsNullOrWhiteSpace(breedingStation))
                    {
                        break;
                    }
                }
                if (string.IsNullOrWhiteSpace(crop))
                {
                    result.Success = false;
                    result.Errors.Add("No Crop Record Found.");
                    return(result);
                }
                if (string.IsNullOrWhiteSpace(breedingStation))
                {
                    result.Success = false;
                    result.Errors.Add("No breeding station found.");
                    return(result);
                }

                var dtRowTVP     = new DataTable("TVP_Row");
                var dtColumnsTVP = new DataTable("TVP_Column");
                var dtCellTVP    = new DataTable("TVP_Cell");
                var dtListTVP    = new DataTable("TVP_List");

                //prepare list tvp which is only needed for importing data from phenome
                dtListTVP.Columns.Add("RowID");
                dtListTVP.Columns.Add("GID");
                dtListTVP.Columns.Add("EntryCode");

                //prepare columns
                PrepareColumnTableTVP(dtColumnsTVP, headerText, stylesTable, screeningNr);
                var coldata = dtColumnsTVP.AsEnumerable().Select(x => new
                {
                    ColName = x.IsNull("TraitID") ? x["ColumnLabel"] : x["TraitID"]
                }).AsEnumerable().Select(x => x.ColName).GroupBy(g => g).Select(x => new
                {
                    ColVal = x.Key,
                    Count  = x.Count()
                }).Where(x => x.Count > 1);

                if (coldata.Any())
                {
                    var keylist = coldata.Select(x => x.ColVal.ToText()).ToList();
                    var key     = keylist.Truncate();
                    result.Errors.Add($"Duplicate Column {key}");
                }
                result.Success = !result.Errors.Any();
                if (!result.Success)
                {
                    return(result);
                }

                //this validation is removed as per client request, and query is adjusted on returning multiple traitname for same determination ID.
                //var columnvalidations = await ValidateColumnsForUniqueDeterminations(dtColumnsTVP, crop, requestArgs.Source);
                //if (columnvalidations.Tables[0].Rows.Count > 0)
                //{
                //    result.Success = false;
                //    foreach (DataRow _value in columnvalidations.Tables[0].Rows)
                //    {
                //        result.Errors.Add("Multiple determination applied for Trait " + _value["Traits"]);
                //    }
                //    return result;
                //}

                var lastRow = sheet.LastRowNum + 1;                                                 //this is because RowNum starts from 0 not from 1.
                if (lastRow - 2 > ConfigurationManager.AppSettings["App:MaxNoOfRecords"].ToInt64()) //first two rows data are meta data and should be ignored while importing it so value 2 is subtracted.
                {
                    result.Errors.Add("Cannot import excel file having rows greater than " + ConfigurationManager.AppSettings["App:MaxNoOfRecords"]);
                    result.Success = false;
                    return(result);
                }
                //Prepare rows and cell values
                PrepareRowAndCellTVP(dtRowTVP, dtCellTVP, headerText, stylesTable, sheet, result);
                var data = dtRowTVP.AsEnumerable().Select(x => x.Field <string>("MaterialKey"))
                           .GroupBy(g => g)
                           .Select(
                    x => new
                {
                    MaterialKey = x.Key,
                    Count       = x.Count()
                });

                if (data.Any(x => x.MaterialKey.ToText() == string.Empty))
                {
                    result.Errors.Add("Material Key cannot be null or empty");
                }
                var material = data.FirstOrDefault();
                if (material != null)
                {
                    syncCode = material.MaterialKey?.Substring(0, 2);
                }
                if (string.IsNullOrWhiteSpace(syncCode))
                {
                    result.Errors.Add("SyncCode cannot be null or empty");
                }
                var keys = data.Where(x => x.Count > 1);
                if (keys.Any())
                {
                    var keylist = keys.Select(x => x.MaterialKey).ToList();
                    var key     = keylist.Truncate();
                    result.Errors.Add($"Duplicate Material key {key}");
                }
                result.Success = !result.Errors.Any();
                if (result.Success)
                {
                    await ImportDataAsync(crop, breedingStation, syncCode, string.Empty, requestArgs, dtColumnsTVP, dtRowTVP, dtCellTVP, dtListTVP);

                    tcs.SetResult(await GetDataAsync(requestArgs));
                }
                else
                {
                    tcs.SetResult(result);
                }
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }
            return(await tcs.Task);
        }
Example #2
0
 public async Task <ExcelDataResult> ExportExcelDataToDBAsync(ImportDataRequestArgs args)
 {
     return(await repository.ExportExcelDataToDBAsync(args));
 }
Example #3
0
        public async Task ImportDataAsync(string crop, string breedingStation, string syncCode, string countryCode, ImportDataRequestArgs requestArgs,
                                          DataTable dtColumnsTVP, DataTable dtRowTVP, DataTable dtCellTVP, DataTable dtListTVP)
        {
            var p1 = DbContext.CreateOutputParameter("@TestID", DbType.Int32);

            DbContext.CommandTimeout = 5 * 60; //5 minutes
            await DbContext.ExecuteNonQueryAsync(DataConstants.PR_INSERT_EXCEL_DATA,
                                                 CommandType.StoredProcedure, args1 =>
            {
                args1.Add("@CropCode", crop);
                args1.Add("@BreedingStationCode", breedingStation);
                args1.Add("@SyncCode", syncCode);
                args1.Add("@CountryCode", countryCode);
                args1.Add("@TestTypeID", requestArgs.TestTypeID);
                args1.Add("@UserID", userContext.GetContext().FullName);
                args1.Add("@FileTitle", requestArgs.FilePath);
                args1.Add("@TVPColumns", dtColumnsTVP);
                args1.Add("@TVPRow", dtRowTVP);
                args1.Add("@TVPCell", dtCellTVP);
                args1.Add("@TestID", p1);
                args1.Add("@PlannedDate", requestArgs.PlannedDate);
                args1.Add("@MaterialStateID", requestArgs.MaterialStateID);
                args1.Add("@MaterialTypeID", requestArgs.MaterialTypeID);
                args1.Add("@ContainerTypeID", requestArgs.ContainerTypeID);
                args1.Add("@Isolated", requestArgs.Isolated);
                args1.Add("@Source", requestArgs.Source);
                args1.Add("@TestName", requestArgs.TestName);
                args1.Add("@ObjectID", requestArgs.ObjectID);
                args1.Add("@ExpectedDate", requestArgs.ExpectedDate);
                args1.Add("@Cumulate", requestArgs.Cumulate);
                args1.Add("@ImportLevel", requestArgs.ImportLevel);
                args1.Add("@TVPList", dtListTVP);
                args1.Add("@ExcludeControlPosition", requestArgs.ExcludeControlPosition);
                args1.Add("@SiteID", requestArgs.SiteID);
                args1.Add("@FileID", requestArgs.FileID);
                args1.Add("@BTR", requestArgs.BTR);
                args1.Add("@ResearcherName", requestArgs.ResearcherName);
            });

            requestArgs.TestID = p1.Value.ToInt32();
        }
        public async Task <IHttpActionResult> ImportExcel()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                return(InvalidRequest("Please upload file with enctype='multipart/form-data'."));
            }

            var provider = await Request.Content.ReadAsMultipartAsync(new MultipartFormDataMemoryStreamProvider());

            //get file from content
            var file = provider.Contents.Where((content, idx) => provider.IsStream(idx)).FirstOrDefault();

            if (file == null)
            {
                return(InvalidRequest("File is either corrupted or invalid."));
            }

            var fileName = file.Headers.ContentDisposition.FileName.Trim('\"');
            //this check should be done while creating file on DB because now file must be unique based on CropCode and breeding station code but not per user.
            ////check if file is already exists for user
            //var fileExists = await fileService.FileExistsAsync(fileName);
            //if (fileExists)
            //{
            //    return InvalidRequest("File already exists.");
            //}
            var stream = await file.ReadAsStreamAsync();

            //save excel data to database
            var args = new ImportDataRequestArgs
            {
                TestTypeID             = provider.FormData["testTypeID"].ToInt32(),
                PageNumber             = provider.FormData["pageNumber"].ToInt32(),
                PageSize               = provider.FormData["pageSize"].ToInt32(),
                PlannedDate            = provider.FormData["plannedDate"].ToNDateTime(),
                MaterialStateID        = provider.FormData["materialStateID"].ToInt32(),
                MaterialTypeID         = provider.FormData["materialTypeID"].ToInt32(),
                ContainerTypeID        = provider.FormData["containerTypeID"].ToInt32(),
                Isolated               = provider.FormData["isolated"].ToBoolean(),
                Source                 = provider.FormData["source"],
                FilePath               = fileName,
                TestName               = System.IO.Path.GetFileNameWithoutExtension(fileName),
                DataStream             = stream,
                ExpectedDate           = provider.FormData["expectedDate"].ToNDateTime(),
                Cumulate               = provider.FormData["cumulate"].ToBoolean(),
                ExcludeControlPosition = provider.FormData["excludeControlPosition"].ToBoolean()
            };
            var data = await excelDataService.ExportExcelDataToDBAsync(args);

            //get recently uploaded file details
            var fileInfo = await fileService.GetFileAsync(args.TestID);

            var result = new
            {
                data.Success,
                data.Errors,
                data.Total,
                data.DataResult,
                args.TestID,
                File = fileInfo
            };

            return(Ok(result));
        }