//Спецсимволы Логина private bool CorrectLogin(DirEmployee dirEmployee) { string sLg = dirEmployee.DirEmployeeLogin; if ( sLg.IndexOf("@") != -1 || sLg.IndexOf("!") != -1 || sLg.IndexOf("#") != -1 || sLg.IndexOf("$") != -1 || sLg.IndexOf("%") != -1 || sLg.IndexOf("^") != -1 || sLg.IndexOf("&") != -1 || sLg.IndexOf("*") != -1 || sLg.IndexOf("(") != -1 || sLg.IndexOf(")") != -1 || sLg.IndexOf("_") != -1 || sLg.IndexOf("+") != -1 || sLg.IndexOf("=") != -1 || sLg.IndexOf("{") != -1 || sLg.IndexOf("}") != -1 || sLg.IndexOf(";") != -1 || sLg.IndexOf(":") != -1 || sLg.IndexOf(@"\") != -1 || sLg.IndexOf("|") != -1 || sLg.IndexOf("<") != -1 || sLg.IndexOf(">") != -1 || sLg.IndexOf("?") != -1 || sLg.IndexOf("/") != -1 || sLg.IndexOf("'") != -1 || sLg.IndexOf(@"""") != -1 ) { return(false); } return(true); }
//Уникальный Логин private bool ExistLogin( DirEmployee dirEmployee ) { int iCount = ( from x in db.DirEmployees where x.DirEmployeeLogin == dirEmployee.DirEmployeeLogin && x.DirEmployeeID != dirEmployee.DirEmployeeID select x ).Count(); if (iCount > 0) { return(true); } else { return(false); } }
//Сохранение private void mPutPostDirEmployee( DirEmployee dirEmployee, EntityState entityState, //EntityState.Added, Modified Models.Sklad.Dir.DirEmployeeWarehouses[] dirEmployeeWarehousesCollection, Classes.Account.Login.Field field //Для "ExistPay" ) { using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { #region 1. DirEmployee db.Entry(dirEmployee).State = entityState; db.SaveChanges(); #endregion #region 2. dirEmployeeWarehouses *** *** *** *** *** *** *** *** *** *** //3.2. Удаляем все кроме существующих //3.2.1. Формируем запрос var query2 = ( from dirEmployeeWarehouse in db.DirEmployeeWarehouse where dirEmployeeWarehouse.DirEmployeeID == dirEmployee.DirEmployeeID // == id select dirEmployeeWarehouse ).ToList(); //3.2.2. Удаляем каждую запись отдельно foreach (var dirDiscountTab in query2) { try { db.Entry(dirDiscountTab).State = EntityState.Deleted; db.SaveChanges(); } catch (Exception ex) { ts.Rollback(); db.Database.Connection.Close(); throw new System.InvalidOperationException(Classes.Language.Sklad.Language.msg93 + ex.Message); } } //3.3. Проверяем, что бы склады не повторялись: for (int i = 0; i < dirEmployeeWarehousesCollection.Length; i++) { for (int j = i + 1; j < dirEmployeeWarehousesCollection.Length; j++) { //Суммы равны if (dirEmployeeWarehousesCollection[i].DirWarehouseID == dirEmployeeWarehousesCollection[j].DirWarehouseID) { ts.Rollback(); db.Database.Connection.Close(); throw new System.InvalidOperationException(Classes.Language.Sklad.Language.msg121); } } } //3.4 Сохраняем for (int i = 0; i < dirEmployeeWarehousesCollection.Count(); i++) { dirEmployeeWarehousesCollection[i].DirEmployeeID = Convert.ToInt32(dirEmployee.DirEmployeeID); db.Entry(dirEmployeeWarehousesCollection[i]).State = EntityState.Added; db.SaveChanges(); } //db.SaveChanges(); #endregion #region 2. DirEmployeeHistory //Получаем историю DirEmployeeHistory dirEmployeeHistory = new DirEmployeeHistory(); dirEmployeeHistory.DirEmployeeID = Convert.ToInt32(dirEmployee.DirEmployeeID); dirEmployeeHistory.HistoryDate = DateTime.Now; dirEmployeeHistory.DirCurrencyID = dirEmployee.DirCurrencyID; dirEmployeeHistory.Salary = dirEmployee.Salary; dirEmployeeHistory.SalaryDayMonthly = dirEmployee.SalaryDayMonthly; dirEmployeeHistory.DirBonusID = dirEmployee.DirBonusID; //Алгоритм: // - Если не найдена, то создаём сразу запись, с датой = "1800-01-01", т.к. это первая запис в истории //1. Ищим дату самую блискую снизу вверх (Максимум) к дате "dirEmployeeHistory.DirEmployeeHistoryDate" // Возмоно 2-а варианта: "есть дата" и "нет даты" var queryMax = db.DirEmployeeHistories. Where(x => x.DirEmployeeID == dirEmployee.DirEmployeeID). GroupBy(g => new { g.HistoryDate, g.DirEmployeeHistoryID, g.DirCurrencyID, g.Salary, g.DirBonusID, g.SalaryDayMonthly }). Where(grp => grp.Max(m => m.HistoryDate) <= dirEmployeeHistory.HistoryDate). Select(x => x.Key).OrderByDescending(o => o.HistoryDate).FirstOrDefault(); //var queryMax = queryMax1.ToList(); //if (queryMax.Count() == 0) if (queryMax == null) { //2. Нет данных: "INSERT", создаем новую запись в Истории dirEmployeeHistory.HistoryDate = Convert.ToDateTime("1800-01-01"); db.Entry(dirEmployeeHistory).State = EntityState.Added; } else { //3.1. Если реквизиты совпадают, то ничего не делаем // - Если нет, то: // - Даты совпадают - UPDATE // - Даты не совпадают - INSERT //Если не совпадают реквизиты if ( queryMax.DirCurrencyID != dirEmployeeHistory.DirCurrencyID || queryMax.Salary != dirEmployeeHistory.Salary || queryMax.DirBonusID != dirEmployeeHistory.DirBonusID || queryMax.SalaryDayMonthly != dirEmployeeHistory.SalaryDayMonthly ) { if (Convert.ToDateTime(queryMax.HistoryDate).ToString("yyyy-MM-dd") == Convert.ToDateTime(dirEmployeeHistory.HistoryDate).ToString("yyyy-MM-dd")) { //"HistoryID" который надо обновить, т.к. обновляет по PK dirEmployeeHistory.DirEmployeeHistoryID = queryMax.DirEmployeeHistoryID; // - Даты совпадают - UPDATE db.Entry(dirEmployeeHistory).State = EntityState.Modified; } else { // - Даты не совпадают - INSERT db.Entry(dirEmployeeHistory).State = EntityState.Added; //3.2. Если следуящая запись (вверх, до этого нижнюю смотрели) равна (Rate, Multy) вставляемой, то удалить её! var queryMin = db.DirEmployeeHistories. Where(x => x.DirEmployeeID == dirEmployee.DirEmployeeID). GroupBy(g => new { g.HistoryDate, g.DirEmployeeHistoryID, g.DirCurrencyID, g.Salary, g.DirBonusID, g.SalaryDayMonthly }). Where(grp => grp.Min(m => m.HistoryDate) >= dirEmployeeHistory.HistoryDate). Select(x => x.Key). ToList(); if ( queryMin.Count() > 0 && queryMin[0].DirCurrencyID == dirEmployeeHistory.DirCurrencyID && queryMin[0].Salary == dirEmployeeHistory.Salary && queryMin[0].DirBonusID == dirEmployeeHistory.DirBonusID && queryMin[0].SalaryDayMonthly == dirEmployeeHistory.SalaryDayMonthly ) { DirEmployeeHistory dirEmployeeHistoryMin = db.DirEmployeeHistories.Find(queryMin[0].DirEmployeeHistoryID); db.Entry(dirEmployeeHistoryMin).State = EntityState.Deleted; } } } } db.SaveChanges(); #endregion #region 3. Подтверждение транзакции ts.Commit(); //.Complete(); #endregion } }
public async Task <IHttpActionResult> PostDirEmployee(DirEmployee dirEmployee) { #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, "RightDirEmployees")); 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 Параметры //Получаем колекцию "Табличную часть" Models.Sklad.Dir.DirEmployeeWarehouses[] dirEmployeeWarehousesCollection = null; if (!String.IsNullOrEmpty(dirEmployee.recordsDirEmployeeWarehouses)) { JavaScriptSerializer serializer = new JavaScriptSerializer(); dirEmployeeWarehousesCollection = serializer.Deserialize <Models.Sklad.Dir.DirEmployeeWarehouses[]>(dirEmployee.recordsDirEmployeeWarehouses); } for (int i = 0; i < dirEmployeeWarehousesCollection.Count(); i++) { Models.Sklad.Dir.DirEmployeeWarehouses dirEmployeeWarehouses = dirEmployeeWarehousesCollection[i]; if (dirEmployeeWarehouses.IsAdminNameRu.ToString().ToLower() == "администратор") { dirEmployeeWarehouses.IsAdmin = true; } else { dirEmployeeWarehouses.IsAdmin = false; } if (dirEmployeeWarehouses.WarehouseAllNameRu.ToString().ToLower() == "виден" && Convert.ToBoolean(dirEmployee.RightDocServicePurchesWarehouseAllCheck)) { dirEmployeeWarehouses.WarehouseAll = true; } else { dirEmployeeWarehouses.WarehouseAll = false; } dirEmployeeWarehousesCollection[i] = dirEmployeeWarehouses; } #endregion #region Проверки if (!ModelState.IsValid) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg91))); //return BadRequest(ModelState); } //Подстановки - некоторые поля надо заполнить, если они не заполены dirEmployee.Substitute(); //Дополнительные проверки if (Convert.ToBoolean(dirEmployee.DirEmployeeActive)) { //Уникальность Логина if (ExistLogin(dirEmployee)) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg81))); } //Корректность Логина if (!CorrectLogin(dirEmployee)) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg86))); } } //ЗП: Если есть фиксированный оклад "SalaryFixedSalesMount>0", то тоогда или "Salary=0" или "Salary>0 and SalaryDayMonthly=1" if ( dirEmployee.SalaryFixedSalesMount > 0 && dirEmployee.Salary > 0 && dirEmployee.SalaryDayMonthly == 2 ) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg125))); } #endregion #region Сохранение try { //Используем метод, что бы было всё в одном потоке await Task.Run(() => mPutPostDirEmployee(dirEmployee, EntityState.Added, dirEmployeeWarehousesCollection, 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 = dirEmployee.DirEmployeeID; sysJourDisp.Description = ""; try { sysJourDispsController.mPutPostSysJourDisps(db, sysJourDisp, EntityState.Added); } catch (Exception ex) { } #endregion dynamic collectionWrapper = new { ID = dirEmployee.DirEmployeeID }; return(Ok(returnServer.Return(true, collectionWrapper))); //return Ok(returnServer.Return(true, "")); } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } #endregion }