public Queue CreateQueue(Queue q)
        {
            this.Validate(q);

            q.Queue_CreationDate = DateTime.Now;
            q.Queue_ID = System.Guid.NewGuid();

            FreeQ_DBEntities db = new FreeQ_DBEntities();

            db.Queue.AddObject(q);
            db.SaveChanges();

            return q;
        }
        public void DisableQueue(Guid queueID)
        {
            Queue queue = null;

            try
            {
                FreeQ_DBEntities db = new FreeQ_DBEntities();

                queue = this.GetQueue(db, queueID);

                queue.Queue_IsActive = false;

                int result = db.SaveChanges();
            }
            catch { }
        }
        public Ticket GenerateNextTicket(Guid queueID, string email)
        {
            Random random = new Random();
            Ticket ticket = new Ticket();
            HelperClass_Queue hcq = new HelperClass_Queue();

            Queue queue = hcq.GetQueue(queueID);

            try
            {
                if (!hcq.IsActive(queue)) throw new Exception("This queue isn't active; no ticket can be created.");

                ticket.Ticket_ID = System.Guid.NewGuid();

                FreeQ_DBEntities db = new FreeQ_DBEntities();

                ticket.Ticket_UniversalIncrement =
                    (from q in db.Ticket
                     select q.Ticket_UniversalIncrement).Max() + 1;

                if (ticket.Ticket_UniversalIncrement == null) ticket.Ticket_UniversalIncrement = ticket.Ticket_Increment + 1;

                ticket.Ticket_Increment = queue.Queue_Next_Increment;
                ticket.Ticket_Password = random.Next(1000).ToString();
                ticket.Ticket_Queue_ID = queueID;
                ticket.Ticket_Email = email;
                ticket.Ticket_StateID = 1;
                ticket.Ticket_CreationDate = DateTime.Now;

                db.Ticket.AddObject(ticket);
                int result = db.SaveChanges();

                hcq.NextIncrement(ticket.Ticket_ID, queueID);
            }
            catch { }

            return ticket;
        }
        public void ValidateCurrentTicket(Guid queueID, bool cancel)
        {
            Queue queue = null;

            try
            {
                FreeQ_DBEntities db = new FreeQ_DBEntities();

                queue = this.GetQueue(db, queueID);

                HelperClass_Ticket hct = new HelperClass_Ticket();
                HelperClass_Queue hcq = new HelperClass_Queue();

                if (!hcq.IsActive(queue)) throw new Exception("This queue isn't active; you can't handle tickets anymore.");

                if (queue.Queue_Current_Ticket_ID == null)
                {
                    List<Ticket> tickets = (from t in db.Ticket
                                            where t.Ticket_Queue_ID == queueID
                                            orderby t.Ticket_ID
                                            select t).ToList<Ticket>();

                    if (tickets.Count > 0)
                        queue.Queue_Current_Ticket_ID = tickets[0].Ticket_ID;
                }
                else
                {
                    Ticket t = hct.GetTicket(db, (Guid)queue.Queue_Current_Ticket_ID);

                    if (t == null) return;

                    if (cancel)
                        t.Ticket_StateID = 3;
                    else
                        t.Ticket_StateID = 2;

                    List<Ticket> tickets = (from ti in db.Ticket
                                            where ti.Ticket_Queue_ID == queueID
                                            && ti.Ticket_UniversalIncrement > t.Ticket_UniversalIncrement
                                            orderby ti.Ticket_ID
                                            select ti). ToList<Ticket>();

                    if (tickets.Count > 0)
                        queue.Queue_Current_Ticket_ID = tickets[0].Ticket_ID;
                }

                int result = db.SaveChanges();

                // Send alert

                Ticket ct = hct.GetTicket(db, (Guid)queue.Queue_Current_Ticket_ID);

                List<Ticket> nextTicket = (from ti in db.Ticket
                                           where ti.Ticket_Queue_ID == queueID
                                           && ti.Ticket_UniversalIncrement == ct.Ticket_UniversalIncrement + 2
                                           orderby ti.Ticket_ID
                                           select ti).ToList<Ticket>();

                if (nextTicket.Count == 1 && !String.IsNullOrEmpty(nextTicket[0].Ticket_Email))
                {
                    HelperClass_Email.SendEmail(nextTicket[0].Ticket_Email, "Quddle - it is almost your turn!", "Hey, only 2 persons are in front of you ; it is time to go...");
                }
            }
            catch { }
        }
        public bool UpdateQueue(Queue q)
        {
            this.Validate(q);

            FreeQ_DBEntities db = new FreeQ_DBEntities();

            try
            {
                Queue queue = db.Queue.Single<Queue>(p => p.Queue_ID == q.Queue_ID);

                queue.Queue_Name = q.Queue_Name;
                queue.Queue_Next_Increment = q.Queue_Next_Increment;
                queue.Queue_Address = q.Queue_Address;
                queue.Queue_IsActive = q.Queue_IsActive;

                db.SaveChanges();

                return true;
            }
            catch
            {
                return false;
            }
        }
        public Queue NextIncrement(Guid currentTicketID, Guid queueID)
        {
            Queue queue = null;

            try
            {
                FreeQ_DBEntities db = new FreeQ_DBEntities();

                queue = this.GetQueue(db, queueID);

                if (queue.Queue_ResetAtMidnight && queue.Queue_Date_LastIncrement < DateTime.Now.Date)
                    queue.Queue_Next_Increment = 1;
                else
                    queue.Queue_Next_Increment += 1;

                if (queue.Queue_ResetAtMaxReached && queue.Queue_Next_Increment == queue.Queue_MaxLimit)
                    queue.Queue_Next_Increment = 1;

                queue.Queue_Date_LastIncrement = DateTime.Now.Date;

                if (queue.Queue_Current_Ticket_ID == null)
                    queue.Queue_Current_Ticket_ID = currentTicketID;

                int result = db.SaveChanges();
            }
            catch { }

            return queue;
        }
        public void UpdateAlertEmail(Guid ticketID, string alertEmail)
        {
            FreeQ_DBEntities db = new FreeQ_DBEntities();

            Ticket t = this.GetTicket(db, ticketID);

            t.Ticket_Email = alertEmail;

            db.SaveChanges();
        }