public static void CalculateAssessmentScore(this TreatmentBMPAssessment treatmentBMPAssessment)
        {
            if (!treatmentBMPAssessment.TreatmentBMP.IsBenchmarkAndThresholdsComplete())
            {
                return;
            }

            if (!treatmentBMPAssessment.IsAssessmentComplete)
            {
                return;
            }

            //if any observations that override the score have a failing score, return 0
            var observationTypesThatPotentiallyOverrideScore = treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType.TreatmentBMPTypeAssessmentObservationTypes
                                                               .Where(x => x.OverrideAssessmentScoreIfFailing)
                                                               .ToList().Select(x => x.TreatmentBMPAssessmentObservationType);

            double?score;

            if (observationTypesThatPotentiallyOverrideScore.Any(x =>
            {
                var treatmentBMPObservation = treatmentBMPAssessment.TreatmentBMPObservations.SingleOrDefault(y => y.TreatmentBMPAssessmentObservationType == x);
                return(treatmentBMPObservation?.OverrideScoreForFailingObservation(x) ?? false);
            }))
            {
                score = 0;
            }
            //if all observations override the score and all are passing, return 5
            else if (treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType.TreatmentBMPTypeAssessmentObservationTypes
                     .All(x => x.OverrideAssessmentScoreIfFailing))
            {
                score = 5;
            }
            else
            {
                //otherwise calculate the score
                score = treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType.TreatmentBMPTypeAssessmentObservationTypes
                        .Where(x => !x.OverrideAssessmentScoreIfFailing)
                        .Select(x => x.TreatmentBMPAssessmentObservationType).ToList().Sum(x =>
                {
                    var observationScore = treatmentBMPAssessment.TreatmentBMPObservations
                                           .SingleOrDefault(y =>
                                                            y.TreatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeID ==
                                                            x.TreatmentBMPAssessmentObservationTypeID).CalculateObservationScore();

                    var treatmentBMPAssessmentObservationType = treatmentBMPAssessment.TreatmentBMPObservations
                                                                .SingleOrDefault(y =>
                                                                                 y.TreatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeID ==
                                                                                 x.TreatmentBMPAssessmentObservationTypeID).TreatmentBMPAssessmentObservationType;
                    var observationWeight = Convert.ToDouble(treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType
                                                             .GetTreatmentBMPTypeObservationType(treatmentBMPAssessmentObservationType)
                                                             .AssessmentScoreWeight
                                                             .Value);
                    return(observationScore * observationWeight);
                });
            }

            treatmentBMPAssessment.AssessmentScore = score;
        }
        public static string GetEditUrl(this TreatmentBMPAssessment treatmentBMPAssessment)
        {
            if (treatmentBMPAssessment.TreatmentBMPAssessmentType == TreatmentBMPAssessmentType.Initial)
            {
                return(EditInitialAssessmentUrlTemplate.ParameterReplace(treatmentBMPAssessment.FieldVisit.FieldVisitID));
            }

            return(EditPostMaintenanceAssessmentUrlTemplate.ParameterReplace(treatmentBMPAssessment.FieldVisit.FieldVisitID));
        }
 /// <summary>
 /// Constructor for building a new object with MinimalConstructor required fields, using objects whenever possible
 /// </summary>
 public TreatmentBMPAssessmentPhoto(FileResource fileResource, TreatmentBMPAssessment treatmentBMPAssessment) : this()
 {
     // Mark this as a new object by setting primary key with special value
     this.TreatmentBMPAssessmentPhotoID = ModelObjectHelpers.MakeNextUnsavedPrimaryKeyValue();
     this.FileResourceID = fileResource.FileResourceID;
     this.FileResource   = fileResource;
     fileResource.TreatmentBMPAssessmentPhotos.Add(this);
     this.TreatmentBMPAssessmentID = treatmentBMPAssessment.TreatmentBMPAssessmentID;
     this.TreatmentBMPAssessment   = treatmentBMPAssessment;
     treatmentBMPAssessment.TreatmentBMPAssessmentPhotos.Add(this);
 }
 /// <summary>
 /// Constructor for building a new object with MinimalConstructor required fields, using objects whenever possible
 /// </summary>
 public TreatmentBMPObservation(TreatmentBMPAssessment treatmentBMPAssessment, TreatmentBMPTypeAssessmentObservationType treatmentBMPTypeAssessmentObservationType, TreatmentBMPType treatmentBMPType, TreatmentBMPAssessmentObservationType treatmentBMPAssessmentObservationType, string observationData) : this()
 {
     // Mark this as a new object by setting primary key with special value
     this.TreatmentBMPObservationID = ModelObjectHelpers.MakeNextUnsavedPrimaryKeyValue();
     this.TreatmentBMPAssessmentID  = treatmentBMPAssessment.TreatmentBMPAssessmentID;
     this.TreatmentBMPAssessment    = treatmentBMPAssessment;
     treatmentBMPAssessment.TreatmentBMPObservations.Add(this);
     this.TreatmentBMPTypeAssessmentObservationTypeID = treatmentBMPTypeAssessmentObservationType.TreatmentBMPTypeAssessmentObservationTypeID;
     this.TreatmentBMPTypeAssessmentObservationType   = treatmentBMPTypeAssessmentObservationType;
     treatmentBMPTypeAssessmentObservationType.TreatmentBMPObservations.Add(this);
     this.TreatmentBMPTypeID = treatmentBMPType.TreatmentBMPTypeID;
     this.TreatmentBMPType   = treatmentBMPType;
     treatmentBMPType.TreatmentBMPObservations.Add(this);
     this.TreatmentBMPAssessmentObservationTypeID = treatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeID;
     this.TreatmentBMPAssessmentObservationType   = treatmentBMPAssessmentObservationType;
     treatmentBMPAssessmentObservationType.TreatmentBMPObservations.Add(this);
     this.ObservationData = observationData;
 }
        public TreatmentBMPAssessmentObservationTypeSimple(TreatmentBMPAssessmentObservationType treatmentBMPAssessmentObservationType,
                                                           TreatmentBMPAssessment treatmentBMPAssessment, bool overrideAssessmentScoreIfFailing)
        {
            TreatmentBMPAssessmentObservationTypeID = treatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeID;
            HasBenchmarkAndThresholds = treatmentBMPAssessmentObservationType.GetHasBenchmarkAndThreshold();

            var unitDisplayName = treatmentBMPAssessmentObservationType.GetMeasurementUnitType() != null ? $" ({treatmentBMPAssessmentObservationType.GetMeasurementUnitType().LegendDisplayName})" : string.Empty;

            DisplayName = $"{treatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeName}{unitDisplayName}";

            var benchmarkValue        = treatmentBMPAssessmentObservationType.GetBenchmarkValue(treatmentBMPAssessment.TreatmentBMP);
            var thresholdValue        = treatmentBMPAssessmentObservationType.GetThresholdValue(treatmentBMPAssessment.TreatmentBMP);
            var assessmentScoreWeight = treatmentBMPAssessmentObservationType.TreatmentBMPTypeAssessmentObservationTypes.SingleOrDefault(x => x.TreatmentBMPTypeID == treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType.TreatmentBMPTypeID)?.AssessmentScoreWeight;

            var treatmentBMPObservation = treatmentBMPAssessment.TreatmentBMPObservations.SingleOrDefault(y => y.TreatmentBMPAssessmentObservationTypeID == treatmentBMPAssessmentObservationType.TreatmentBMPAssessmentObservationTypeID);

            TreatmentBMPObservationSimple = treatmentBMPObservation != null ? new TreatmentBMPObservationSimple(treatmentBMPObservation, overrideAssessmentScoreIfFailing) : null;

            var useUpperValue = treatmentBMPAssessmentObservationType.UseUpperValueForThreshold(benchmarkValue, TreatmentBMPObservationSimple?.ObservationValue);

            ThresholdValueInObservedUnits = treatmentBMPAssessmentObservationType.GetThresholdValueInBenchmarkUnits(benchmarkValue, thresholdValue, useUpperValue) ?? 0;
            BenchmarkValue = benchmarkValue ?? 0;
            Weight         = assessmentScoreWeight?.ToStringShortPercent() ?? "pass/fail";
        }
 /// <summary>
 /// Creates a "blank" object of this type and populates primitives with defaults
 /// </summary>
 public static TreatmentBMPObservation CreateNewBlank(TreatmentBMPAssessment treatmentBMPAssessment, TreatmentBMPTypeAssessmentObservationType treatmentBMPTypeAssessmentObservationType, TreatmentBMPType treatmentBMPType, TreatmentBMPAssessmentObservationType treatmentBMPAssessmentObservationType)
 {
     return(new TreatmentBMPObservation(treatmentBMPAssessment, treatmentBMPTypeAssessmentObservationType, treatmentBMPType, treatmentBMPAssessmentObservationType, default(string)));
 }
 public static string GetDeleteUrl(this TreatmentBMPAssessment treatmentBMPAssessment)
 {
     return(DeleteUrlTemplate.ParameterReplace(treatmentBMPAssessment.TreatmentBMPAssessmentID));
 }
 public static void CalculateIsAssessmentComplete(this TreatmentBMPAssessment treatmentBMPAssessment)
 {
     treatmentBMPAssessment.IsAssessmentComplete = treatmentBMPAssessment.TreatmentBMP.TreatmentBMPType.GetObservationTypes().All(treatmentBMPAssessment.IsObservationComplete);
 }
 /// <summary>
 /// Creates a "blank" object of this type and populates primitives with defaults
 /// </summary>
 public static TreatmentBMPAssessmentPhoto CreateNewBlank(FileResource fileResource, TreatmentBMPAssessment treatmentBMPAssessment)
 {
     return(new TreatmentBMPAssessmentPhoto(fileResource, treatmentBMPAssessment));
 }
 public static void DeleteTreatmentBMPAssessment(this IQueryable <TreatmentBMPAssessment> treatmentBMPAssessments, TreatmentBMPAssessment treatmentBMPAssessmentToDelete)
 {
     DeleteTreatmentBMPAssessment(treatmentBMPAssessments, new List <TreatmentBMPAssessment> {
         treatmentBMPAssessmentToDelete
     });
 }