/// <summary> /// Maps the pledge. /// </summary> /// <param name="queryable">The queryable.</param> /// <exception cref="System.NotImplementedException"></exception> private int MapPledge( CSVInstance csvData ) { var lookupContext = new RockContext(); var accountList = new FinancialAccountService( lookupContext ).Queryable().AsNoTracking().ToList(); var importedPledges = new FinancialPledgeService( lookupContext ).Queryable().AsNoTracking() .Where( p => p.ForeignId != null ) .ToDictionary( t => ( int )t.ForeignId, t => ( int? )t.Id ); var pledgeFrequencies = DefinedTypeCache.Read( new Guid( Rock.SystemGuid.DefinedType.FINANCIAL_FREQUENCY ), lookupContext ).DefinedValues; int oneTimePledgeFrequencyId = pledgeFrequencies.FirstOrDefault( f => f.Guid == new Guid( Rock.SystemGuid.DefinedValue.TRANSACTION_FREQUENCY_ONE_TIME ) ).Id; var newPledges = new List<FinancialPledge>(); int completed = 0; ReportProgress( 0, string.Format( "Verifying pledge import ({0:N0} already exist).", importedPledges.Count ) ); string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ( (row = csvData.Database.FirstOrDefault()) != null ) { string amountKey = row[TotalPledge]; decimal? amount = amountKey.AsType<decimal?>(); string startDateKey = row[StartDate]; if ( String.IsNullOrWhiteSpace( startDateKey ) ) { startDateKey = "01/01/0001"; } DateTime? startDate = startDateKey.AsType<DateTime?>(); string endDateKey = row[EndDate]; if ( String.IsNullOrWhiteSpace( endDateKey ) ) { endDateKey = "12/31/9999"; } DateTime? endDate = endDateKey.AsType<DateTime?>(); string pledgeIdKey = row[PledgeId]; int? pledgeId = pledgeIdKey.AsType<int?>(); if ( amount != null && !importedPledges.ContainsKey( ( int )pledgeId ) ) { string individualIdKey = row[IndividualID]; int? individualId = individualIdKey.AsType<int?>(); var personKeys = GetPersonKeys( individualId ); if ( personKeys != null && personKeys.PersonAliasId > 0 ) { var pledge = new FinancialPledge(); pledge.PersonAliasId = personKeys.PersonAliasId; pledge.CreatedByPersonAliasId = ImportPersonAliasId; pledge.StartDate = ( DateTime )startDate; pledge.EndDate = ( DateTime )endDate; pledge.TotalAmount = ( decimal )amount; pledge.CreatedDateTime = ImportDateTime; pledge.ModifiedDateTime = ImportDateTime; pledge.ModifiedByPersonAliasId = ImportPersonAliasId; pledge.ForeignKey = pledgeIdKey; pledge.ForeignId = pledgeId; string frequency = row[PledgeFrequencyName].ToString().ToLower(); if ( !String.IsNullOrWhiteSpace( frequency ) ) { frequency = frequency.ToLower(); if ( frequency.Equals( "one time" ) || frequency.Equals( "one-time" ) || frequency.Equals( "as can" ) ) { pledge.PledgeFrequencyValueId = oneTimePledgeFrequencyId; } else { pledge.PledgeFrequencyValueId = pledgeFrequencies .Where( f => f.Value.ToLower().StartsWith( frequency ) || f.Description.ToLower().StartsWith( frequency ) ) .Select( f => f.Id ).FirstOrDefault(); } } string fundName = row[FundName] as string; string subFund = row[SubFundName] as string; string fundGLAccount = row[FundGLAccount] as string; string subFundGLAccount = row[SubFundGLAccount] as string; string isFundActiveKey = row[FundIsActive]; Boolean? isFundActive = isFundActiveKey.AsType<Boolean?>(); string isSubFundActiveKey = row[SubFundIsActive]; Boolean? isSubFundActive = isSubFundActiveKey.AsType<Boolean?>(); if ( !String.IsNullOrWhiteSpace( fundName ) ) { var parentAccount = accountList.FirstOrDefault( a => a.Name.Equals( fundName.Truncate( 50 ) ) && a.CampusId == null ); if ( parentAccount == null ) { parentAccount = AddAccount( lookupContext, fundName, string.Empty, null, null, isFundActive ); accountList.Add( parentAccount ); } if ( !String.IsNullOrWhiteSpace( subFund ) ) { int? campusFundId = null; // assign a campus if the subfund is a campus fund var campusFund = CampusList.FirstOrDefault( c => subFund.StartsWith( c.Name ) || subFund.StartsWith( c.ShortCode ) ); if ( campusFund != null ) { // use full campus name as the subfund subFund = campusFund.Name; campusFundId = campusFund.Id; } // add info to easily find/assign this fund in the view subFund = string.Format( "{0} {1}", subFund, fundName ); var childAccount = accountList.FirstOrDefault( c => c.Name.Equals( subFund.Truncate( 50 ) ) && c.ParentAccountId == parentAccount.Id ); if ( childAccount == null ) { // create a child account with a campusId if it was set childAccount = AddAccount( lookupContext, subFund, string.Empty, campusFundId, parentAccount.Id, isSubFundActive ); accountList.Add( childAccount ); } pledge.AccountId = childAccount.Id; } else { pledge.AccountId = parentAccount.Id; } } newPledges.Add( pledge ); completed++; if ( completed % (ReportingNumber * 10) < 1 ) { ReportProgress( 0, string.Format( "{0:N0} pledges imported.", completed ) ); } else if ( completed % ReportingNumber < 1 ) { SavePledges( newPledges ); ReportPartialProgress(); newPledges.Clear(); } } } } if ( newPledges.Any() ) { SavePledges( newPledges ); } ReportProgress( 100, string.Format( "Finished pledge import: {0:N0} pledges imported.", completed ) ); return completed; }