public async Task <ExcelDataResult> GetPhenomeDataAsync(HttpRequestMessage request, PhenomeImportRequestArgs args) { PhenoneImportDataResult result = null; if (args.ImportLevel.EqualsIgnoreCase("LIST")) { result = await GetListDataFromPhenomeAsync(request, args); } else { result = await GetDataFromPhenomeAsync(request, args); } if (result.Errors.Any() || result.Warnings.Any()) { return(new ExcelDataResult { Success = false, Warnings = result.Warnings, Errors = result.Errors }); } //TestName and FilePath is same for Phenome args.FilePath = args.TestName; //import data into database await excelDataRepo.ImportDataAsync(result.CropCode, result.BrStationCode, result.SyncCode, result.CountryCode, args, result.TVPColumns, result.TVPRows, result.TVPCells, result.TVPList); return(await excelDataRepo.GetDataAsync(args)); }
public async Task <PhenoneImportDataResult> ImportDataFromPhenomeAsync(HttpRequestMessage request, PhenomeImportRequestArgs args) { var result = new PhenoneImportDataResult(); string cropCode = ""; string breedingStation = ""; string syncCode = ""; string countryCode = ""; #region prepare datatables for stored procedure call var dtCellTVP = new DataTable(); var dtRowTVP = new DataTable(); var dtListTVP = new DataTable(); var dtColumnsTVP = new DataTable(); var TVPS2SCapacity = new DataTable(); PrepareTVPS(dtCellTVP, dtRowTVP, dtListTVP, dtColumnsTVP, TVPS2SCapacity); #endregion using (var client = new RestClient(BASE_SVC_URL)) { var URI = ""; client.SetRequestCookies(request); #region Get Variables detail from Tree Structure //call service to get crop code based on cropid URI = $"/api/v1/researchgroup/info/{ args.CropID}"; var cropDetail = await GetFolderVariablesDetail(client, URI); if (!cropDetail.TryGetValue("Crop", out cropCode)) { result.Errors.Add("Crop code not found. Please add crop code first."); return(result); } if (string.IsNullOrWhiteSpace(cropCode)) { result.Errors.Add("CropCode can not be null or empty."); return(result); } //call service to get Breeding station and SyncCode based on breeding station level call on phenome from folder in tree structure. URI = $"/api/v1/folder/info/{ args.FolderID}"; var breedingStationDetail = await GetFolderVariablesDetail(client, URI); if (!breedingStationDetail.TryGetValue("Breeding Station", out breedingStation) && !breedingStationDetail.TryGetValue("BreedStat", out breedingStation)) { result.Errors.Add("Breeding station not found. Please add Breeding station code first."); return(result); } if (string.IsNullOrWhiteSpace(breedingStation)) { result.Errors.Add("Breeding station can not be null or empty."); return(result); } //syncCode if (!breedingStationDetail.TryGetValue("SyncCode", out syncCode)) { result.Errors.Add("SyncCode not found. Please add SyncCode first."); return(result); } if (string.IsNullOrWhiteSpace(syncCode)) { result.Errors.Add("SyncCode can not be null or empty."); return(result); } //countrycode if (!breedingStationDetail.TryGetValue("Country", out countryCode)) { result.Errors.Add("Country not found. Please add Country first."); return(result); } if (string.IsNullOrWhiteSpace(countryCode)) { result.Errors.Add("Country can not be null or empty."); return(result); } #endregion if (args.ImportLevel.EqualsIgnoreCase("list")) { URI = "/api/v1/simplegrid/grid/create/FieldNursery"; } else { URI = "/api/v1/simplegrid/grid/create/FieldPlants"; } var response = await client.PostAsync(URI, values => { values.Add("object_type", args.ObjectType); values.Add("object_id", args.ObjectID); values.Add("grid_id", args.GridID); }); await response.EnsureSuccessStatusCodeAsync(); var columnResponse = await response.Content.DeserializeAsync <PhenomeColumnsResponse>(); if (!columnResponse.Success) { throw new UnAuthorizedException(columnResponse.Message); } if (!columnResponse.Columns.Any()) { result.Errors.Add("No columns found."); return(result); } if (!args.ForcedImport && columnResponse.Columns.Count > 50) { result.Warnings.Add("You are importing more than 50 columns.This can lead to problem. We recommend to reduce the amount of columns in Phenome. Continue?"); return(result); } if (args.ImportLevel.EqualsIgnoreCase("list")) { URI = "/api/v1/simplegrid/grid/get_json/FieldNursery?" + $"object_type={args.ObjectType}&" + $"object_id={args.ObjectID}&" + $"grid_id={args.GridID}&" + "add_header=1&" + "posStart=0&" + "count=99999"; } else { URI = "/api/v1/simplegrid/grid/get_json/FieldPlants?" + $"object_type={args.ObjectType}&" + $"object_id={args.ObjectID}&" + $"grid_id={args.GridID}&" + "add_header=1&" + "posStart=0&" + "count=99999"; } response = await client.GetAsync(URI); await response.EnsureSuccessStatusCodeAsync(); var dataResponse = await response.Content.DeserializeAsync <PhenomeDataResponse>(); var totalRecords = dataResponse.Properties.Max(x => x.Total_count); if (totalRecords <= 0) { result.Errors.Add("No data to process."); return(result); } var getTraitID = new Func <string, int?>(o => { var traitid = 0; if (int.TryParse(o, out traitid)) { if (traitid > 0) { return(traitid); } } return(null); }); var columns1 = columnResponse.Columns.Select(x => new { ID = x.id, ColName = getTraitID(x.variable_id) == null ? x.desc : getTraitID(x.variable_id).ToString(), DataType = string.IsNullOrWhiteSpace(x.data_type) || x.data_type == "C" ? "NVARCHAR(255)" : x.data_type, ColLabel = x.desc, TraitID = getTraitID(x.variable_id) }).GroupBy(g => g.ColName.Trim(), StringComparer.OrdinalIgnoreCase) .Select(y => { var elem = y.FirstOrDefault(); var item = new { ColumnName = elem.ColName, elem.ID, elem.DataType, elem.ColLabel, elem.TraitID }; return(item); }); var columns2 = dataResponse.Columns.Select((x, i) => new { ID = x.Properties[0].ID, Index = i }).GroupBy(g => g.ID).Select(x => new { ID = x.Key, Index = x.FirstOrDefault().Index }); var columns = (from t1 in columns1 join t2 in columns2 on t1.ID equals t2.ID select new { t2.ID, t2.Index, ColName = t1.ColumnName, t1.DataType, t1.ColLabel, t1.TraitID }).ToList(); if (columns.GroupBy(x => x.ColLabel.Trim(), StringComparer.OrdinalIgnoreCase).Any(g => g.Count() > 1)) { result.Errors.Add("Duplicate column found on " + args.Source); return(result); } var foundGIDColumn = false; var foundLotNrColumn = false; var foundEntryCode = false; var foundPlantName = false; var foundMasterNr = false; for (int i = 0; i < columns.Count; i++) { var col = columns[i]; var dr = dtColumnsTVP.NewRow(); if (col.ColLabel.EqualsIgnoreCase("GID")) { foundGIDColumn = true; } else if (col.ColLabel.EqualsIgnoreCase("LotNr")) { foundLotNrColumn = true; } else if (col.ColLabel.EqualsIgnoreCase("MasterNr")) { foundMasterNr = true; } else if (col.ColLabel.EqualsIgnoreCase("Entry Code")) { foundEntryCode = true; } else if (col.ColLabel.EqualsIgnoreCase("plant name")) { foundPlantName = true; } dr["ColumnNr"] = i; dr["TraitID"] = col.TraitID; dr["ColumnLabel"] = col.ColLabel; dr["DataType"] = col.DataType; dtColumnsTVP.Rows.Add(dr); } var missedMendatoryColumns = new List <string>(); if (!foundGIDColumn) { missedMendatoryColumns.Add("GID"); } if (!foundEntryCode) { missedMendatoryColumns.Add("Entry Code"); } if (!foundMasterNr) { missedMendatoryColumns.Add("MasterNr"); } if (args.ImportLevel.EqualsIgnoreCase("list") && !foundLotNrColumn) { missedMendatoryColumns.Add("LotNr"); } if (!args.ImportLevel.EqualsIgnoreCase("list") && !foundPlantName) { missedMendatoryColumns.Add("Plant name"); } if (missedMendatoryColumns.Any()) { result.Errors.Add("Please add following columns during import: " + string.Join(",", missedMendatoryColumns)); return(result); } var getColIndex = new Func <string, int>(name => { var fldName = columns.FirstOrDefault(o => o.ColLabel.EqualsIgnoreCase(name)); if (fldName != null) { return(fldName.Index); } return(-1); }); for (int i = 0; i < dataResponse.Rows.Count; i++) { var dr = dataResponse.Rows[i]; var drRow = dtRowTVP.NewRow(); drRow["RowNr"] = i; drRow["MaterialKey"] = dr.Properties[0].ID; //prepare rows for list tvp as well var drList = dtListTVP.NewRow(); drList["RowID"] = dr.Properties[0].ID; drList["GID"] = dr.Cells[getColIndex("GID")].Value; drList["EntryCode"] = getColIndex("EntryCode") > 0 ? dr.Cells[getColIndex("EntryCode")].Value : ""; //foreach (var col in columns) for (int j = 0; j < columns.Count; j++) { var col = columns[j]; var drCell = dtCellTVP.NewRow(); var cellval = dr.Cells[col.Index].Value; if (col.ColLabel.EqualsIgnoreCase("GID")) { if (string.IsNullOrWhiteSpace(cellval)) { result.Errors.Add("GID value can not be empty."); return(result); } else { drRow["GID"] = cellval; } } drCell["RowID"] = i; drCell["ColumnID"] = j; drCell["Value"] = cellval; dtCellTVP.Rows.Add(drCell); } dtListTVP.Rows.Add(drList); dtRowTVP.Rows.Add(drRow); } //check for duplicate material key 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 keys = data.Where(x => x.Count > 1).ToList(); if (keys.Any()) { var keylist = keys.Select(x => x.MaterialKey).ToList(); var key = keylist.Truncate(); result.Errors.Add($"Duplicate Material key {key}"); } if (result.Errors.Any()) { return(result); } result.CropCode = cropCode; result.BrStationCode = breedingStation; result.SyncCode = syncCode; result.CountryCode = countryCode; result.TVPColumns = dtColumnsTVP; result.TVPRows = dtRowTVP; result.TVPCells = dtCellTVP; result.TVPList = dtListTVP; //TestName and FilePath is same for Phenome args.FilePath = args.TestName; //import data into database await excelDataRepo.ImportDataAsync(result.CropCode, result.BrStationCode, result.SyncCode, result.CountryCode, args, result.TVPColumns, result.TVPRows, result.TVPCells, result.TVPList); return(result); } }