public IHttpActionResult TotalProfitByMovie(StatisticsParameters statisticsParameters)
        {
            var      fltTechTypes = new List <int>();
            var      CinemaID     = statisticsParameters.CinemaID;
            var      TechTypeID   = statisticsParameters.TechTypeID;
            DateTime DateTimeFrom = statisticsParameters.DateTimeFrom;
            DateTime DateTimeTo   = statisticsParameters.DateTimeTo;

            fltTechTypes.AddRange((TechTypeID == 0) ? principal.TechnologyTypes.Select(x => x.TechnologyTypeID).ToList() : principal.TechnologyTypes.Where(x => x.TechnologyTypeID == TechTypeID).Select(x => x.TechnologyTypeID).ToList());

            var profitByMovie = (from T in principal.Tickets
                                 join P in principal.Projections on T.ProjectionID equals P.ProjectionID
                                 join M in principal.Movies on P.MovieID equals M.MovieID
                                 join TT in principal.TechnologyTypes on P.TechnologyTypeID equals TT.TechnologyTypeID
                                 join CHS in principal.CinemaHalls on P.CinemaHallID equals CHS.CinemaHallID
                                 join CS in principal.Cinemas on CHS.CinemaID equals CS.CinemaID
                                 where P.DateTimeStart >= DateTimeFrom &&
                                 P.DateTimeStart <= DateTimeTo &&
                                 fltTechTypes.Contains(TT.TechnologyTypeID) &&
                                 CS.CinemaID == CinemaID
                                 group T by T.Projections.Movies into Tgroup
                                 orderby Tgroup.Sum(x => x.TicketPrice) descending
                                 select new
            {
                MovieName = Tgroup.Key.Name,
                SumOfTicketPrice = Tgroup.Sum(x => x.TicketPrice)
            }).ToDictionary(t => t.MovieName, t => t.SumOfTicketPrice);

            if (profitByMovie.Count == 0)
            {
                return(NotFound());
            }
            return(Ok(profitByMovie));
        }
        public IHttpActionResult ProfitByPaymentMethods(ReportingParameters reportingParameters)
        {
            var      CinemaID     = reportingParameters.CinemaID;
            DateTime DateTimeFrom = reportingParameters.DateTimeFrom;
            DateTime DateTimeTo   = reportingParameters.DateTimeTo;
            int      TechTypeID   = reportingParameters.TechTypeID;

            var payMethods = principal.PaymentMethods.ToList();

            var dctprofitByPaymentMethods = new Dictionary <string, Dictionary <string, decimal> >();

            var fltTechTypes = new List <int>();

            fltTechTypes.AddRange((TechTypeID == 0) ? principal.TechnologyTypes.Select(x => x.TechnologyTypeID).ToList()
                                         : principal.TechnologyTypes.Where(x => x.TechnologyTypeID == TechTypeID).Select(x => x.TechnologyTypeID).ToList());

            foreach (var item in payMethods)
            {
                var DICTprofitByPaymentMethods = (from T in principal.Tickets
                                                  join P in principal.Projections on T.ProjectionID equals P.ProjectionID
                                                  join CHS in principal.CinemaHalls on P.CinemaHallID equals CHS.CinemaHallID
                                                  join CS in principal.Cinemas on CHS.CinemaID equals CS.CinemaID
                                                  join R in principal.Reservations on T.ReservationID equals R.ReservationID
                                                  join PM in principal.PaymentMethods on R.PaymentMethodID equals PM.PaymentMethodID
                                                  join TT in principal.TechnologyTypes on P.TechnologyTypeID equals TT.TechnologyTypeID
                                                  where P.DateTimeStart >= DateTimeFrom &&
                                                  P.DateTimeStart <= DateTimeTo &&
                                                  CS.CinemaID == CinemaID &&
                                                  PM.PaymentMethodID == item.PaymentMethodID &&
                                                  fltTechTypes.Contains(TT.TechnologyTypeID)
                                                  group T by new
                {
                    T.Projections.DateTimeStart.Day,
                    T.Projections.DateTimeStart.Month,
                    T.Projections.DateTimeStart.Year
                } into Tgroup
                                                  orderby Tgroup.Key.Day
                                                  select new
                {
                    DateDayMonth = Tgroup.Key.Day.ToString() + "." + Tgroup.Key.Month.ToString(),
                    Total = Tgroup.Sum(x => x.TicketPrice)
                }).ToDictionary(t => t.DateDayMonth, t => t.Total);

                dctprofitByPaymentMethods.Add(

                    item.Name,

                    DICTprofitByPaymentMethods);
            }

            if (dctprofitByPaymentMethods.Count == 0)
            {
                return(NotFound());
            }


            return(Ok(dctprofitByPaymentMethods));
        }
        public IHttpActionResult TotalTicketsSold(StatisticsParameters statisticsParameters)
        {
            var CinemaID   = statisticsParameters.CinemaID;
            var TechTypeID = statisticsParameters.TechTypeID;
            var MovieID    = statisticsParameters.MovieID;

            var fltMovies    = new List <int>();
            var fltTechTypes = new List <int>();



            fltMovies.AddRange((MovieID == 0) ? principal.Movies.Select(x => x.MovieID).ToList() : principal.Movies.Where(x => x.MovieID == MovieID).Select(x => x.MovieID).ToList());
            fltTechTypes.AddRange((TechTypeID == 0) ? principal.TechnologyTypes.Select(x => x.TechnologyTypeID).ToList() : principal.TechnologyTypes.Where(x => x.TechnologyTypeID == TechTypeID).Select(x => x.TechnologyTypeID).ToList());

            DateTime DateTimeFrom = statisticsParameters.DateTimeFrom;
            DateTime DateTimeTo   = statisticsParameters.DateTimeTo;



            var countTickets = (from T in principal.Tickets
                                join P in principal.Projections on T.ProjectionID equals P.ProjectionID
                                join M in principal.Movies on P.MovieID equals M.MovieID
                                join TT in principal.TechnologyTypes on P.TechnologyTypeID equals TT.TechnologyTypeID
                                join CHS in principal.CinemaHalls on P.CinemaHallID equals CHS.CinemaHallID
                                join CS in principal.Cinemas on CHS.CinemaID equals CS.CinemaID
                                where P.DateTimeStart >= DateTimeFrom &&
                                P.DateTimeStart <= DateTimeTo &&
                                fltMovies.Contains(M.MovieID) &&
                                fltTechTypes.Contains(TT.TechnologyTypeID) &&
                                CS.CinemaID == CinemaID
                                group T by new
            {
                T.Projections.DateTimeStart.Day,
                T.Projections.DateTimeStart.Month,
                T.Projections.DateTimeStart.Year
            } into Tgroup
                                orderby Tgroup.Key.Day
                                select new
            {
                DayMonth = Tgroup.Key.Day.ToString() + "." + Tgroup.Key.Month.ToString(),
                SumOfTicketPrice = Tgroup.Count()
            }).ToDictionary(t => t.DayMonth, t => t.SumOfTicketPrice);

            if (countTickets.Count == 0)
            {
                return(NotFound());
            }
            return(Ok(countTickets));
        }
        public IHttpActionResult ProfitByMovies(ReportingParameters reportingParameters)
        {
            var      fltTechTypes = new List <int>();
            var      CinemaID     = reportingParameters.CinemaID;
            var      TechTypeID   = reportingParameters.TechTypeID;
            DateTime DateTimeFrom = reportingParameters.DateTimeFrom;
            DateTime DateTimeTo   = reportingParameters.DateTimeTo;

            fltTechTypes.AddRange((TechTypeID == 0) ? principal.TechnologyTypes.Select(x => x.TechnologyTypeID).ToList() : principal.TechnologyTypes.Where(x => x.TechnologyTypeID == TechTypeID).Select(x => x.TechnologyTypeID).ToList());

            var profitByMovie = (from T in principal.Tickets
                                 join P in principal.Projections on T.ProjectionID equals P.ProjectionID
                                 join M in principal.Movies on P.MovieID equals M.MovieID
                                 join TT in principal.TechnologyTypes on P.TechnologyTypeID equals TT.TechnologyTypeID
                                 join CHS in principal.CinemaHalls on P.CinemaHallID equals CHS.CinemaHallID
                                 join CS in principal.Cinemas on CHS.CinemaID equals CS.CinemaID
                                 where P.DateTimeStart >= DateTimeFrom &&
                                 P.DateTimeStart <= DateTimeTo &&
                                 fltTechTypes.Contains(TT.TechnologyTypeID) &&
                                 CS.CinemaID == CinemaID
                                 group T by T.Projections.Movies into Tgroup
                                 orderby Tgroup.Sum(x => x.TicketPrice) descending
                                 select new
            {
                MovieID = Tgroup.Key.MovieID,
                Name = Tgroup.Key.Name,
                Genre = Tgroup.Key.Genres.Name,
                Director = Tgroup.Key.MovieDirectors.FirstName + " " + Tgroup.Key.MovieDirectors.LastName,
                Total = Tgroup.Sum(x => x.TicketPrice)
            }).Take(10).
                                ToDictionary(t => t.MovieID, t => new {
                t.Name, t.Genre, t.Director, t.Total
            });

            if (profitByMovie.Count == 0)
            {
                return(NotFound());
            }
            return(Ok(profitByMovie));
        }
        public IHttpActionResult TotalProfitByMovieGenre(StatisticsParameters statisticsParameters)
        {
            var fltTechTypes = new List <int>();
            var CinemaID     = statisticsParameters.CinemaID;
            var TechTypeID   = statisticsParameters.TechTypeID;
            var GenreID      = statisticsParameters.GenreID;

            DateTime DateTimeFrom = statisticsParameters.DateTimeFrom;
            DateTime DateTimeTo   = statisticsParameters.DateTimeTo;


            fltTechTypes.AddRange((TechTypeID == 0) ? principal.TechnologyTypes.Select(x => x.TechnologyTypeID).ToList() : principal.TechnologyTypes.Where(x => x.TechnologyTypeID == TechTypeID).Select(x => x.TechnologyTypeID).ToList());

            var profitGenres = (from T in principal.Tickets
                                join P in principal.Projections on T.ProjectionID equals P.ProjectionID
                                join M in principal.Movies on P.MovieID equals M.MovieID
                                join G in principal.Genres on M.GenreID equals G.GenreID
                                join TT in principal.TechnologyTypes on P.TechnologyTypeID equals TT.TechnologyTypeID
                                join CHS in principal.CinemaHalls on P.CinemaHallID equals CHS.CinemaHallID
                                join CS in principal.Cinemas on CHS.CinemaID equals CS.CinemaID
                                where P.DateTimeStart >= DateTimeFrom &&
                                P.DateTimeStart <= DateTimeTo &&
                                fltTechTypes.Contains(TT.TechnologyTypeID) &&
                                CS.CinemaID == CinemaID &&
                                G.GenreID == GenreID
                                group T by new
            {
                T.Projections.DateTimeStart.Day,
                T.Projections.DateTimeStart.Month,
                T.Projections.DateTimeStart.Year
            } into Tgroup
                                orderby Tgroup.Key.Day
                                select new
            {
                DayMonth = Tgroup.Key.Day.ToString() + "." + Tgroup.Key.Month.ToString() + "." + Tgroup.Key.Year.ToString(),
                SumOfTicketPrice = Tgroup.Sum(x => x.TicketPrice)
            }).ToDictionary(t => t.DayMonth, t => t.SumOfTicketPrice);

            Dictionary <DateTime, decimal> profitFinalConvert = new Dictionary <DateTime, decimal>();

            foreach (var item in profitGenres)
            {
                string[] dayMonthYear = item.Key.Split('.');
                string   temp         = String.Empty;
                foreach (var s in dayMonthYear)
                {
                    if (s.Length == 1)
                    {
                        temp += "0" + s + ".";
                    }
                    else
                    {
                        temp += s + ".";
                    }
                }
                string Final = temp.Substring(0, 10);
                profitFinalConvert.Add(DateTime.ParseExact(Final, "dd.MM.yyyy", CultureInfo.InvariantCulture), item.Value);
            }

            if (profitFinalConvert.Count == 0)
            {
                return(NotFound());
            }
            return(Ok(profitFinalConvert));
        }