예제 #1
0
파일: place.cs 프로젝트: vsh95/ParkgMVC
        //Нужен для регистрации выезда, так же сойдет для отката(и истечения) брони:   
         //Можно попробовать задействовать при включении места. Мое место  включить и сразу все обновить, а альтернативное
        //уже не нужное отправить сюда
        public bool FreePlace(long free_id_loc_place)
        {
            
            bool res = true;
            place fp = mp.place.Where(x => x.id_location_place == free_id_loc_place).FirstOrDefault();
            var obj = mp.reservation.Where(x => x.Status == "Active" & x.id_alternative_location_place == null).ToList();
            int count = obj.Count();
            place pl = new place();
            if (count > 0)
            {
                long id_user_reserv = 0;
                int i = 0;
                foreach (var search in obj)
                {
                    DateTime min = Convert.ToDateTime(search.DateConnection);
                    foreach (var mindate in obj)
                    {
                        if (i < count)
                        {
                            if (min <= Convert.ToDateTime(mindate.DateConnection))
                            {
                                min = Convert.ToDateTime(mindate.DateConnection);
                                id_user_reserv = mindate.id_reservation_user;
                            }
                            i++;
                        }
                        else { break; }
                    }
                    break;
                }
                reservation myfind = mp.reservation.Where(x => x.id_reservation_user == id_user_reserv).FirstOrDefault();
                myfind.id_alternative_location_place = (int)free_id_loc_place;
                mp.Entry(myfind).State = EntityState.Modified;
                mp.SaveChanges();
                //Если освобождающееся место лучше или такое же
                if (pl.bestornot((long)myfind.id_location_place, free_id_loc_place) == true)
                {
                    pl.ChangeStatus("In waiting visit", free_id_loc_place, (int)myfind.place.id_tariff_on_place);
                }
                //если нет
                else
                {
                    pl.ChangeStatus("In waiting visit", free_id_loc_place, 0);
                }

               res = true;
            }
            else
            {
                int newfr = 0;
                var eq = mp.reservation.Where(x =>  x.Status == "Active" & x.id_alternative_location_place != x.id_location_place & x.id_alternative_location_place != free_id_loc_place).ToList();
               int e = eq.Count();
                //long id_u_r = 0;
               // int coun = 0;

                if (e > 0)
                {
                    foreach (var s1 in eq)
                    {
                        place fineq = mp.place.Where(x => x.id_location_place == s1.id_alternative_location_place).FirstOrDefault();

                            if ((fp.tariffonplace.PriceForHourWithoutAbonement > fineq.tariffonplace.PriceForHourWithoutAbonement) &
                             (fp.tariffonplace.PriceForHourWithoutAbonement <= s1.place.tariffonplace.PriceForHourWithoutAbonement))
                                //alt<new<=first 
                            {
                                //Можно модернизировать путем определения ранней даты. Кто раньше забронировался, тому и получше достанется
                                //присвоить и получить
                                newfr = (int)s1.id_alternative_location_place;
                                s1.id_alternative_location_place = (int)free_id_loc_place;
                                mp.Entry(s1).State = EntityState.Modified;
                                mp.SaveChanges();
                               pl.ChangeStatus("In waiting visit", free_id_loc_place, (int)fp.id_tariff_on_place);          
                               break;
                            }

                            
                        
                    }//Разъединил. Сначала те, кто могут подняться к лучшему, потом те, кто могут отпустить более лучшее место, потом
                    //те, кто могут из худшего перейти в лучшее сразу. Может быть удалить первую часть, оставив только 3-ю вместо нее?
                    if (newfr == 0)//последнее добавленное
                    {
                        foreach (var s1 in eq)
                        {
                            place fineq = mp.place.Where(x => x.id_location_place == s1.id_alternative_location_place).FirstOrDefault();
                            if ((fp.tariffonplace.PriceForHourWithoutAbonement >= s1.place.tariffonplace.PriceForHourWithoutAbonement) &
                            (fp.tariffonplace.PriceForHourWithoutAbonement < fineq.tariffonplace.PriceForHourWithoutAbonement))
                            {//alt>new>=first
                                newfr = (int)s1.id_alternative_location_place;
                                s1.id_alternative_location_place = (int)free_id_loc_place;
                                mp.Entry(s1).State = EntityState.Modified;
                                mp.SaveChanges();
                                pl.ChangeStatus("In waiting visit", free_id_loc_place, (int)s1.place.id_tariff_on_place);
                            break;
                            }
                            
                        }
                    }


                    if (newfr == 0)//последнее добавленное
                    {
                        foreach (var s1 in eq)
                        {// alt<first<=new
                            place fineq = mp.place.Where(x => x.id_location_place == s1.id_alternative_location_place).FirstOrDefault();
                            if (((s1.place.tariffonplace.PriceForHourWithoutAbonement > fineq.tariffonplace.PriceForHourWithoutAbonement) &
                                 (fp.tariffonplace.PriceForHourWithoutAbonement >= s1.place.tariffonplace.PriceForHourWithoutAbonement)))
                            {
                                newfr = (int)s1.id_alternative_location_place;
                                s1.id_alternative_location_place = (int)free_id_loc_place;
                                mp.Entry(s1).State = EntityState.Modified;
                                mp.SaveChanges();
                                pl.ChangeStatus("In waiting visit", free_id_loc_place, (int)fp.id_tariff_on_place);
                                break;
                            }
                        }
                    }
                }
                    if (newfr != 0)
                    {
                        pl.FreePlace((long)newfr);
                    }
                    else
                    {
                        pl.ChangeStatus("Free", free_id_loc_place, 0);
                        res = false ;
                    }
            }
            return res;
        }
예제 #2
0
        public bool Revoke(string Describe, reservation obj, string Date)
        {
            bool result = false;
            try
            {
                //format my date have view:  string d = "21.11.14 20:00";

                decimal price = 0;
                usr ur = mp.usr.Where(x => x.Login == obj.Login).FirstOrDefault();
                balance bl = new balance();
                place p = new place();

                //Можно упростить задачу. Следующим коментируемым кодом
                /*  obj.id_alternative_location_place == obj.id_location_place
                 * то есть если место уже изменено на другое, то сделать автомобилисту бесплатную бронь(т.к. нарушена его потребность)
                 * соответственно проверка на то что лучше это место или хуже не понадобится вообще.
                 * 
                 * сейчас действует схема, что бронь бесплатна если новое выданное место хуже или его нет вообще. (риск он принимал в
                 * соглашении)
                */
                if (obj.id_alternative_location_place != null) {


                    if (Describe != "Reservation was used")
                    {
                        //освобождающее место либо достанется кому-то, либо переведтся в свободное состояние
                        p.FreePlace((long)obj.id_alternative_location_place);
                    }

                    //Эта проверка может непонадобится, если обдумать описанный комментарий выше.
                    if (p.bestornot((long)obj.id_location_place, (long)obj.id_alternative_location_place) == true ||
                        obj.id_alternative_location_place == obj.id_location_place)
                        {


                long span = 0;

                if (Describe == "Reservation was expired" | Describe == "Reservation was revoke")
                {
                    span = Convert.ToDateTime(Date).Ticks - Convert.ToDateTime(obj.DateConnection).Ticks;
                }
                else if (Describe == "Reservation was used")
                {



                    DateTime mydate = Convert.ToDateTime(obj.DateConnection).AddMinutes(obj.reservation_tariff.FirstFreeTimeInMinutes);
                    if (mydate <= Convert.ToDateTime(DateTime.Now.ToString("dd.MM.yy HH:mm")))
                    {
                        span = Convert.ToDateTime(Date).Ticks - mydate.Ticks;
                    }


                }





                    decimal priceinmin = (decimal)(obj.reservation_tariff.PriceInRubForHourHightFreeTime) / 60;

                            price = (decimal)TimeSpan.FromTicks(span).TotalMinutes * priceinmin;
                            ur.Now_Balance = ur.Now_Balance - price;
                            mp.Entry(ur).State = EntityState.Modified;
                            mp.SaveChanges();
                        }

                    
                    //Да и еще, расчеты делаются точно. Но не округлить ли баланс на выходе в лучшую сторону для автомобилиста, до копейки(сотых) хотя бы.
                }

                
                bl.Operation("Debit", price, (decimal)ur.Now_Balance, ur.Login, Describe, Date);
                
                result = true;
            }
            catch
            {
                result = false;
            }
            return result;
        }