示例#1
0
        public List <SpreadRow> GetSpreadForLocation()
        {
            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);


            var holdingCosts = from lhc in DataContext.LifecycleHoldingCosts
                               where lhc.Month == 1 &&
                               lhc.Year == 2014
                               select lhc;

            var revenue = from rev in DataContext.RevenueByCommercialCarSegments
                          where rev.Month == 1 &&
                          rev.Year == 2014
                          group rev by new { rev.CarGroupId, rev.LocationId }
            into groupedData
                select new
            {
                groupedData.Key.CarGroupId,
                groupedData.Key.LocationId,
                Revenue = groupedData.Sum(d => d.GrossRevenue)
            };

            var groupedHistory = from fh in fleetHistory
                                 group fh by new { fh.CarGroupId, fh.LocationId }
            into groupedData
                select new { groupedData.Key.CarGroupId, groupedData.Key.LocationId, TotalFleet = groupedData.Sum(d => d.AvgTotal) };



            var spreadData = from gd in groupedHistory
                             join rev in revenue on
                             new { gd.CarGroupId, gd.LocationId }
            equals new { rev.CarGroupId, rev.LocationId }
            join lc in holdingCosts on
                gd.CarGroupId equals lc.CarGroupId
            join cg in DataContext.CAR_GROUPs on gd.CarGroupId equals cg.car_group_id
            join l in DataContext.LOCATIONs on gd.LocationId equals l.dim_Location_id
                select new SpreadRow
            {
                Pool          = l.CMS_LOCATION_GROUP.CMS_POOL.cms_pool1,
                LocationGroup = l.CMS_LOCATION_GROUP.cms_location_group1,
                Location      = l.location1,
                CarSegment    = cg.CAR_CLASS.CAR_SEGMENT.car_segment1,
                CarClass      = cg.CAR_CLASS.car_class1,
                CarGroup      = cg.car_group1,
                TotalFleet    = gd.TotalFleet,
                Revenue       = rev.Revenue,
                Cost          = lc.Cost
            };

            var returned = spreadData.ToList().OrderByDescending(d => d.Spread).ToList();

            return(returned);
        }
示例#2
0
        public IQueryable <NessesaryFleet> CalculateMinNessesaryFleet()
        {
            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);



            var groupedOnWeek = from fh in fleetHistory
                                join week in DataContext.IsoWeekOfYears on fh.Timestamp equals week.Day
                                group fh by new
            {
                fh.LocationId,
                fh.CarGroupId,
                week.WeekOfYear
            }
            into groupedData
                select new
            {
                groupedData.Key.CarGroupId,
                groupedData.Key.LocationId,
                OnRent = groupedData.Max(d => d.PeakOnRent),
                //DayOfWeek = groupedData.Key.DayOfWeek
            };

            var averagedForMonth = from gow in groupedOnWeek
                                   group gow by new
            {
                gow.LocationId,
                gow.CarGroupId,
            }
            into groupedData
                select new NessesaryFleet
            {
                LocationId    = groupedData.Key.LocationId,
                CarGroupId    = groupedData.Key.CarGroupId,
                AverageOnRent = groupedData.Average(d => d.OnRent)
            };

            return(averagedForMonth);
        }
示例#3
0
        public List <ForecastContributionRow> GetForecastContribution(int additionPlanA, int additionPlanB)
        {
            var maxDate = DataContext.RevenueByCommercialCarSegments.Max(d => d.MonthDate);
            var minDate = maxDate.AddMonths(-3);

            var monthlyAverageExpected = GetExpectedFLeet();

            var groupedAdditionAData = GetQuerysFromPlan(additionPlanA);


            var groupedAdditionBData = GetQuerysFromPlan(additionPlanB);


            var contributionData = ContributionQueryable.GetContribution(DataContext, minDate);

            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);

            var sumFleet = from fh in fleetHistory
                           group fh by
                           new { fh.CarGroupId, fh.LocationId, fh.Timestamp }
            into gd
                select new
            {
                gd.Key.CarGroupId,
                gd.Key.LocationId,
                TotalFleet = gd.Sum(d => d.MaxTotal)
            };

            var totalFleet = from fh in sumFleet
                             group fh by
                             new { fh.CarGroupId, fh.LocationId }
            into gd
                select new
            {
                gd.Key.CarGroupId,
                gd.Key.LocationId,
                TotalFleet = gd.Average(d => d.TotalFleet)
            };



            var forecastData = from wae in monthlyAverageExpected
                               join tf in totalFleet on new { wae.CarGroupId, wae.LocationId }
            equals new { tf.CarGroupId, tf.LocationId }
            join cntr in contributionData on new { wae.CarGroupId, wae.LocationId }
            equals new { cntr.CarGroupId, cntr.LocationId }
            into jContri
            from joinedContri in jContri.DefaultIfEmpty()
            join cg in DataContext.CAR_GROUPs on wae.CarGroupId equals cg.car_group_id
            join loc in DataContext.LOCATIONs on wae.LocationId equals loc.dim_Location_id
            orderby wae.Year, wae.Month
                select new ForecastContributionRow
            {
                Year     = wae.Year,
                Month    = wae.Month,
                CarGroup = cg.car_group1,
                Location = loc.location1,
                CpU      = (((joinedContri == null ? 0 : joinedContri.Revenue) / tf.TotalFleet)
                            - (joinedContri == null ? 0 : joinedContri.HoldingCost)),
                Expected             = (double)wae.Expected,
                CumulativeAdditionsA = groupedAdditionAData.Where(d => (d.Year < wae.Year ||
                                                                        (d.Year == wae.Year && d.Month <= wae.Month)) &&
                                                                  d.CarGroupId == wae.CarGroupId &&
                                                                  d.LocationId == wae.LocationId
                                                                  ).Sum(d => (int?)d.Additions) ?? 0,
                CumulativeAdditionsB = groupedAdditionBData.Where(d => (d.Year < wae.Year ||
                                                                        (d.Year == wae.Year && d.Month <= wae.Month)) &&
                                                                  d.CarGroupId == wae.CarGroupId &&
                                                                  d.LocationId == wae.LocationId
                                                                  ).Sum(d => (int?)d.Additions) ?? 0
            };

            var returned = forecastData.ToList();

            return(returned);
        }
示例#4
0
        public IQueryable <DemandGapVisualization> GetDemandGapStepOneViz()
        {
            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);

            var additions = from ad in DataContext.ResAdditions
                            join isoWeek in DataContext.IsoWeekOfYears on ad.RepDate.Date equals isoWeek.Day.Date
                            group new { ad, isoWeek } by new { ad.CarGrpId, ad.LocId, isoWeek.WeekOfYear }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Additions  = groupedData.Sum(d => d.ad.Value)
            };

            var deletions = from del in DataContext.ResDeletions
                            join isoWeek in DataContext.IsoWeekOfYears on del.RepDate.Date equals isoWeek.Day.Date
                            group del by new { del.CarGrpId, del.LocId, isoWeek.WeekOfYear }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Deletions  = groupedData.Sum(d => d.Value)
            };

            var demandGapData = from fh in fleetHistory
                                join minFs in DataContext.MinNessesaryFleets on
                                new { fh.CarGroupId, fh.LocationId } equals new { minFs.CarGroupId, minFs.LocationId }
            join maxFs in DataContext.MaxFleetSizes on
            new { fh.CarGroupId, fh.LocationId } equals new { maxFs.CarGroupId, maxFs.LocationId }
            join adds in additions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber }
            equals new { adds.CarGroupId, adds.LocationId, adds.WeekNumber }
            into joinedAdds
            from joinedAdditions in joinedAdds.DefaultIfEmpty()
            join dels in deletions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber }
            equals new { dels.CarGroupId, dels.LocationId, dels.WeekNumber }
            into joinedDels
            from joinedDeletions in joinedDels.DefaultIfEmpty()

            group new { fh, minFs, maxFs, joinedAdditions, joinedDeletions } by
            new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber, maxFs.PeakDay.Year }
            into groupedData
            join cg in DataContext.CAR_GROUPs on groupedData.Key.CarGroupId equals cg.car_group_id
            join loc in DataContext.LOCATIONs on groupedData.Key.LocationId equals loc.dim_Location_id
            orderby groupedData.Key.Year, groupedData.Key.WeekNumber, loc.location1, cg.car_group1

                select new DemandGapVisualization
            {
                CarGroupId       = groupedData.Key.CarGroupId,
                CarGroupName     = cg.car_group1,
                LocationId       = groupedData.Key.LocationId,
                LocationName     = loc.location1,
                WeekNumber       = groupedData.Key.WeekNumber,
                OperationalFleet = groupedData.Sum(d => d.fh.PeakOperationalFleet),
                MinFleetRequired = groupedData.Sum(d => d.minFs.MinFleet),
                MaxFleet         = groupedData.Sum(d => d.maxFs.MaxFleet),
                Additions        = groupedData.Sum(d => d.joinedAdditions == null ? 0 : d.joinedAdditions.Additions),
                Deletions        = groupedData.Sum(d => d.joinedDeletions == null ? 0 : d.joinedDeletions.Deletions),
                ExpectedFleet    = groupedData.Sum(d => d.fh.PeakOperationalFleet)
                                   - groupedData.Sum(d => d.joinedDeletions == null ? 0 : d.joinedDeletions.Deletions)
                                   + groupedData.Sum(d => d.joinedAdditions == null ? 0 : d.joinedAdditions.Additions)
            };
            var returned = demandGapData;

            //var xx = returned.Where(d => d.Additions != 0.0).Take(10).ToList();
            return(returned);
        }
示例#5
0
        public IQueryable <DemandGapOneRow> GetDemandGapStepOne()
        {
            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);

            var additions = from ad in DataContext.ResAdditions
                            join isoWeek in DataContext.IsoWeekOfYears on ad.RepDate.Date equals isoWeek.Day.Date
                            group new { ad, isoWeek }  by new { ad.CarGrpId, ad.LocId, isoWeek.WeekOfYear, isoWeek.Day.Year }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Year       = groupedData.Key.Year,
                Additions  = groupedData.Sum(d => d.ad.Value)
            };

            var deletions = from del in DataContext.ResDeletions
                            join isoWeek in DataContext.IsoWeekOfYears on del.RepDate.Date equals isoWeek.Day.Date
                            group del by new { del.CarGrpId, del.LocId, isoWeek.WeekOfYear, isoWeek.Day.Year }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Year       = groupedData.Key.Year,
                Deletions  = groupedData.Sum(d => d.Value)
            };

            var demandGapData = from fh in fleetHistory
                                join minFs in DataContext.MinNessesaryFleets on
                                new { fh.CarGroupId, fh.LocationId } equals new { minFs.CarGroupId, minFs.LocationId }
            join maxFs in DataContext.MaxFleetSizes on
            new { fh.CarGroupId, fh.LocationId } equals new { maxFs.CarGroupId, maxFs.LocationId }
            join adds in additions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber }
            equals new { adds.CarGroupId, adds.LocationId, adds.WeekNumber }
            into joinedAdds
            from joinedAdditions in joinedAdds.DefaultIfEmpty()
            join dels in deletions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber }
            equals new { dels.CarGroupId, dels.LocationId, dels.WeekNumber }
            into joinedDels
            from joinedDeletions in joinedDels.DefaultIfEmpty()

            group new { fh, minFs, maxFs, joinedAdditions, joinedDeletions } by
            new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber, maxFs.PeakDay.Year }
            into groupedData
            join cg in DataContext.CAR_GROUPs on groupedData.Key.CarGroupId equals cg.car_group_id
            join loc in DataContext.LOCATIONs on groupedData.Key.LocationId equals loc.dim_Location_id
            join weekToMonth in DataContext.IsoWeekToMonths on
            new { groupedData.Key.WeekNumber, groupedData.Key.Year }
            equals new { WeekNumber = weekToMonth.IsoWeekNumber, Year = (int)weekToMonth.Year }
            orderby groupedData.Key.Year, groupedData.Key.WeekNumber, loc.location1, cg.car_group1
                select new DemandGapOneRow
            {
                Year                = groupedData.Key.Year,
                WeekNumber          = groupedData.Key.WeekNumber,
                MonthNumber         = weekToMonth.Month,
                CarGroupName        = cg.car_group1,
                CarGroupId          = groupedData.Key.CarGroupId,
                LocationId          = groupedData.Key.LocationId,
                CarSegmentId        = cg.CAR_CLASS.car_segment_id,
                LocationName        = loc.location1,
                OperationalFleet    = groupedData.Sum(d => d.fh.PeakOperationalFleet),
                AdditionDeletionSum = groupedData.Sum(d => d.joinedAdditions == null ? 0 : d.joinedAdditions.Additions) - groupedData.Sum(d => d.joinedDeletions == null ? 0 : d.joinedDeletions.Deletions),
                MinFleet            = ((int)groupedData.Sum(d => d.minFs.MinFleet)),
                ReasonForGap        = string.Empty
            };

            var returned = demandGapData;

            //var xx = returned.Take(10).ToList();
            return(returned);
        }
        public List <WeeklyMaxMinValues> CalculateMinMax(int minFleetScenarioId, int maxFleetFactorScenarioId, int weeksToCalculate)
        {
            var additions = from ad in DataContext.ResAdditions
                            join isoWeek in DataContext.IsoWeekOfYears on ad.RepDate.Date equals isoWeek.Day.Date
                            group new { ad, isoWeek }  by new { ad.CarGrpId, ad.LocId, isoWeek.WeekOfYear, isoWeek.Day.Year }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Year       = groupedData.Key.Year,
                Additions  = groupedData.Sum(d => d.ad.Value)
            };

            var deletions = from del in DataContext.ResDeletions
                            join isoWeek in DataContext.IsoWeekOfYears on del.RepDate.Date equals isoWeek.Day.Date
                            group del by new { del.CarGrpId, del.LocId, isoWeek.WeekOfYear, isoWeek.Day.Year }
            into groupedData
                select new
            {
                LocationId = groupedData.Key.LocId,
                CarGroupId = groupedData.Key.CarGrpId,
                WeekNumber = groupedData.Key.WeekOfYear,
                Year       = groupedData.Key.Year,
                Deletions  = groupedData.Sum(d => d.Value)
            };

            //How many weeks to calculate into the future

            var minFleetDataAccess = new MinFleetDataAccess(Parameters, DataContext);
            var minFleet           = minFleetDataAccess.CalculateMinNessesaryFleetCommercialSegment(minFleetScenarioId);



            var maxFleetDataAccess = new MaxFleetDataAccess(Parameters, DataContext);
            var maxFleet           = maxFleetDataAccess.GetMaxFleetSize(maxFleetFactorScenarioId);


            //Build Operational Fleet from the last entry in the Availability History
            //var firstCmsPredictionDate = DataContext.FleetHistories.Max(d => d.Timestamp);
            //Parameters[DictionaryParameter.StartDate] = firstCmsPredictionDate.ToShortDateString();
            var fleetHistory = FleetHistoryQueryable.GetAvailabilityHistory(DataContext, Parameters);

            //Sum FleetType Away, Leaving Date
            var sumFleet = from fh in fleetHistory
                           group fh by
                           new { fh.CarGroupId, fh.LocationId, fh.Timestamp }
            into gd
                select new
            {
                gd.Key.CarGroupId,
                gd.Key.LocationId,
                TotalFleet = gd.Sum(d => d.MaxTotal)
            };

            //Sum Date Away
            var totalFleet = from fh in sumFleet
                             group fh by
                             new { fh.CarGroupId, fh.LocationId }
            into gd
                select new
            {
                gd.Key.CarGroupId,
                gd.Key.LocationId,
                TotalFleet = gd.Average(d => d.TotalFleet)
            };


            var maxDate = DataContext.RevenueByCommercialCarSegments.Max(d => d.MonthDate);
            var minDate = maxDate.AddMonths(-3);

            var contributionData = ContributionQueryable.GetContribution(DataContext, minDate);



            var demandGapData = from fh in totalFleet
                                join minFs in minFleet on
                                new { fh.CarGroupId, fh.LocationId } equals new { minFs.CarGroupId, minFs.LocationId }
            join maxFs in maxFleet on
            new { fh.CarGroupId, fh.LocationId } equals new { maxFs.CarGroupId, maxFs.LocationId }

            join adds in additions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber, maxFs.Year }
            equals new { adds.CarGroupId, adds.LocationId, adds.WeekNumber, adds.Year }
            into joinedAdds
            from joinedAdditions in joinedAdds.DefaultIfEmpty()
            join dels in deletions on new { fh.CarGroupId, fh.LocationId, maxFs.WeekNumber, maxFs.Year }
            equals new { dels.CarGroupId, dels.LocationId, dels.WeekNumber, dels.Year }
            into joinedDels
            from joinedDeletions in joinedDels.DefaultIfEmpty()
            join cd in contributionData on new { fh.CarGroupId, fh.LocationId } equals new { cd.CarGroupId, cd.LocationId }
            into joinedCd
            from joinedContriData in joinedCd.DefaultIfEmpty()
            join cg in DataContext.CAR_GROUPs on fh.CarGroupId equals cg.car_group_id
            join loc in DataContext.LOCATIONs on fh.LocationId equals loc.dim_Location_id
            join weekToMonth in DataContext.IsoWeekToMonths on
            new { maxFs.WeekNumber, maxFs.Year }
            equals new { WeekNumber = weekToMonth.IsoWeekNumber, Year = (int)weekToMonth.Year }
//                orderby groupedData.Key.Year, groupedData.Key.WeekNumber, loc.location1, cg.car_group1
            select new WeeklyMaxMinValues
            {
                Year                = maxFs.Year,
                WeekNumber          = maxFs.WeekNumber,
                MonthNumber         = weekToMonth.Month,
                CarGroupName        = cg.car_group1,
                CarGroupId          = fh.CarGroupId,
                LocationId          = fh.LocationId,
                CarSegmentId        = cg.CAR_CLASS.car_segment_id,
                LocationName        = loc.location1,
                TotalFleet          = (int)fh.TotalFleet,
                AdditionDeletionSum = (joinedAdditions == null ? 0 : joinedAdditions.Additions)
                                      - (joinedDeletions == null ? 0 : joinedDeletions.Deletions),
                MinFleet     = ((int)minFs.MinNessesaryFleetRequired),
                MaxFleet     = ((int)maxFs.MaxForLocation),
                ReasonForGap = string.Empty,
                Contribution = (decimal)((joinedContriData == null ||
                                          joinedContriData.HoldingCost == 0 ||
                                          joinedContriData.Revenue == 0 ? 0
                                            : (joinedContriData.Revenue / fh.TotalFleet) - (joinedContriData.HoldingCost))),
                Revenue     = joinedContriData == null ? 0 : joinedContriData.Revenue,
                HoldingCost = joinedContriData == null ? 0 : joinedContriData.HoldingCost
            };

            var returned = demandGapData.ToList();

            return(returned);
        }