public IHttpActionResult EmployeeSalary(ReportingParameters reportingParameters)
        {
            int  CinemaID = reportingParameters.CinemaID;
            bool Gender   = reportingParameters.Gender;

            var Employments = principal.Employments.ToList()
                              .Where(x => !x.IsDeleted &&
                                     x.Employees.CinemaID == CinemaID &&
                                     !x.Employees.IsDeleted &&
                                     x.Employees.Gender == Gender
                                     ).ToList();

            if (Employments.Count == 0)
            {
                return(BadRequest());
            }

            var allEmps = new List <dynamic>();

            foreach (var item in Employments)
            {
                allEmps.Add(new
                {
                    item.EmployeeID,
                    FullName = $"{item.Employees.FirstName} {item.Employees.LastName}",
                    Gender   = (!item.Employees.Gender) ? "Male" : "Female",
                    item.EmploymentID,
                    EmploymentType = item.EmploymentTypes.Name,
                    CurrentSalary  = item.CurrentSalary
                });
            }
            return(Ok(allEmps));
        }
        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 SeatReservationFrequencyReporting(ReportingParameters reportingParameters)
        {
            var      CinemaID     = reportingParameters.CinemaID;
            var      TechTypeID   = reportingParameters.TechTypeID;
            DateTime DateTimeFrom = reportingParameters.DateTimeFrom;
            DateTime DateTimeTo   = reportingParameters.DateTimeTo;

            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());

            var dctSeatReservationFrequency = (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

                                               group T by T.Seats into SeatGroup
                                               orderby SeatGroup.Count() descending
                                               select new
            {
                SeatID = SeatGroup.Key.SeatID,
                SeatLabel = SeatGroup.Key.SeatRows.SeatRowLbl + SeatGroup.Key.SeatColumns.SeatColumnLbl,
                CinemaHall = SeatGroup.Key.CinemaHalls.Name,
                TotalFrequency = SeatGroup.Count()
            }).Take(10)
                                              .ToDictionary(t => t.SeatID, t => new {
                SeatLabel      = t.SeatLabel,
                CinemaHall     = t.CinemaHall,
                TotalFrequency = t.TotalFrequency
            });

            if (dctSeatReservationFrequency.Count == 0)
            {
                return(NotFound());
            }
            return(Ok(dctSeatReservationFrequency));
        }
        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));
        }