Ejemplo n.º 1
0
        public void BenevolenceRequestDateKeyJoinsCorrectly()
        {
            var expectedRecordCount = 15;
            var year        = 2015;
            var rockContext = new RockContext();
            var benevolenceRequestService = new BenevolenceRequestService(rockContext);

            var minDateValue = TestDataHelper.GetAnalyticsSourceMinDateForYear(rockContext, year);
            var maxDateValue = TestDataHelper.GetAnalyticsSourceMaxDateForYear(rockContext, year);

            for (var i = 0; i < 15; i++)
            {
                var benevolenceRequest = BuildBenevolenceRequest(rockContext,
                                                                 TestDataHelper.GetRandomDateInRange(minDateValue, maxDateValue));

                benevolenceRequestService.Add(benevolenceRequest);
            }

            rockContext.SaveChanges();

            var benevolenceRequests = benevolenceRequestService.
                                      Queryable("AnalyticsSourceDate").
                                      Where(i => i.ForeignKey == benevolenceRequestForeignKey).
                                      Where(i => i.RequestSourceDate.CalendarYear == year);

            Assert.AreEqual(expectedRecordCount, benevolenceRequests.Count());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates a Linq Expression that can be applied to an IQueryable to filter the result set.
        /// </summary>
        /// <param name="entityType">The type of entity in the result set.</param>
        /// <param name="serviceInstance">A service instance that can be queried to obtain the result set.</param>
        /// <param name="parameterExpression">The input parameter that will be injected into the filter expression.</param>
        /// <param name="selection">A formatted string representing the filter settings.</param>
        /// <returns>
        /// A Linq Expression that can be used to filter an IQueryable.
        /// </returns>
        /// <exception cref="System.Exception">Filter issue(s):  + errorMessages.AsDelimited( ;  )</exception>
        public override Expression GetExpression(Type entityType, IService serviceInstance, ParameterExpression parameterExpression, string selection)
        {
            var settings = new FilterSettings(selection);

            var context = (RockContext)serviceInstance.Context;

            // Get the Benevolence Request Data View.
            var dataView = DataComponentSettingsHelper.GetDataViewForFilterComponent(settings.DataViewGuid, context);

            // Evaluate the Data View that defines the Person's Benevolence Request.
            var benevolenceRequestService = new BenevolenceRequestService(context);

            var benevolenceRequestQuery = benevolenceRequestService.Queryable();

            if (dataView != null)
            {
                benevolenceRequestQuery = DataComponentSettingsHelper.FilterByDataView(benevolenceRequestQuery, dataView, benevolenceRequestService);
            }

            var benevolenceRequestPersonsKey = benevolenceRequestQuery.Select(a => a.RequestedByPersonAliasId);
            // Get all of the Person corresponding to the qualifying Benevolence Requests.
            var qry = new PersonService(context).Queryable()
                      .Where(g => g.Aliases.Any(k => benevolenceRequestPersonsKey.Contains(k.Id)));

            // Retrieve the Filter Expression.
            var extractedFilterExpression = FilterExpressionExtractor.Extract <Model.Person>(qry, parameterExpression, "g");

            return(extractedFilterExpression);
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            phSummary.Controls.Clear();
            rFilter.Visible = true;
            gList.Visible   = true;

            bool canAddEditDelete = IsUserAuthorized(Authorization.EDIT);

            gList.Actions.ShowAdd = canAddEditDelete;
            gList.IsDeleteEnabled = canAddEditDelete;

            var rockContext = new RockContext();
            var benevolenceRequestService = new BenevolenceRequestService(rockContext);

            var benevolenceRequests = benevolenceRequestService
                                      .Queryable("BenevolenceResults,RequestedByPersonAlias,RequestedByPersonAlias.Person,CaseWorkerPersonAlias,CaseWorkerPersonAlias.Person").AsNoTracking();

            var hideGridColumns       = GetAttributeValue(AttributeKey.HideColumnsAttributeKey)?.Split(',')?.Select(v => v.ToUpper());
            var benevolenceTypeFilter = GetAttributeValue(AttributeKey.FilterBenevolenceTypesAttributeKey)
                                        ?.Split(',')
                                        ?.Where(v => v.IsNotNullOrWhiteSpace())
                                        ?.Select(v => new Guid(v));

            // Filter by Start Date
            DateTime?startDate = drpDate.LowerValue;

            if (startDate != null)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.RequestDateTime >= startDate);
            }

            // Filter by End Date
            DateTime?endDate = drpDate.UpperValue;

            if (endDate != null)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.RequestDateTime <= endDate);
            }

            // Filter by Campus
            if (cpCampus.SelectedCampusId.HasValue)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.CampusId == cpCampus.SelectedCampusId);
            }

            if (TargetPerson != null)
            {
                // show benevolence request for the target person and also for their family members
                var qryFamilyMembers = TargetPerson.GetFamilyMembers(true, rockContext);
                benevolenceRequests = benevolenceRequests.Where(a => a.RequestedByPersonAliasId.HasValue && qryFamilyMembers.Any(b => b.PersonId == a.RequestedByPersonAlias.PersonId));
            }
            else
            {
                // Filter by First Name
                string firstName = tbFirstName.Text;
                if (!string.IsNullOrWhiteSpace(firstName))
                {
                    benevolenceRequests = benevolenceRequests.Where(b => b.FirstName.StartsWith(firstName));
                }

                // Filter by Last Name
                string lastName = tbLastName.Text;
                if (!string.IsNullOrWhiteSpace(lastName))
                {
                    benevolenceRequests = benevolenceRequests.Where(b => b.LastName.StartsWith(lastName));
                }
            }

            // Filter by Government Id
            string governmentId = tbGovernmentId.Text;

            if (!string.IsNullOrWhiteSpace(governmentId))
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.GovernmentId.StartsWith(governmentId));
            }

            // Filter by Case Worker
            int?caseWorkerPersonAliasId = ddlCaseWorker.SelectedItem.Value.AsIntegerOrNull();

            if (caseWorkerPersonAliasId != null)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.CaseWorkerPersonAliasId == caseWorkerPersonAliasId);
            }

            // Filter by Result
            int?resultTypeValueId = dvpResult.SelectedItem.Value.AsIntegerOrNull();

            if (resultTypeValueId != null)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.BenevolenceResults.Where(r => r.ResultTypeValueId == resultTypeValueId).Count() > 0);
            }

            // Filter by Request Status
            int?requestStatusValueId = dvpStatus.SelectedItem.Value.AsIntegerOrNull();

            if (requestStatusValueId != null)
            {
                benevolenceRequests = benevolenceRequests.Where(b => b.RequestStatusValueId == requestStatusValueId);
            }

            // Filter by Benevolence Types
            var benevolenceTypeIds = cblBenevolenceType.SelectedValues.Where(v => v.ToIntSafe() > 0).Select(v => v.ToIntSafe());

            if (benevolenceTypeIds?.Count() > 0)
            {
                benevolenceRequests = benevolenceRequests.Where(b => benevolenceTypeIds.Contains(b.BenevolenceTypeId));
            }

            if (benevolenceTypeFilter?.Count() > 0)
            {
                benevolenceRequests = benevolenceRequests.Where(b => benevolenceTypeFilter.Contains(b.BenevolenceType.Guid));
            }

            SortProperty sortProperty = gList.SortProperty;

            if (sortProperty != null)
            {
                if (sortProperty.Property == "TotalAmount")
                {
                    if (sortProperty.Direction == SortDirection.Descending)
                    {
                        benevolenceRequests = benevolenceRequests.OrderByDescending(a => a.BenevolenceResults.Sum(b => b.Amount));
                    }
                    else
                    {
                        benevolenceRequests = benevolenceRequests.OrderBy(a => a.BenevolenceResults.Sum(b => b.Amount));
                    }
                }
            }
            else
            {
                benevolenceRequests = benevolenceRequests.OrderByDescending(a => a.RequestDateTime).ThenByDescending(a => a.Id);
            }

            // Filter query by any configured attribute filters

            if (AvailableAttributes != null && AvailableAttributes.Any())
            {
                foreach (var attribute in AvailableAttributes)
                {
                    var filterControl = phAttributeFilters.FindControl("filter_" + attribute.Id.ToString());
                    benevolenceRequests = attribute.FieldType.Field.ApplyAttributeQueryFilter(benevolenceRequests, filterControl, attribute, benevolenceRequestService, Rock.Reporting.FilterMode.SimpleFilter);
                }
            }

            var personContext = this.ContextEntity <Person>();

            if (personContext != null)
            {
                benevolenceRequests = benevolenceRequests.Where(a => a.RequestedByPersonAlias.PersonId == personContext.Id);
            }

            if (sortProperty != null)
            {
                gList.DataSource = benevolenceRequests.Sort(sortProperty).ToList();
            }
            else
            {
                gList.DataSource = benevolenceRequests.OrderByDescending(p => p.CreatedDateTime).ThenByDescending(p => p.Id).ToList();
            }

            // Hide the campus column if the campus filter is not visible.
            gList.ColumnsOfType <RockBoundField>().First(c => c.DataField == "Campus.Name").Visible = cpCampus.Visible;

            gList.EntityTypeId = EntityTypeCache.Get <BenevolenceRequest>().Id;
            gList.DataBind();

            // Hide columns and specific fields if the hide column attributes are set on the block.
            if (hideGridColumns?.Count() > 0)
            {
                foreach (DataControlField controlField in gList.Columns)
                {
                    controlField.Visible = !hideGridColumns.Contains(controlField.HeaderText.ToUpper());
                }

                pnlSummary.Visible = !hideGridColumns.Contains("TOTAL RESULTS");
            }

            // Hide the campus column if the campus filter is not visible.
            gList.ColumnsOfType <RockBoundField>().First(c => c.DataField == "Campus.Name").Visible = cpCampus.Visible;

            // Builds the Totals section
            var definedTypeCache = DefinedTypeCache.Get(new Guid(Rock.SystemGuid.DefinedType.BENEVOLENCE_RESULT_TYPE));
            Dictionary <string, decimal> resultTotals = new Dictionary <string, decimal>();
            decimal grandTotal = 0;

            foreach (BenevolenceRequest request in benevolenceRequests)
            {
                foreach (BenevolenceResult result in request.BenevolenceResults)
                {
                    if (result.Amount != null)
                    {
                        if (resultTotals.ContainsKey(result.ResultTypeValue.Value))
                        {
                            resultTotals[result.ResultTypeValue.Value] += result.Amount.Value;
                        }
                        else
                        {
                            resultTotals.Add(result.ResultTypeValue.Value, result.Amount.Value);
                        }

                        grandTotal += result.Amount.Value;
                    }
                }
            }

            foreach (KeyValuePair <string, decimal> keyValuePair in resultTotals)
            {
                phSummary.Controls.Add(new LiteralControl(string.Format("<div class='row'><div class='col-xs-8'>{0}: </div><div class='col-xs-4 text-right'>{1}</div></div>", keyValuePair.Key, keyValuePair.Value.FormatAsCurrency())));
            }

            phSummary.Controls.Add(new LiteralControl(string.Format("<div class='row'><div class='col-xs-8'><b>Total: </div><div class='col-xs-4 text-right'>{0}</b></div></div>", grandTotal.FormatAsCurrency())));
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            phSummary.Controls.Clear();
            rFilter.Visible = true;
            gList.Visible   = true;
            RockContext rockContext = new RockContext();
            BenevolenceRequestService benevolenceRequestService = new BenevolenceRequestService(rockContext);
            var qry = benevolenceRequestService.Queryable("BenevolenceResults,RequestedByPersonAlias,RequestedByPersonAlias.Person,CaseWorkerPersonAlias,CaseWorkerPersonAlias.Person").AsNoTracking();

            // Filter by Start Date
            DateTime?startDate = drpDate.LowerValue;

            if (startDate != null)
            {
                qry = qry.Where(b => b.RequestDateTime >= startDate);
            }

            // Filter by End Date
            DateTime?endDate = drpDate.UpperValue;

            if (endDate != null)
            {
                qry = qry.Where(b => b.RequestDateTime <= endDate);
            }

            // Filter by Campus
            if (cpCampus.SelectedCampusId.HasValue)
            {
                qry = qry.Where(b => b.CampusId == cpCampus.SelectedCampusId);
            }

            if (TargetPerson != null)
            {
                // show benevolence request for the target person and also for their family members
                var qryFamilyMembers = TargetPerson.GetFamilyMembers(true, rockContext);
                qry = qry.Where(a => a.RequestedByPersonAliasId.HasValue && qryFamilyMembers.Any(b => b.PersonId == a.RequestedByPersonAlias.PersonId));
            }
            else
            {
                // Filter by First Name
                string firstName = tbFirstName.Text;
                if (!string.IsNullOrWhiteSpace(firstName))
                {
                    qry = qry.Where(b => b.FirstName.StartsWith(firstName));
                }

                // Filter by Last Name
                string lastName = tbLastName.Text;
                if (!string.IsNullOrWhiteSpace(lastName))
                {
                    qry = qry.Where(b => b.LastName.StartsWith(lastName));
                }
            }

            // Filter by Government Id
            string governmentId = tbGovernmentId.Text;

            if (!string.IsNullOrWhiteSpace(governmentId))
            {
                qry = qry.Where(b => b.GovernmentId.StartsWith(governmentId));
            }

            // Filter by Case Worker
            int?caseWorkerPersonAliasId = ddlCaseWorker.SelectedItem.Value.AsIntegerOrNull();

            if (caseWorkerPersonAliasId != null)
            {
                qry = qry.Where(b => b.CaseWorkerPersonAliasId == caseWorkerPersonAliasId);
            }

            // Filter by Result
            int?resultTypeValueId = dvpResult.SelectedItem.Value.AsIntegerOrNull();

            if (resultTypeValueId != null)
            {
                qry = qry.Where(b => b.BenevolenceResults.Where(r => r.ResultTypeValueId == resultTypeValueId).Count() > 0);
            }

            // Filter by Request Status
            int?requestStatusValueId = dvpStatus.SelectedItem.Value.AsIntegerOrNull();

            if (requestStatusValueId != null)
            {
                qry = qry.Where(b => b.RequestStatusValueId == requestStatusValueId);
            }

            SortProperty sortProperty = gList.SortProperty;

            if (sortProperty != null)
            {
                if (sortProperty.Property == "TotalAmount")
                {
                    if (sortProperty.Direction == SortDirection.Descending)
                    {
                        qry = qry.OrderByDescending(a => a.BenevolenceResults.Sum(b => b.Amount));
                    }
                    else
                    {
                        qry = qry.OrderBy(a => a.BenevolenceResults.Sum(b => b.Amount));
                    }
                }
                else
                {
                    qry = qry.Sort(sortProperty);
                }
            }
            else
            {
                qry = qry.OrderByDescending(a => a.RequestDateTime).ThenByDescending(a => a.Id);
            }

            // Filter query by any configured attribute filters
            if (AvailableAttributes != null && AvailableAttributes.Any())
            {
                foreach (var attribute in AvailableAttributes)
                {
                    var filterControl = phAttributeFilters.FindControl("filter_" + attribute.Id.ToString());
                    qry = attribute.FieldType.Field.ApplyAttributeQueryFilter(qry, filterControl, attribute, benevolenceRequestService, Rock.Reporting.FilterMode.SimpleFilter);
                }
            }

            var list = qry.ToList();

            gList.DataSource = list;
            gList.DataBind();

            // Builds the Totals section
            var definedTypeCache = DefinedTypeCache.Get(new Guid(Rock.SystemGuid.DefinedType.BENEVOLENCE_RESULT_TYPE));
            Dictionary <string, decimal> resultTotals = new Dictionary <string, decimal>();
            decimal grandTotal = 0;

            foreach (BenevolenceRequest request in list)
            {
                foreach (BenevolenceResult result in request.BenevolenceResults)
                {
                    if (result.Amount != null)
                    {
                        if (resultTotals.ContainsKey(result.ResultTypeValue.Value))
                        {
                            resultTotals[result.ResultTypeValue.Value] += result.Amount.Value;
                        }
                        else
                        {
                            resultTotals.Add(result.ResultTypeValue.Value, result.Amount.Value);
                        }

                        grandTotal += result.Amount.Value;
                    }
                }
            }

            foreach (KeyValuePair <string, decimal> keyValuePair in resultTotals)
            {
                phSummary.Controls.Add(new LiteralControl(string.Format("<div class='row'><div class='col-xs-8'>{0}: </div><div class='col-xs-4 text-right'>{1}{2:#,##0.00}</div></div>", keyValuePair.Key, GlobalAttributesCache.Value("CurrencySymbol"), keyValuePair.Value)));
            }

            phSummary.Controls.Add(new LiteralControl(string.Format("<div class='row'><div class='col-xs-8'><b>Total: </div><div class='col-xs-4 text-right'>{0}{1:#,##0.00}</b></div></div>", GlobalAttributesCache.Value("CurrencySymbol"), grandTotal)));
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            phSummary.Controls.Clear();
            rFilter.Visible = true;
            gList.Visible = true;
            RockContext rockContext = new RockContext();
            BenevolenceRequestService benevolenceRequestService = new BenevolenceRequestService( rockContext );
            var qry = benevolenceRequestService.Queryable( "BenevolenceResults,RequestedByPersonAlias,RequestedByPersonAlias.Person,CaseWorkerPersonAlias,CaseWorkerPersonAlias.Person" );

            // Filter by Start Date
            DateTime? startDate = drpDate.LowerValue;
            if ( startDate != null )
            {
                qry = qry.Where( b => b.RequestDateTime >= startDate );
            }

            // Filter by End Date
            DateTime? endDate = drpDate.UpperValue;
            if ( endDate != null )
            {
                qry = qry.Where( b => b.RequestDateTime <= endDate );
            }

            if ( TargetPerson != null )
            {
                // show benevolence request for the target person and also for their family members
                var qryFamilyMembers = TargetPerson.GetFamilyMembers( true, rockContext );
                qry = qry.Where( a => a.RequestedByPersonAliasId.HasValue && qryFamilyMembers.Any( b => b.PersonId == a.RequestedByPersonAlias.PersonId ) );
            }
            else
            {
                // Filter by First Name
                string firstName = tbFirstName.Text;
                if ( !string.IsNullOrWhiteSpace( firstName ) )
                {
                    qry = qry.Where( b => b.FirstName.StartsWith( firstName ) );
                }

                // Filter by Last Name
                string lastName = tbLastName.Text;
                if ( !string.IsNullOrWhiteSpace( lastName ) )
                {
                    qry = qry.Where( b => b.LastName.StartsWith( lastName ) );
                }
            }

            // Filter by Government Id
            string governmentId = tbGovernmentId.Text;
            if ( !string.IsNullOrWhiteSpace( governmentId ) )
            {
                qry = qry.Where( b => b.GovernmentId.StartsWith( governmentId ) );
            }

            // Filter by Case Worker
            int? caseWorkerPersonAliasId = ddlCaseWorker.SelectedItem.Value.AsIntegerOrNull();
            if ( caseWorkerPersonAliasId != null )
            {
                qry = qry.Where( b => b.CaseWorkerPersonAliasId == caseWorkerPersonAliasId );
            }

            // Filter by Result
            int? resultTypeValueId = ddlResult.SelectedItem.Value.AsIntegerOrNull();
            if ( resultTypeValueId != null )
            {
                qry = qry.Where( b => b.BenevolenceResults.Where( r => r.ResultTypeValueId == resultTypeValueId ).Count() > 0 );
            }

            // Filter by Request Status
            int? requestStatusValueId = ddlStatus.SelectedItem.Value.AsIntegerOrNull();
            if ( requestStatusValueId != null )
            {
                qry = qry.Where( b => b.RequestStatusValueId == requestStatusValueId );
            }

            SortProperty sortProperty = gList.SortProperty;
            if ( sortProperty != null )
            {
                if ( sortProperty.Property == "TotalAmount" )
                {
                    if ( sortProperty.Direction == SortDirection.Descending )
                    {
                        qry = qry.OrderByDescending( a => a.BenevolenceResults.Sum( b => b.Amount ) );
                    }
                    else
                    {
                        qry = qry.OrderBy( a => a.BenevolenceResults.Sum( b => b.Amount ) );
                    }
                }
                else
                {
                    qry = qry.Sort( sortProperty );
                }
            }
            else
            {
                qry = qry.OrderByDescending( a => a.RequestDateTime ).ThenByDescending( a => a.Id );
            }

            gList.DataSource = qry.ToList();
            gList.DataBind();

            // Builds the Totals section
            var definedTypeCache = DefinedTypeCache.Read( new Guid( Rock.SystemGuid.DefinedType.BENEVOLENCE_RESULT_TYPE ) );
            Dictionary<string, decimal> resultTotals = new Dictionary<string, decimal>();
            decimal grandTotal = 0;
            foreach ( BenevolenceRequest request in qry.ToList() )
            {
                foreach ( BenevolenceResult result in request.BenevolenceResults )
                {
                    if ( result.Amount != null )
                    {
                        if ( resultTotals.ContainsKey( result.ResultTypeValue.Value ) )
                        {
                            resultTotals[result.ResultTypeValue.Value] += result.Amount.Value;
                        }
                        else
                        {
                            resultTotals.Add( result.ResultTypeValue.Value, result.Amount.Value );
                        }

                        grandTotal += result.Amount.Value;
                    }
                }
            }

            foreach ( KeyValuePair<string, decimal> keyValuePair in resultTotals )
            {
                phSummary.Controls.Add( new LiteralControl( string.Format( "<div class='row'><div class='col-xs-8'>{0}: </div><div class='col-xs-4 text-right'>{1}{2:#,##0.00}</div></div>", keyValuePair.Key, GlobalAttributesCache.Value( "CurrencySymbol" ), keyValuePair.Value ) ) );
            }

            phSummary.Controls.Add( new LiteralControl( string.Format( "<div class='row'><div class='col-xs-8'><b>Total: </div><div class='col-xs-4 text-right'>{0}{1:#,##0.00}</b></div></div>", GlobalAttributesCache.Value( "CurrencySymbol" ), grandTotal ) ) );
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Loads the Benevolence Requests data.
        /// </summary>
        /// <param name="csvData">The CSV data.</param>
        private int LoadBenevolenceRequest(CSVInstance csvData)
        {
            var lookupContext               = new RockContext();
            var benevolenceRequestService   = new BenevolenceRequestService(lookupContext);
            var importedBenevolenceRequests = benevolenceRequestService.Queryable().Count(p => p.ForeignKey != null);
            var requestStatusDTGuid         = Rock.SystemGuid.DefinedType.BENEVOLENCE_REQUEST_STATUS.AsGuid();
            var requestStatusPendingDVId    = DefinedValueCache.Get(new Guid(Rock.SystemGuid.DefinedValue.BENEVOLENCE_PENDING), lookupContext).Id;
            var homePhoneTypeDVId           = DefinedValueCache.Get(new Guid(Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_HOME), lookupContext).Id;
            var mobilePhoneTypeDVId         = DefinedValueCache.Get(new Guid(Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_MOBILE), lookupContext).Id;
            var workPhoneTypeDVId           = DefinedValueCache.Get(new Guid(Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_WORK), lookupContext).Id;

            var benevolenceRequestList = new List <BenevolenceRequest>();

            var completedItems = 0;
            var addedItems     = 0;

            ReportProgress(0, string.Format("Verifying benevolence request import ({0:N0} already imported).", importedBenevolenceRequests));

            string[] row;
            // Uses a look-ahead enumerator: this call will move to the next record immediately

            while ((row = csvData.Database.FirstOrDefault()) != null)
            {
                var benevolenceRequestText              = row[BenevolenceRequestText];
                var benevolenceRequestDate              = row[BenevolenceRequestDate];
                var benevolenceRequestId                = row[BenevolenceRequestId];
                var benevolenceRequestFirstName         = row[BenevolenceRequestFirstName];
                var benevolenceRequestLastName          = row[BenevolenceRequestLastName];
                var benevolenceRequestEmail             = row[BenevolenceRequestEmail];
                var benevolenceRequestCreatedById       = row[BenevolenceRequestCreatedById];
                var benevolenceRequestCreatedDate       = row[BenevolenceRequestCreatedDate];
                var benevolenceRequestRequestedById     = row[BenevolenceRequestRequestedById];
                var benevolenceRequestCaseWorkerId      = row[BenevolenceRequestCaseWorkerId];
                var benevolenceRequestCellPhone         = row[BenevolenceRequestCellPhone];
                var benevolenceRequestHomePhone         = row[BenevolenceRequestHomePhone];
                var benevolenceRequestWorkPhone         = row[BenevolenceRequestWorkPhone];
                var benevolenceRequestGovernmentId      = row[BenevolenceRequestGovernmentId];
                var benevolenceRequestProvidedNextSteps = row[BenevolenceRequestProvidedNextSteps];
                var benevolenceRequestStatus            = row[BenevolenceRequestStatus];
                var benevolenceRequestResultSummary     = row[BenevolenceRequestResultSummary];
                var benevolenceRequestAddress           = row[BenevolenceRequestAddress];
                var benevolenceRequestAddress2          = row[BenevolenceRequestAddress2];
                var benevolenceRequestCity              = row[BenevolenceRequestCity];
                var benevolenceRequestState             = row[BenevolenceRequestState];
                var benevolenceRequestZip               = row[BenevolenceRequestZip];
                var benevolenceRequestCountry           = row[BenevolenceRequestCountry];

                //
                // Verify we have the minimum required information for a valid BenevolenceRequest in the csv file.
                //
                if (string.IsNullOrWhiteSpace(benevolenceRequestText) ||
                    (string.IsNullOrWhiteSpace(benevolenceRequestRequestedById) && (string.IsNullOrWhiteSpace(benevolenceRequestFirstName) || string.IsNullOrWhiteSpace(benevolenceRequestLastName))))
                {
                    ReportProgress(0, $"Benevolence Request {benevolenceRequestId} is missing information. See exception log for details.");
                    LogException("InvalidBenevolenceRequest", string.Format("RequestId: {0} - BenevolenceRequestText and either BenevolenceRequestRequestedById or both BenevolenceRequestFirstName and BenevolenceRequestLastName are required. Benevolence Request {0} was not imported.", benevolenceRequestId));
                    completedItems++;
                    continue;
                }

                //
                // Check that this Benevolence Request doesn't already exist.
                //
                var exists = false;
                if (importedBenevolenceRequests > 0)
                {
                    exists = benevolenceRequestService.Queryable().AsNoTracking().Any(r => r.ForeignKey == benevolenceRequestId);
                }

                if (!exists)
                {
                    var email = string.Empty;
                    if (benevolenceRequestEmail.IsEmail())
                    {
                        email = benevolenceRequestEmail;
                    }

                    int?requestedByAliasId    = null;
                    var requestedByPersonKeys = GetPersonKeys(benevolenceRequestRequestedById);
                    if (requestedByPersonKeys != null)
                    {
                        requestedByAliasId = requestedByPersonKeys.PersonAliasId;
                    }

                    int?createdByAliasId    = null;
                    var createdByPersonKeys = GetPersonKeys(benevolenceRequestCreatedById);
                    if (createdByPersonKeys != null)
                    {
                        createdByAliasId = createdByPersonKeys.PersonAliasId;
                    }

                    int?caseWorkerAliasId    = null;
                    var caseWorkerPersonKeys = GetPersonKeys(benevolenceRequestCaseWorkerId);
                    if (caseWorkerPersonKeys != null)
                    {
                        caseWorkerAliasId = caseWorkerPersonKeys.PersonAliasId;
                    }

                    var requestDate = ( DateTime )ParseDateOrDefault(benevolenceRequestDate, Bulldozer.BulldozerComponent.ImportDateTime);
                    var dateCreated = ( DateTime )ParseDateOrDefault(benevolenceRequestCreatedDate, Bulldozer.BulldozerComponent.ImportDateTime);

                    var benevolenceRequest = new BenevolenceRequest
                    {
                        RequestedByPersonAliasId = requestedByAliasId,
                        FirstName               = benevolenceRequestFirstName,
                        LastName                = benevolenceRequestLastName,
                        Email                   = email,
                        RequestText             = benevolenceRequestText,
                        RequestDateTime         = requestDate,
                        CreatedDateTime         = dateCreated,
                        CreatedByPersonAliasId  = createdByAliasId,
                        ResultSummary           = benevolenceRequestResultSummary,
                        CaseWorkerPersonAliasId = caseWorkerAliasId,
                        ForeignKey              = benevolenceRequestId,
                        ForeignId               = benevolenceRequestId.AsType <int?>()
                    };
                    // Handle request Status
                    if (!string.IsNullOrWhiteSpace(benevolenceRequestStatus))
                    {
                        var statusDV = FindDefinedValueByTypeAndName(lookupContext, requestStatusDTGuid, benevolenceRequestStatus);
                        if (statusDV == null)
                        {
                            statusDV = AddDefinedValue(new RockContext(), requestStatusDTGuid.ToString(), benevolenceRequestStatus);
                        }
                        benevolenceRequest.RequestStatusValueId = statusDV.Id;
                    }
                    else
                    {
                        // set default status to pending
                        benevolenceRequest.RequestStatusValueId = requestStatusPendingDVId;
                    }

                    // Check for requester person and use its info instead
                    if (requestedByAliasId.HasValue && requestedByAliasId.Value > 0)
                    {
                        Person requester            = null;
                        var    requesterPersonAlias = new PersonAliasService(lookupContext).Queryable()
                                                      .AsNoTracking()
                                                      .FirstOrDefault(pa => pa.Id == requestedByAliasId.Value);
                        if (requesterPersonAlias != null && requesterPersonAlias.PersonId > 0)
                        {
                            requester = requesterPersonAlias.Person;
                        }

                        if (requester != null)
                        {
                            if (!string.IsNullOrWhiteSpace(requester.NickName))
                            {
                                benevolenceRequest.FirstName = requester.NickName;
                            }
                            else if (!string.IsNullOrWhiteSpace(requester.FirstName))
                            {
                                benevolenceRequest.FirstName = requester.FirstName;
                            }
                            if (!string.IsNullOrWhiteSpace(requester.LastName))
                            {
                                benevolenceRequest.LastName = requester.LastName;
                            }
                            if (!string.IsNullOrWhiteSpace(requester.Email))
                            {
                                benevolenceRequest.Email = requester.Email;
                            }
                            if (requester.PrimaryCampusId.HasValue)
                            {
                                benevolenceRequest.CampusId = requester.PrimaryCampusId;
                            }
                            if (requester.PhoneNumbers.Any(n => n.NumberTypeValueId.Value == homePhoneTypeDVId))
                            {
                                benevolenceRequest.HomePhoneNumber = requester.PhoneNumbers.FirstOrDefault(n => n.NumberTypeValueId.Value == homePhoneTypeDVId).NumberFormatted;
                            }
                            if (requester.PhoneNumbers.Any(n => n.NumberTypeValueId.Value == mobilePhoneTypeDVId))
                            {
                                benevolenceRequest.CellPhoneNumber = requester.PhoneNumbers.FirstOrDefault(n => n.NumberTypeValueId.Value == mobilePhoneTypeDVId).NumberFormatted;
                            }
                            if (requester.PhoneNumbers.Any(n => n.NumberTypeValueId.Value == workPhoneTypeDVId))
                            {
                                benevolenceRequest.WorkPhoneNumber = requester.PhoneNumbers.FirstOrDefault(n => n.NumberTypeValueId.Value == workPhoneTypeDVId).NumberFormatted;
                            }
                            var requesterAddressLocation = requester.GetHomeLocation();
                            if (requesterAddressLocation != null)
                            {
                                benevolenceRequest.LocationId = requesterAddressLocation.Id;
                            }
                        }
                        else
                        {
                            benevolenceRequestRequestedById = null;
                        }
                    }
                    if (string.IsNullOrWhiteSpace(benevolenceRequestRequestedById))
                    {
                        // Handle Address
                        var requestAddress = new LocationService(lookupContext).Get(benevolenceRequestAddress.Left(100), benevolenceRequestAddress2.Left(100), benevolenceRequestCity, benevolenceRequestState, benevolenceRequestZip, benevolenceRequestCountry, verifyLocation: false);
                        if (requestAddress != null)
                        {
                            benevolenceRequest.LocationId = requestAddress.Id;
                        }
                    }
                    benevolenceRequestList.Add(benevolenceRequest);
                    addedItems++;
                }
                completedItems++;
                if (completedItems % (ReportingNumber * 10) < 1)
                {
                    ReportProgress(0, string.Format("{0:N0} benevolence requests processed.", completedItems));
                }

                if (completedItems % ReportingNumber < 1)
                {
                    SaveBenevolenceRequests(benevolenceRequestList);
                    ReportPartialProgress();
                    benevolenceRequestList.Clear();
                }
            }

            if (benevolenceRequestList.Any())
            {
                SaveBenevolenceRequests(benevolenceRequestList);
            }

            ReportProgress(100, string.Format("Finished benevolence request import: {0:N0} benevolence requests processed, {1:N0} imported.", completedItems, addedItems));
            return(completedItems);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Loads the BenevolenceResult data.
        /// </summary>
        /// <param name="csvData">The CSV data.</param>
        private int LoadBenevolenceResult(CSVInstance csvData)
        {
            var lookupContext             = new RockContext();
            var benevolenceResultService  = new BenevolenceResultService(lookupContext);
            var benevolenceRequestService = new BenevolenceRequestService(lookupContext);
            var resultTypeDTGuid          = Rock.SystemGuid.DefinedType.BENEVOLENCE_RESULT_TYPE.AsGuid();
            var benevolenceResultList     = new List <BenevolenceResult>();

            var importedRequestIds = new List <int>();

            var completed            = 0;
            var importedCount        = 0;
            var alreadyImportedCount = benevolenceResultService.Queryable().AsNoTracking().Count(i => i.ForeignKey != null);

            ReportProgress(0, $"Starting Benevolence Result import ({alreadyImportedCount:N0} already exist).");

            string[] row;
            // Uses a look-ahead enumerator: this call will move to the next record immediately
            while ((row = csvData.Database.FirstOrDefault()) != null)
            {
                var benevolenceResultRequestId   = row[BenevolenceResultRequestId];
                var benevolenceResultType        = row[BenevolenceResultType];
                var benevolenceResultId          = row[BenevolenceResultId];
                var benevolenceResultAmount      = row[BenevolenceResultAmount];
                var benevolenceResultSummary     = row[BenevolenceResultSummary];
                var benevolenceResultCreatedById = row[BenevolenceResultCreatedById];
                var benevolenceResultCreatedDate = row[BenevolenceResultCreatedDate];

                //
                // Verify the Benevolence Result has a Result Type provided in the csv file.
                //
                if (string.IsNullOrWhiteSpace(benevolenceResultType))
                {
                    ReportProgress(0, $"Benevolence Result {benevolenceResultId} has no BenevolenceResultType value provided. Skipping Benevolence Result {benevolenceResultId}.");
                    LogException("InvalidBenevolenceResult", string.Format("ResultId: {0} - Missing BenevolenceResultType value. Benevolence Result {0} was not imported.", benevolenceResultId));
                    completed++;
                    continue;
                }

                BenevolenceRequest benevolenceRequest = null;
                if (benevolenceRequestService.Queryable().AsNoTracking().Any(r => r.ForeignKey == benevolenceResultRequestId))
                {
                    benevolenceRequest = benevolenceRequestService.Queryable().AsNoTracking().FirstOrDefault(r => r.ForeignKey == benevolenceResultRequestId);
                }

                //
                // Verify the Benevolence Request exists.
                //
                if (benevolenceRequest == null || benevolenceRequest.Id < 1)
                {
                    ReportProgress(0, $"Benevolence Request {benevolenceResultRequestId} not found. Skipping Benevolence Result {benevolenceResultId}.");
                    LogException("InvalidBenevolenceResult", string.Format("ResultId: {0} - BenevolenceResultRequestId {1} does not exist in imported Benevolence Requests. Benevolence Result {0} was not imported.", benevolenceResultId, benevolenceResultRequestId));
                    completed++;
                    continue;
                }

                //
                // Check that this Benevolence Result doesn't already exist.
                //
                var exists = false;
                if (alreadyImportedCount > 0)
                {
                    exists = benevolenceResultService.Queryable().AsNoTracking().Any(r => r.ForeignKey == benevolenceResultId);
                }

                if (!exists)
                {
                    // Handle Result Type
                    var resultTypeDV = FindDefinedValueByTypeAndName(lookupContext, resultTypeDTGuid, benevolenceResultType);
                    if (resultTypeDV == null)
                    {
                        resultTypeDV = AddDefinedValue(new RockContext(), resultTypeDTGuid.ToString(), benevolenceResultType);
                    }

                    // Format created date
                    var resultCreatedDate = ( DateTime )ParseDateOrDefault(benevolenceResultCreatedDate, Bulldozer.BulldozerComponent.ImportDateTime);

                    // Handle created by
                    int?createdByAliasId    = null;
                    var createdByPersonKeys = GetPersonKeys(benevolenceResultCreatedById);
                    if (createdByPersonKeys != null)
                    {
                        createdByAliasId = createdByPersonKeys.PersonAliasId;
                    }

                    //
                    // Create and populate the new Benevolence Result.
                    //
                    var benevolenceResult = new BenevolenceResult
                    {
                        BenevolenceRequestId = benevolenceRequest.Id,
                        ResultSummary        = benevolenceResultSummary,
                        ResultTypeValueId    = resultTypeDV.Id,
                        Amount                 = benevolenceResultAmount.AsType <decimal?>(),
                        ForeignKey             = benevolenceResultId,
                        ForeignId              = benevolenceResultId.AsType <int?>(),
                        CreatedDateTime        = resultCreatedDate,
                        CreatedByPersonAliasId = createdByAliasId,
                    };

                    benevolenceResultList.Add(benevolenceResult);

                    importedCount++;
                }

                //
                // Notify user of our status.
                //
                completed++;
                if (completed % (ReportingNumber * 10) < 1)
                {
                    ReportProgress(0, $"{completed:N0} Benevolence Request records processed, {importedCount:N0} imported.");
                }

                if (completed % ReportingNumber < 1)
                {
                    SaveBenevolenceResults(benevolenceResultList);
                    ReportPartialProgress();
                    benevolenceResultList.Clear();

                    // Clear out variables
                    benevolenceRequestService = new BenevolenceRequestService(lookupContext);
                }
            }

            if (benevolenceResultList.Any())
            {
                SaveBenevolenceResults(benevolenceResultList);
            }

            ReportProgress(0, $"Finished Benevolence Result import: {importedCount:N0} records added.");

            return(completed);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            phSummary.Controls.Clear();
            rFilter.Visible = true;
            gList.Visible   = true;
            RockContext rockContext = new RockContext();
            BenevolenceRequestService benevolenceRequestService = new BenevolenceRequestService(rockContext);
            var qry = benevolenceRequestService.Queryable("BenevolenceResults,BenevolenceResults.ResultTypeValue,RequestedByPersonAlias,RequestedByPersonAlias.Person,CaseWorkerPersonAlias,CaseWorkerPersonAlias.Person");

            //Filter by Start Date
            DateTime?startDate = drpDate.LowerValue;

            if (startDate != null)
            {
                qry = qry.Where(b => b.RequestDateTime >= startDate);
            }

            //Filter by End Date
            DateTime?endDate = drpDate.UpperValue;

            if (endDate != null)
            {
                qry = qry.Where(b => b.RequestDateTime <= endDate);
            }

            // Filter by First Name
            string firstName = tbFirstName.Text;

            if (!string.IsNullOrWhiteSpace(firstName))
            {
                qry = qry.Where(b => b.FirstName.StartsWith(firstName));
            }

            // Filter by Last Name
            string lastName = tbLastName.Text;

            if (!string.IsNullOrWhiteSpace(lastName))
            {
                qry = qry.Where(b => b.LastName.StartsWith(lastName));
            }

            // Filter by Government Id
            string governmentId = tbGovernmentId.Text;

            if (!string.IsNullOrWhiteSpace(governmentId))
            {
                qry = qry.Where(b => b.GovernmentId.StartsWith(governmentId));
            }

            //Filter by Case Worker
            int?caseWorkerPersonAliasId = ddlCaseWorker.SelectedItem.Value.AsIntegerOrNull();

            if (caseWorkerPersonAliasId != null)
            {
                qry = qry.Where(b => b.CaseWorkerPersonAliasId == caseWorkerPersonAliasId);
            }

            //Filter by Result
            int?resultTypeValueId = ddlResult.SelectedItem.Value.AsIntegerOrNull();

            if (resultTypeValueId != null)
            {
                qry = qry.Where(b => b.BenevolenceResults.Where(r => r.ResultTypeValueId == resultTypeValueId).Count() > 0);
            }

            //Filter by Request Status
            int?requestStatusValueId = ddlStatus.SelectedItem.Value.AsIntegerOrNull();

            if (requestStatusValueId != null)
            {
                qry = qry.Where(b => b.RequestStatusValueId == requestStatusValueId);
            }

            gList.DataSource = qry.ToList();
            gList.DataBind();

            //Builds the Totals section
            var definedTypeCache = DefinedTypeCache.Read(new Guid(Rock.SystemGuid.DefinedType.BENEVOLENCE_RESULT_TYPE));
            Dictionary <string, decimal> resultTotals = new Dictionary <string, decimal>();
            decimal grandTotal = 0;

            foreach (BenevolenceRequest request in qry.ToList())
            {
                foreach (BenevolenceResult result in request.BenevolenceResults)
                {
                    if (result.Amount != null)
                    {
                        if (resultTotals.ContainsKey(result.ResultTypeValue.Value))
                        {
                            resultTotals[result.ResultTypeValue.Value] += result.Amount.Value;
                        }
                        else
                        {
                            resultTotals.Add(result.ResultTypeValue.Value, result.Amount.Value);
                        }
                        grandTotal += result.Amount.Value;
                    }
                }
            }
            foreach (KeyValuePair <string, decimal> keyValuePair in resultTotals)
            {
                phSummary.Controls.Add(new LiteralControl(String.Format("<div class='row'><div class='col-xs-8'>{0}: </div><div class='col-xs-4 text-right'>{1}{2:0.00}</div></div>", keyValuePair.Key, GlobalAttributesCache.Value("CurrencySymbol"), keyValuePair.Value)));
            }
            phSummary.Controls.Add(new LiteralControl(String.Format("<div class='row'><div class='col-xs-8'><b>Grand Total: </div><div class='col-xs-4 text-right'>{0}{1:0.00}</b></div></div>", GlobalAttributesCache.Value("CurrencySymbol"), grandTotal)));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Maps the specified folder.
        /// </summary>
        /// <param name="folder">The folder.</param>
        /// <param name="requestDocumentType">The benevolence request document file type.</param>
        public int Map(ZipArchive folder, BinaryFileType requestDocumentType)
        {
            var lookupContext = new RockContext();

            var emptyJsonObject           = "{}";
            var newFileList               = new Dictionary <KeyValuePair <int, int>, Rock.Model.BinaryFile>();
            var benevolenceRequestService = new BenevolenceRequestService(lookupContext);
            var importedRequests          = benevolenceRequestService
                                            .Queryable().AsNoTracking().Where(t => t.ForeignId != null)
                                            .ToDictionary(t => ( int )t.ForeignId, t => t.Id);
            var importedRequestDocuments = new BenevolenceRequestDocumentService(lookupContext)
                                           .Queryable().AsNoTracking().Where(t => t.ForeignId != null)
                                           .ToDictionary(t => ( int )t.ForeignId, t => t.Id);

            var storageProvider = requestDocumentType.StorageEntityTypeId == DatabaseProvider.EntityType.Id
                ? ( ProviderComponent )DatabaseProvider
                : ( ProviderComponent )FileSystemProvider;

            var completedItems = 0;
            var totalEntries   = folder.Entries.Count;
            var percentage     = (totalEntries - 1) / 100 + 1;

            ReportProgress(0, string.Format("Verifying benevolence request documents import ({0:N0} found.", totalEntries));

            foreach (var file in folder.Entries)
            {
                var fileExtension = Path.GetExtension(file.Name);
                if (FileTypeBlackList.Contains(fileExtension))
                {
                    LogException("Binary File Import", string.Format("{0} filetype not allowed ({1})", fileExtension, file.Name));
                    continue;
                }

                var nameWithoutExtension = file.Name.ReplaceLastOccurrence(fileExtension, string.Empty);
                var parsedFileName       = nameWithoutExtension.Split('_').ToList();

                //
                // Benevolence Request docs should follow this pattern:
                // 0. Request ForeignId
                // 1. FileName
                // 2. Doc Id

                var foreignBenevolenceRequestId = parsedFileName[0].AsType <int?>();

                // Make sure the Benevolence Request exists
                if (foreignBenevolenceRequestId != null && importedRequests.ContainsKey(( int )foreignBenevolenceRequestId))
                {
                    var benevolenceRequest = benevolenceRequestService.Queryable().AsNoTracking().FirstOrDefault(r => r.ForeignId.HasValue && r.ForeignId == foreignBenevolenceRequestId);
                    var documentForeignId  = -1;
                    var fileName           = string.Empty;
                    if (parsedFileName.Count() >= 3)
                    {
                        documentForeignId = parsedFileName.LastOrDefault().AsInteger();

                        // If document foreignId is provided, make sure it doesn't already exist
                        if (documentForeignId > 0 && importedRequestDocuments.ContainsKey(documentForeignId))
                        {
                            continue;
                        }

                        // Extract filename
                        parsedFileName.RemoveAt(parsedFileName.Count() - 1); // Remove Doc Id from end
                        parsedFileName.RemoveAt(0);                          // Remove Request ForeignId from beginning
                        fileName = string.Join("_", parsedFileName);
                    }
                    else
                    {
                        var filename = file.Name.ReplaceLastOccurrence(fileExtension, string.Empty);
                    }

                    // Create the binary file
                    var rockFile = new Rock.Model.BinaryFile
                    {
                        IsSystem               = false,
                        IsTemporary            = false,
                        MimeType               = GetMIMEType(file.Name),
                        BinaryFileTypeId       = requestDocumentType.Id,
                        FileName               = fileName,
                        CreatedDateTime        = file.LastWriteTime.DateTime,
                        ModifiedDateTime       = file.LastWriteTime.DateTime,
                        CreatedByPersonAliasId = ImportPersonAliasId
                    };

                    rockFile.SetStorageEntityTypeId(requestDocumentType.StorageEntityTypeId);
                    rockFile.StorageEntitySettings = emptyJsonObject;

                    if (requestDocumentType.AttributeValues.Any())
                    {
                        rockFile.StorageEntitySettings = requestDocumentType.AttributeValues
                                                         .ToDictionary(a => a.Key, v => v.Value.Value).ToJson();
                    }

                    // use base stream instead of file stream to keep the byte[]
                    // NOTE: if byte[] converts to a string it will corrupt the stream
                    using (var fileContent = new StreamReader(file.Open()))
                    {
                        rockFile.ContentStream = new MemoryStream(fileContent.BaseStream.ReadBytesToEnd());
                    }

                    //  add this document file to the Rock transaction
                    newFileList.Add(new KeyValuePair <int, int>(importedRequests[( int )foreignBenevolenceRequestId], documentForeignId), rockFile);

                    completedItems++;
                    if (completedItems % percentage < 1)
                    {
                        var percentComplete = completedItems / percentage;
                        ReportProgress(percentComplete, string.Format("{0:N0} benevolence document files imported ({1}% complete).", completedItems, percentComplete));
                    }

                    if (completedItems % ReportingNumber < 1)
                    {
                        SaveFiles(newFileList, storageProvider);

                        // Reset list
                        newFileList.Clear();
                        ReportPartialProgress();
                    }
                }
            }

            if (newFileList.Any())
            {
                SaveFiles(newFileList, storageProvider);
            }

            ReportProgress(100, string.Format("Finished document import: {0:N0} benevolence documents imported.", completedItems));
            return(completedItems);
        }