//Нужен для регистрации выезда, так же сойдет для отката(и истечения) брони: //Можно попробовать задействовать при включении места. Мое место включить и сразу все обновить, а альтернативное //уже не нужное отправить сюда 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; }
public string AddPlace(Int32 id_loc_level, Int32 amount_added_place, string Status, long id_tariff_on_place) { string Result = ""; reservation expired = new reservation(); expired.FindOnExpired(""); place last = mp.place.Where(x => x.id_location_level == id_loc_level & x.Status != "Was replaced" & x.Status != "Disabled").OrderByDescending(x => x.NumberPlace).FirstOrDefault(); Int32 last_place = 0; if (last != null) { last_place = last.NumberPlace+1; } else { last_place = 1; } for (int i = last_place; i < last_place + amount_added_place; i++) { place disabled = mp.place.Where(x => x.id_location_level == id_loc_level & x.Status == "Disabled" & x.NumberPlace == i).FirstOrDefault(); place change = new place(); if (disabled != null) { reservation res = mp.reservation.Where(x => x.Status == "Active" & (x.id_location_place == disabled.id_location_place)).FirstOrDefault(); if (res != null) { if (Status == "Free" & disabled.id_tariff_on_place == id_tariff_on_place) { if (res.id_alternative_location_place != null) { change.FreePlace((long)res.id_alternative_location_place); } res.id_alternative_location_place = (int)disabled.id_location_place; mp.Entry(res).State = EntityState.Modified; mp.SaveChanges(); change.ChangeStatus("In waiting visit", disabled.id_location_place, 0); //Т.е. админ должен потом решить включить ли то место с со СТАРЫМ тарифом или ждать пока бронь кончится, //а потом как доступ к изменению тарифу будет открыт(как закончится бронь) он его изменит и включит. //Совпадающий тариф учитывается } else if (Status == "Free" & disabled.id_tariff_on_place != id_tariff_on_place) { change.ChangeStatus("Not working", disabled.id_location_place, 0); Result = "0"; } if (Status != "Free" & disabled.id_tariff_on_place != id_tariff_on_place) { if (Result != "0") { Result = "1"; } change.ChangeStatus("Not working", disabled.id_location_place, 0); } else if (Status != "Free" & disabled.id_tariff_on_place == id_tariff_on_place) { change.ChangeStatus("Not working", disabled.id_location_place, 0); } } else { disabled.Status = Status; disabled.id_tariff_on_place = id_tariff_on_place; disabled.id_alternative_tariff_on_place = (int)id_tariff_on_place; mp.Entry(disabled).State = EntityState.Modified; mp.SaveChanges(); if (Status == "Free") { change.FreePlace((long)disabled.id_location_place); } } } else { place di = mp.place.Where(x => x.id_location_level == id_loc_level & x.Status == "Occupied" & x.NumberPlace == i).FirstOrDefault(); if (di == null) { place new_place = new place(); new_place.NumberPlace = i; new_place.Status = Status; new_place.id_tariff_on_place = id_tariff_on_place; new_place.id_alternative_tariff_on_place = (int)id_tariff_on_place; new_place.id_location_level = id_loc_level; mp.place.Add(new_place); mp.SaveChanges(); if (Status == "Free") { place new_place_search = mp.place.Where(x => x.NumberPlace == i & x.Status == Status & x.id_tariff_on_place == id_tariff_on_place & x.id_location_level == id_loc_level & x.id_alternative_tariff_on_place == (int)id_tariff_on_place).FirstOrDefault(); change.FreePlace((long)new_place_search.id_location_place); } } } } if (Result == "0") { Result = "К некоторым местам смена тарифа будет доступна по истечении действия активных записей бронирований, которые прикреплены к этим местам. К местам, к которым не удалось произвести смену тарифа, был присвоен статус 'Not working', их можно так же включить не меняя тариф, перейдя в просмотр мест этого уровня."; } else if (Result == "1") { Result = "К некоторым местам не удалось произвести смену тарифа, поскольку их ожидают активные записи бронирования. Смена тарифа будет доступна по истечении действия активных записей бронирований."; } return Result; }
public string Run_this_level(Int32 id_loc_level) { string Result = ""; reservation expired = new reservation(); expired.FindOnExpired(""); int ap = mp.place.Count(x => x.id_location_level == id_loc_level & x.Status != "Was replaced" & x.Status != "Disabled"); for (int i = 0; i <= ap; i++) { place not_working_place = mp.place.Where(x => x.id_location_level == id_loc_level & x.NumberPlace == i & x.Status == "Not working").FirstOrDefault(); if (not_working_place != null) { place change = new place(); reservation res = mp.reservation.Where(x => x.Status == "Active" & (x.id_location_place == not_working_place.id_location_place)).FirstOrDefault(); if (res != null) { if (res.id_alternative_location_place != null) { change.FreePlace((long)res.id_alternative_location_place); } res.id_alternative_location_place = (int)not_working_place.id_location_place; mp.Entry(res).State = EntityState.Modified; mp.SaveChanges(); change.ChangeStatus("In waiting visit", not_working_place.id_location_place, 0); } else { change.FreePlace((long)not_working_place.id_location_place); } } } return Result; }
public ActionResult Start_work(Int32 id_location_level, Int32 id_loc_pl, FormCollection form) { ViewData["ActiveTariffs"] = mp.tariffonplace.Where(x => x.Status == "Active"); reservation expired = new reservation(); expired.FindOnExpired(""); place not_working_place = mp.place.Where(x => x.id_location_place == id_loc_pl).FirstOrDefault(); if (not_working_place.Status == "Not working") { place change = new place(); reservation res = mp.reservation.Where(x => x.Status == "Active" & (x.id_location_place == id_loc_pl)).FirstOrDefault(); if (res != null) { if (res.id_alternative_location_place != null) { change.FreePlace((long)res.id_alternative_location_place); } res.id_alternative_location_place = id_loc_pl; mp.Entry(res).State = EntityState.Modified; mp.SaveChanges(); change.ChangeStatus("In waiting visit", id_loc_pl, 0); } else { change.FreePlace((long)id_loc_pl); } } ViewData["Reservation"] = ""; ViewData["Zone-Level"] = "Зона №" + Convert.ToString(not_working_place.levelzone.Parking_zone) + " ; Уровень:" + Convert.ToString(not_working_place.levelzone.Level) + " ; Тип уровня: " + not_working_place.levelzone.TypeLevel; ViewData["ReservationPlace"] = "Место №" + not_working_place.NumberPlace + " было успешно переведено в активное состояние."; return View(mp.place.Where(x => x.id_location_level == id_location_level & (x.Status == "Free" || x.Status == "Not working" || x.Status == "In waiting visit")).OrderBy(x => x.NumberPlace).ToList()); }
public ActionResult RegisterOut(ts numb) { ViewData["ActiveVisit"] = mp.visit.Where(x => x.DateOut == "dateout").ToList(); if (ModelState.IsValidField("Number")) { ts searchts = mp.ts.Where(x => x.Number == numb.Number & x.Status == "True").FirstOrDefault(); if (searchts != null) { usingtariffonabonementforvisit expiredabonement = new usingtariffonabonementforvisit(); expiredabonement.ExpiredAbonement(searchts.Login); visit vis = mp.visit.Where(x => x.id_ts == searchts.id_ts & x.DateOut == "dateout").FirstOrDefault(); if (vis != null) { Int64 id_abonement_u = 0; bool dual = false; tariffonplace top = mp.tariffonplace.Where(x => x.id_tariff_on_place == vis.place.id_alternative_tariff_on_place).FirstOrDefault(); decimal PriceForPlace = 0; usingtariffonabonementforvisit abontar = mp.usingtariffonabonementforvisit.Where(x => x.Login == searchts.Login & x.Status == "Active").FirstOrDefault(); if (abontar != null) { PriceForPlace = top.PriceForHourWithAbonement; } else { var searchab = mp.usingtariffonabonementforvisit.Where(x => x.Status == "Not active" & x.Login == searchts.Login).ToList(); int count = searchab.Count(); int i = 0; foreach (var s1 in searchab) { DateTime max = Convert.ToDateTime(s1.DateOutFromActivity); foreach (var maxdate in searchab) { if (i < count) { if (max >= Convert.ToDateTime(maxdate.DateConnection)) { max = Convert.ToDateTime(maxdate.DateConnection); if (max > Convert.ToDateTime(vis.DateIn)) { id_abonement_u = maxdate.id_abonement; } } i++; } else { break; } } break; } if (id_abonement_u != 0) { //Осталось учесть, если абонемент который на время сдох во время стоянки. //Тогда поделить на 2 части. Первая по абонементской цене до этой даты, вторая по обычной, после выхода абонемента из строя //Делаю в этой ветке, т.к. автомобилист уже мог подключить новый абонемент, а эта ветка происходит если нового //не было найдено //Причем это пригодится только для первой попытки выезда. dual = true; } PriceForPlace = top.PriceForHourWithoutAbonement; } string Date = DateTime.Now.ToString("dd.MM.yy HH:mm"); decimal price = 0; usr ur = mp.usr.Where(x => x.Login == searchts.Login).FirstOrDefault(); balance bl = new balance(); place p = new place(); int y = 0; if (vis.FirstAttemptGoOut == "dateout2") { //В минуты время простоя. long span = 0; DateTime timein = Convert.ToDateTime(vis.DateIn).AddMinutes(vis.visitparameters.FirstFreeTimeInMinutes); if (timein < Convert.ToDateTime(Date)) { if (dual == false) { span = Convert.ToDateTime(Date).Ticks - timein.Ticks; //наличие абонемента играет роль decimal priceinmin = (decimal)(PriceForPlace) / 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, "Register Out. First Attempt.", Date); } else { usingtariffonabonementforvisit uab = mp.usingtariffonabonementforvisit.Where(x => x.id_abonement == id_abonement_u).FirstOrDefault(); long span2 = 0; span = Convert.ToDateTime(uab.DateOutFromActivity).Ticks - timein.Ticks; span2 = Convert.ToDateTime(Date).Ticks - Convert.ToDateTime(uab.DateOutFromActivity).Ticks; decimal priceinmin1 = (decimal)(top.PriceForHourWithoutAbonement) / 60; decimal priceinmin2 = (decimal)(top.PriceForHourWithAbonement) / 60; price = ((decimal)TimeSpan.FromTicks(span).TotalMinutes * priceinmin1) + ((decimal)TimeSpan.FromTicks(span2).TotalMinutes * priceinmin2); 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, "Register Out. First Attempt. With a both price, because your abonement was disabled during idle time", Date); } } MyParkingEntities updout = new MyParkingEntities(); vis.FirstAttemptGoOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); y = 1; } if (y == 0) { if (vis.FirstAttemptGoOut != "dateout2" & vis.NextAttemptGoOut == "dateout3") { long span = Convert.ToDateTime(Date).Ticks - Convert.ToDateTime(vis.FirstAttemptGoOut).Ticks; decimal minutes = (decimal)TimeSpan.FromTicks(span).TotalMinutes - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans; if (minutes > 0) { price = Math.Abs(minutes) * ((decimal)PriceForPlace / 60); 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, "Register Out. Second Attempt", Date); } y = 1; MyParkingEntities updout = new MyParkingEntities(); vis.NextAttemptGoOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); } } if (y == 0) { if (vis.NextAttemptGoOut != "dateout3") { //Сколько прошло от той попытки. long span = Convert.ToDateTime(Date).Ticks - Convert.ToDateTime(vis.NextAttemptGoOut).Ticks; decimal minutesnow = (decimal)TimeSpan.FromTicks(span).TotalMinutes; // //Для дальнейшего определения использован ли параметр бесплатного времени на покрытие брони. long span2 = Convert.ToDateTime(vis.NextAttemptGoOut).Ticks - Convert.ToDateTime(vis.FirstAttemptGoOut).Ticks; decimal minutes = (decimal)TimeSpan.FromTicks(span2).TotalMinutes; //decimal minutes2 = (decimal)TimeSpan.FromTicks(span2).TotalMinutes - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans; if (minutes - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans >= 0) { price = Math.Abs(minutesnow) * ((decimal)PriceForPlace / 60); 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, "Register Out. Next Attempt.", Date); //y = 1; MyParkingEntities updout = new MyParkingEntities(); vis.NextAttemptGoOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); } else if (minutes - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans < 0) { if ((minutes + minutesnow - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans) < 0) { MyParkingEntities updout = new MyParkingEntities(); vis.NextAttemptGoOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); } else if ((minutes + minutesnow - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans) >= 0) { price = Math.Abs((minutes + minutesnow - (decimal)vis.visitparameters.FirstFreeTimeOnChangeBalans)) * ((decimal)PriceForPlace / 60); 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, "Register Out. Next Attempt.", Date); //y = 1; MyParkingEntities updout = new MyParkingEntities(); vis.NextAttemptGoOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); } } } } if (searchts.usr.Now_Balance >= 0) { //Если абонемент на кол-во посещений, то прибавить единицу и проверить не истек ли и если да, то сразу здесь же закрыть. vis.DateOut = Date; mp.Entry(vis).State = EntityState.Modified; mp.SaveChanges(); place fp = new place(); fp.FreePlace(vis.id_location_place); //разделить эти изменения по методам возникает ошибка. // usingtariffonabonementforvisit abontar2 = mp.usingtariffonabonementforvisit.Where(x => x.Name_tariff_on_abonement == abontar.Name_tariff_on_abonement).FirstOrDefault(); //MyParkingEntities forabonement = new MyParkingEntities(); if (abontar != null) { abontar.NumOfVisitsMadeWithUsingThisTariff = abontar.NumOfVisitsMadeWithUsingThisTariff + 1; mp.Entry(abontar).State = EntityState.Modified; mp.SaveChanges(); usingtariffonabonementforvisit afterupdabontar = mp.usingtariffonabonementforvisit.Where(x => x.Login == searchts.Login & x.Status == "Active").FirstOrDefault(); if (abontar.tariffonabonementforvisit.Max_Num_visits_in_this_tariff != null) { if (abontar.tariffonabonementforvisit.Max_Num_visits_in_this_tariff == afterupdabontar.NumOfVisitsMadeWithUsingThisTariff) { abontar.Status = "Expired"; abontar.DateOutFromActivity = Date; mp.Entry(abontar).State = EntityState.Modified; mp.SaveChanges(); } } } } else { ViewData["ExceptionRegisterOut"] = "Баланс отрицателен, полный выезд невозможен"; return View("RegisterOut"); } } else { ViewData["ExceptionRegisterOut"] = "Возможно, Вы ошиблись при вводе регистрационного номера, т.к. указанное вами ТС на парковке не найдено"; return View("RegisterOut"); } } else { ViewData["ExceptionRegisterOut"] = "Возможно, Вы ошиблись при вводе регистрационного номера, т.к. указанное вами TC не найдено в бд"; return View("RegisterOut"); } return RedirectToAction("Index", new { Controller = "Home"}); } else { return View("RegisterOut"); } }
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; }