//Сохранение private void mPutPostDirCurrency( DirCurrency dirCurrency, EntityState entityState, //EntityState.Added, Modified Classes.Account.Login.Field field //Для "ExistPay" ) { using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { #region 1. DirCurrency db.Entry(dirCurrency).State = entityState; db.SaveChanges(); #endregion #region 2. DirCurrencyHistory //Получаем историю DirCurrencyHistory dirCurrencyHistory = new DirCurrencyHistory(); dirCurrencyHistory.DirCurrencyID = Convert.ToInt32(dirCurrency.DirCurrencyID); dirCurrencyHistory.HistoryDate = DateTime.Now; dirCurrencyHistory.DirCurrencyID = dirCurrency.DirCurrencyID; dirCurrencyHistory.DirCurrencyRate = dirCurrency.DirCurrencyRate; dirCurrencyHistory.DirCurrencyMultiplicity = dirCurrency.DirCurrencyMultiplicity; //Алгоритм: // - Если не найдена, то создаём сразу запись, с датой = "1800-01-01", т.к. это первая запис в истории //1. Ищим дату самую блискую снизу вверх (Максимум) к дате "dirCurrencyHistory.DirCurrencyHistoryDate" // Возмоно 2-а варианта: "есть дата" и "нет даты" var queryMax = db.DirCurrencyHistories. Where(x => x.DirCurrencyID == dirCurrency.DirCurrencyID). GroupBy(g => new { g.HistoryDate, g.DirCurrencyHistoryID, g.DirCurrencyID, g.DirCurrencyRate, g.DirCurrencyMultiplicity }). Where(grp => grp.Max(m => m.HistoryDate) <= dirCurrencyHistory.HistoryDate). Select(x => x.Key).OrderByDescending(o => o.HistoryDate).FirstOrDefault(); //var queryMax = queryMax1.ToList(); //if (queryMax.Count() == 0) if (queryMax == null) { //2. Нет данных: "INSERT", создаем новую запись в Истории dirCurrencyHistory.HistoryDate = Convert.ToDateTime("1800-01-01"); db.Entry(dirCurrencyHistory).State = EntityState.Added; } else { //3.1. Если реквизиты совпадают, то ничего не делаем // - Если нет, то: // - Даты совпадают - UPDATE // - Даты не совпадают - INSERT //Если не совпадают реквизиты if ( queryMax.DirCurrencyID != dirCurrencyHistory.DirCurrencyID || queryMax.DirCurrencyRate != dirCurrencyHistory.DirCurrencyRate || queryMax.DirCurrencyMultiplicity != dirCurrencyHistory.DirCurrencyMultiplicity ) { if (Convert.ToDateTime(queryMax.HistoryDate).ToString("yyyy-MM-dd") == Convert.ToDateTime(dirCurrencyHistory.HistoryDate).ToString("yyyy-MM-dd")) { //"HistoryID" который надо обновить, т.к. обновляет по PK dirCurrencyHistory.DirCurrencyHistoryID = queryMax.DirCurrencyHistoryID; // - Даты совпадают - UPDATE db.Entry(dirCurrencyHistory).State = EntityState.Modified; } else { // - Даты не совпадают - INSERT db.Entry(dirCurrencyHistory).State = EntityState.Added; //3.2. Если следуящая запись (вверх, до этого нижнюю смотрели) равна (Rate, Multy) вставляемой, то удалить её! var queryMin = db.DirCurrencyHistories. Where(x => x.DirCurrencyID == dirCurrency.DirCurrencyID). GroupBy(g => new { g.HistoryDate, g.DirCurrencyHistoryID, g.DirCurrencyID, g.DirCurrencyRate, g.DirCurrencyMultiplicity }). Where(grp => grp.Min(m => m.HistoryDate) >= dirCurrencyHistory.HistoryDate). Select(x => x.Key). ToList(); if ( queryMin.Count() > 0 && queryMin[0].DirCurrencyID == dirCurrencyHistory.DirCurrencyID && queryMin[0].DirCurrencyRate == dirCurrencyHistory.DirCurrencyRate && queryMin[0].DirCurrencyMultiplicity == dirCurrencyHistory.DirCurrencyMultiplicity ) { DirCurrencyHistory dirCurrencyHistoryMin = db.DirCurrencyHistories.Find(queryMin[0].DirCurrencyHistoryID); db.Entry(dirCurrencyHistoryMin).State = EntityState.Deleted; } } } } db.SaveChanges(); #endregion #region 3. Подтверждение транзакции ts.Commit(); //.Complete(); #endregion } }
public async Task <IHttpActionResult> PostDirCurrency(DirCurrency dirCurrency) { #region Проверяем Логин и Пароль + Изменяем строку соединения + Права + Разные Функции //Получаем Куку System.Web.HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies["CookieIPOL"]; // Проверяем Логин и Пароль Classes.Account.Login.Field field = await Task.Run(() => login.Return(authCookie, true)); if (!field.Access) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg10))); } //Изменяем строку соединения db = new DbConnectionSklad(connectionString.Return(field.DirCustomersID, null, true)); //Права (1 - Write, 2 - Read, 3 - No Access) int iRight = await Task.Run(() => accessRight.Access(connectionString.Return(field.DirCustomersID, null, true), field.DirEmployeeID, "RightDirCurrencies")); if (iRight != 1) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg57(0)))); } //Разные Функции function.NumberDecimalSeparator(); //Получам настройки Models.Sklad.Sys.SysSetting sysSetting = await db.SysSettings.FindAsync(1); #endregion #region Проверки if (!ModelState.IsValid) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg91))); //return BadRequest(ModelState); } //Подстановки - некоторые поля надо заполнить, если они не заполены //dirCurrency.Substitute(); //Дополнительные проверки /*if (Convert.ToBoolean(dirCurrency.DirCurrencyActive)) * { * //Уникальность Логина * if (ExistLogin(dirCurrency)) return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg81)); * * //Корректность Логина * if (!CorrectLogin(dirCurrency)) return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg86)); * }*/ #endregion #region Сохранение try { //Используем метод, что бы было всё в одном потоке await Task.Run(() => mPutPostDirCurrency(dirCurrency, EntityState.Added, field)); #region 6. JourDisp *** *** *** *** *** *** *** *** *** * Models.Sklad.Sys.SysJourDisp sysJourDisp = new Models.Sklad.Sys.SysJourDisp(); sysJourDisp.DirDispOperationID = 3; //Добавление записи sysJourDisp.DirEmployeeID = field.DirEmployeeID; sysJourDisp.ListObjectID = ListObjectID; sysJourDisp.TableFieldID = dirCurrency.DirCurrencyID; sysJourDisp.Description = ""; try { sysJourDispsController.mPutPostSysJourDisps(db, sysJourDisp, EntityState.Added); } catch (Exception ex) { } #endregion dynamic collectionWrapper = new { ID = dirCurrency.DirCurrencyID }; return(Ok(returnServer.Return(true, collectionWrapper))); //return Ok(returnServer.Return(true, "")); } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } #endregion }