public async Task<ActionResult> DownloadPrintForm(int id)
        {
            var order = await db.Orders
                .FirstAsync(o => o.Id == id);
            var tag = await db.Tags.OfType<EventTag>().Include(t => t.Event).Include("Event.Groups").FirstAsync(t => t.Orders.Any(o => o.Id == order.Id));

            if (order.TimingSystemId.HasValue && tag.Event.TimingSystemId.HasValue)
            {
                var connector = new TrackMePro.PortalConnector();

                return File(connector.GetOrderPrintForm(tag.Event.TimingSystemId.Value, order.TimingSystemId.Value), "application/pdf");
            }
            return View("TimingNotConfigured");
        }
        public async Task<ActionResult> DownloadPrintForm(int id)
        {
             var accreditation = await db.Accreditations
                .Include(a=>a.Tag)                
                .FirstAsync(o => o.Id == id);
             var eventTag = ((EventTag)accreditation.Tag);
             await db.Entry(eventTag).Reference(t => t.Event).LoadAsync();

             if (accreditation.TimingSystemId.HasValue && eventTag.Event.TimingSystemId.HasValue)
            {
                var connector = new TrackMePro.PortalConnector();

                return File(connector.GetAccreditationPrintForm(eventTag.Event.TimingSystemId.Value, accreditation.TimingSystemId.Value), "application/pdf");
            }
            return View("TimingNotConfigured");
        }
        public async Task<ActionResult> GeneratePrintForms(int id)
        {
            var order = await db.Orders
                .Include(o=>o.Car)
                .Include(o=>o.CoDriver)
                .Include(o=>o.CoDriver.Licenses)
                .Include(o=>o.Driver)
                .Include(o=>o.Driver.Licenses)
                .Include(o=>o.Team)
                .Include(o=>o.Group)
                .FirstAsync(o => o.Id == id);
            var tag = await db.Tags.OfType<EventTag>().Include(t => t.Event).Include("Event.Groups").FirstAsync(t => t.Orders.Any(o => o.Id == order.Id));
            
            if (tag.Event.TimingSystemId.HasValue)
            {
                var connector = new TrackMePro.PortalConnector();
                var groups = connector.AvailableGroups(tag.Event.TimingSystemId.Value);

                var serverGroups = groups.Where(g => order.Group.Any(grp => grp.Title == g.Name));

                var serverOrder = new TrackMePro.Entry();
                serverOrder.Groups = serverGroups.ToArray();
                serverOrder.EntryFeeToPay = 0;
                serverOrder.EntryFeeToPaid = 0;
                serverOrder.State = TrackMePro.EntryState.Preliminary;
                try {
                    serverOrder.StartNumber = int.Parse(order.StartNumber);
                }catch {
                    serverOrder.StartNumber = null;
                }

                if (order.Driver != null)
                {
                    serverOrder.FirstName = order.Driver.FirstName;
                    serverOrder.LastName = order.Driver.LastName;
                    serverOrder.BirthDay = order.Driver.BirthDate;
                    serverOrder.Address = order.Driver.Address;
                    serverOrder.Email = order.Driver.Email;
                    serverOrder.City = order.Driver.Location;
                    serverOrder.Phone = order.Driver.Phone;
                   
                    serverOrder.Passport = order.Driver.Passport;

                    if (order.Driver.Licenses.Any(l => l.Season == 2014 && l.Type == LicenseType.Driver))
                    {
                        serverOrder.License = order.Driver.Licenses.OrderByDescending(l => l.IssuesOn).First(l => l.Season == 2014 && l.Type == LicenseType.Driver).Number;
                    }
                }

                if (order.CoDriver != null)
                {
                    serverOrder.CoDriverFirstName = order.CoDriver.FirstName;
                    serverOrder.CoDriverLastName = order.CoDriver.LastName;
                    serverOrder.CoDriverBirthDate = order.CoDriver.BirthDate;
                    serverOrder.CoDriverAddress = order.CoDriver.Address;
                    serverOrder.CoDriverEmail = order.CoDriver.Email;
                    serverOrder.CoDriverCity = order.CoDriver.Location;
                    serverOrder.CoDriverPhone = order.CoDriver.Phone;
                    serverOrder.CoDriverPassport = order.CoDriver.Passport;

                    if (order.CoDriver.Licenses.Any(l => l.Season == 2014 && l.Type == LicenseType.Driver))
                    {
                        serverOrder.CoDriverLicense = order.CoDriver.Licenses.OrderByDescending(l => l.IssuesOn).First(l => l.Season == 2014 && l.Type == LicenseType.Driver).Number;
                    }
                }

                if (order.Car != null)
                {
                    serverOrder.Mark = order.Car.Mark;
                    serverOrder.Model = order.Car.Model;
                    serverOrder.RegistrationNumber = order.Car.RegistrationNumber;
                    serverOrder.Engine = order.Car.Engine;                    
                }

                if (order.Team != null)
                {
                    serverOrder.TeamPhone = order.Team.Phone;
                    serverOrder.Team = order.Team.Name;
                    serverOrder.TeamLicense = order.Team.License;
                    serverOrder.TeamFax = order.Team.Fax;
                    serverOrder.TeamEmail = order.Team.Email;
                    serverOrder.TeamCity = order.Team.City;
                    serverOrder.TeamAddress = order.Team.Address;
                }

                order.TimingSystemId = connector.RegisterOrder(tag.Event.TimingSystemId.Value, order.TimingSystemId, serverOrder);
                await db.SaveChangesAsync();

                return RedirectToAction("DownloadPrintForm", new { id = id});
            }
            return View("TimingNotConfigured");
        }
        public async Task<ActionResult> GeneratePrintForms(int id)
        {
            var accreditation = await db.Accreditations
                .Include(a=>a.User)
                .Include(a=>a.Media)                
                .Include(a=>a.Tag)                
                .FirstAsync(o => o.Id == id);
            var eventTag = ((EventTag)accreditation.Tag);
            await db.Entry(eventTag).Reference(t=>t.Event).LoadAsync();

            if (eventTag.Event.TimingSystemId.HasValue)
            {
                var connector = new TrackMePro.PortalConnector();


                var serverAccreditation = new TrackMePro.Accreditation();
                serverAccreditation.Address = accreditation.User.Address;
                serverAccreditation.BirthDate = accreditation.User.BirthDate;
                serverAccreditation.Car = accreditation.Car;
                serverAccreditation.Email = accreditation.User.Email;
                serverAccreditation.FirstName = accreditation.User.FirstName;
                serverAccreditation.LastName = accreditation.User.LastName;
                serverAccreditation.Location = accreditation.User.Location;
                serverAccreditation.Passport = accreditation.User.Passport;
                serverAccreditation.Phone = accreditation.User.Phone;
                serverAccreditation.Id = accreditation.TimingSystemId.GetValueOrDefault();
                serverAccreditation.Media = accreditation.Media.Select(m => new TrackMePro.MediaInfoEntry()
                {
                    Edition = m.Edition,
                    Email = m.Email,
                    Fax = m.Fax,
                    Frequency = m.Frequency,
                    Media = m.Media,
                    Organisation = m.Organisation,
                    Phone = m.Phone,
                    Position = m.Position,
                    Region = m.Region,
                    Type = ((TrackMePro.MediaType)(int)m.Type),
                    Web = m.Web 
                }).ToArray();


                accreditation.TimingSystemId = connector.RegisterAccreditation(((EventTag)accreditation.Tag).Event.TimingSystemId.Value, accreditation.TimingSystemId, serverAccreditation);                
                await db.SaveChangesAsync();

                return RedirectToAction("DownloadPrintForm", new { id = id });
            }
            return View("TimingNotConfigured");
        }