internal async Task <Models.Sklad.Doc.Doc> Save() { //Проверка Удалён ли документ, если удалён, то не сохранять if (await Deleted()) { throw new System.InvalidOperationException(Classes.Language.Sklad.Language.msg85); } //Проверка Инвентаризирован ли документ, если Инвентаризирован, то не сохранять //if (Convert.ToBoolean(doc.Held) && await Inv()) { throw new System.InvalidOperationException(Classes.Language.Sklad.Language.msg85_1); } //if (Convert.ToBoolean(doc.Held)) { await Inv(); } await Inv(); //Дата проведения if (!Convert.ToBoolean(doc.Held)) { doc.DocDateHeld = doc.DocDate; } else { doc.DocDateHeld = DateTime.Now; } if (entityState == EntityState.Added) { doc.DocDateCreate = DateTime.Now; } //Дата оплаты (проверить, если нет оплаты, то ставить дату Документа) if (doc.Payment == 0) { doc.DocDatePayment = doc.DocDate; } else { if (doc.DocDatePayment == null) { Models.Sklad.Doc.Doc docX = await dbRead.Docs.FindAsync(doc.DocID); doc.DocDatePayment = docX.DocDatePayment; } } //Сохраянем if (doc.DirPaymentTypeID == null) { doc.DirPaymentTypeID = 1; } db.Entry(doc).State = entityState; await db.SaveChangesAsync(); return(doc); }
internal int DirContractorIDOrg = 0; //Пока не используется //Метод для передачи данных в переменные internal Docs( DbConnectionSklad _db, DbConnectionSklad _dbRead, Models.Sklad.Doc.Doc _doc, EntityState _entityState //EntityState.Added, Modified ) { db = _db; if (_dbRead != null) { dbRead = _dbRead; } else { dbRead = _db; } doc = _doc; entityState = _entityState; }
internal async Task <DocServicePurch2Tab> mPutPostDocServicePurch2Tab( DbConnectionSklad db, Models.Sklad.Doc.DocServicePurch docServicePurch, DocServicePurch2Tab docServicePurch2Tab, Classes.Account.Login.Field field //Дополнительные данные о сотруднике ) { #region Лог //Пишем в Лог о смене статуса и мастера, если такое было logService.DocServicePurchID = docServicePurch2Tab.DocServicePurchID; logService.DirServiceLogTypeID = 6; logService.DirEmployeeID = field.DirEmployeeID; logService.DirServiceStatusID = null; if (docServicePurch2Tab.DocServicePurch2TabID == null) { logService.Msg = "Создание записи " + docServicePurch2Tab.DirNomenName + " на сумму " + docServicePurch2Tab.PriceCurrency; } else { logService.Msg = "Изменение записи " + docServicePurch2Tab.DirNomenName + " на сумму " + docServicePurch2Tab.PriceCurrency; } await logServicesController.mPutPostLogServices(db, logService, EntityState.Added); #endregion #region Save docServicePurch2Tab.TabDate = DateTime.Now; if (docServicePurch2Tab.DocServicePurch2TabID > 0) { db.Entry(docServicePurch2Tab).State = EntityState.Modified; } else { db.Entry(docServicePurch2Tab).State = EntityState.Added; } await Task.Run(() => db.SaveChangesAsync()); #endregion #region Партии *** *** *** *** *** *** *** *** Controllers.Sklad.Rem.RemPartyMinusesController remPartyMinuses = new Rem.RemPartyMinusesController(); //Находим "DocServicePurch" по "docServicePurch2Tab.DocServicePurchID" //Models.Sklad.Doc.DocServicePurch docServicePurch = await db.DocServicePurches.FindAsync(docServicePurch2Tab.DocServicePurchID); Models.Sklad.Doc.Doc doc = await db.Docs.FindAsync(docServicePurch.DocID); #region Ищим в Возврате покупателя, если нет, то удаляем в RemPartyMinuses *** *** *** *** *** //Ищим в Возврате покупателя var queryRemPartyMinuses = await ( from x in db.RemPartyMinuses where x.DocID == docServicePurch.DocID select x ).ToListAsync(); for (int i = 0; i < queryRemPartyMinuses.Count(); i++) { int iRemPartyMinusID = Convert.ToInt32(queryRemPartyMinuses[i].RemPartyMinusID); var queryDocReturnsCustomerTab = await ( from x in db.DocReturnsCustomerTabs where x.RemPartyMinusID == iRemPartyMinusID select x ).ToListAsync(); if (queryDocReturnsCustomerTab.Count() > 0) { throw new System.InvalidOperationException( Classes.Language.Sklad.Language.msg117 + "<tr>" + "<td>" + queryDocReturnsCustomerTab[0].RemPartyMinusID + "</td>" + //партия списания "<td>" + queryDocReturnsCustomerTab[0].DocReturnsCustomerID + "</td>" + //№ д-та "<td>" + queryDocReturnsCustomerTab[0].DirNomenID + "</td>" + //Код товара "<td>" + queryDocReturnsCustomerTab[0].Quantity + "</td>" + //списуемое к-во "</tr>" + "</table>" + Classes.Language.Sklad.Language.msg117_1 ); } //1.1. Удаляем "RemPartyMinuses" - не удаляем!!! //Models.Sklad.Rem.RemPartyMinus _remPartyMinus = await db.RemPartyMinuses.FindAsync(iRemPartyMinusID); //db.RemPartyMinuses.Remove(_remPartyMinus); //await db.SaveChangesAsync(); } #endregion #region Удаляем все записи из таблицы "RemPartyMinuses" - не удаляем!!! //Удаляем все записи из таблицы "RemPartyMinuses" //Что бы правильно Проверяло на Остаток. //А то, товар уже списан, а я проверяю на остаток! //await Task.Run(() => remPartyMinuses.Delete(db, Convert.ToInt32(docServicePurch.DocID))); //remPartyMinuses.Delete(db, Convert.ToInt32(doc.DocID))); #endregion #region Проверки и Списание с партий (RemPartyMinuses) #region Проверка //Переменные int iRemPartyID = docServicePurch2Tab.RemPartyID; double dQuantity = 1; // docServicePurch2Tab.Quantity; //Находим партию Models.Sklad.Rem.RemParty remParty = await db.RemParties.FindAsync(iRemPartyID); db.Entry(remParty).Reload(); // - Это Важно! Триггер изменил значения, то они НЕ видны в проекте, надо обновить значения!!! #region 1. Есть ли остаток в партии с которой списываем! if (remParty.Remnant < dQuantity) { throw new System.InvalidOperationException( Classes.Language.Sklad.Language.msg104 + "<tr>" + "<td>" + docServicePurch2Tab.RemPartyID + "</td>" + //партия "<td>" + docServicePurch2Tab.DirNomenID + "</td>" + //Код товара "<td>1</td>" + //"<td>" + docServicePurch2Tab.Quantity + "</td>" //списуемое к-во "<td>" + remParty.Remnant + "</td>" + //остаток партии "<td>" + (1 - remParty.Remnant).ToString() + "</td>" + //"<td>" + (docServicePurch2Tab.Quantity - remParty.Remnant).ToString() + "</td>" //недостающее к-во "</tr>" + "</table>" + Classes.Language.Sklad.Language.msg104_1 ); } #endregion #region 2. Склад: склад документа должен соответствовать каждой списуемой партии! if (remParty.DirWarehouseID != docServicePurch.DirWarehouseID) { //Это нужно, т.к. к нам от клиента не пришли все значения модели: "docServicePurch.dirWarehouse.DirWarehouseName" Models.Sklad.Dir.DirWarehouse dirWarehouse = await db.DirWarehouses.FindAsync(docServicePurch.DirWarehouseID); throw new System.InvalidOperationException( Classes.Language.Sklad.Language.msg105 + "<tr>" + "<td>" + docServicePurch2Tab.RemPartyID + "</td>" + //партия "<td>" + docServicePurch2Tab.DirNomenID + "</td>" + //Код товара "<td>" + dirWarehouse.DirWarehouseName + "</td>" + //склад документа "<td>" + remParty.dirWarehouse.DirWarehouseName + "</td>" + //склад партии "</tr>" + "</table>" + Classes.Language.Sklad.Language.msg105_1 ); } #endregion #region 3. Организация: организация документа должен соответствовать каждой списуемой партии! if (remParty.DirContractorIDOrg != doc.DirContractorIDOrg) { //Это нужно, т.к. к нам от клиента не пришли все значения модели: "docServicePurch.dirWarehouse.DirWarehouseName" Models.Sklad.Dir.DirContractor dirContractor = await db.DirContractors.FindAsync(doc.DirContractorIDOrg); throw new System.InvalidOperationException( Classes.Language.Sklad.Language.msg106 + "<tr>" + "<td>" + docServicePurch2Tab.RemPartyID + "</td>" + //партия "<td>" + docServicePurch2Tab.DirNomenID + "</td>" + //Код товара "<td>" + dirContractor.DirContractorName + "</td>" + //организация спецификации "<td>" + remParty.dirContractorOrg.DirContractorName + "</td>" + //организация партии "</tr>" + "</table>" + Classes.Language.Sklad.Language.msg106_1 ); } #endregion #endregion #region Сохранение Models.Sklad.Rem.RemPartyMinus remPartyMinus = new Models.Sklad.Rem.RemPartyMinus(); remPartyMinus.RemPartyMinusID = null; remPartyMinus.RemPartyID = docServicePurch2Tab.RemPartyID; remPartyMinus.DirNomenID = Convert.ToInt32(docServicePurch2Tab.DirNomenID); remPartyMinus.Quantity = 1; // docServicePurch2Tab.Quantity; remPartyMinus.DirCurrencyID = docServicePurch2Tab.DirCurrencyID; remPartyMinus.DirCurrencyMultiplicity = docServicePurch2Tab.DirCurrencyMultiplicity; remPartyMinus.DirCurrencyRate = docServicePurch2Tab.DirCurrencyRate; remPartyMinus.DirVatValue = docServicePurch.DirVatValue; remPartyMinus.DirWarehouseID = docServicePurch.DirWarehouseID; remPartyMinus.DirContractorIDOrg = doc.DirContractorIDOrg; remPartyMinus.DirContractorID = doc.DirContractorIDOrg; remPartyMinus.DocID = Convert.ToInt32(docServicePurch.DocID); remPartyMinus.PriceCurrency = docServicePurch2Tab.PriceCurrency; remPartyMinus.PriceVAT = docServicePurch2Tab.PriceVAT; remPartyMinus.FieldID = Convert.ToInt32(docServicePurch2Tab.DocServicePurch2TabID); remPartyMinus.Reserve = false; //docServicePurch.Reserve; remPartyMinus.DirEmployeeID = doc.DirEmployeeID; remPartyMinus.DocDate = doc.DocDate; db.Entry(remPartyMinus).State = EntityState.Added; await db.SaveChangesAsync(); #endregion #endregion #endregion return(docServicePurch2Tab); }
//Алгоритм: //1. INSERT в "DocSecondHandReturns" //2. UPDATE Status в "DocSecondHandPurches" internal async Task <DocSecondHandReturn> mPutPostDocSecondHandReturn( DbConnectionSklad db, DbConnectionSklad dbRead, string UO_Action, //DbConnectionSklad dbRead, //Models.Sklad.Sys.SysSetting sysSetting, DocSecondHandReturn docSecondHandReturn, //bool InsertUpdate, //true - Insert, false - Update EntityState entityState, //EntityState.Added, Modified //Models.Sklad.Doc.DocSecondHandReturnTab[] docSecondHandReturnTabCollection, Classes.Account.Login.Field field //Дополнительные данные о сотруднике ) { #region Проверка статуса аппарата, только если: //DirSecondHandStatusID == 9 //DirSecondHandStatusID_789 == 7 Models.Sklad.Doc.DocSecondHandPurch docSecondHandPurch = await db.DocSecondHandPurches.FindAsync(docSecondHandReturn.DocSecondHandPurchID); if (docSecondHandPurch.DirSecondHandStatusID != 10 || docSecondHandPurch.DirSecondHandStatusID_789 != 7) { throw new System.InvalidOperationException("Аппарат не готов к продаже или уже возвращён!"); } #endregion #region Меняем статус аппарата docSecondHandPurch.DirSecondHandStatusID = 9; docSecondHandPurch.DirReturnTypeID = docSecondHandReturn.DirReturnTypeID; docSecondHandPurch.DirDescriptionID = docSecondHandReturn.DirDescriptionID; db.Entry(docSecondHandPurch).State = EntityState.Modified; await db.SaveChangesAsync(); #endregion #region 1. Doc //Модель Models.Sklad.Doc.Doc doc = new Models.Sklad.Doc.Doc(); //Присваиваем значения doc.ListObjectID = ListObjectID; doc.IsImport = false; doc.NumberInt = docSecondHandReturn.NumberInt; doc.NumberReal = docSecondHandReturn.DocSecondHandReturnID; doc.DirEmployeeID = field.DirEmployeeID; doc.DirPaymentTypeID = docSecondHandReturn.DirPaymentTypeID; doc.Payment = docSecondHandReturn.Payment; if (docSecondHandReturn.DirContractorID != null) { doc.DirContractorID = Convert.ToInt32(docSecondHandReturn.DirContractorID); } else { doc.DirContractorID = docSecondHandReturn.DirContractorIDOrg; } doc.DirContractorIDOrg = docSecondHandReturn.DirContractorIDOrg; doc.Discount = docSecondHandReturn.Discount; doc.DirVatValue = docSecondHandReturn.DirVatValue; doc.Base = docSecondHandReturn.Base; doc.Description = docSecondHandReturn.Description; doc.DocDate = DateTime.Now; //docSecondHandReturn.DocDate; //doc.DocDisc = docSecondHandReturn.DocDisc; if (UO_Action == "held") { doc.Held = true; } else { doc.Held = false; } doc.DocID = docSecondHandReturn.DocID; doc.DocIDBase = docSecondHandReturn.DocIDBase; doc.KKMSCheckNumber = docSecondHandReturn.KKMSCheckNumber; doc.KKMSIdCommand = docSecondHandReturn.KKMSIdCommand; doc.KKMSEMail = docSecondHandReturn.KKMSEMail; doc.KKMSPhone = docSecondHandReturn.KKMSPhone; //Класс Docs.Docs docs = new Docs.Docs(db, dbRead, doc, entityState); //doc = await docs.Save(); await Task.Run(() => docs.Save()); //Нужно вернуть "docSecondHandReturn" со всем полями! docSecondHandReturn.DocID = doc.DocID; #endregion #region 2. DocSecondHandReturn docSecondHandReturn.DocID = doc.DocID; db.Entry(docSecondHandReturn).State = entityState; await db.SaveChangesAsync(); #region 2.1. UpdateNumberInt, если INSERT if (entityState == EntityState.Added && (docSecondHandReturn.doc.NumberInt == null || docSecondHandReturn.doc.NumberInt.Length == 0)) { doc.NumberInt = docSecondHandReturn.DocSecondHandReturnID.ToString(); doc.NumberReal = docSecondHandReturn.DocSecondHandReturnID; docs = new Docs.Docs(db, dbRead, doc, EntityState.Modified); await Task.Run(() => docs.Save()); } else if (entityState == EntityState.Added) { doc.NumberReal = docSecondHandReturn.DocSecondHandReturnID; docs = new Docs.Docs(db, dbRead, doc, EntityState.Modified); await Task.Run(() => docs.Save()); } #endregion #endregion #region Касса или Банк #region 1. Получаем валюту из склада int DirCurrencyID = 0, DirCurrencyMultiplicity = 0; //, DirCashOfficeID = 0, DirBankID = 0;; double DirCurrencyRate = 0; var query = await Task.Run(() => ( from x in db.DirWarehouses where x.DirWarehouseID == docSecondHandReturn.DirWarehouseID select new { //DirCashOfficeID= x.dirCashOffice.DirCashOfficeID, DirCurrencyID_Bank = x.dirBank.DirCurrencyID, DirCurrencyRate_Bank = x.dirBank.dirCurrency.DirCurrencyRate, DirCurrencyMultiplicity_Bank = x.dirBank.dirCurrency.DirCurrencyMultiplicity, //DirBankID = x.dirBank.DirBankID, DirCurrencyID_Cash = x.dirCashOffice.DirCurrencyID, DirCurrencyRate_Cash = x.dirCashOffice.dirCurrency.DirCurrencyRate, DirCurrencyMultiplicity_Cash = x.dirCashOffice.dirCurrency.DirCurrencyMultiplicity, } ).ToListAsync()); if (query.Count() > 0) { if (doc.DirPaymentTypeID == 1) { //DirCashOfficeID = Convert.ToInt32(query[0].DirCashOfficeID); DirCurrencyID = query[0].DirCurrencyID_Cash; DirCurrencyRate = query[0].DirCurrencyRate_Cash; DirCurrencyMultiplicity = query[0].DirCurrencyMultiplicity_Cash; } else if (doc.DirPaymentTypeID == 2) { //DirBankID = Convert.ToInt32(query[0].DirBankID); DirCurrencyID = query[0].DirCurrencyID_Bank; DirCurrencyRate = query[0].DirCurrencyRate_Bank; DirCurrencyMultiplicity = query[0].DirCurrencyMultiplicity_Bank; } else { throw new System.InvalidOperationException("Не выбран метод оплаты: Касса или Банк!"); } } #endregion #region 2. Заполняем Модель Models.Sklad.Pay.Pay pay = new Models.Sklad.Pay.Pay(); //pay.DirCashOfficeID = Convert.ToInt32(DirCashOfficeID); //pay.DirBankID = Convert.ToInt32(DirBankID); //Валюта pay.DirCurrencyID = DirCurrencyID; pay.DirCurrencyRate = DirCurrencyRate; pay.DirCurrencyMultiplicity = DirCurrencyMultiplicity; pay.DirEmployeeID = field.DirEmployeeID; pay.DirPaymentTypeID = doc.DirPaymentTypeID; //pay.DirXName = ""; //no //pay.DirXSumTypeID = 0; //no pay.DocCashBankID = null; pay.DocID = doc.DocID; pay.DocXID = docSecondHandReturn.DocSecondHandReturnID; pay.DocXSumDate = doc.DocDate; pay.DocXSumSum = docSecondHandReturn.PriceCurrency - doc.Discount; // - получили при сохранении Спецификации (выше) docSecondHandReturn.PriceVAT //DocSecondHandPurchID - найти!!! pay.Base = "Возврат документа №" + docSecondHandPurch.DocSecondHandPurchID; //pay.Base = "Оплата за коды товаров: " + NomenName; // - получили при сохранении Спецификации (выше) //pay.Description = ""; pay.KKMSCheckNumber = docSecondHandReturn.KKMSCheckNumber; pay.KKMSIdCommand = docSecondHandReturn.KKMSIdCommand; pay.KKMSEMail = docSecondHandReturn.KKMSEMail; pay.KKMSPhone = docSecondHandReturn.KKMSPhone; pay.Discount = doc.Discount; #endregion #region 3. Сохраняем PartionnyAccount.Controllers.Sklad.Pay.PayController payController = new Pay.PayController(); doc = await Task.Run(() => payController.mPutPostPay(db, pay, EntityState.Modified, field)); //sysSetting #endregion #endregion #region 4. Log logService.DocSecondHandPurchID = docSecondHandPurch.DocSecondHandPurchID; logService.DirSecondHandLogTypeID = 14; logService.DirEmployeeID = field.DirEmployeeID; logService.DirSecondHandStatusID = docSecondHandPurch.DirSecondHandStatusID; logService.DirWarehouseIDFrom = docSecondHandPurch.DirWarehouseID; logService.DirWarehouseIDTo = docSecondHandPurch.DirWarehouseID; //logService.Msg = "Аппарат принят на точку №" + docSecondHandPurch.DirWarehouseID; await logServicesController.mPutPostLogSecondHands(db, logService, EntityState.Added); #endregion return(docSecondHandReturn); }
public async Task <IHttpActionResult> DeleteDocSalary(int id) { 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 Проверки try { //Документ проведён!<BR>Перед удалением, нужно отменить проводку! var queryHeld = await Task.Run(() => ( from x in dbRead.DocSalaries where x.DocSalaryID == id select x ).ToListAsync()); if (queryHeld.Count() > 0) { if (Convert.ToBoolean(queryHeld[0].doc.Held)) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg18))); //return BadRequest(); } } } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } #endregion #region Удаление //Алгоритм. //Удаляем по порядку: //1. RemParties //2. DocSalaryTabs //3. DocSalaries //4. Docs //Сотрудник Models.Sklad.Doc.DocSalary docSalary = await db.DocSalaries.FindAsync(id); if (docSalary == null) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg99))); } using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { try { #region 1. Ищим DocID *** *** *** *** *** //1.1. Ищим DocID int iDocID = 0; var queryDocs1 = await ( from x in db.DocSalaries where x.DocSalaryID == id select x ).ToListAsync(); if (queryDocs1.Count() > 0) { iDocID = Convert.ToInt32(queryDocs1[0].DocID); } else { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg99))); } #endregion #region 2. DocSalaryTabs *** *** *** *** *** var queryDocSalaryTabs = await ( from x in db.DocSalaryTabs where x.DocSalaryID == id select x ).ToListAsync(); for (int i = 0; i < queryDocSalaryTabs.Count(); i++) { Models.Sklad.Doc.DocSalaryTab docSalaryTab = await db.DocSalaryTabs.FindAsync(queryDocSalaryTabs[i].DocSalaryTabID); db.DocSalaryTabs.Remove(docSalaryTab); await db.SaveChangesAsync(); } #endregion #region 3. DocSalaries *** *** *** *** *** var queryDocSalaries = await ( from x in db.DocSalaries where x.DocSalaryID == id select x ).ToListAsync(); for (int i = 0; i < queryDocSalaries.Count(); i++) { Models.Sklad.Doc.DocSalary docSalary1 = await db.DocSalaries.FindAsync(queryDocSalaries[i].DocSalaryID); db.DocSalaries.Remove(docSalary1); await db.SaveChangesAsync(); } #endregion #region 4. Doc *** *** *** *** *** var queryDocs2 = await ( from x in db.Docs where x.DocID == iDocID select x ).ToListAsync(); for (int i = 0; i < queryDocs2.Count(); i++) { Models.Sklad.Doc.Doc doc = await db.Docs.FindAsync(queryDocs2[i].DocID); db.Docs.Remove(doc); await db.SaveChangesAsync(); } #endregion ts.Commit(); #region 6. JourDisp *** *** *** *** *** *** *** *** *** * Models.Sklad.Sys.SysJourDisp sysJourDisp = new Models.Sklad.Sys.SysJourDisp(); sysJourDisp.DirDispOperationID = 5; //Удаление записи sysJourDisp.DirEmployeeID = field.DirEmployeeID; sysJourDisp.ListObjectID = ListObjectID; sysJourDisp.TableFieldID = id; sysJourDisp.Description = ""; try { sysJourDispsController.mPutPostSysJourDisps(db, sysJourDisp, EntityState.Added); } catch (Exception ex) { } #endregion dynamic collectionWrapper = new { ID = id, Msg = Classes.Language.Sklad.Language.msg19 }; return(Ok(returnServer.Return(true, collectionWrapper))); //return Ok(returnServer.Return(true, "")); } 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)))); } //catch } //DbContextTransaction #endregion } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } }
public async Task <IHttpActionResult> PutDocSalary(int id, 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 Проверки //1. if (!ModelState.IsValid) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg91))); //return BadRequest(ModelState); } if (id < 1 || id != docSalary.DocSalaryID || docSalary.DocID < 1) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg8))); //return BadRequest(); } //2. Получаем "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(); } } //3. Проверяем, если документ Models.Sklad.Doc.Doc docTemp = await dbRead.Docs.FindAsync(docSalary.DocID); //3.1. проведён и мы пытаемся его сохранить или провести - выдать Эксепшн if (Convert.ToBoolean(docTemp.Held) && (UO_Action == "save" || UO_Action == "save_close" || UO_Action == "held")) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg12_1))); } //3.2. НЕ проведён и мы пытаемся Снять Проводку - выдать Эксепшн if (!Convert.ToBoolean(docTemp.Held) && UO_Action == "held_cancel") { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg12_2))); } //4. Подстановки - некоторые поля надо заполнить, если они не заполены (Юридические реквизиты) 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.Modified, 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 = 4; //Изменение записи 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); }