public async Task <IHttpActionResult> PostDocSalary(DocSalary docSalary, HttpRequestMessage request) { try { #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)); dbRead = 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, "RightDocSalaries")); 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 Параметры //save, save_close, held, held_cancel var paramList = request.GetQueryNameValuePairs(); string UO_Action = paramList.FirstOrDefault(kv => string.Compare(kv.Key, "UO_Action", true) == 0).Value; if (UO_Action == null) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg101))); } UO_Action = UO_Action.ToLower(); //Получаем колекцию "Спецификации" Models.Sklad.Doc.DocSalaryTab[] docSalaryTabCollection = null; if (!String.IsNullOrEmpty(docSalary.recordsDocSalaryTab)) { JavaScriptSerializer serializer = new JavaScriptSerializer(); docSalaryTabCollection = serializer.Deserialize <Models.Sklad.Doc.DocSalaryTab[]>(docSalary.recordsDocSalaryTab); } #endregion #region Проверки if (!ModelState.IsValid) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg91))); //return BadRequest(ModelState); } /* * //Получаем "docSalary.DocID" из БД, если он отличается от пришедшего от клиента "docSalary.DocID" выдаём ошибку * //Были проблемы, кодга на один "DocID" числилось 2-а документа, а то и больше * var query = await Task.Run(() => * ( * from x in dbRead.DocSalaries * where x.DocSalaryID == docSalary.DocSalaryID * select x * ).ToListAsync()); * * if (query.Count() > 0) * if (query[0].DocID != docSalary.DocID) * return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg8)); //return BadRequest(); * * //dbRead.Database.Connection.Close(); */ //Подстановки - некоторые поля надо заполнить, если они не заполены (Юридические реквизиты) docSalary.Substitute(); #endregion #region Сохранение //using (TransactionScope ts = new TransactionScope()) using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { db.Configuration.AutoDetectChangesEnabled = false; try { //Используем метод, что бы было всё в одном потоке docSalary = await Task.Run(() => mPutPostDocSalary(db, dbRead, UO_Action, docSalary, EntityState.Added, docSalaryTabCollection, field)); //sysSetting ts.Commit(); //.Complete(); } catch (Exception ex) { try { ts.Rollback(); ts.Dispose(); } catch { } try { db.Database.Connection.Close(); db.Database.Connection.Dispose(); } catch { } return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } } #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 = docSalary.DocSalaryID; sysJourDisp.Description = ""; try { sysJourDispsController.mPutPostSysJourDisps(db, sysJourDisp, EntityState.Added); } catch (Exception ex) { } #endregion dynamic collectionWrapper = new { DocID = docSalary.DocID, DocSalaryID = docSalary.DocSalaryID }; return(Ok(returnServer.Return(true, collectionWrapper))); //return Ok(returnServer.Return(true, "")); #endregion } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } }
internal async Task <DocSalary> mPutPostDocSalary( DbConnectionSklad db, DbConnectionSklad dbRead, string UO_Action, //DbConnectionSklad dbRead, //Models.Sklad.Sys.SysSetting sysSetting, DocSalary docSalary, //bool InsertUpdate, //true - Insert, false - Update EntityState entityState, //EntityState.Added, Modified Models.Sklad.Doc.DocSalaryTab[] docSalaryTabCollection, Classes.Account.Login.Field field //Дополнительные данные о сотруднике ) { if (UO_Action == "save" || UO_Action == "save_close" || UO_Action == "held") { #region 1. Doc //Модель Models.Sklad.Doc.Doc doc = new Models.Sklad.Doc.Doc(); //Присваиваем значения doc.ListObjectID = ListObjectID; doc.IsImport = false; doc.NumberInt = docSalary.NumberInt; doc.NumberReal = docSalary.DocSalaryID; doc.DirEmployeeID = field.DirEmployeeID; //doc.DirPaymentTypeID = docSalary.DirPaymentTypeID; doc.Payment = 0; //docSalary.Payment; doc.DirContractorID = docSalary.DirContractorIDOrg; doc.DirContractorIDOrg = docSalary.DirContractorIDOrg; doc.Discount = docSalary.Discount; doc.DirVatValue = 0; doc.Base = docSalary.Base; doc.Description = docSalary.Description; doc.DocDate = docSalary.DocDate; //doc.DocDisc = docSalary.DocDisc; if (UO_Action == "held") { doc.Held = true; } else { doc.Held = false; } doc.DocID = docSalary.DocID; doc.DocIDBase = docSalary.DocIDBase; //Класс Docs.Docs docs = new Docs.Docs(db, dbRead, doc, entityState); //doc = await docs.Save(); await Task.Run(() => docs.Save()); //Нужно вернуть "docSalary" со всем полями! docSalary.DocID = doc.DocID; #endregion #region 2. DocSalary docSalary.DocID = doc.DocID; db.Entry(docSalary).State = entityState; await db.SaveChangesAsync(); #region 2.1. UpdateNumberInt, если INSERT if (entityState == EntityState.Added && (docSalary.doc.NumberInt == null || docSalary.doc.NumberInt.Length == 0)) { doc.NumberInt = docSalary.DocSalaryID.ToString(); doc.NumberReal = docSalary.DocSalaryID; docs = new Docs.Docs(db, dbRead, doc, EntityState.Modified); await Task.Run(() => docs.Save()); } else if (entityState == EntityState.Added) { doc.NumberReal = docSalary.DocSalaryID; docs = new Docs.Docs(db, dbRead, doc, EntityState.Modified); await Task.Run(() => docs.Save()); } #endregion #endregion #region 3. DocSalaryTab //2.1. Удаляем записи в БД, если UPDATE if (entityState == EntityState.Modified) { SQLiteParameter parDocSalaryID = new SQLiteParameter("@DocSalaryID", System.Data.DbType.Int32) { Value = docSalary.DocSalaryID }; db.Database.ExecuteSqlCommand("DELETE FROM DocSalaryTabs WHERE DocSalaryID=@DocSalaryID;", parDocSalaryID); } //2.2. Проставляем ID-шник "DocSalaryID" для всех позиций спецификации for (int i = 0; i < docSalaryTabCollection.Count(); i++) { docSalaryTabCollection[i].DocSalaryTabID = null; docSalaryTabCollection[i].DocSalaryID = Convert.ToInt32(docSalary.DocSalaryID); db.Entry(docSalaryTabCollection[i]).State = EntityState.Added; } await db.SaveChangesAsync(); #endregion } #region n. Подтверждение транзакции *** *** *** *** *** * //ts.Commit(); //.Complete(); #endregion return(docSalary); }