private static StudentSupportEmail GenerateAlertEmail(Election election, float participationRatio)
        {
            int participation  = ElectionPhaseBase.ParticipationRatioToPercentage(participationRatio);
            int alarmThreshold = GetAlarmThreshold(election);

            StringBuilder emailBodyBuilder = new StringBuilder();

            emailBodyBuilder.Append($"Election name: {election.Name}\r\n");
            emailBodyBuilder.Append($"Election type: {election.Type}\r\n");
            emailBodyBuilder.Append($"Election phase: {election.State}\r\n");
            emailBodyBuilder.Append("\r\n");
            emailBodyBuilder.Append($"Current participation: {participation}\r\n");
            emailBodyBuilder.Append($"Alarm threshold: {alarmThreshold}\r\n");

            return(new StudentSupportEmail
            {
                Subject = "Election alert - low participation",
                Body = emailBodyBuilder.ToString()
            });
        }
        private ElectionStateChange GetStateChangeRecord()
        {
            ElectionPhaseBase phase = Entity.GetPhaseByState(PhaseState);

            return(IsStart ? phase.BeginsInfo : phase.EndInfo);
        }
        public override DateTime GetIntendedRunAt()
        {
            ElectionPhaseBase phase = Entity.GetPhaseByState(PhaseState);

            return(IsStart ? phase.BeginsAt : phase.EndsAt);
        }
        public override bool ShouldBeScheduled()
        {
            ElectionPhaseBase jobPhase = GetPhase();

            return(jobPhase.AlarmEnabled && Entity.State == jobPhase.AssociatedState);
        }