//Нужен для регистрации выезда, так же сойдет для отката(и истечения) брони: //Можно попробовать задействовать при включении места. Мое место включить и сразу все обновить, а альтернативное //уже не нужное отправить сюда 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 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; }