/// <summary> Updates break efficiency on both Break & Schedule
        /// documents </summary> <param name="salesArea"></param> <param
        /// name="breakEfficiencyImport"></param> <param name="schedules"></param>
        private bool UpdateBreakEfficiency(SalesArea salesArea, BreakEfficiencyImport breakEfficiencyImport, List <ScheduleIndexed <Break, int> > schedules, Dictionary <int, Demographic> demographicsById)
        {
            bool success       = false;
            var  startDateTime = GetStartDateTime(breakEfficiencyImport);

            // Set break efficiency on Schedule document
            var schedule = schedules.Where(s => s.SalesArea == salesArea.Name && s.Date == startDateTime.Date)
                           .OrderByDescending(s => (s.BreaksByKey.Count))
                           .FirstOrDefault();

            if (schedule != null)    // Schedule document found
            {
                var breakForSchedule = schedule.GetBreak(breakEfficiencyImport.break_no);
                if (breakForSchedule != null)   // Break found
                {
                    success = true;
                    var demographic = demographicsById.ContainsKey(breakEfficiencyImport.demo_no) ? demographicsById[breakEfficiencyImport.demo_no] : null;

                    if (breakForSchedule.BreakEfficiencyList == null)
                    {
                        breakForSchedule.BreakEfficiencyList = new List <BreakEfficiency>();
                    }

                    // TODO: Re-enable this when Break.Efficiency has been added
                    breakForSchedule.BreakEfficiencyList.Add(new BreakEfficiency(demographic.ExternalRef, breakEfficiencyImport.eff));
                }
            }
            return(success);
        }
        /// <summary>
        /// Load breaks for break efficiency import record if not already in memory
        /// </summary>
        /// <param name="salesArea"></param>
        /// <param name="breakEfficiencyImport"></param>
        /// <param name="schedules"></param>
        private void LoadBreaks(SalesArea salesArea, BreakEfficiencyImport breakEfficiencyImport, List <ScheduleIndexed <Break, int> > schedules, IScheduleRepository scheduleRepository)
        {
            DateTime startDateTime = GetStartDateTime(breakEfficiencyImport);

            // Load Schedule document if necessary
            var schedule = schedules.Where(s => s.SalesArea == salesArea.Name && s.Date.Date == startDateTime.Date).FirstOrDefault();

            if (schedule == null)       // Not in memory, load it
            {
                var scheduleObject = scheduleRepository.GetSchedule(salesArea.Name, startDateTime.Date);
                if (scheduleObject != null)
                {
                    if (scheduleObject.Breaks != null && scheduleObject.Breaks.Count > 0)  // Schedule has breaks
                    {
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("Break Efficiency processing. Schedule loaded for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                        scheduleObject.Breaks.ForEach(@break => @break.BreakEfficiencyList = null);
                    }
                    else    // No breaks
                    {
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, string.Format("Break Efficiency processing. Schedule document has no breaks for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                    }
                    schedules.Add(new ScheduleIndexed <Break, int>(scheduleObject, delegate(Break currentBreak) { return(currentBreak); }, delegate(Break currentBreak) { return(currentBreak.CustomId); }));
                }
                else    // No Schedule document, log warning
                {
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, string.Format("Break Efficiency processing. Schedule document does not exist for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                }
            }
        }
        private DateTime GetStartDateTime(BreakEfficiencyImport breakEfficiencyImport)
        {
            // TODO: Make this shared...
            string nom_time = breakEfficiencyImport.brek_nom_time.ToString("000000");
            int    seconds  = (Convert.ToInt32(nom_time.Substring(0, 2)) * (60 * 60)) + // Hours
                              (Convert.ToInt32(nom_time.Substring(2, 2)) * 60) +        // Mins
                              (Convert.ToInt32(nom_time.Substring(4, 2)));              // Secs

            return(DateHelper.GetDateTime(string.Format("{0} {1}", breakEfficiencyImport.brek_sched_date.ToString("00000000"), "000000"), "yyyyMMdd HHmmss", DateTimeKind.Utc).AddSeconds(seconds));
        }