public int? UpdateProjects(List<iatiactivity> projects, string Iuser, bool notCleanOldData = true) { var aimsCurrencies = from c in dbContext.tblCurrencies select new CurrencyLookupItem { Id = c.Id, IATICode = c.IATICode }; var aimsAidCategories = from c in dbContext.tblAidCategories select new AidCategoryLookupItem { Id = c.Id, IATICode = c.IATICode }; var divisions = (from d in dbContext.tblDivisions where d.GPSLatitude != null && d.GPSLongitude != null select new GeoLocation { DivisionId = d.Id, Name = d.DivisionName, Latitude = (double)d.GPSLatitude, Longitude = (double)d.GPSLongitude }).ToList(); var districts = (from d in dbContext.tblDistricts where d.GPSLatitude != null && d.GPSLongitude != null select new GeoLocation { DistrictId = d.Id, DivisionId = d.DivisionId, Name = d.DistrictName, Latitude = (double)d.GPSLatitude, Longitude = (double)d.GPSLongitude }).ToList(); var upazilas = (from d in dbContext.tblUpazilas where d.GPSLatitude != null && d.GPSLongitude != null select new GeoLocation { UpazilaId = d.Id, DistrictId = d.DistrictId, DivisionId = d.DivisionId, Name = d.UpazilaName, Latitude = (double)d.GPSLatitude, Longitude = (double)d.GPSLongitude }).ToList(); foreach (var mergedproject in projects) { try { bool isFinancialDataMismathed = false; var defaultfinancetype = "100"; if (mergedproject.defaultfinancetype != null && !string.IsNullOrWhiteSpace(mergedproject.defaultfinancetype.code)) defaultfinancetype = mergedproject.defaultfinancetype.code.StartsWith("4") ? "400" : "100"; var p = dbContext.tblProjectInfoes?.FirstOrDefault(f => f.Id == mergedproject.ProjectId); if (p == null) { p = new tblProjectInfo(); p.IDate = DateTime.Now; p.IUser = Iuser; p.FundSourceId = mergedproject.AimsFundSourceId; p.IatiIdentifier = mergedproject.IatiIdentifier; dbContext.tblProjectInfoes.Add(p); } else { // first check isFinancialDataMismathed foreach (var MatchedProject in mergedproject.MatchedProjects) { isFinancialDataMismathed = CheckTransactionMismatch(p, MatchedProject, notCleanOldData); if (isFinancialDataMismathed) break; } //if Financial Data are Mismathed then continue with next project if (isFinancialDataMismathed) continue; //if FinancialData are not Mismathed then delete existing transactions (this DP only) foreach (var MatchedProject in mergedproject.MatchedProjects) { DeleteTransactions(p, MatchedProject); } //then we need another loop to update transactions !!! Do not combine these three identical loops. foreach (var MatchedProject in mergedproject.MatchedProjects) { UpdateTransactions(Iuser, aimsCurrencies, aimsAidCategories, defaultfinancetype, p, MatchedProject); } } isFinancialDataMismathed = CheckTransactionMismatch(p, mergedproject, notCleanOldData); if (isFinancialDataMismathed) continue; DeleteTransactions(p, mergedproject); UpdateTransactions(Iuser, aimsCurrencies, aimsAidCategories, defaultfinancetype, p, mergedproject); //if (checkMismatch) //{ //we need to place this region at bottom due to checking isFinancialDataMismatched #region Other Fields p.Title = mergedproject.Title; p.Objective = mergedproject.Description; if (notCleanOldData == false) { foreach (var item in p.tblProjectAttachments.ToList()) { dbContext.tblProjectAttachments.Remove(item); } foreach (var item in p.tblProjectSectoralAllocations.ToList()) { dbContext.tblProjectSectoralAllocations.Remove(item); } foreach (var item in p.tblProjectGeographicAllocations.ToList()) { dbContext.tblProjectGeographicAllocations.Remove(item); } foreach (var item in p.tblProjectExecutingAgencies.ToList()) { dbContext.tblProjectExecutingAgencies.Remove(item); } } #region Document if (mergedproject.documentlink != null) { foreach (var document in mergedproject.documentlink) { var docTitle = document.title?.narrative.n(0).Value; var attachment = p.tblProjectAttachments.FirstOrDefault(f => f.AttachmentTitle == docTitle); if (attachment == null) { attachment = new tblProjectAttachment(); p.tblProjectAttachments.Add(attachment); } var docCatCode = document.category.n(0).code; var docCategory = dbContext.tblDocumentCategories.FirstOrDefault(f => f.IATICode == docCatCode); attachment.DocumentCategoryId = docCategory != null ? docCategory.Id : dbContext.tblDocumentCategories.OrderBy(o => o.Id).FirstOrDefault().Id; attachment.AttachmentTitle = docTitle; attachment.AttachmentFileURL = document.url; attachment.IUser = Iuser; attachment.IDate = DateTime.Now; } } #endregion #region Aid Type var AssistanceType = dbContext.tblAssistanceTypes.FirstOrDefault(f => f.IATICode.Contains(mergedproject.AidTypeCode)); p.AssistanceTypeId = AssistanceType != null ? AssistanceType.Id : dbContext.tblAssistanceTypes.FirstOrDefault().Id; var ProjectType = dbContext.tblProjectTypes.FirstOrDefault(f => f.IATICode.Contains(mergedproject.AidTypeCode)); p.ProjectTypeId = ProjectType != null ? ProjectType.Id : dbContext.tblProjectTypes.FirstOrDefault().Id; #endregion #region Dates p.AgreementSignDate = mergedproject.ActualStartDate == default(DateTime) ? mergedproject.PlannedStartDate.ToSqlDateTime() : mergedproject.ActualStartDate; p.PlannedProjectStartDate = mergedproject.PlannedStartDate.ToSqlDateTimeNull(); p.ActualProjectStartDate = mergedproject.ActualStartDate.ToSqlDateTimeNull(); p.PlannedProjectCompletionDate = mergedproject.PlannedEndDate.ToSqlDateTimeNull(); p.RevisedProjectCompletionDate = mergedproject.ActualEndDate.ToSqlDateTimeNull(); #endregion #region Status var statusCode = mergedproject.activitystatus?.code; var ImplementationStatus = dbContext.tblImplementationStatus.FirstOrDefault(f => f.IATICode.Contains(statusCode)); p.ImplementationStatusId = ImplementationStatus == null ? default(int?) : ImplementationStatus.Id; #endregion #region Sector if (mergedproject.sector != null) { var totalPercentage = mergedproject.sector.Sum(s => s.percentage); // to prevent percentage being greater than 100 foreach (var sector in mergedproject.sector) { if (sector.vocabulary == "1" || sector.vocabulary == "2") { var aimsSector = dbContext.tblSectors.FirstOrDefault(f => f.IATICode == sector.code); var aimsSubsector = dbContext.tblSubSectors.FirstOrDefault(f => f.IATICode == sector.code); var sectorId = aimsSector != null ? aimsSector.Id : aimsSubsector != null ? aimsSubsector.SectorId : 0; if (sectorId > 0) { var SubsectorId = aimsSubsector != null ? aimsSubsector.Id : 0; var psector = p.tblProjectSectoralAllocations.FirstOrDefault(f => f.SectorId == sectorId && f.SubSectorId == SubsectorId); if (psector == null) { psector = new tblProjectSectoralAllocation(); p.tblProjectSectoralAllocations.Add(psector); psector.IUser = Iuser; psector.IDate = DateTime.Now; } psector.SectorId = sectorId; psector.SubSectorId = SubsectorId; psector.TotalCommitmentPercent = sector.percentage.ToPercent(totalPercentage); } } } } #endregion #region Location if (mergedproject.location != null) { foreach (var location in mergedproject.location) { if (location.point == null) continue; GeoLocation nearestGeoLocation = null; var administrative = location.administrative?.FirstOrDefault(); if (administrative != null && administrative.vocabulary == "G1") { if (administrative.level == "1") { nearestGeoLocation = GetNearestGeoLocation(divisions, location); } else if (administrative.level == "2") { nearestGeoLocation = GetNearestGeoLocation(districts, location); } else if (administrative.level == "3") { nearestGeoLocation = GetNearestGeoLocation(upazilas, location); } } else { nearestGeoLocation = GetNearestGeoLocation(districts, location); } var aimsProjectLocation = p.tblProjectGeographicAllocations.FirstOrDefault(f => f.DivisionId == nearestGeoLocation.DivisionId && f.DistrictId == nearestGeoLocation.DistrictId && f.UpazilaId == nearestGeoLocation.UpazilaId); if (aimsProjectLocation == null) { aimsProjectLocation = new tblProjectGeographicAllocation(); aimsProjectLocation.DivisionId = nearestGeoLocation.DivisionId; aimsProjectLocation.DistrictId = nearestGeoLocation.DistrictId; aimsProjectLocation.UpazilaId = nearestGeoLocation.UpazilaId; aimsProjectLocation.IUser = Iuser; aimsProjectLocation.IDate = DateTime.Now; p.tblProjectGeographicAllocations.Add(aimsProjectLocation); } aimsProjectLocation.TotalCommitmentPercentForDistrict = 100 / mergedproject.location.Count(); } } #endregion #region Executing Agency if (mergedproject.ImplementingOrgs.IsNotEmpty()) { foreach (var ImplementingOrg in mergedproject.ImplementingOrgs.Where(w => w.AllID != mergedproject.AllID)) { var executingAgency = p.tblProjectExecutingAgencies.FirstOrDefault(f => f.ExecutingAgencyOrganizationId == ImplementingOrg.ExecutingAgencyOrganizationId); if (executingAgency == null) { executingAgency = new tblProjectExecutingAgency { ExecutingAgencyOrganizationId = ImplementingOrg.ExecutingAgencyOrganizationId, IUser = Iuser, IDate = DateTime.Now }; p.tblProjectExecutingAgencies.Add(executingAgency); } executingAgency.ExecutingAgencyTypeId = ImplementingOrg.ExecutingAgencyTypeId.Value; executingAgency.ExecutingAgencyOrganizationTypeId = ImplementingOrg.ExecutingAgencyOrganizationTypeId; } } #endregion #endregion //} dbContext.SaveChanges(); mergedproject.ProjectId = p.Id; } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } catch (Exception ex) { Logger.WriteToDbAndFile(ex, LogType.Error, mergedproject.IATICode, mergedproject.IatiIdentifier); } } try { aimsDBIatiDAL.MapActivities(projects); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } catch (Exception ex) { Logger.WriteToDbAndFile(ex, LogType.Error); } return 1; }