public Model.Usage GetUsage(LogEntry logEntry)
        {
            var baseTimestamp = GetUsageTimestamp(logEntry.Timestamp);

            Usage usage       = null;
            bool  updateUsage = false;

            if (lastHourlyUsage.ContainsKey(logEntry.UserId) && lastHourlyUsage[logEntry.UserId].Timestamp == baseTimestamp)
            {
                usage = lastHourlyUsage[logEntry.UserId];
            }

            if (usage == null)
            {
                updateUsage = true;
                usage       = context.Usages.FirstOrDefault(x => x.UserId == logEntry.UserId && x.Timestamp == baseTimestamp);
            }

            if (usage == null)
            {
                usage = new Model.Usage()
                {
                    Timestamp = baseTimestamp, UserId = logEntry.UserId
                };

                var prevUsage = context.Usages.Where(x => x.UserId == logEntry.UserId && x.Timestamp < baseTimestamp).OrderByDescending(x => x.Timestamp).FirstOrDefault();
                if (prevUsage != null)
                {
                    usage.E1Start           = prevUsage.E1Current;
                    usage.E2Start           = prevUsage.E2Current;
                    usage.E1RetourStart     = prevUsage.E1RetourCurrent;
                    usage.E2RetourStart     = prevUsage.E2RetourCurrent;
                    usage.PvProductionStart = prevUsage.PvProductionCurrent;
                }
                else
                {
                    usage.E1Start           = logEntry.E1;
                    usage.E2Start           = logEntry.E2;
                    usage.E1RetourStart     = logEntry.E1Retour;
                    usage.E2RetourStart     = logEntry.E2Retour;
                    usage.PvProductionStart = 0;
                }

                context.Usages.Add(usage);
            }

            if (updateUsage)
            {
                lastHourlyUsage[logEntry.UserId] = usage;
            }

            return(usage);
        }
        private void PopulateUsage(Model.Usage usage, Model.LogEntry entry)
        {
            usage.E1Current       = entry.E1;
            usage.E2Current       = entry.E2;
            usage.E1RetourCurrent = entry.E1Retour;
            usage.E2RetourCurrent = entry.E2Retour;

            if (entry.PvCounter > 0 && entry.Timestamp.Hour >= 3)
            {
                var refDate            = entry.Timestamp.Date;
                var minDailyProduction = context.Usages.Where(x => x.Timestamp >= refDate).Min(x => x.PvProductionStart);
                usage.PvProductionCurrent = minDailyProduction + entry.PvCounter;
            }
            else
            {
                usage.PvProductionCurrent = usage.PvProductionStart;
            }
        }
        public Model.Usage GetUsage(LogEntry logEntry)
        {
            var baseTimestamp = GetUsageTimestamp(logEntry.Timestamp);

            Usage usage = null;
            bool updateUsage = false;

            if (lastHourlyUsage.ContainsKey(logEntry.UserId) && lastHourlyUsage[logEntry.UserId].Timestamp == baseTimestamp) {
                usage = lastHourlyUsage[logEntry.UserId];
            }

            if (usage == null) {
                updateUsage = true;
                usage = context.Usages.FirstOrDefault(x => x.UserId == logEntry.UserId  && x.Timestamp == baseTimestamp);
            }

            if (usage == null) {
                usage = new Model.Usage() { Timestamp = baseTimestamp, UserId = logEntry.UserId };

                var prevUsage = context.Usages.Where(x => x.UserId == logEntry.UserId && x.Timestamp < baseTimestamp).OrderByDescending(x => x.Timestamp).FirstOrDefault();
                if (prevUsage != null) {
                    usage.E1Start = prevUsage.E1Current;
                    usage.E2Start = prevUsage.E2Current;
                    usage.E1RetourStart = prevUsage.E1RetourCurrent;
                    usage.E2RetourStart = prevUsage.E2RetourCurrent;
                    usage.PvProductionStart = prevUsage.PvProductionCurrent;
                } else {
                    usage.E1Start = logEntry.E1;
                    usage.E2Start = logEntry.E2;
                    usage.E1RetourStart = logEntry.E1Retour;
                    usage.E2RetourStart = logEntry.E2Retour;
                    usage.PvProductionStart = 0;
                }

                context.Usages.Add(usage);
            }

            if (updateUsage) {
                lastHourlyUsage[logEntry.UserId] = usage;
            }

            return usage;
        }