public PerformanceIndicatorWeekData(PerformanceIndicatorWeekDataLink link, double actual)
 {
     base.Link        = link.Link;
     base.IndicatorId = link.IndicatorId;
     base.WeekNumber  = link.WeekNumber;
     base.Year        = link.Year;
     m_actual         = actual;
 }
        public bool Equals(PerformanceIndicatorWeekDataLink other)
        {
            // credit: http://stackoverflow.com/a/10454552/677735
            if (other == null)
            {
                return(false);
            }

            return
                ((
                     this.IndicatorId.Equals(other.IndicatorId) &&
                     this.Year.Equals(other.Year) &&
                     this.WeekNumber.Equals(other.WeekNumber)
                     ) &&
                 (
                     this.Link == other.Link || this.Link != null && this.Link.Equals(other.Link)
                 ));
        }
        public void addWeekValue(int year, int weekNumber, IO.Swagger.Model.CorporateStructureLink link, int indicatorId, double actual)
        {
            PerformanceIndicatorWeekDataLink dataLink = new PerformanceIndicatorWeekDataLink();

            dataLink.Year        = year;
            dataLink.WeekNumber  = weekNumber;
            dataLink.Link        = new IO.Swagger.Model.CorporateStructureLink(link.ProductID, link.GeoAreaID, link.CustomerID, link.CompetitorID, link.SupplierID, link.PartnerID, link.OtherPlayerID, link.CompanyLegalEntityID, link.CompanyFunctionID);
            dataLink.IndicatorId = indicatorId;

            if (m_weeklyValues.ContainsKey(dataLink))
            {
                m_weeklyValues[dataLink] += actual;
            }
            else
            {
                m_weeklyValues.Add(dataLink, actual);
            }
        }
        private void calculateWeeklyLevelRows()
        {
            /*
             * Iterate all indicators and every used corporatefilter value
             * and generate "sum" row for this filter
             */

            int minYear = m_weeklyValues.Keys.Min(x => x.Year);
            int maxYear = m_weeklyValues.Keys.Max(x => x.Year);

            List <int> distinctIndicators = m_weeklyValues.Keys.Select(x => x.IndicatorId).Distinct().ToList();

            foreach (int indicatorId in distinctIndicators)
            {
                for (int selYear = minYear; selYear <= maxYear; selYear++)
                {
                    for (int selWeek = 1; selWeek <= 52; selWeek++)
                    {
                        if (m_weeklyValues.Keys.Where(x => x.Year == selYear && x.WeekNumber == selWeek && x.IndicatorId == indicatorId).Count() == 0)
                        {
                            continue;
                        }

                        PerformanceIndicatorWeekDataLink topLevelLink = new PerformanceIndicatorWeekDataLink();
                        topLevelLink.Year        = selYear;
                        topLevelLink.WeekNumber  = selWeek;
                        topLevelLink.IndicatorId = indicatorId;
                        topLevelLink.Link        = new IO.Swagger.Model.CorporateStructureLink(null, null, null, null, null, null, null, null, null);

                        double totalValue = 0;
                        foreach (PerformanceIndicatorWeekDataLink entryWithSomething in m_weeklyValues.Keys.Where(x => x.Year == selYear && x.WeekNumber == selWeek && x.IndicatorId == indicatorId &&
                                                                                                                  (x.Link.CompanyFunctionID != 0 || x.Link.CompanyLegalEntityID != 0 || x.Link.CompetitorID != 0 || x.Link.CustomerID != 0 || x.Link.GeoAreaID != 0 || x.Link.OtherPlayerID != 0 || x.Link.PartnerID != 0 || x.Link.ProductID != 0 || x.Link.SupplierID != 0)
                                                                                                                  ))
                        {
                            totalValue += m_weeklyValues[entryWithSomething];
                        }

                        if (m_weeklyValues.ContainsKey(topLevelLink))
                        {
                            m_weeklyValues[topLevelLink] += totalValue;
                        }
                        else
                        {
                            m_weeklyValues.Add(topLevelLink, totalValue);
                        }

                        List <PerformanceIndicatorWeekDataLink> thisPeriodValues = m_weeklyValues.Keys.Where(x => x.Year == selYear && x.WeekNumber == selWeek && x.IndicatorId == indicatorId).ToList();
                        foreach (PerformanceIndicatorWeekDataLink entryWithSomething in thisPeriodValues)
                        {
                            if (entryWithSomething.Link.GeoAreaID != null)
                            {
                                PerformanceIndicatorWeekDataLink entryWithoutOtherLinks = new PerformanceIndicatorWeekDataLink();
                                entryWithoutOtherLinks.Year        = selYear;
                                entryWithoutOtherLinks.WeekNumber  = selWeek;
                                entryWithoutOtherLinks.IndicatorId = indicatorId;
                                entryWithoutOtherLinks.Link        = new IO.Swagger.Model.CorporateStructureLink(null, entryWithSomething.Link.GeoAreaID, null, null, null, null, null, null, null);

                                if (!m_weeklyValues.ContainsKey(entryWithoutOtherLinks))
                                {
                                    totalValue = 0;
                                    foreach (PerformanceIndicatorWeekDataLink entryWithGeoAreaSet in m_weeklyValues.Keys.Where(x => x.Year == selYear && x.WeekNumber == selWeek && x.IndicatorId == indicatorId && x.Link.GeoAreaID == entryWithSomething.Link.GeoAreaID))
                                    {
                                        totalValue += m_weeklyValues[entryWithGeoAreaSet];
                                    }

                                    m_weeklyValues.Add(entryWithoutOtherLinks, totalValue);
                                }
                            }

                            if (entryWithSomething.Link.PartnerID != null)
                            {
                                PerformanceIndicatorWeekDataLink entryWithoutOtherLinks = new PerformanceIndicatorWeekDataLink();
                                entryWithoutOtherLinks.Year        = selYear;
                                entryWithoutOtherLinks.WeekNumber  = selWeek;
                                entryWithoutOtherLinks.IndicatorId = indicatorId;
                                entryWithoutOtherLinks.Link        = new IO.Swagger.Model.CorporateStructureLink(null, null, null, null, null, entryWithSomething.Link.PartnerID, null, null, null);

                                if (!m_weeklyValues.ContainsKey(entryWithoutOtherLinks))
                                {
                                    totalValue = 0;
                                    foreach (PerformanceIndicatorWeekDataLink entryWithPartnerSet in m_weeklyValues.Keys.Where(x => x.Year == selYear && x.WeekNumber == selWeek && x.IndicatorId == indicatorId && x.Link.PartnerID == entryWithSomething.Link.PartnerID))
                                    {
                                        totalValue += m_weeklyValues[entryWithPartnerSet];
                                    }

                                    m_weeklyValues.Add(entryWithoutOtherLinks, totalValue);
                                }
                            }
                        }
                    }
                }
            }
        }