Exemple #1
0
        private IQueryable <MetricValue> GetMetricData(int metricId)
        {
            var rockContext = new RockContext();

            var metricValueService = new MetricValueService(rockContext);
            var qry = metricValueService.Queryable("Metric").AsNoTracking();

            qry = qry.Where(a => a.MetricId == metricId);

            var drp = new DateRangePicker();

            drp.DelimitedValues = gfMetricValues.GetUserPreference("Date Range");
            if (drp.LowerValue.HasValue)
            {
                qry = qry.Where(a => a.MetricValueDateTime >= drp.LowerValue.Value);
            }

            if (drp.UpperValue.HasValue)
            {
                var upperDate = drp.UpperValue.Value.Date.AddDays(1);
                qry = qry.Where(a => a.MetricValueDateTime < upperDate);
            }

            var campusId = ddlCampuses.SelectedValueAsId();

            if (ddlCampuses.SelectedValue.HasValue())
            {
                qry = qry.Where(mv => mv.MetricValuePartitions.Any(mvp => mvp.EntityId == campusId || mvp.EntityId == null));
            }

            return(qry);
        }
        /// <summary>
        /// Handles the Delete event of the gMetricValues control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param>
        protected void gMetricValues_Delete(object sender, RowEventArgs e)
        {
            var rockContext                 = new RockContext();
            var metricValueService          = new MetricValueService(rockContext);
            var metricValuePartitionService = new MetricValuePartitionService(rockContext);

            var metricValue = metricValueService.Get(e.RowKeyId);

            if (metricValue != null)
            {
                string errorMessage;
                if (!metricValueService.CanDelete(metricValue, out errorMessage))
                {
                    mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                    return;
                }

                rockContext.WrapTransaction(() =>
                {
                    metricValuePartitionService.DeleteRange(metricValue.MetricValuePartitions);
                    metricValueService.Delete(metricValue);
                    rockContext.SaveChanges();
                });
            }

            BindGrid();
        }
Exemple #3
0
        /// <summary>
        /// Handles the Click event of the btnSaveValue control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSaveValue_Click(object sender, EventArgs e)
        {
            using (new Rock.Data.UnitOfWorkScope())
            {
                int         metricValueId      = hfMetricValueId.ValueAsInt();
                var         metricValueService = new MetricValueService();
                MetricValue metricValue;

                if (metricValueId == 0)
                {
                    metricValue          = new MetricValue();
                    metricValue.IsSystem = false;
                    metricValue.MetricId = hfMetricId.ValueAsInt();
                    metricValueService.Add(metricValue, CurrentPersonId);
                }
                else
                {
                    metricValue = metricValueService.Get(metricValueId);
                }

                metricValue.Value       = tbValue.Text;
                metricValue.Description = tbValueDescription.Text;
                metricValue.xValue      = tbXValue.Text;
                metricValue.Label       = tbLabel.Text;
                metricValue.isDateBased = cbIsDateBased.Checked;
                metricValue.MetricId    = Int32.Parse(ddlMetricFilter.SelectedValue);
                metricValueService.Save(metricValue, CurrentPersonId);
            }

            BindGrid();
            modalValue.Hide();
        }
Exemple #4
0
        public void MetricValueDateKeyJoinsCorrectly()
        {
            var expectedRecordCount = 15;
            var year               = 2015;
            var rockContext        = new RockContext();
            var metricValueService = new MetricValueService(rockContext);

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

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

                metricValueService.Add(metricValue);
            }

            rockContext.SaveChanges();

            var metricValues = metricValueService.
                               Queryable("AnalyticsSourceDate").
                               Where(i => i.ForeignKey == metricValueForeignKey).
                               Where(i => i.MetricValueSourceDate.CalendarYear == year);

            Assert.AreEqual(expectedRecordCount, metricValues.Count());
        }
Exemple #5
0
        /// <summary>
        /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event.
        /// </summary>
        /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (Page.IsPostBack)
            {
                // create dynamic controls
                var rockContext = new RockContext();
                var metricValue = new MetricValueService(rockContext).Get(hfMetricValueId.Value.AsInteger());
                if (metricValue == null)
                {
                    metricValue = new MetricValue {
                        MetricId = hfMetricId.Value.AsInteger()
                    };
                    metricValue.Metric = new MetricService(rockContext).Get(metricValue.MetricId);
                }

                CreateDynamicControls(metricValue, false, false);
            }

            if (!Page.IsPostBack)
            {
                int?metricValueId = PageParameter("MetricValueId").AsIntegerOrNull();

                // in case called with MetricId as the parent id parameter
                int?metricId = PageParameter("MetricId").AsIntegerOrNull();

                // in case called with MetricCategoryId as the parent id parameter
                int?           metricCategoryId = PageParameter("MetricCategoryId").AsIntegerOrNull();
                MetricCategory metricCategory   = null;
                if (metricCategoryId.HasValue)
                {
                    if (metricCategoryId.Value > 0)
                    {
                        // editing a metric, but get the metricId from the metricCategory
                        metricCategory = new MetricCategoryService(new RockContext()).Get(metricCategoryId.Value);
                        if (metricCategory != null)
                        {
                            metricId = metricCategory.MetricId;
                        }
                    }
                    else
                    {
                        // adding a new metric. Block will (hopefully) not be shown
                        metricId = 0;
                    }
                }

                hfMetricCategoryId.Value = metricCategoryId.ToString();

                if (metricValueId.HasValue)
                {
                    ShowDetail(metricValueId.Value, metricId);
                }
                else
                {
                    pnlDetails.Visible = false;
                }
            }
        }
Exemple #6
0
        protected void bbAdd_OnClick(object sender, EventArgs e)
        {
            int?metricId      = hfMetricId.ValueAsInt();
            var dateTimeArray = ddlInstanceTwo.SelectedValue.Split(',');
            var dateTime      = dateTimeArray[0].AsDateTime();
            var value         = nbValue.Text.AsIntegerOrNull();

            if (metricId == 0 || !dateTime.HasValue || !value.HasValue)
            {
                nbWarning.Text    = "Unable to save. Please check you have selected an instance and input a value. Also ask your administrator to double check your Headcount Metric Sync Groups job is running.";
                nbWarning.Visible = true;
                return;
            }

            var rockContext         = new RockContext();
            var metricValueService  = new MetricValueService(rockContext);
            var existingMetricValue = metricValueService.Queryable().FirstOrDefault(v => v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == dateTime.Value && v.MetricId == metricId);

            if (existingMetricValue != null && !string.IsNullOrWhiteSpace(existingMetricValue.MetricValuePartitionEntityIds) && existingMetricValue.MetricValuePartitionEntityIds.Split(',').Any(partition => partition.Split('|')[0].AsInteger() == EntityTypeCache.Get(typeof(Campus)).Id&& partition.Split('|')[1].AsInteger() == ddlCampuses.SelectedValueAsId()))
            {
                nbWarning.Text =
                    String.Format(
                        "A metric value already existed for the {0}, the old value of {1} has been changed to {2}",
                        dateTime.Value, Decimal.ToInt32(existingMetricValue.YValue.Value), value);
                nbWarning.Visible          = true;
                existingMetricValue.YValue = value;
            }
            else
            {
                var metric      = new MetricService(rockContext).Get(metricId.Value);
                var metricValue = new MetricValue();
                metricValue.MetricValueDateTime = dateTime;
                metricValue.YValue = value;
                metricValue.MetricValuePartitions = new List <MetricValuePartition>();
                var metricPartitionsByPosition = metric.MetricPartitions.OrderBy(a => a.Order).ToList();
                foreach (var metricPartition in metricPartitionsByPosition)
                {
                    var metricValuePartition = new MetricValuePartition();
                    metricValuePartition.MetricPartition   = metricPartition;
                    metricValuePartition.MetricPartitionId = metricPartition.Id;
                    metricValuePartition.MetricValue       = metricValue;
                    metricValuePartition.EntityId          = ddlCampuses.SelectedValueAsId();
                    metricValue.MetricValuePartitions.Add(metricValuePartition);
                }
                metricValue.MetricId = metricId.Value;
                metricValue.Note     = "Input as a headcount metric value";

                metricValueService.Add(metricValue);
                nbWarning.Text    = "";
                nbWarning.Visible = false;
            }

            nbValue.Text = "";
            rockContext.SaveChanges();
            BindGrid();
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            MetricValue        metricValue;
            var                rockContext        = new RockContext();
            MetricValueService metricValueService = new MetricValueService(rockContext);

            int metricValueId = int.Parse(hfMetricValueId.Value);

            if (metricValueId == 0)
            {
                metricValue = new MetricValue();
                metricValueService.Add(metricValue);
                metricValue.MetricId = hfMetricId.ValueAsInt();
                metricValue.Metric   = metricValue.Metric ?? new MetricService(rockContext).Get(metricValue.MetricId);
            }
            else
            {
                metricValue = metricValueService.Get(metricValueId);
            }

            metricValue.MetricValueType     = ddlMetricValueType.SelectedValueAsEnum <MetricValueType>();
            metricValue.XValue              = tbXValue.Text;
            metricValue.YValue              = tbYValue.Text.AsDecimalOrNull();
            metricValue.Note                = tbNote.Text;
            metricValue.MetricValueDateTime = dpMetricValueDateTime.SelectedDate;

            // Get EntityId from EntityType UI controls
            var     metricEntityType      = EntityTypeCache.Read(metricValue.Metric.EntityTypeId ?? 0);
            Control entityTypeEditControl = phEntityTypeEntityIdValue.FindControl("entityTypeEditControl");

            if (metricEntityType != null && metricEntityType.SingleValueFieldType != null && metricEntityType.SingleValueFieldType.Field is IEntityFieldType)
            {
                metricValue.EntityId = (metricEntityType.SingleValueFieldType.Field as IEntityFieldType).GetEditValueAsEntityId(entityTypeEditControl, new Dictionary <string, ConfigurationValue>());
            }
            else
            {
                metricValue.EntityId = null;
            }

            if (!metricValue.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            rockContext.SaveChanges();

            var qryParams = new Dictionary <string, string>();

            qryParams.Add("MetricId", hfMetricId.Value);
            qryParams.Add("MetricCategoryId", hfMetricCategoryId.Value);
            qryParams.Add("ExpandedIds", PageParameter("ExpandedIds"));
            NavigateToParentPage(qryParams);
        }
Exemple #8
0
        /// <summary>
        /// Handles the Delete event of the gMetricValues control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs"/> instance containing the event data.</param>
        protected void gMetricValues_Delete(object sender, RowEventArgs e)
        {
            var metricValueService = new MetricValueService();

            MetricValue metricValue = metricValueService.Get((int)e.RowKeyValue);

            if (metricValue != null)
            {
                metricValueService.Delete(metricValue, CurrentPersonId);
                metricValueService.Save(metricValue, CurrentPersonId);
            }

            BindGrid();
        }
Exemple #9
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            MetricValueService metricValueService = new MetricValueService(new RockContext());
            SortProperty       sortProperty       = gMetricValues.SortProperty;
            var qry = metricValueService.Queryable();

            // in case called normally
            int?metricId = PageParameter("MetricId").AsInteger(false);

            // in case called from CategoryTreeView
            int?           metricCategoryId = PageParameter("MetricCategoryId").AsInteger(false);
            MetricCategory metricCategory   = null;

            if (metricCategoryId.HasValue)
            {
                if (metricCategoryId.Value > 0)
                {
                    // editing a metric, but get the metricId from the metricCategory
                    metricCategory = new MetricCategoryService(new RockContext()).Get(metricCategoryId.Value);
                    if (metricCategory != null)
                    {
                        metricId = metricCategory.MetricId;
                    }
                }
                else
                {
                    // adding a new metric. Block will (hopefully) not be shown
                    metricId = 0;
                }
            }

            hfMetricId.Value         = metricId.ToString();
            hfMetricCategoryId.Value = metricCategoryId.ToString();

            this.Visible = metricId.HasValue;

            qry = qry.Where(a => a.MetricId == metricId);

            if (sortProperty != null)
            {
                gMetricValues.DataSource = qry.Sort(sortProperty).ToList();
            }
            else
            {
                gMetricValues.DataSource = qry.OrderBy(s => s.Order).ThenBy(s => s.XValue).ThenBy(s => s.MetricValueDateTime).ThenBy(s => s.YValue).ToList();
            }

            gMetricValues.DataBind();
        }
Exemple #10
0
        public void MetricValueDateKeySavesCorrectly()
        {
            var rockContext        = new RockContext();
            var metricValueService = new MetricValueService(rockContext);

            var metricValue = BuildMetricValue(rockContext, Convert.ToDateTime("3/15/2010"));

            metricValueService.Add(metricValue);
            rockContext.SaveChanges();

            var metricValueId = metricValue.Id;

            // We're bypassing the model because the model doesn't user the MetricValueDateKey from the database,
            // but it still needs to be correct for inner joins to work correctly.
            var result = rockContext.Database.
                         SqlQuery <int>($"SELECT MetricValueDateKey FROM MetricValue WHERE Id = {metricValueId}").First();

            Assert.AreEqual(20100315, result);
        }
Exemple #11
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            int metricId  = hfMetricId.ValueAsInt();
            var queryable = new MetricValueService().Queryable()
                            .Where(a => a.MetricId == metricId);

            SortProperty sortProperty = gMetricValues.SortProperty;

            if (sortProperty != null)
            {
                queryable = queryable.Sort(sortProperty);
            }
            else
            {
                queryable = queryable.OrderBy(a => a.Id).ThenBy(a => a.Value);
            }

            gMetricValues.DataSource = queryable.ToList();
            gMetricValues.DataBind();
        }
Exemple #12
0
        /// <summary>
        /// Shows the edit modal.
        /// </summary>
        /// <param name="valueId">The value unique identifier.</param>
        protected void ShowEdit(int valueId)
        {
            var metricId = hfMetricId.ValueAsInt();
            var metric   = new MetricService().Get(metricId);

            MetricValue metricValue = null;

            if (!valueId.Equals(0))
            {
                metricValue = new MetricValueService().Get(valueId);
                if (metric != null)
                {
                    lActionTitle.Text = ActionTitle.Edit("metric value for " + metric.Title);
                }
            }
            else
            {
                metricValue = new MetricValue {
                    Id = 0
                };
                metricValue.MetricId = metricId;
                if (metric != null)
                {
                    lActionTitle.Text = ActionTitle.Add("metric value for " + metric.Title);
                }
            }

            hfMetricValueId.SetValue(metricValue.Id);
            ddlMetricFilter.SelectedValue = hfMetricId.Value;
            tbValue.Text            = metricValue.Value;
            tbValueDescription.Text = metricValue.Description;
            tbXValue.Text           = metricValue.xValue;
            tbLabel.Text            = metricValue.Label;
            cbIsDateBased.Checked   = metricValue.isDateBased;

            modalValue.Show();
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            int campusEntityTypeId   = EntityTypeCache.Get(typeof(Rock.Model.Campus)).Id;
            int scheduleEntityTypeId = EntityTypeCache.Get(typeof(Rock.Model.Schedule)).Id;

            int?     campusId   = bddlCampus.SelectedValueAsInt();
            int?     scheduleId = bddlService.SelectedValueAsInt();
            DateTime?weekend    = bddlWeekend.SelectedValue.AsDateTime();

            if (campusId.HasValue && scheduleId.HasValue && weekend.HasValue)
            {
                using (var rockContext = new RockContext())
                {
                    var metricService      = new MetricService(rockContext);
                    var metricValueService = new MetricValueService(rockContext);

                    weekend = GetWeekendDate(scheduleId, weekend, rockContext);

                    foreach (RepeaterItem item in rptrMetric.Items)
                    {
                        var hfMetricIId   = item.FindControl("hfMetricId") as HiddenField;
                        var nbMetricValue = item.FindControl("nbMetricValue") as NumberBox;

                        if (hfMetricIId != null && nbMetricValue != null)
                        {
                            var metricYValue = nbMetricValue.Text.AsDecimalOrNull();

                            // If no value was provided and the block is not configured to default to "0" then just skip this metric.
                            if (metricYValue == null && !GetAttributeValue(AttributeKey.DefaultToZero).AsBoolean())
                            {
                                continue;
                            }

                            int metricId = hfMetricIId.ValueAsInt();
                            var metric   = new MetricService(rockContext).Get(metricId);

                            if (metric != null)
                            {
                                int campusPartitionId   = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault();
                                int schedulePartitionId = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId).Select(p => p.Id).FirstOrDefault();

                                var metricValue = metricValueService
                                                  .Queryable()
                                                  .Where(v =>
                                                         v.MetricId == metric.Id &&
                                                         v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                         v.MetricValuePartitions.Count == 2 &&
                                                         v.MetricValuePartitions.Any(p => p.MetricPartitionId == campusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                         v.MetricValuePartitions.Any(p => p.MetricPartitionId == schedulePartitionId && p.EntityId.HasValue && p.EntityId.Value == scheduleId.Value))
                                                  .FirstOrDefault();

                                if (metricValue == null)
                                {
                                    metricValue = new MetricValue();
                                    metricValue.MetricValueType     = MetricValueType.Measure;
                                    metricValue.MetricId            = metric.Id;
                                    metricValue.MetricValueDateTime = weekend.Value;
                                    metricValueService.Add(metricValue);

                                    var campusValuePartition = new MetricValuePartition();
                                    campusValuePartition.MetricPartitionId = campusPartitionId;
                                    campusValuePartition.EntityId          = campusId.Value;
                                    metricValue.MetricValuePartitions.Add(campusValuePartition);

                                    var scheduleValuePartition = new MetricValuePartition();
                                    scheduleValuePartition.MetricPartitionId = schedulePartitionId;
                                    scheduleValuePartition.EntityId          = scheduleId.Value;
                                    metricValue.MetricValuePartitions.Add(scheduleValuePartition);
                                }

                                if (metricYValue == null)
                                {
                                    metricValue.YValue = 0;
                                }
                                else
                                {
                                    metricValue.YValue = metricYValue;
                                }

                                metricValue.Note = tbNote.Text;
                            }
                        }
                    }

                    rockContext.SaveChanges();
                }

                nbMetricsSaved.Text = string.Format("Your metrics for the {0} service on {1} at the {2} Campus have been saved.",
                                                    bddlService.SelectedItem.Text, bddlWeekend.SelectedItem.Text, bddlCampus.SelectedItem.Text);
                nbMetricsSaved.Visible = true;

                BindMetrics();
            }
        }
        /// <summary>
        /// Executes the specified context.
        /// </summary>
        /// <param name="context">The context.</param>
        public void Execute(IJobExecutionContext context)
        {
            var metricSourceValueTypeDataviewGuid = Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_DATAVIEW.AsGuid();
            var metricSourceValueTypeSqlGuid      = Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_SQL.AsGuid();

            var metricsQry = new MetricService(new RockContext()).Queryable().AsNoTracking().Where(
                a => a.ScheduleId.HasValue &&
                a.SourceValueTypeId.HasValue &&
                (a.SourceValueType.Guid == metricSourceValueTypeDataviewGuid || a.SourceValueType.Guid == metricSourceValueTypeSqlGuid));

            var metricIdList = metricsQry.OrderBy(a => a.Title).ThenBy(a => a.Subtitle).Select(a => a.Id).ToList();

            var    metricExceptions       = new List <Exception>();
            int    metricsCalculated      = 0;
            int    metricValuesCalculated = 0;
            Metric metric = null;

            foreach (var metricId in metricIdList)
            {
                try
                {
                    using (var rockContextForMetricEntity = new RockContext())
                    {
                        var metricService = new MetricService(rockContextForMetricEntity);

                        metric = metricService.Get(metricId);
                        var lastRunDateTime = metric.LastRunDateTime ?? metric.CreatedDateTime ?? metric.ModifiedDateTime;
                        if (lastRunDateTime.HasValue)
                        {
                            var currentDateTime = RockDateTime.Now;

                            // get all the schedule times that were supposed to run since that last time it was scheduled to run
                            var scheduledDateTimesToProcess = metric.Schedule.GetScheduledStartTimes(lastRunDateTime.Value, currentDateTime).Where(a => a > lastRunDateTime.Value).ToList();
                            foreach (var scheduleDateTime in scheduledDateTimesToProcess)
                            {
                                using (var rockContextForMetricValues = new RockContext())
                                {
                                    var metricPartitions                     = new MetricPartitionService(rockContextForMetricValues).Queryable().Where(a => a.MetricId == metric.Id).ToList();
                                    var metricValueService                   = new MetricValueService(rockContextForMetricValues);
                                    List <ResultValue> resultValues          = new List <ResultValue>();
                                    bool getMetricValueDateTimeFromResultSet = false;
                                    if (metric.SourceValueType.Guid == metricSourceValueTypeDataviewGuid)
                                    {
                                        // get the metric value from the DataView
                                        if (metric.DataView != null)
                                        {
                                            var errorMessages = new List <string>();
                                            var qry           = metric.DataView.GetQuery(null, null, out errorMessages);
                                            if (metricPartitions.Count > 1 || metricPartitions.First().EntityTypeId.HasValue)
                                            {
                                                throw new NotImplementedException("Partitioned Metrics using DataViews is not supported.");
                                            }
                                            else
                                            {
                                                var resultValue = new ResultValue();
                                                resultValue.Value               = Convert.ToDecimal(qry.Count());
                                                resultValue.Partitions          = new List <ResultValuePartition>();
                                                resultValue.MetricValueDateTime = scheduleDateTime;
                                                resultValues.Add(resultValue);
                                            }
                                        }
                                    }
                                    else if (metric.SourceValueType.Guid == metricSourceValueTypeSqlGuid)
                                    {
                                        //// calculate the metricValue using the results from the SQL
                                        //// assume SQL is in one of the following forms:
                                        //// -- "SELECT Count(*), Partion0EntityId, Partion1EntityId, Partion2EntityId,.. FROM ..."
                                        //// -- "SELECT Count(*), [MetricValueDateTime], Partion0EntityId, Partion1EntityId, Partion2EntityId,.. FROM ..."
                                        if (!string.IsNullOrWhiteSpace(metric.SourceSql))
                                        {
                                            string formattedSql = metric.SourceSql.ResolveMergeFields(metric.GetMergeObjects(scheduleDateTime));
                                            var    tableResult  = DbService.GetDataTable(formattedSql, System.Data.CommandType.Text, null);

                                            if (tableResult.Columns.Count >= 2 && tableResult.Columns[1].ColumnName == "MetricValueDateTime")
                                            {
                                                getMetricValueDateTimeFromResultSet = true;
                                            }

                                            foreach (var row in tableResult.Rows.OfType <System.Data.DataRow>())
                                            {
                                                var resultValue = new ResultValue();

                                                resultValue.Value = Convert.ToDecimal(row[0]);
                                                if (getMetricValueDateTimeFromResultSet)
                                                {
                                                    resultValue.MetricValueDateTime = Convert.ToDateTime(row[1]);
                                                }
                                                else
                                                {
                                                    resultValue.MetricValueDateTime = scheduleDateTime;
                                                }

                                                resultValue.Partitions = new List <ResultValuePartition>();
                                                int partitionPosition    = 0;
                                                int partitionFieldIndex  = getMetricValueDateTimeFromResultSet ? 2 : 1;
                                                int partitionColumnCount = tableResult.Columns.Count - 1;
                                                while (partitionFieldIndex <= partitionColumnCount)
                                                {
                                                    resultValue.Partitions.Add(new ResultValuePartition
                                                    {
                                                        PartitionPosition = partitionPosition,
                                                        EntityId          = row[partitionFieldIndex] as int?
                                                    });

                                                    partitionPosition++;
                                                    partitionFieldIndex++;
                                                }

                                                resultValues.Add(resultValue);
                                            }
                                        }
                                    }

                                    metric.LastRunDateTime = scheduleDateTime;
                                    metricsCalculated++;
                                    metricValuesCalculated += resultValues.Count();

                                    if (resultValues.Any())
                                    {
                                        List <MetricValue> metricValuesToAdd = new List <MetricValue>();
                                        foreach (var resultValue in resultValues)
                                        {
                                            var metricValue = new MetricValue();
                                            metricValue.MetricId            = metric.Id;
                                            metricValue.MetricValueDateTime = resultValue.MetricValueDateTime;
                                            metricValue.MetricValueType     = MetricValueType.Measure;
                                            metricValue.YValue                = resultValue.Value;
                                            metricValue.CreatedDateTime       = RockDateTime.Now;
                                            metricValue.ModifiedDateTime      = RockDateTime.Now;
                                            metricValue.MetricValuePartitions = new List <MetricValuePartition>();
                                            var metricPartitionsByPosition = metricPartitions.OrderBy(a => a.Order).ToList();

                                            if (!resultValue.Partitions.Any() && metricPartitionsByPosition.Count() == 1 && !metricPartitionsByPosition[0].EntityTypeId.HasValue)
                                            {
                                                // a metric with just the default partition (not partitioned by Entity)
                                                var metricPartition      = metricPartitionsByPosition[0];
                                                var metricValuePartition = new MetricValuePartition();
                                                metricValuePartition.MetricPartition   = metricPartition;
                                                metricValuePartition.MetricPartitionId = metricPartition.Id;
                                                metricValuePartition.MetricValue       = metricValue;
                                                metricValuePartition.EntityId          = null;
                                                metricValue.MetricValuePartitions.Add(metricValuePartition);
                                            }
                                            else
                                            {
                                                foreach (var partitionResult in resultValue.Partitions)
                                                {
                                                    if (metricPartitionsByPosition.Count > partitionResult.PartitionPosition)
                                                    {
                                                        var metricPartition      = metricPartitionsByPosition[partitionResult.PartitionPosition];
                                                        var metricValuePartition = new MetricValuePartition();
                                                        metricValuePartition.MetricPartition   = metricPartition;
                                                        metricValuePartition.MetricPartitionId = metricPartition.Id;
                                                        metricValuePartition.MetricValue       = metricValue;
                                                        metricValuePartition.EntityId          = partitionResult.EntityId;
                                                        metricValue.MetricValuePartitions.Add(metricValuePartition);
                                                    }
                                                }
                                            }

                                            if (metricValue.MetricValuePartitions == null || !metricValue.MetricValuePartitions.Any())
                                            {
                                                // shouldn't happen, but just in case
                                                throw new Exception("MetricValue requires at least one Partition Value");
                                            }
                                            else
                                            {
                                                metricValuesToAdd.Add(metricValue);
                                            }
                                        }

                                        // if a single metricValueDateTime was specified, delete any existing metric values for this date and refresh with the current results
                                        var dbTransaction = rockContextForMetricValues.Database.BeginTransaction();
                                        if (getMetricValueDateTimeFromResultSet)
                                        {
                                            var metricValueDateTimes = metricValuesToAdd.Select(a => a.MetricValueDateTime).Distinct().ToList();
                                            foreach (var metricValueDateTime in metricValueDateTimes)
                                            {
                                                bool alreadyHasMetricValues = metricValueService.Queryable().Where(a => a.MetricId == metric.Id && a.MetricValueDateTime == metricValueDateTime).Any();
                                                if (alreadyHasMetricValues)
                                                {
                                                    // use direct SQL to clean up any existing metric values
                                                    rockContextForMetricValues.Database.ExecuteSqlCommand(@"
                                                        DELETE
                                                        FROM MetricValuePartition
                                                        WHERE MetricValueId IN (
                                                            SELECT Id
                                                            FROM MetricValue
                                                            WHERE MetricId = @metricId
                                                            AND MetricValueDateTime = @metricValueDateTime
                                                        )
                                                    ", new SqlParameter("@metricId", metric.Id), new SqlParameter("@metricValueDateTime", metricValueDateTime));

                                                    rockContextForMetricValues.Database.ExecuteSqlCommand(@"
                                                        DELETE
                                                        FROM MetricValue
                                                        WHERE MetricId = @metricId
                                                        AND MetricValueDateTime = @metricValueDateTime
                                                    ", new SqlParameter("@metricId", metric.Id), new SqlParameter("@metricValueDateTime", metricValueDateTime));
                                                }
                                            }
                                        }

                                        metricValueService.AddRange(metricValuesToAdd);

                                        // disable savechanges PrePostProcessing since there could be hundreds or thousands of metric values getting inserted/updated
                                        rockContextForMetricValues.SaveChanges(true);
                                        dbTransaction.Commit();
                                    }

                                    rockContextForMetricEntity.SaveChanges();
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    metricExceptions.Add(new Exception(string.Format("Exception when calculating metric for {0} ", metric), ex));
                }
            }

            context.Result = string.Format("Calculated a total of {0} metric values for {1} metrics", metricValuesCalculated, metricsCalculated);

            if (metricExceptions.Any())
            {
                throw new AggregateException("One or more metric calculations failed ", metricExceptions);
            }
        }
Exemple #15
0
        public string GetHtmlForBlock(int blockId, int?entityTypeId = null, int?entityId = null)
        {
            RockContext rockContext = this.Service.Context as RockContext ?? new RockContext();
            Block       block       = new BlockService(rockContext).Get(blockId);

            if (block != null)
            {
                block.LoadAttributes();

                string liquidTemplate = block.GetAttributeValue("LiquidTemplate");

                var metricCategoryPairList = Rock.Attribute.MetricCategoriesFieldAttribute.GetValueAsGuidPairs(block.GetAttributeValue("MetricCategories"));

                var metricGuids = metricCategoryPairList.Select(a => a.MetricGuid).ToList();

                bool roundYValues = block.GetAttributeValue("RoundValues").AsBooleanOrNull() ?? true;

                MetricService metricService = new MetricService(rockContext);
                var           metrics       = metricService.GetByGuids(metricGuids).Include(a => a.MetricPartitions);
                List <object> metricsData   = new List <object>();

                if (metrics.Count() == 0)
                {
                    return(@"<div class='alert alert-warning'> 
								Please select a metric in the block settings.
							</div>"                            );
                }

                MetricValueService metricValueService = new MetricValueService(rockContext);

                DateTime firstDayOfYear     = new DateTime(RockDateTime.Now.Year, 1, 1);
                DateTime currentDateTime    = RockDateTime.Now;
                DateTime firstDayOfNextYear = new DateTime(RockDateTime.Now.Year + 1, 1, 1);

                foreach (var metric in metrics)
                {
                    var metricYTDData    = JsonConvert.DeserializeObject(metric.ToJson(), typeof(MetricYTDData)) as MetricYTDData;
                    var qryMeasureValues = metricValueService.Queryable()
                                           .Where(a => a.MetricId == metricYTDData.Id)
                                           .Where(a => a.MetricValueDateTime >= firstDayOfYear && a.MetricValueDateTime < currentDateTime)
                                           .Where(a => a.MetricValueType == MetricValueType.Measure);

                    //// if an entityTypeId/EntityId filter was specified, and the entityTypeId is the same as the metric's partitions' EntityTypeId, filter the values to the specified entityId
                    //// Note: if a Metric or it's Metric Value doesn't have a context, include it regardless of Context setting
                    if (entityTypeId.HasValue && entityId.HasValue)
                    {
                        if (metric.MetricPartitions.Any(a => a.EntityTypeId == entityTypeId.Value))
                        {
                            qryMeasureValues = qryMeasureValues.Where(a => a.MetricValuePartitions.Any(p => p.EntityId == entityId.Value && p.MetricPartition.EntityTypeId == entityTypeId));
                        }
                    }

                    var lastMetricValue = qryMeasureValues.OrderByDescending(a => a.MetricValueDateTime).FirstOrDefault();
                    if (lastMetricValue != null)
                    {
                        metricYTDData.LastValueDate = lastMetricValue.MetricValueDateTime.HasValue ? lastMetricValue.MetricValueDateTime.Value.Date : DateTime.MinValue;

                        // get a sum of the values that for whole 24 hour day of the last Date
                        DateTime lastValueDateEnd           = metricYTDData.LastValueDate.AddDays(1);
                        var      lastMetricCumulativeValues = qryMeasureValues.Where(a => a.MetricValueDateTime.HasValue && a.MetricValueDateTime.Value >= metricYTDData.LastValueDate && a.MetricValueDateTime.Value < lastValueDateEnd);
                        metricYTDData.LastValue = lastMetricCumulativeValues.Sum(a => a.YValue).HasValue ? Math.Round(lastMetricCumulativeValues.Sum(a => a.YValue).Value, roundYValues ? 0 : 2) : (decimal?)null;
                    }

                    decimal?sum = qryMeasureValues.Sum(a => a.YValue);
                    metricYTDData.CumulativeValue = sum.HasValue ? Math.Round(sum.Value, roundYValues ? 0 : 2) : (decimal?)null;

                    // figure out goal as of current date time by figuring out the slope of the goal
                    var qryGoalValuesCurrentYear = metricValueService.Queryable()
                                                   .Where(a => a.MetricId == metricYTDData.Id)
                                                   .Where(a => a.MetricValueDateTime >= firstDayOfYear && a.MetricValueDateTime < firstDayOfNextYear)
                                                   .Where(a => a.MetricValueType == MetricValueType.Goal);

                    // if an entityTypeId/EntityId filter was specified, and the entityTypeId is the same as the metric's partitions' EntityTypeId, filter the values to the specified entityId
                    if (entityTypeId.HasValue && entityId.HasValue)
                    {
                        if (metric.MetricPartitions.Any(a => a.EntityTypeId == entityTypeId.Value))
                        {
                            qryGoalValuesCurrentYear = qryGoalValuesCurrentYear.Where(a => a.MetricValuePartitions.Any(p => p.EntityId == entityId.Value && p.MetricPartition.EntityTypeId == entityTypeId));
                        }
                    }

                    MetricValue goalLineStartPoint = qryGoalValuesCurrentYear.Where(a => a.MetricValueDateTime <= currentDateTime).OrderByDescending(a => a.MetricValueDateTime).FirstOrDefault();
                    MetricValue goalLineEndPoint   = qryGoalValuesCurrentYear.Where(a => a.MetricValueDateTime >= currentDateTime).FirstOrDefault();
                    if (goalLineStartPoint != null && goalLineEndPoint != null)
                    {
                        var changeInX = goalLineEndPoint.DateTimeStamp - goalLineStartPoint.DateTimeStamp;
                        var changeInY = goalLineEndPoint.YValue - goalLineStartPoint.YValue;
                        if (changeInX != 0)
                        {
                            decimal?slope     = changeInY / changeInX;
                            decimal goalValue = ((slope * (currentDateTime.ToJavascriptMilliseconds() - goalLineStartPoint.DateTimeStamp)) + goalLineStartPoint.YValue).Value;
                            metricYTDData.GoalValue = Math.Round(goalValue, roundYValues ? 0 : 2);
                        }
                    }
                    else
                    {
                        // if there isn't a both a start goal and end goal within the date range, there wouldn't be a goal line shown in a line chart, so don't display a goal in liquid either
                        metricYTDData.GoalValue = null;
                    }

                    metricsData.Add(metricYTDData.ToLiquid());
                }

                Dictionary <string, object> mergeValues = new Dictionary <string, object>();
                mergeValues.Add("Metrics", metricsData);

                string resultHtml = liquidTemplate.ResolveMergeFields(mergeValues);

                // show liquid help for debug
                if (block.GetAttributeValue("EnableDebug").AsBoolean())
                {
                    resultHtml += mergeValues.lavaDebugInfo();
                }

                return(resultHtml);
            }

            return(string.Format(
                       @"<div class='alert alert-danger'> 
                    unable to find block_id: {0}
                </div>",
                       blockId));
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            int?metricId = hfMetricId.Value.AsIntegerOrNull();

            if (!metricId.HasValue)
            {
                return;
            }

            var                rockContext        = new RockContext();
            SortProperty       sortProperty       = gMetricValues.SortProperty;
            MetricValueService metricValueService = new MetricValueService(rockContext);
            var                qry = metricValueService.Queryable().Include(a => a.MetricValuePartitions);

            qry = qry.Where(a => a.MetricId == metricId);

            var metricValuePartitionsColumn = gMetricValues.Columns.OfType <RockLiteralField>().FirstOrDefault(a => a.ID == "lMetricValuePartitions");
            var metric = new MetricService(rockContext).Get(metricId ?? 0);

            metricValuePartitionsColumn.Visible = metric != null && metric.MetricPartitions.Any(a => a.EntityTypeId.HasValue);

            var drp = new DateRangePicker();

            drp.DelimitedValues = gfMetricValues.GetUserPreference("Date Range");
            if (drp.LowerValue.HasValue)
            {
                qry = qry.Where(a => a.MetricValueDateTime >= drp.LowerValue.Value);
            }

            if (drp.UpperValue.HasValue)
            {
                DateTime upperDate = drp.UpperValue.Value.Date.AddDays(1);
                qry = qry.Where(a => a.MetricValueDateTime < upperDate);
            }

            var metricValueType = gfMetricValues.GetUserPreference("Goal/Measure").ConvertToEnumOrNull <MetricValueType>();

            if (metricValueType.HasValue)
            {
                qry = qry.Where(a => a.MetricValueType == metricValueType.Value);
            }

            var entityTypeEntityUserPreference = gfMetricValues.GetUserPreference(this.EntityTypeEntityPreferenceKey) ?? string.Empty;

            var entityTypeEntityList = entityTypeEntityUserPreference.Split(',').Select(a => a.Split('|')).Where(a => a.Length == 2).Select(a =>
                                                                                                                                            new
            {
                EntityTypeId = a[0].AsIntegerOrNull(),
                EntityId     = a[1].AsIntegerOrNull()
            });

            foreach (var entityTypeEntity in entityTypeEntityList)
            {
                if (entityTypeEntity.EntityTypeId.HasValue && entityTypeEntity.EntityId.HasValue)
                {
                    qry = qry.Where(a => a.MetricValuePartitions.Any(x => x.MetricPartition.EntityTypeId == entityTypeEntity.EntityTypeId && x.EntityId == entityTypeEntity.EntityId));
                }
            }

            if (sortProperty != null)
            {
                qry = qry.Sort(sortProperty);
            }
            else
            {
                qry = qry.OrderByDescending(s => s.MetricValueDateTime).ThenBy(s => s.YValue).ThenBy(s => s.XValue).ThenByDescending(s => s.ModifiedDateTime);
            }

            gMetricValues.SetLinqDataSource(qry);

            gMetricValues.DataBind();
        }
Exemple #17
0
        /// <summary>
        /// Binds the metrics.
        /// </summary>
        private void BindMetrics()
        {
            var serviceMetricValues = new List <ServiceMetric>();

            int campusEntityTypeId   = EntityTypeCache.Get(typeof(Rock.Model.Campus)).Id;
            int scheduleEntityTypeId = EntityTypeCache.Get(typeof(Rock.Model.Schedule)).Id;

            int?     campusId   = bddlCampus.SelectedValueAsInt();
            int?     scheduleId = bddlService.SelectedValueAsInt();
            DateTime?weekend    = bddlWeekend.SelectedValue.AsDateTime();

            var notes = new List <string>();

            if (campusId.HasValue && scheduleId.HasValue && weekend.HasValue)
            {
                SetBlockUserPreference("CampusId", campusId.HasValue ? campusId.Value.ToString() : "");
                SetBlockUserPreference("ScheduleId", scheduleId.HasValue ? scheduleId.Value.ToString() : "");

                var metricCategories = MetricCategoriesFieldAttribute.GetValueAsGuidPairs(GetAttributeValue("MetricCategories"));
                var metricGuids      = metricCategories.Select(a => a.MetricGuid).ToList();
                using (var rockContext = new RockContext())
                {
                    var metricValueService = new MetricValueService(rockContext);
                    foreach (var metric in new MetricService(rockContext)
                             .GetByGuids(metricGuids)
                             .Where(m =>
                                    m.MetricPartitions.Count == 2 &&
                                    m.MetricPartitions.Any(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId) &&
                                    m.MetricPartitions.Any(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId))
                             .OrderBy(m => m.Title)
                             .Select(m => new
                    {
                        m.Id,
                        m.Title,
                        CampusPartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                        SchedulePartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                    }))
                    {
                        var serviceMetric = new ServiceMetric(metric.Id, metric.Title);

                        if (campusId.HasValue && weekend.HasValue && scheduleId.HasValue)
                        {
                            var metricValue = metricValueService
                                              .Queryable().AsNoTracking()
                                              .Where(v =>
                                                     v.MetricId == metric.Id &&
                                                     v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                     v.MetricValuePartitions.Count == 2 &&
                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.CampusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.SchedulePartitionId && p.EntityId.HasValue && p.EntityId.Value == scheduleId.Value))
                                              .FirstOrDefault();

                            if (metricValue != null)
                            {
                                serviceMetric.Value = metricValue.YValue;

                                if (!string.IsNullOrWhiteSpace(metricValue.Note) &&
                                    !notes.Contains(metricValue.Note))
                                {
                                    notes.Add(metricValue.Note);
                                }
                            }
                        }

                        serviceMetricValues.Add(serviceMetric);
                    }
                }
            }

            rptrMetric.DataSource = serviceMetricValues;
            rptrMetric.DataBind();

            tbNote.Text = notes.AsDelimited(Environment.NewLine + Environment.NewLine);
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            Metric metric;

            var                   rockContext           = new RockContext();
            MetricService         metricService         = new MetricService(rockContext);
            MetricCategoryService metricCategoryService = new MetricCategoryService(rockContext);
            MetricValueService    metricValueService    = new MetricValueService(rockContext);
            bool                  deleteValuesOnSave    = sender == btnDeleteValuesAndSave;

            int metricId = hfMetricId.Value.AsInteger();

            if (metricId == 0)
            {
                metric = new Metric();
            }
            else
            {
                metric = metricService.Get(metricId);
            }

            metric.Title             = tbTitle.Text;
            metric.Subtitle          = tbSubtitle.Text;
            metric.Description       = tbDescription.Text;
            metric.IconCssClass      = tbIconCssClass.Text;
            metric.SourceValueTypeId = ddlSourceType.SelectedValueAsId();
            metric.XAxisLabel        = tbXAxisLabel.Text;
            metric.YAxisLabel        = tbYAxisLabel.Text;
            metric.IsCumulative      = cbIsCumulative.Checked;

            var origEntityType = metric.EntityTypeId.HasValue ? EntityTypeCache.Read(metric.EntityTypeId.Value) : null;
            var newEntityType  = etpEntityType.SelectedEntityTypeId.HasValue ? EntityTypeCache.Read(etpEntityType.SelectedEntityTypeId.Value) : null;

            if (origEntityType != null && !deleteValuesOnSave)
            {
                if (newEntityType == null || newEntityType.Id != origEntityType.Id)
                {
                    // if the EntityTypeId of this metric has changed to NULL or to another EntityType, warn about the EntityId values being wrong
                    bool hasEntityValues = metricValueService.Queryable().Any(a => a.MetricId == metric.Id && a.EntityId.HasValue);

                    if (hasEntityValues)
                    {
                        nbEntityTypeChanged.Text = string.Format(
                            "Warning: You can't change the series partition to {0} when there are values associated with {1}. Do you want to delete existing values?",
                            newEntityType != null ? newEntityType.FriendlyName : "<none>",
                            origEntityType.FriendlyName);
                        mdEntityTypeChanged.Show();
                        nbEntityTypeChanged.Visible = true;
                        return;
                    }
                }
            }

            metric.EntityTypeId = etpEntityType.SelectedEntityTypeId;

            int sourceTypeDataView = DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_DATAVIEW.AsGuid()).Id;
            int sourceTypeSQL      = DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_SQL.AsGuid()).Id;

            var personService        = new PersonService(rockContext);
            var metricChampionPerson = personService.Get(ppMetricChampionPerson.SelectedValue ?? 0);

            metric.MetricChampionPersonAliasId = metricChampionPerson != null ? metricChampionPerson.PrimaryAliasId : null;
            var adminPerson = personService.Get(ppAdminPerson.SelectedValue ?? 0);

            metric.AdminPersonAliasId = adminPerson != null ? adminPerson.PrimaryAliasId : null;

            if (metric.SourceValueTypeId == sourceTypeSQL)
            {
                metric.SourceSql = ceSourceSql.Text;
            }
            else
            {
                metric.SourceSql = string.Empty;
            }

            if (metric.SourceValueTypeId == sourceTypeDataView)
            {
                metric.DataViewId = ddlDataView.SelectedValueAsId();
            }
            else
            {
                metric.DataViewId = null;
            }

            var scheduleSelectionType = rblScheduleSelect.SelectedValueAsEnum <ScheduleSelectionType>();

            if (scheduleSelectionType == ScheduleSelectionType.NamedSchedule)
            {
                metric.ScheduleId = ddlSchedule.SelectedValueAsId();
            }
            else
            {
                metric.ScheduleId = hfUniqueScheduleId.ValueAsInt();
            }

            if (!Page.IsValid)
            {
                return;
            }

            if (!metric.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            if (!cpMetricCategories.SelectedValuesAsInt().Any())
            {
                cpMetricCategories.ShowErrorMessage("Must select at least one category");
                return;
            }

            // do a WrapTransaction since we are doing multiple SaveChanges()
            rockContext.WrapTransaction(() =>
            {
                var scheduleService          = new ScheduleService(rockContext);
                var schedule                 = scheduleService.Get(metric.ScheduleId ?? 0);
                int metricScheduleCategoryId = new CategoryService(rockContext).Get(Rock.SystemGuid.Category.SCHEDULE_METRICS.AsGuid()).Id;
                if (schedule == null)
                {
                    schedule = new Schedule();

                    // make it an "Unnamed" metrics schedule
                    schedule.Name       = string.Empty;
                    schedule.CategoryId = metricScheduleCategoryId;
                }

                // if the schedule was a unique schedule (configured in the Metric UI, set the schedule's ical content to the schedule builder UI's value
                if (scheduleSelectionType == ScheduleSelectionType.Unique)
                {
                    schedule.iCalendarContent = sbSchedule.iCalendarContent;
                }

                if (!schedule.HasSchedule() && scheduleSelectionType == ScheduleSelectionType.Unique)
                {
                    // don't save as a unique schedule if the schedule doesn't do anything
                    schedule = null;
                }
                else
                {
                    if (schedule.Id == 0)
                    {
                        scheduleService.Add(schedule);

                        // save to make sure we have a scheduleId
                        rockContext.SaveChanges();
                    }
                }

                if (schedule != null)
                {
                    metric.ScheduleId = schedule.Id;
                }
                else
                {
                    metric.ScheduleId = null;
                }

                if (metric.Id == 0)
                {
                    metricService.Add(metric);

                    // save to make sure we have a metricId
                    rockContext.SaveChanges();
                }

                // update MetricCategories for Metric
                metric.MetricCategories = metric.MetricCategories ?? new List <MetricCategory>();
                var selectedCategoryIds = cpMetricCategories.SelectedValuesAsInt();

                // delete any categories that were removed
                foreach (var metricCategory in metric.MetricCategories.ToList())
                {
                    if (!selectedCategoryIds.Contains(metricCategory.CategoryId))
                    {
                        metricCategoryService.Delete(metricCategory);
                    }
                }

                // add any categories that were added
                foreach (int categoryId in selectedCategoryIds)
                {
                    if (!metric.MetricCategories.Any(a => a.CategoryId == categoryId))
                    {
                        metricCategoryService.Add(new MetricCategory {
                            CategoryId = categoryId, MetricId = metric.Id
                        });
                    }
                }

                rockContext.SaveChanges();

                // delete MetricValues associated with the old entityType if they confirmed the EntityType change
                if (deleteValuesOnSave)
                {
                    metricValueService.DeleteRange(metricValueService.Queryable().Where(a => a.MetricId == metric.Id && a.EntityId.HasValue));

                    // since there could be 1000s of values that got deleted, do a SaveChanges that skips PrePostProcessing
                    rockContext.SaveChanges(true);
                }

                // delete any orphaned Unnamed metric schedules
                var metricIdSchedulesQry = metricService.Queryable().Select(a => a.ScheduleId);
                int?metricScheduleId     = schedule != null ? schedule.Id : (int?)null;
                var orphanedSchedules    = scheduleService.Queryable()
                                           .Where(a => a.CategoryId == metricScheduleCategoryId && a.Name == string.Empty && a.Id != (metricScheduleId ?? 0))
                                           .Where(s => !metricIdSchedulesQry.Any(m => m == s.Id));
                foreach (var item in orphanedSchedules)
                {
                    scheduleService.Delete(item);
                }

                if (orphanedSchedules.Any())
                {
                    rockContext.SaveChanges();
                }
            });

            var qryParams = new Dictionary <string, string>();

            qryParams["MetricId"] = metric.Id.ToString();
            if (hfMetricCategoryId.ValueAsInt() == 0)
            {
                int?parentCategoryId = PageParameter("ParentCategoryId").AsIntegerOrNull();
                int?metricCategoryId = new MetricCategoryService(new RockContext()).Queryable().Where(a => a.MetricId == metric.Id && a.CategoryId == parentCategoryId).Select(a => a.Id).FirstOrDefault();
                hfMetricCategoryId.Value = metricCategoryId.ToString();
            }

            qryParams["MetricCategoryId"] = hfMetricCategoryId.Value;
            qryParams["ExpandedIds"]      = PageParameter("ExpandedIds");

            NavigateToPage(RockPage.Guid, qryParams);
        }
        /// <summary>
        /// Binds the metrics.
        /// </summary>
        private void BindMetrics()
        {
            var groupMetricValues = new List <GroupMetric>();

            int groupEntityTypeId  = EntityTypeCache.Get(typeof(Rock.Model.Group)).Id;
            int campusEntityTypeId = EntityTypeCache.Get(typeof(Rock.Model.Campus)).Id;

            int?     groupId = gpSelectGroup.SelectedValueAsInt();
            DateTime?weekend = dpMetricValueDateTime.SelectedDate;

            var notes = new List <string>();

            if (groupId.HasValue && weekend.HasValue)
            {
                SetBlockUserPreference("GroupId", groupId.HasValue ? groupId.Value.ToString() : "");

                var metricCategories = MetricCategoriesFieldAttribute.GetValueAsGuidPairs(GetAttributeValue("MetricCategories"));
                var metricGuids      = metricCategories.Select(a => a.MetricGuid).ToList();
                using (var rockContext = new RockContext())
                {
                    var group              = new GroupService(rockContext).Queryable().FirstOrDefault(g => g.Id == groupId);
                    int?campusId           = group.CampusId;
                    var metricValueService = new MetricValueService(rockContext);
                    foreach (var metric in new MetricService(rockContext)
                             .GetByGuids(metricGuids)
                             .OrderBy(m => m.Title)
                             .Select(m => new
                    {
                        m.Id,
                        m.Title,
                        GroupPartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == groupEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                        CampusPartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault()
                    }))
                    {
                        var groupMetric = new GroupMetric(metric.Id, metric.Title);

                        if (groupId.HasValue && weekend.HasValue)
                        {
                            var metricValue = metricValueService
                                              .Queryable().AsNoTracking()
                                              .Where(v =>
                                                     v.MetricId == metric.Id &&
                                                     v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                     (
                                                         (
                                                             v.MetricValuePartitions.Count == 2 &&
                                                             v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.CampusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                             v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.GroupPartitionId && p.EntityId.HasValue && p.EntityId.Value == groupId.Value)
                                                         ) ||
                                                         (
                                                             v.MetricValuePartitions.Count == 1 &&
                                                             (
                                                                 v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.GroupPartitionId && p.EntityId.HasValue && p.EntityId.Value == groupId.Value)
                                                             )
                                                         )
                                                     )
                                                     )
                                              .FirstOrDefault();

                            if (metricValue != null)
                            {
                                groupMetric.Value = metricValue.YValue;

                                if (!string.IsNullOrWhiteSpace(metricValue.Note) &&
                                    !notes.Contains(metricValue.Note))
                                {
                                    notes.Add(metricValue.Note);
                                }
                            }
                        }

                        groupMetricValues.Add(groupMetric);
                    }
                }
            }

            rptrMetric.DataSource = groupMetricValues;
            rptrMetric.DataBind();

            tbNote.Text = notes.AsDelimited(Environment.NewLine + Environment.NewLine);
        }
Exemple #20
0
        /// <summary>
        /// Shows the detail.
        /// </summary>
        /// <param name="metricValueId">The metric value identifier.</param>
        /// <param name="metricId">The metric identifier.</param>
        public void ShowDetail(int metricValueId, int?metricId)
        {
            pnlDetails.Visible = true;

            // Load depending on Add(0) or Edit
            MetricValue metricValue = null;

            if (!metricValueId.Equals(0))
            {
                metricValue       = new MetricValueService(new RockContext()).Get(metricValueId);
                lActionTitle.Text = ActionTitle.Edit(MetricValue.FriendlyTypeName).FormatAsHtmlTitle();
                pdAuditDetails.SetEntity(metricValue, ResolveRockUrl("~"));
            }

            if (metricValue == null && metricId.HasValue)
            {
                metricValue = new MetricValue {
                    Id = 0, MetricId = metricId.Value
                };
                metricValue.Metric = metricValue.Metric ?? new MetricService(new RockContext()).Get(metricValue.MetricId);
                lActionTitle.Text  = ActionTitle.Add(MetricValue.FriendlyTypeName).FormatAsHtmlTitle();
                // hide the panel drawer that show created and last modified dates
                pdAuditDetails.Visible = false;
            }

            hfMetricValueId.Value = metricValue.Id.ToString();

            LoadDropDowns();

            ddlMetricValueType.SelectedValue = metricValue.MetricValueType.ConvertToInt().ToString();
            tbXValue.Text    = metricValue.XValue;
            tbYValue.Text    = metricValue.YValue.ToString();
            hfMetricId.Value = metricValue.MetricId.ToString();
            tbNote.Text      = metricValue.Note;
            dpMetricValueDateTime.SelectedDate = metricValue.MetricValueDateTime;

            // render UI based on Authorized and IsSystem
            bool readOnly = false;

            nbEditModeMessage.Text = string.Empty;

            bool canEdit = UserCanEdit;

            if (!canEdit && metricId.HasValue && metricId.Value > 0)
            {
                var metric = new MetricService(new RockContext()).Get(metricId.Value);
                if (metric != null && metric.IsAuthorized(Authorization.EDIT, CurrentPerson))
                {
                    canEdit = true;
                }
            }

            if (!canEdit)
            {
                readOnly = true;
                nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed(MetricValue.FriendlyTypeName);
            }

            if (readOnly)
            {
                lActionTitle.Text = ActionTitle.View(MetricValue.FriendlyTypeName);
                btnCancel.Text    = "Close";
            }

            CreateDynamicControls(metricValue, true, readOnly);

            ddlMetricValueType.Enabled    = !readOnly;
            tbXValue.ReadOnly             = readOnly;
            tbYValue.ReadOnly             = readOnly;
            tbNote.ReadOnly               = readOnly;
            dpMetricValueDateTime.Enabled = !readOnly;

            btnSave.Visible = !readOnly;
        }
Exemple #21
0
        protected void CalulateMetrics()
        {
            DateTime start2020 = new DateTime(2020, 1, 1);
            DateTime end2020   = new DateTime(2020, 12, 31);

            var _now = DateTime.Now.SundayDate().AddDays(-7 * 3);

            var CurrentMonthInFiscalYear      = ((_now.Month - 8) % 12) + 1;
            var GoalOffsetMultiplier          = (1.0 / 12) * CurrentMonthInFiscalYear;
            var SecondaryGoalOffsetMultiplier = 0.88 + (CurrentMonthInFiscalYear * 0.01);

            var _6wkEnd     = _now;
            var _6wkStart   = _6wkEnd.AddDays(-7 * 6);
            var _6wkLYEnd   = _6wkEnd.AddYears(-1);
            var _6wkLYStart = _6wkLYEnd.AddDays(-7 * 6);

            var _8wkEnd     = _now;
            var _8wkStart   = _6wkEnd.AddDays(-7 * 8);
            var _8wkLYEnd   = _6wkEnd.AddYears(-1);
            var _8wkLYStart = _6wkLYEnd.AddDays(-7 * 8);

            DateTime fiscalYearStartDate;
            var      fiscalYearStartDateFromAttribute = GetAttributeValue("FiscalYearStartDate").AsDateTime();

            if (fiscalYearStartDateFromAttribute.HasValue)
            {
                fiscalYearStartDate = new DateTime(_now.Year, fiscalYearStartDateFromAttribute.Value.Month, fiscalYearStartDateFromAttribute.Value.Day);
            }
            else
            {
                fiscalYearStartDate = new DateTime(_now.Year, 1, 1);
            }
            if (fiscalYearStartDate > _now)
            {
                fiscalYearStartDate.AddYears(-1);
            }

            var _fyEnd   = _now;
            var _fyStart = fiscalYearStartDate;



            List <MetricRow>   metricList = new List <MetricRow>();
            MetricValueService mvServ     = new MetricValueService(rockContext);
            var metric         = mvServ.Queryable().Where(mv => mv.MetricValuePartitions.Where(mvp => mvp.MetricPartition.EntityTypeId == 67).Select(mvp => mvp.EntityId).Contains(SelectedCampusId));
            var metric_Goal    = metric.Where(mv => mv.MetricValueType == MetricValueType.Goal);
            var metric_Measure = metric.Where(mv => mv.MetricValueType == MetricValueType.Measure);

            var metric_Att_Adult = new MetricRow();

            metric_Att_Adult.SecondaryGoalOffsetMultiplier = SecondaryGoalOffsetMultiplier;
            metric_Att_Adult.Name                = "6wk Average Adult Attendance";
            metric_Att_Adult.YearToDateValue     = ( int? )metric_Measure.Where(mv => mv.MetricId == 2 && mv.MetricValueDateTime >= _6wkStart && mv.MetricValueDateTime < _6wkEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Adult.LastYearToDateValue = ( int? )metric_Measure.Where(mv => mv.MetricId == 2 && mv.MetricValueDateTime >= _6wkLYStart && mv.MetricValueDateTime < _6wkLYEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Adult.Goal                = ( int? )metric_Goal.Where(mv => mv.MetricId == 2 && mv.MetricValueDateTime >= start2020 && mv.MetricValueDateTime <= end2020).Sum(mv => mv.YValue) ?? 0;
            metricList.Add(metric_Att_Adult);

            var metric_Att_Kid = new MetricRow();

            metric_Att_Kid.SecondaryGoalOffsetMultiplier = SecondaryGoalOffsetMultiplier;
            metric_Att_Kid.Name                = "6wk Average Kids Attendance";
            metric_Att_Kid.YearToDateValue     = ( int? )metric_Measure.Where(mv => new int[] { 3, 4 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkStart && mv.MetricValueDateTime < _6wkEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Kid.LastYearToDateValue = ( int? )metric_Measure.Where(mv => new int[] { 3, 4 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkLYStart && mv.MetricValueDateTime < _6wkLYEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Kid.Goal                = ( int? )metric_Goal.Where(mv => new int[] { 3, 4 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= start2020 && mv.MetricValueDateTime <= end2020).Sum(mv => mv.YValue) ?? 0;
            metricList.Add(metric_Att_Kid);

            var metric_Att_Stud = new MetricRow();

            metric_Att_Stud.SecondaryGoalOffsetMultiplier = SecondaryGoalOffsetMultiplier;
            metric_Att_Stud.Name                = "6wk Average Students Attendance";
            metric_Att_Stud.YearToDateValue     = ( int? )metric_Measure.Where(mv => new int[] { 5 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkStart && mv.MetricValueDateTime < _6wkEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Stud.LastYearToDateValue = ( int? )metric_Measure.Where(mv => new int[] { 5 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkLYStart && mv.MetricValueDateTime < _6wkLYEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_Stud.Goal                = ( int? )metric_Goal.Where(mv => new int[] { 5 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= start2020 && mv.MetricValueDateTime <= end2020).Sum(mv => mv.YValue) ?? 0;
            metricList.Add(metric_Att_Stud);

            var metric_Att_HS = new MetricRow();

            metric_Att_HS.SecondaryGoalOffsetMultiplier = SecondaryGoalOffsetMultiplier;
            metric_Att_HS.Name                = "6wk Average High School Attendance";
            metric_Att_HS.YearToDateValue     = ( int? )metric_Measure.Where(mv => new int[] { 23 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkStart && mv.MetricValueDateTime < _6wkEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_HS.LastYearToDateValue = ( int? )metric_Measure.Where(mv => new int[] { 23 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= _6wkLYStart && mv.MetricValueDateTime < _6wkLYEnd).ToList().GroupBy(mv => mv.MetricValueDateTime.Value.SundayDate()).Select(mv => mv.Sum(m => m.YValue)).Average() ?? 0;
            metric_Att_HS.Goal                = ( int? )metric_Goal.Where(mv => new int[] { 23 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= start2020 && mv.MetricValueDateTime <= end2020).Sum(mv => mv.YValue) ?? 0;
            metricList.Add(metric_Att_HS);



            gMetricsChart.DataSource = metricList;
            gMetricsChart.DataBind();
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            int? metricId = hfMetricId.Value.AsIntegerOrNull();

            if ( !metricId.HasValue )
            {
                return;
            }

            var rockContext = new RockContext();
            SortProperty sortProperty = gMetricValues.SortProperty;
            MetricValueService metricValueService = new MetricValueService( rockContext );
            var qry = metricValueService.Queryable();

            qry = qry.Where( a => a.MetricId == metricId );

            var entityTypeNameColumn = gMetricValues.Columns.OfType<RockLiteralField>().FirstOrDefault( a => a.ID == "lEntityTypeName" );
            var metric = new MetricService( rockContext ).Get( metricId ?? 0 );
            entityTypeNameColumn.Visible = metric != null && metric.EntityTypeId.HasValue;

            if ( metric != null )
            {
                _entityNameLookup = new Dictionary<int, string>();

                var entityTypeCache = EntityTypeCache.Read( metric.EntityTypeId ?? 0 );
                if ( entityTypeCache != null )
                {
                    entityTypeNameColumn.HeaderText = entityTypeCache.FriendlyName;
                    IQueryable<IEntity> entityQry = null;
                    if ( entityTypeCache.GetEntityType() == typeof( Rock.Model.Group ) )
                    {
                        // special case for Group since there could be a very large number (especially if you include families), so limit to GroupType.ShowInGroupList
                        entityQry = new GroupService( rockContext ).Queryable().Where( a => a.GroupType.ShowInGroupList );
                    }
                    else
                    {
                        Type[] modelType = { entityTypeCache.GetEntityType() };
                        Type genericServiceType = typeof( Rock.Data.Service<> );
                        Type modelServiceType = genericServiceType.MakeGenericType( modelType );
                        var serviceInstance = Activator.CreateInstance( modelServiceType, new object[] { rockContext } ) as IService;
                        MethodInfo qryMethod = serviceInstance.GetType().GetMethod( "Queryable", new Type[] { } );
                        entityQry = qryMethod.Invoke( serviceInstance, new object[] { } ) as IQueryable<IEntity>;
                    }

                    if ( entityQry != null )
                    {
                        var entityList = entityQry.ToList();
                        foreach ( var e in entityList )
                        {
                            _entityNameLookup.AddOrReplace( e.Id, e.ToString() );
                        }
                    }
                }
            }

            var drp = new DateRangePicker();
            drp.DelimitedValues = gfMetricValues.GetUserPreference( "Date Range" );
            if ( drp.LowerValue.HasValue )
            {
                qry = qry.Where( a => a.MetricValueDateTime >= drp.LowerValue.Value );
            }

            if ( drp.UpperValue.HasValue )
            {
                DateTime upperDate = drp.UpperValue.Value.Date.AddDays( 1 );
                qry = qry.Where( a => a.MetricValueDateTime < upperDate );
            }

            var metricValueType = gfMetricValues.GetUserPreference( "Goal/Measure" ).ConvertToEnumOrNull<MetricValueType>();
            if ( metricValueType.HasValue )
            {
                qry = qry.Where( a => a.MetricValueType == metricValueType.Value );
            }

            var entityParts = gfMetricValues.GetUserPreference( this.EntityPreferenceKey ).Split( '|' );
            if ( entityParts.Length == 2 )
            {
                if ( entityParts[0].AsInteger() == metric.EntityTypeId )
                {
                    var entityId = entityParts[1].AsIntegerOrNull();
                    if ( entityId.HasValue )
                    {
                        qry = qry.Where( a => a.EntityId == entityId );
                    }
                }
            }

            if ( sortProperty != null )
            {
                qry = qry.Sort( sortProperty );
            }
            else
            {
                qry = qry.OrderBy( s => s.Order ).ThenByDescending( s => s.MetricValueDateTime ).ThenBy( s => s.YValue ).ThenBy( s => s.XValue ).ThenByDescending( s => s.ModifiedDateTime );
            }

            gMetricValues.SetLinqDataSource( qry );

            gMetricValues.DataBind();
        }
        protected void DoSQL()
        {
            int         SelectedCampusId   = cpCampus.SelectedValue.AsInteger();
            CampusCache SelectedCampus     = CampusCache.Read(SelectedCampusId);
            string      SelectedCampusName = SelectedCampus != null ? SelectedCampus.Name : "";

            var sunday     = DateTime.Today.SundayDate().AddDays(-6);
            var lastSunday = sunday.AddDays(-7);

            SundayDate = sunday.ToShortDateString();

            MetricValueService mvServ = new MetricValueService(rockContext);

            var metricValues    = SelectedCampusId == 0 ? mvServ.Queryable() : mvServ.Queryable().Where(mv => mv.MetricValuePartitions.Where(mvp => mvp.MetricPartition.EntityTypeId == 67).Select(mvp => mvp.EntityId).Contains(SelectedCampusId));
            var metric_Goal     = metricValues.Where(mv => mv.MetricValueType == MetricValueType.Goal);
            var metric_Measure  = metricValues.Where(mv => mv.MetricValueType == MetricValueType.Measure);
            var metric_LastWeek = metric_Measure.Where(mv => mv.MetricValueDateTime > lastSunday && mv.MetricValueDateTime <= sunday);


            //Attendance Last Week - All Environments
            int iAttendanceGoalCurrent = decimal.ToInt32(metric_Goal.Where(mv => new int[] { 2, 3, 4, 5 }.Contains(mv.MetricId) && mv.MetricValueDateTime.Value.Year == sunday.Year).Sum(mv => mv.YValue) ?? 0);
            int iAttendanceLastWeekAll = decimal.ToInt32(metric_LastWeek.Where(mv => new int[] { 2, 3, 4, 5 }.Contains(mv.MetricId)).Sum(mv => mv.YValue) ?? 0);
            int iAttendancePercent     = iAttendanceGoalCurrent != 0 ? ( int )((( double )iAttendanceLastWeekAll / iAttendanceGoalCurrent) * 100) : 0;

            AttendanceLastWeekAll = iAttendanceLastWeekAll.ToString();
            AttendancePercentage  = iAttendancePercent.ToString();

            AttendanceColor = GetColorForPercent(iAttendancePercent);

            //Attendance Last Week - Auditorium
            AttendanceLastWeekAud = decimal.ToInt32(metric_LastWeek.Where(mv => new int[] { 2 }.Contains(mv.MetricId)).Sum(mv => mv.YValue) ?? 0).ToString();

            //Attendance Last Week - Rainforest + Velocity
            AttendanceLastWeekChild = decimal.ToInt32(metric_LastWeek.Where(mv => new int[] { 3, 4 }.Contains(mv.MetricId)).Sum(mv => mv.YValue) ?? 0).ToString();

            //Attendance Last Week - The Collective
            AttendanceLastWeekStudent = decimal.ToInt32(metric_LastWeek.Where(mv => new int[] { 5 }.Contains(mv.MetricId)).Sum(mv => mv.YValue) ?? 0).ToString();


            //Comitments
            var commitStartDate = DateTime.Parse("2015-09-01");

            //First Time Commitments
            int iCommitments = decimal.ToInt32(metric_Measure.Where(mv => mv.MetricId == 12 && mv.MetricValueDateTime >= commitStartDate).Sum(mv => mv.YValue) ?? 0);

            Commitments = iCommitments.ToString();


            //Re-commitments
            int iRecommitments = decimal.ToInt32(metric_Measure.Where(mv => mv.MetricId == 13 && mv.MetricValueDateTime >= commitStartDate).Sum(mv => mv.YValue) ?? 0);

            Recommitments = iRecommitments.ToString();


            //TotalCommitments
            int iTotalCommitments       = decimal.ToInt32(metric_Measure.Where(mv => new int[] { 12, 13 }.Contains(mv.MetricId) && mv.MetricValueDateTime >= commitStartDate).Sum(mv => mv.YValue) ?? 0);
            int iTotalCommitmentGoal    = decimal.ToInt32(metric_Goal.Where(mv => new int[] { 12, 13 }.Contains(mv.MetricId) && mv.MetricValueDateTime.Value.Year == sunday.Year).Sum(mv => mv.YValue) ?? 0);
            int iTotalCommitmentPercent = iTotalCommitmentGoal != 0 ? ( int )((( double )iTotalCommitments / iTotalCommitmentGoal) * 100) : 0;

            AllCommitments            = iTotalCommitments.ToString();
            TotalCommitmentPercentage = iTotalCommitmentPercent.ToString();

            TotalCommitmentColor = GetColorForPercent(iTotalCommitmentPercent);


            //Involvement
            var groupMembers = new GroupMemberService(rockContext).Queryable().Where(gm => gm.Group.IsActive && gm.GroupMemberStatus == GroupMemberStatus.Active);

            if (SelectedCampusId != 0)
            {
                groupMembers = groupMembers.Where(gm => gm.Group.CampusId == SelectedCampusId);
            }

            //Small Group Leaders
            SmallGroupLeaders = groupMembers.Where(gm => gm.Group.GroupTypeId == 25 && gm.GroupRoleId == 24).DistinctBy(gm => gm.PersonId).Count().ToString();

            //Volunteers
            Volunteers = groupMembers.Where(gm => gm.Group.GroupTypeId == 42).DistinctBy(gm => gm.PersonId).Count().ToString();

            //Total Involvement
            Involvement = groupMembers.Where(gm => (gm.Group.GroupTypeId == 25 && gm.GroupRoleId == 24) || gm.Group.GroupTypeId == 42).DistinctBy(gm => gm.PersonId).Count().ToString();


            WorkflowService workServ = new WorkflowService(rockContext);

            var today = DateTime.Now;

            int iInactiveFollowupComplete;
            int iInactiveFollowupIncomplete;

            //Inactive Follow-up
            if (SelectedCampusId == 0)
            {
                iInactiveFollowupComplete = workServ.Queryable().Where(w => w.WorkflowTypeId == 120 && w.Status == "Completed" && w.ActivatedDateTime.Value.Year == today.Year && w.ActivatedDateTime.Value.Month == today.Month).Count();
            }
            else
            {
                iInactiveFollowupComplete = workServ.Queryable().Where(w => w.WorkflowTypeId == 120 && w.Status == "Completed" && w.ActivatedDateTime.Value.Year == today.Year && w.ActivatedDateTime.Value.Month == today.Month).WhereAttributeValue(rockContext, "Campus", SelectedCampusName).Count();
            }

            if (SelectedCampusId == 0)
            {
                iInactiveFollowupIncomplete = workServ.Queryable().Where(w => w.WorkflowTypeId == 120 && w.Status != "Completed" && w.ActivatedDateTime.Value.Year == today.Year && w.ActivatedDateTime.Value.Month == today.Month).Count();
            }
            else
            {
                iInactiveFollowupIncomplete = workServ.Queryable().Where(w => w.WorkflowTypeId == 120 && w.Status != "Completed" && w.ActivatedDateTime.Value.Year == today.Year && w.ActivatedDateTime.Value.Month == today.Month).WhereAttributeValue(rockContext, "Campus", SelectedCampusName).Count();
            }

            int iInactiveFollowup           = iInactiveFollowupComplete + iInactiveFollowupIncomplete;
            int iInactiveFollowupPercentage = iInactiveFollowup != 0 ? ( int )((( double )iInactiveFollowupComplete / iInactiveFollowup) * 100) : 0;

            InactiveFollowupComplete   = iInactiveFollowupComplete.ToString();
            InactiveFollowupIncomplete = iInactiveFollowupIncomplete.ToString();
            InactiveFollowup           = iInactiveFollowup.ToString();
            InactiveFollowupPercentage = iInactiveFollowupPercentage.ToString();

            InactiveFollowupColor = GetColorForPercent(iInactiveFollowupPercentage);
        }
        /// <summary>
        /// Shows the detail.
        /// </summary>
        /// <param name="metricValueId">The metric value identifier.</param>
        /// <param name="metricId">The metric identifier.</param>
        public void ShowDetail(int metricValueId, int?metricId)
        {
            pnlDetails.Visible = true;

            // Load depending on Add(0) or Edit
            MetricValue metricValue = null;

            if (!metricValueId.Equals(0))
            {
                metricValue       = new MetricValueService(new RockContext()).Get(metricValueId);
                lActionTitle.Text = ActionTitle.Edit(MetricValue.FriendlyTypeName).FormatAsHtmlTitle();
            }

            if (metricValue == null && metricId.HasValue)
            {
                metricValue = new MetricValue {
                    Id = 0, MetricId = metricId.Value
                };
                metricValue.Metric = metricValue.Metric ?? new MetricService(new RockContext()).Get(metricValue.MetricId);
                lActionTitle.Text  = ActionTitle.Add(MetricValue.FriendlyTypeName).FormatAsHtmlTitle();
            }

            hfMetricValueId.Value = metricValue.Id.ToString();

            LoadDropDowns();

            ddlMetricValueType.SelectedValue = metricValue.MetricValueType.ConvertToInt().ToString();
            tbXValue.Text    = metricValue.XValue;
            tbYValue.Text    = metricValue.YValue.ToString();
            hfMetricId.Value = metricValue.MetricId.ToString();
            tbNote.Text      = metricValue.Note;
            dpMetricValueDateTime.SelectedDate = metricValue.MetricValueDateTime;

            var metricEntityType = EntityTypeCache.Read(metricValue.Metric.EntityTypeId ?? 0);

            // Setup EntityType UI controls
            Control entityTypeEditControl = null;

            if (metricEntityType != null && metricEntityType.SingleValueFieldType != null)
            {
                hfSingleValueFieldTypeId.Value = metricEntityType.SingleValueFieldType.Id.ToString();
                FieldTypeCache fieldType = FieldTypeCache.Read(hfSingleValueFieldTypeId.Value.AsInteger());
                entityTypeEditControl = fieldType.Field.EditControl(new Dictionary <string, Rock.Field.ConfigurationValue>(), "entityTypeEditControl");

                if (entityTypeEditControl is IRockControl)
                {
                    (entityTypeEditControl as IRockControl).Label = fieldType.Name;
                }

                phEntityTypeEntityIdValue.Controls.Add(entityTypeEditControl);
                IEntityFieldType entityFieldType = metricEntityType.SingleValueFieldType.Field as IEntityFieldType;
                if (entityFieldType != null)
                {
                    entityFieldType.SetEditValueFromEntityId(entityTypeEditControl, new Dictionary <string, ConfigurationValue>(), metricValue.EntityId);
                }
            }

            // render UI based on Authorized and IsSystem
            bool readOnly = false;

            nbEditModeMessage.Text = string.Empty;

            bool canEdit = UserCanEdit;

            if (!canEdit && metricId.HasValue && metricId.Value > 0)
            {
                var metric = new MetricService(new RockContext()).Get(metricId.Value);
                if (metric != null && metric.IsAuthorized(Authorization.EDIT, CurrentPerson))
                {
                    canEdit = true;
                }
            }

            if (!canEdit)
            {
                readOnly = true;
                nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed(MetricValue.FriendlyTypeName);
            }

            if (readOnly)
            {
                lActionTitle.Text = ActionTitle.View(MetricValue.FriendlyTypeName);
                btnCancel.Text    = "Close";
            }

            ddlMetricValueType.Enabled    = !readOnly;
            tbXValue.ReadOnly             = readOnly;
            tbYValue.ReadOnly             = readOnly;
            tbNote.ReadOnly               = readOnly;
            dpMetricValueDateTime.Enabled = !readOnly;
            if (entityTypeEditControl is WebControl)
            {
                (entityTypeEditControl as WebControl).Enabled = !readOnly;
            }

            btnSave.Visible = !readOnly;
        }
Exemple #25
0
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            int campusEntityTypeId   = EntityTypeCache.Read(typeof(Rock.Model.Campus)).Id;
            int scheduleEntityTypeId = EntityTypeCache.Read(typeof(Rock.Model.Schedule)).Id;

            int?campusId = bddlCampus.SelectedValueAsInt();
            //int? scheduleId = bddlService.SelectedValueAsInt();
            DateTime?weekend = bddlWeekend.SelectedValue.AsDateTime();

            if (campusId.HasValue && weekend.HasValue)
            {
                using (var rockContext = new RockContext())
                {
                    var metricService      = new MetricService(rockContext);
                    var metricValueService = new MetricValueService(rockContext);

                    foreach (RepeaterItem category in rptrMetricCategory.Items)
                    {
                        var rptrMetric = category.FindControl("rptrMetric") as Repeater;
                        foreach (RepeaterItem item in rptrMetric.Items)
                        {
                            var hfMetricIId   = item.FindControl("hfMetricId") as HiddenField;
                            var nbMetricValue = item.FindControl("nbMetricValue") as NumberBox;

                            if (hfMetricIId != null && nbMetricValue != null && !string.IsNullOrEmpty(nbMetricValue.Text))
                            {
                                int metricId = hfMetricIId.ValueAsInt();
                                var metric   = new MetricService(rockContext).Get(metricId);

                                if (metric != null)
                                {
                                    int campusPartitionId = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault();

                                    var metricValue = metricValueService
                                                      .Queryable()
                                                      .Where(v =>
                                                             v.MetricId == metric.Id &&
                                                             v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                             v.MetricValuePartitions.Count == 1 &&
                                                             v.MetricValuePartitions.Any(p => p.MetricPartitionId == campusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value))
                                                      .FirstOrDefault();

                                    if (metricValue == null)
                                    {
                                        metricValue = new MetricValue();
                                        metricValue.MetricValueType     = MetricValueType.Measure;
                                        metricValue.MetricId            = metric.Id;
                                        metricValue.MetricValueDateTime = weekend.Value;
                                        metricValueService.Add(metricValue);

                                        var campusValuePartition = new MetricValuePartition();
                                        campusValuePartition.MetricPartitionId = campusPartitionId;
                                        campusValuePartition.EntityId          = campusId.Value;
                                        metricValue.MetricValuePartitions.Add(campusValuePartition);
                                    }

                                    metricValue.YValue = nbMetricValue.Text.AsDecimalOrNull();
                                    metricValue.Note   = tbNote.Text;
                                }
                            }
                        }
                    }

                    foreach (RepeaterItem service in rptrService.Items)
                    {
                        var hfScheduleId      = service.FindControl("hfScheduleId") as HiddenField;
                        int scheduleId        = hfScheduleId.ValueAsInt();
                        var rptrServiceMetric = service.FindControl("pnlwService").FindControl("rptrServiceMetric") as Repeater;

                        foreach (RepeaterItem item in rptrServiceMetric.Items)
                        {
                            var hfMetricIId   = item.FindControl("hfMetricId") as HiddenField;
                            var nbMetricValue = item.FindControl("nbMetricValue") as NumberBox;

                            if (hfMetricIId != null && nbMetricValue != null && !string.IsNullOrEmpty(nbMetricValue.Text))
                            {
                                int metricId = hfMetricIId.ValueAsInt();
                                var metric   = new MetricService(rockContext).Get(metricId);

                                if (metric != null)
                                {
                                    int campusPartitionId   = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault();
                                    int schedulePartitionId = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId).Select(p => p.Id).FirstOrDefault();

                                    var metricValue = metricValueService
                                                      .Queryable()
                                                      .Where(v =>
                                                             v.MetricId == metric.Id &&
                                                             v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                             v.MetricValuePartitions.Count == 2 &&
                                                             v.MetricValuePartitions.Any(p => p.MetricPartitionId == campusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                             v.MetricValuePartitions.Any(p => p.MetricPartitionId == schedulePartitionId && p.EntityId.HasValue && p.EntityId.Value == scheduleId))
                                                      .FirstOrDefault();

                                    if (metricValue == null)
                                    {
                                        metricValue = new MetricValue();
                                        metricValue.MetricValueType     = MetricValueType.Measure;
                                        metricValue.MetricId            = metric.Id;
                                        metricValue.MetricValueDateTime = weekend.Value;
                                        metricValueService.Add(metricValue);

                                        var campusValuePartition = new MetricValuePartition();
                                        campusValuePartition.MetricPartitionId = campusPartitionId;
                                        campusValuePartition.EntityId          = campusId.Value;
                                        metricValue.MetricValuePartitions.Add(campusValuePartition);

                                        var scheduleValuePartition = new MetricValuePartition();
                                        scheduleValuePartition.MetricPartitionId = schedulePartitionId;
                                        scheduleValuePartition.EntityId          = scheduleId;
                                        metricValue.MetricValuePartitions.Add(scheduleValuePartition);
                                    }

                                    metricValue.YValue = nbMetricValue.Text.AsDecimalOrNull();
                                    metricValue.Note   = tbNote.Text;
                                }
                            }
                        }
                    }

                    rockContext.SaveChanges();
                }

                nbMetricsSaved.Text = string.Format("Your metrics for {0} at the {1} Campus have been saved.",
                                                    bddlWeekend.SelectedItem.Text, bddlCampus.SelectedItem.Text);
                nbMetricsSaved.Visible = true;

                BindMetrics();
            }
        }
Exemple #26
0
        /// <summary>
        /// Executes the specified context.
        /// </summary>
        /// <param name="context">The context.</param>
        public void Execute(IJobExecutionContext context)
        {
            var dataMap        = context.JobDetail.JobDataMap;
            var commandTimeout = dataMap.GetString(AttributeKey.CommandTimeout).AsIntegerOrNull() ?? 300;
            var metricSourceValueTypeDataviewGuid = Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_DATAVIEW.AsGuid();
            var metricSourceValueTypeSqlGuid      = Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_SQL.AsGuid();
            var metricSourceValueTypeLavaGuid     = Rock.SystemGuid.DefinedValue.METRIC_SOURCE_VALUE_TYPE_LAVA.AsGuid();

            Guid[] calculatedSourceTypes = new Guid[] {
                metricSourceValueTypeDataviewGuid,
                metricSourceValueTypeSqlGuid,
                metricSourceValueTypeLavaGuid
            };

            var metricsQry = new MetricService(new RockContext()).Queryable().AsNoTracking().Where(
                a => a.ScheduleId.HasValue &&
                a.SourceValueTypeId.HasValue &&
                calculatedSourceTypes.Contains(a.SourceValueType.Guid));

            var metricIdList = metricsQry.OrderBy(a => a.Title).ThenBy(a => a.Subtitle).Select(a => a.Id).ToList();

            var    metricExceptions       = new List <Exception>();
            int    metricsCalculated      = 0;
            int    metricValuesCalculated = 0;
            Metric metric = null;

            foreach (var metricId in metricIdList)
            {
                try
                {
                    using (var rockContextForMetricEntity = new RockContext())
                    {
                        rockContextForMetricEntity.Database.CommandTimeout = commandTimeout;
                        var metricService = new MetricService(rockContextForMetricEntity);

                        metric = metricService.Get(metricId);

                        /*  Get the last time the metric has run, if it has never run then set it as the first day of the current week to give it a chance to run now.
                         *  NOTE: This is being used instead of Min Date to prevent a schedule with a start date of months or years back from running for each period since then.
                         *  This would be the case for the "out-of-the-box" Rock daily metrics "Active Records", "Active Families", and "Active Connection Requests" if they
                         *  have never run before. Or if a new user created metric uses a schedule that has an older start date.
                         */
                        DateTime currentDateTime = RockDateTime.Now;
                        DateTime?startOfWeek     = currentDateTime.StartOfWeek(RockDateTime.FirstDayOfWeek);
                        DateTime?lastRunDateTime = metric.LastRunDateTime ?? startOfWeek;

                        // get all the schedule times that were supposed to run since that last time it was scheduled to run
                        var scheduledDateTimesToProcess = metric.Schedule.GetScheduledStartTimes(lastRunDateTime.Value, currentDateTime).Where(a => a > lastRunDateTime.Value).ToList();
                        foreach (var scheduleDateTime in scheduledDateTimesToProcess)
                        {
                            using (var rockContextForMetricValues = new RockContext())
                            {
                                rockContextForMetricValues.Database.CommandTimeout = commandTimeout;
                                var metricPartitions                     = new MetricPartitionService(rockContextForMetricValues).Queryable().Where(a => a.MetricId == metric.Id).ToList();
                                var metricValueService                   = new MetricValueService(rockContextForMetricValues);
                                List <ResultValue> resultValues          = new List <ResultValue>();
                                bool getMetricValueDateTimeFromResultSet = false;
                                if (metric.SourceValueType.Guid == metricSourceValueTypeDataviewGuid)
                                {
                                    // get the metric value from the DataView
                                    if (metric.DataView != null)
                                    {
                                        bool parseCampusPartition = metricPartitions.Count == 1 &&
                                                                    metric.AutoPartitionOnPrimaryCampus &&
                                                                    metric.DataView.EntityTypeId == Web.Cache.EntityTypeCache.GetId(SystemGuid.EntityType.PERSON) &&
                                                                    metricPartitions[0].EntityTypeId == Web.Cache.EntityTypeCache.GetId(SystemGuid.EntityType.CAMPUS);

                                        // Dataview metrics can be partitioned by campus only and AutoPartitionOnPrimaryCampus must be selected.
                                        if (metricPartitions.Count > 1 ||
                                            (metricPartitions[0].EntityTypeId.HasValue && parseCampusPartition == false))
                                        {
                                            throw new NotImplementedException("Partitioned Metrics using DataViews is only supported for Person data views using a single partition of type 'Campus' with 'Auto Partition on Primary Campus' checked. Any other dataview partition configuration is not supported.");
                                        }

                                        Stopwatch stopwatch = Stopwatch.StartNew();
                                        var       qry       = metric.DataView.GetQuery(new DataViewGetQueryArgs());

                                        if (parseCampusPartition)
                                        {
                                            // Create a dictionary of campus IDs with a person count
                                            var campusPartitionValues = new Dictionary <int, int>();
                                            foreach (var person in qry.ToList())
                                            {
                                                var iPerson  = ( Person )person;
                                                var campusId = iPerson.GetCampus()?.Id ?? -1;
                                                campusPartitionValues.TryGetValue(campusId, out var currentCount);
                                                campusPartitionValues[campusId] = currentCount + 1;
                                            }

                                            // Use the dictionary to create the ResultValues for each campus (partition)
                                            foreach (var campusPartitionValue in campusPartitionValues)
                                            {
                                                var resultValue = new ResultValue
                                                {
                                                    MetricValueDateTime = scheduleDateTime,
                                                    Partitions          = new List <ResultValuePartition>(),
                                                    Value = campusPartitionValue.Value
                                                };

                                                int?entityId = campusPartitionValue.Key;
                                                if (entityId == -1)
                                                {
                                                    entityId = null;
                                                }

                                                resultValue.Partitions.Add(new ResultValuePartition
                                                {
                                                    PartitionPosition = 0,
                                                    EntityId          = entityId
                                                });

                                                resultValues.Add(resultValue);
                                            }
                                        }
                                        else
                                        {
                                            // Put the entire set in one result since there is no partition
                                            resultValues.Add(new ResultValue
                                            {
                                                Value = Convert.ToDecimal(qry.Count()),
                                                MetricValueDateTime = scheduleDateTime,
                                                Partitions          = new List <ResultValuePartition>()
                                            });
                                        }

                                        stopwatch.Stop();
                                        DataViewService.AddRunDataViewTransaction(metric.DataView.Id, Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds));
                                    }
                                }
                                else if (metric.SourceValueType.Guid == metricSourceValueTypeSqlGuid)
                                {
                                    //// calculate the metricValue using the results from the SQL
                                    //// assume SQL is in one of the following forms:
                                    //// -- "SELECT Count(*) FROM ..."
                                    //// -- "SELECT Count(*), [MetricValueDateTime] FROM ..."
                                    //// -- "SELECT Count(*), Partition0EntityId, Partition1EntityId, Partition2EntityId,.. FROM ..."
                                    //// -- "SELECT Count(*), [MetricValueDateTime], Partition0EntityId, Partition1EntityId, Partition2EntityId,.. FROM ..."
                                    if (!string.IsNullOrWhiteSpace(metric.SourceSql))
                                    {
                                        string formattedSql = metric.SourceSql.ResolveMergeFields(metric.GetMergeObjects(scheduleDateTime));
                                        var    tableResult  = DbService.GetDataTable(formattedSql, System.Data.CommandType.Text, null);

                                        if (tableResult.Columns.Count >= 2 && tableResult.Columns[1].ColumnName == "MetricValueDateTime")
                                        {
                                            getMetricValueDateTimeFromResultSet = true;
                                        }

                                        foreach (var row in tableResult.Rows.OfType <System.Data.DataRow>())
                                        {
                                            var resultValue = new ResultValue();

                                            resultValue.Value = Convert.ToDecimal(row[0] == DBNull.Value ? 0 : row[0]);
                                            if (getMetricValueDateTimeFromResultSet)
                                            {
                                                resultValue.MetricValueDateTime = Convert.ToDateTime(row[1]);
                                            }
                                            else
                                            {
                                                resultValue.MetricValueDateTime = scheduleDateTime;
                                            }

                                            resultValue.Partitions = new List <ResultValuePartition>();
                                            int partitionPosition    = 0;
                                            int partitionFieldIndex  = getMetricValueDateTimeFromResultSet ? 2 : 1;
                                            int partitionColumnCount = tableResult.Columns.Count - 1;
                                            while (partitionFieldIndex <= partitionColumnCount)
                                            {
                                                resultValue.Partitions.Add(new ResultValuePartition
                                                {
                                                    PartitionPosition = partitionPosition,
                                                    EntityId          = row[partitionFieldIndex] as int?
                                                });

                                                partitionPosition++;
                                                partitionFieldIndex++;
                                            }

                                            resultValues.Add(resultValue);
                                        }
                                    }
                                }
                                else if (metric.SourceValueType.Guid == metricSourceValueTypeLavaGuid)
                                {
                                    //// calculate the metricValue using the results from Lava
                                    //// assume Lava Output is in one of the following forms:
                                    //// A single Count
                                    //// 42
                                    //// A List of Count, MetricValueDateTime
                                    //// 42, 1/1/2017
                                    //// 40, 1/2/2017
                                    //// 49, 1/3/2017
                                    //// A List of Count, Partition0EntityId, Partition1EntityId, Partition2EntityId
                                    //// 42, 201, 450, 654
                                    //// 42, 202, 450, 654
                                    //// 42, 203, 450, 654
                                    //// A List of Count, MetricValueDateTime,  Partition0EntityId, Partition1EntityId, Partition2EntityId
                                    //// 42, 1/1/2017, 201, 450, 654
                                    //// 42, 1/2/2017, 202, 450, 654
                                    //// 42, 1/3/2017, 203, 450, 654
                                    if (!string.IsNullOrWhiteSpace(metric.SourceLava))
                                    {
                                        var           mergeObjects = metric.GetMergeObjects(scheduleDateTime);
                                        string        lavaResult   = metric.SourceLava.ResolveMergeFields(mergeObjects, enabledLavaCommands: "All", throwExceptionOnErrors: true);
                                        List <string> resultLines  = lavaResult.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                                                     .Select(a => a.Trim()).Where(a => !string.IsNullOrEmpty(a)).ToList();
                                        List <string[]> resultList = resultLines.Select(a => a.SplitDelimitedValues()).ToList();

                                        if (resultList.Any())
                                        {
                                            if (resultList[0].Length >= 2)
                                            {
                                                // if the value of the data in the 2nd column is a Date, assume that is is the MetricValueDateTime
                                                if (resultList[0][1].AsDateTime().HasValue)
                                                {
                                                    getMetricValueDateTimeFromResultSet = true;
                                                }
                                            }
                                        }

                                        foreach (var row in resultList)
                                        {
                                            var resultValue = new ResultValue();

                                            resultValue.Value = row[0].AsDecimal();
                                            if (getMetricValueDateTimeFromResultSet)
                                            {
                                                resultValue.MetricValueDateTime = row[1].AsDateTime() ?? scheduleDateTime;
                                            }
                                            else
                                            {
                                                resultValue.MetricValueDateTime = scheduleDateTime;
                                            }

                                            resultValue.Partitions = new List <ResultValuePartition>();
                                            int partitionPosition    = 0;
                                            int partitionFieldIndex  = getMetricValueDateTimeFromResultSet ? 2 : 1;
                                            int partitionColumnCount = row.Length - 1;
                                            while (partitionFieldIndex <= partitionColumnCount)
                                            {
                                                resultValue.Partitions.Add(new ResultValuePartition
                                                {
                                                    PartitionPosition = partitionPosition,
                                                    EntityId          = row[partitionFieldIndex].AsIntegerOrNull()
                                                });

                                                partitionPosition++;
                                                partitionFieldIndex++;
                                            }

                                            resultValues.Add(resultValue);
                                        }
                                    }
                                }

                                metric.LastRunDateTime = scheduleDateTime;
                                metricsCalculated++;
                                metricValuesCalculated += resultValues.Count();

                                if (resultValues.Any())
                                {
                                    List <MetricValue> metricValuesToAdd = new List <MetricValue>();
                                    foreach (var resultValue in resultValues)
                                    {
                                        var metricValue = new MetricValue();
                                        metricValue.MetricId            = metric.Id;
                                        metricValue.MetricValueDateTime = resultValue.MetricValueDateTime;
                                        metricValue.MetricValueType     = MetricValueType.Measure;
                                        metricValue.YValue                = resultValue.Value;
                                        metricValue.CreatedDateTime       = RockDateTime.Now;
                                        metricValue.ModifiedDateTime      = RockDateTime.Now;
                                        metricValue.MetricValuePartitions = new List <MetricValuePartition>();
                                        var metricPartitionsByPosition = metricPartitions.OrderBy(a => a.Order).ToList();

                                        if (!resultValue.Partitions.Any() && metricPartitionsByPosition.Count() == 1 && !metricPartitionsByPosition[0].EntityTypeId.HasValue)
                                        {
                                            // a metric with just the default partition (not partitioned by Entity)
                                            var metricPartition      = metricPartitionsByPosition[0];
                                            var metricValuePartition = new MetricValuePartition();
                                            metricValuePartition.MetricPartition   = metricPartition;
                                            metricValuePartition.MetricPartitionId = metricPartition.Id;
                                            metricValuePartition.MetricValue       = metricValue;
                                            metricValuePartition.EntityId          = null;
                                            metricValue.MetricValuePartitions.Add(metricValuePartition);
                                        }
                                        else
                                        {
                                            foreach (var partitionResult in resultValue.Partitions)
                                            {
                                                if (metricPartitionsByPosition.Count > partitionResult.PartitionPosition)
                                                {
                                                    var metricPartition      = metricPartitionsByPosition[partitionResult.PartitionPosition];
                                                    var metricValuePartition = new MetricValuePartition();
                                                    metricValuePartition.MetricPartition   = metricPartition;
                                                    metricValuePartition.MetricPartitionId = metricPartition.Id;
                                                    metricValuePartition.MetricValue       = metricValue;
                                                    metricValuePartition.EntityId          = partitionResult.EntityId;
                                                    metricValue.MetricValuePartitions.Add(metricValuePartition);
                                                }
                                            }
                                        }

                                        if (metricValue.MetricValuePartitions == null || !metricValue.MetricValuePartitions.Any())
                                        {
                                            // shouldn't happen, but just in case
                                            throw new Exception("MetricValue requires at least one Partition Value");
                                        }
                                        else
                                        {
                                            metricValuesToAdd.Add(metricValue);
                                        }
                                    }

                                    // if a single metricValueDateTime was specified, delete any existing metric values for this date and refresh with the current results
                                    var dbTransaction = rockContextForMetricValues.Database.BeginTransaction();
                                    if (getMetricValueDateTimeFromResultSet)
                                    {
                                        var metricValueDateTimes = metricValuesToAdd.Select(a => a.MetricValueDateTime).Distinct().ToList();
                                        foreach (var metricValueDateTime in metricValueDateTimes)
                                        {
                                            bool alreadyHasMetricValues = metricValueService.Queryable().Where(a => a.MetricId == metric.Id && a.MetricValueDateTime == metricValueDateTime).Any();
                                            if (alreadyHasMetricValues)
                                            {
                                                // use direct SQL to clean up any existing metric values
                                                rockContextForMetricValues.Database.ExecuteSqlCommand(@"
                                                    DELETE
                                                    FROM MetricValuePartition
                                                    WHERE MetricValueId IN (
                                                        SELECT Id
                                                        FROM MetricValue
                                                        WHERE MetricId = @metricId
                                                        AND MetricValueDateTime = @metricValueDateTime
                                                    )
                                                ", new SqlParameter("@metricId", metric.Id), new SqlParameter("@metricValueDateTime", metricValueDateTime));

                                                rockContextForMetricValues.Database.ExecuteSqlCommand(@"
                                                    DELETE
                                                    FROM MetricValue
                                                    WHERE MetricId = @metricId
                                                    AND MetricValueDateTime = @metricValueDateTime
                                                ", new SqlParameter("@metricId", metric.Id), new SqlParameter("@metricValueDateTime", metricValueDateTime));
                                            }
                                        }
                                    }

                                    metricValueService.AddRange(metricValuesToAdd);

                                    // disable savechanges PrePostProcessing since there could be hundreds or thousands of metric values getting inserted/updated
                                    rockContextForMetricValues.SaveChanges(true);
                                    dbTransaction.Commit();
                                }

                                rockContextForMetricEntity.SaveChanges();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    metricExceptions.Add(new Exception($"Exception when calculating metric for {metric}: {ex.Message}", ex));
                }
            }

            context.Result = string.Format("Calculated a total of {0} metric values for {1} metrics", metricValuesCalculated, metricsCalculated);

            if (metricExceptions.Any())
            {
                throw new AggregateException("One or more metric calculations failed ", metricExceptions);
            }
        }
Exemple #27
0
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            MetricValue        metricValue;
            var                rockContext        = new RockContext();
            MetricValueService metricValueService = new MetricValueService(rockContext);

            int metricValueId = int.Parse(hfMetricValueId.Value);

            if (metricValueId == 0)
            {
                metricValue = new MetricValue();
                metricValueService.Add(metricValue);
                metricValue.MetricId = hfMetricId.ValueAsInt();
                metricValue.Metric   = metricValue.Metric ?? new MetricService(rockContext).Get(metricValue.MetricId);
                metricValue.MetricValuePartitions = new List <MetricValuePartition>();
            }
            else
            {
                metricValue = metricValueService.Get(metricValueId);
            }

            metricValue.MetricValueType     = ddlMetricValueType.SelectedValueAsEnum <MetricValueType>();
            metricValue.XValue              = tbXValue.Text;
            metricValue.YValue              = tbYValue.Text.AsDecimalOrNull();
            metricValue.Note                = tbNote.Text;
            metricValue.MetricValueDateTime = dpMetricValueDateTime.SelectedDate;

            // Get EntityId from EntityType UI controls
            foreach (var metricPartition in metricValue.Metric.MetricPartitions)
            {
                var     metricPartitionEntityType = EntityTypeCache.Get(metricPartition.EntityTypeId ?? 0);
                var     controlId             = string.Format("metricPartition{0}_entityTypeEditControl", metricPartition.Id);
                Control entityTypeEditControl = phMetricValuePartitions.FindControl(controlId);
                var     metricValuePartition  = metricValue.MetricValuePartitions.FirstOrDefault(a => a.MetricPartitionId == metricPartition.Id);
                if (metricValuePartition == null)
                {
                    metricValuePartition = new MetricValuePartition();
                    metricValuePartition.MetricPartitionId = metricPartition.Id;
                    metricValue.MetricValuePartitions.Add(metricValuePartition);
                }

                if (metricPartitionEntityType != null && metricPartitionEntityType.SingleValueFieldType != null && metricPartitionEntityType.SingleValueFieldType.Field is IEntityFieldType)
                {
                    metricValuePartition.EntityId = (metricPartitionEntityType.SingleValueFieldType.Field as IEntityFieldType).GetEditValueAsEntityId(entityTypeEditControl, new Dictionary <string, ConfigurationValue>());
                }
                else
                {
                    metricValuePartition.EntityId = null;
                }

                if (metricPartition.IsRequired && metricPartitionEntityType != null && !metricValuePartition.EntityId.HasValue)
                {
                    nbValueRequired.Text        = string.Format("A value for {0} is required", metricPartition.Label ?? metricPartitionEntityType.FriendlyName);
                    nbValueRequired.Dismissable = true;
                    nbValueRequired.Visible     = true;
                    return;
                }
            }


            if (!metricValue.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            rockContext.SaveChanges();

            var qryParams = new Dictionary <string, string>();

            qryParams.Add("MetricId", hfMetricId.Value);
            qryParams.Add("MetricCategoryId", hfMetricCategoryId.Value);
            qryParams.Add("ExpandedIds", PageParameter("ExpandedIds"));
            NavigateToParentPage(qryParams);
        }
Exemple #28
0
        /// <summary>
        /// Binds the metrics.
        /// </summary>
        private void BindMetrics()
        {
            var metricCategoryList = new List <MetricCategory>();

            int campusEntityTypeId   = EntityTypeCache.Read(typeof(Rock.Model.Campus)).Id;
            int scheduleEntityTypeId = EntityTypeCache.Read(typeof(Rock.Model.Schedule)).Id;

            int?campusId = bddlCampus.SelectedValueAsInt();
            //int? scheduleId = bddlService.SelectedValueAsInt();
            DateTime?weekend = bddlWeekend.SelectedValue.AsDateTime();

            // If we changed the campus, make sure we reload the services
            if (campusId != _selectedCampusId)
            {
                _selectedCampusId = GetBlockUserPreference("CampusId").AsIntegerOrNull();
                SaveViewState();
                //bddlService.Items.Clear();
                // Load service times
                foreach (var service in GetServices(CampusCache.Read(campusId.Value)))
                {
                    //    bddlService.Items.Add( new ListItem( service.Name, service.Id.ToString() ) );
                }
                //bddlService.SetValue( _selectedServiceId.Value );
            }

            var notes = new List <string>();

            if (campusId.HasValue && weekend.HasValue)
            {
                SetBlockUserPreference("CampusId", campusId.HasValue ? campusId.Value.ToString() : "");

                var metricCategories = MetricCategoriesFieldAttribute.GetValueAsGuidPairs(GetAttributeValue("MetricCategories"));
                var metricGuids      = metricCategories.Select(a => a.MetricGuid).ToList();
                using (var rockContext = new RockContext())
                {
                    var metricValueService = new MetricValueService(rockContext);
                    var metrics            = new MetricService(rockContext)
                                             .GetByGuids(metricGuids)
                                             .Where(m =>
                                                    m.MetricPartitions.Count == 1 &&
                                                    m.MetricPartitions.Any(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId))
                                             .OrderBy(m => m.Title)
                                             .Select(m => new
                    {
                        m.Id,
                        m.Title,
                        CampusPartitionId   = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                        SchedulePartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                        CategoryName        = m.MetricCategories.Select(c => c.Category.Name).FirstOrDefault()
                    });
                    foreach (var metric in metrics.OrderBy(m => m.CategoryName).ThenBy(m => m.Title))
                    {
                        MetricCategory category = null;
                        if (metricCategoryList.Any(mct => mct.CategoryName == metric.CategoryName))
                        {
                            category = metricCategoryList.Where(mct => mct.CategoryName == metric.CategoryName).FirstOrDefault();
                        }
                        else
                        {
                            category = new MetricCategory()
                            {
                                CategoryName = metric.CategoryName, Metrics = new List <Metric>()
                            };
                            metricCategoryList.Add(category);
                        }

                        var metricObj = new Metric(metric.Id, metric.Title);
                        if (campusId.HasValue && weekend.HasValue)
                        {
                            var metricValue = metricValueService
                                              .Queryable().AsNoTracking()
                                              .Where(v =>
                                                     v.MetricId == metric.Id &&
                                                     v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                     v.MetricValuePartitions.Count == 1 &&
                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.CampusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value))
                                              .FirstOrDefault();

                            if (metricValue != null)
                            {
                                metricObj.Value = metricValue.YValue;

                                if (!string.IsNullOrWhiteSpace(metricValue.Note) &&
                                    !notes.Contains(metricValue.Note))
                                {
                                    notes.Add(metricValue.Note);
                                }
                            }
                        }

                        category.Metrics.Add(metricObj);
                    }
                }
            }
            rptrMetricCategory.DataSource = metricCategoryList;
            rptrMetricCategory.DataBind();

            if (campusId.HasValue)
            {
                rptrService.DataSource = GetServices(CampusCache.Read(campusId.Value));
                rptrService.DataBind();
                rptrService.Visible = rptrService.Items.Count > 0;
            }


            tbNote.Text = notes.AsDelimited(Environment.NewLine + Environment.NewLine);
        }
Exemple #29
0
        /// <summary>
        /// Handles the ItemDataBound event of the rptrService control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RepeaterItemEventArgs"/> instance containing the event data.</param>
        protected void rptrService_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Schedule schedule = e.Item.DataItem as Schedule;

                int campusEntityTypeId   = EntityTypeCache.Read(typeof(Rock.Model.Campus)).Id;
                int scheduleEntityTypeId = EntityTypeCache.Read(typeof(Rock.Model.Schedule)).Id;

                int?     campusId   = bddlCampus.SelectedValueAsInt();
                int?     scheduleId = schedule.Id;
                DateTime?weekend    = bddlWeekend.SelectedValue.AsDateTime();

                var notes = new List <string>();

                var serviceMetricValues = new List <Metric>();
                var rptrServiceMetric   = e.Item.FindControl("pnlwService").FindControl("rptrServiceMetric") as Repeater;

                var metricCategories = MetricCategoriesFieldAttribute.GetValueAsGuidPairs(GetAttributeValue("MetricCategories"));
                var metricGuids      = metricCategories.Select(a => a.MetricGuid).ToList();
                using (var rockContext = new RockContext())
                {
                    var metricValueService = new MetricValueService(rockContext);
                    foreach (var metric in new MetricService(rockContext)
                             .GetByGuids(metricGuids)
                             .Where(m =>
                                    m.MetricPartitions.Count == 2 &&
                                    m.MetricPartitions.Any(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId) &&
                                    m.MetricPartitions.Any(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId))
                             .OrderBy(m => m.Title)
                             .Select(m => new
                    {
                        m.Id,
                        m.Title,
                        CampusPartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                        SchedulePartitionId = m.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == scheduleEntityTypeId).Select(p => p.Id).FirstOrDefault(),
                    }))
                    {
                        var serviceMetric = new Metric(metric.Id, metric.Title);

                        if (campusId.HasValue && weekend.HasValue && scheduleId.HasValue)
                        {
                            var metricValue = metricValueService
                                              .Queryable().AsNoTracking()
                                              .Where(v =>
                                                     v.MetricId == metric.Id &&
                                                     v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == weekend.Value &&
                                                     v.MetricValuePartitions.Count == 2 &&
                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.CampusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == metric.SchedulePartitionId && p.EntityId.HasValue && p.EntityId.Value == scheduleId.Value))
                                              .FirstOrDefault();

                            if (metricValue != null)
                            {
                                serviceMetric.Value = metricValue.YValue;

                                if (!string.IsNullOrWhiteSpace(metricValue.Note) &&
                                    !notes.Contains(metricValue.Note))
                                {
                                    notes.Add(metricValue.Note);
                                }
                            }
                        }

                        serviceMetricValues.Add(serviceMetric);
                    }
                }

                rptrServiceMetric.DataSource = serviceMetricValues;
                rptrServiceMetric.DataBind();
            }
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            int groupEntityTypeId  = EntityTypeCache.Get(typeof(Rock.Model.Group)).Id;
            int campusEntityTypeId = EntityTypeCache.Get(typeof(Rock.Model.Campus)).Id;

            int?     groupId = gpSelectGroup.SelectedValueAsInt();
            DateTime?dateVal = dpMetricValueDateTime.SelectedDate;

            if (groupId.HasValue && dateVal.HasValue)
            {
                using (var rockContext = new RockContext())
                {
                    var metricService      = new MetricService(rockContext);
                    var metricValueService = new MetricValueService(rockContext);

                    var group    = new GroupService(rockContext).Queryable().FirstOrDefault(g => g.Id == groupId);
                    int?campusId = group.CampusId;

                    foreach (RepeaterItem item in rptrMetric.Items)
                    {
                        var hfMetricIId   = item.FindControl("hfMetricId") as HiddenField;
                        var nbMetricValue = item.FindControl("nbMetricValue") as NumberBox;

                        if (hfMetricIId != null && nbMetricValue != null)
                        {
                            int metricId = hfMetricIId.ValueAsInt();
                            var metric   = new MetricService(rockContext).Get(metricId);

                            if (metric != null)
                            {
                                int groupPartitionId  = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == groupEntityTypeId).Select(p => p.Id).FirstOrDefault();
                                int campusPartitionId = metric.MetricPartitions.Where(p => p.EntityTypeId.HasValue && p.EntityTypeId.Value == campusEntityTypeId).Select(p => p.Id).FirstOrDefault();

                                var metricValue = metricValueService
                                                  .Queryable()
                                                  .Where(v =>
                                                         v.MetricId == metric.Id &&
                                                         v.MetricValueDateTime.HasValue && v.MetricValueDateTime.Value == dateVal.Value &&
                                                         (
                                                             (
                                                                 v.MetricValuePartitions.Count == 2 &&
                                                                 v.MetricValuePartitions.Any(p => p.MetricPartitionId == campusPartitionId && p.EntityId.HasValue && p.EntityId.Value == campusId.Value) &&
                                                                 v.MetricValuePartitions.Any(p => p.MetricPartitionId == groupPartitionId && p.EntityId.HasValue && p.EntityId.Value == groupId.Value)
                                                             ) ||
                                                             (
                                                                 v.MetricValuePartitions.Count == 1 &&
                                                                 (
                                                                     v.MetricValuePartitions.Any(p => p.MetricPartitionId == groupPartitionId && p.EntityId.HasValue && p.EntityId.Value == groupId.Value)
                                                                 )
                                                             )
                                                         )
                                                         )
                                                  .FirstOrDefault();

                                if (metricValue == null)
                                {
                                    metricValue = new MetricValue();
                                    metricValue.MetricValueType     = MetricValueType.Measure;
                                    metricValue.MetricId            = metric.Id;
                                    metricValue.MetricValueDateTime = dateVal.Value;
                                    metricValueService.Add(metricValue);

                                    if (groupPartitionId > 0)
                                    {
                                        var groupValuePartition = new MetricValuePartition();
                                        groupValuePartition.MetricPartitionId = groupPartitionId;
                                        groupValuePartition.EntityId          = groupId.Value;
                                        metricValue.MetricValuePartitions.Add(groupValuePartition);
                                    }
                                    if (campusPartitionId > 0 && campusId.HasValue)
                                    {
                                        var campusValuePartition = new MetricValuePartition();
                                        campusValuePartition.MetricPartitionId = campusPartitionId;
                                        campusValuePartition.EntityId          = campusId.Value;
                                        metricValue.MetricValuePartitions.Add(campusValuePartition);
                                    }
                                }

                                metricValue.YValue = nbMetricValue.Text.AsDecimalOrNull();
                                metricValue.Note   = tbNote.Text;
                            }
                        }
                    }

                    rockContext.SaveChanges();
                }

                nbMetricsSaved.Text    = string.Format("The metrics for '{0}' on {1} have been saved.", gpSelectGroup.ItemName, dpMetricValueDateTime.SelectedDate.ToString());
                nbMetricsSaved.Visible = true;

                BindMetrics();
            }
        }