Exemplo n.º 1
0
        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))));
            }
        }
Exemplo n.º 2
0
        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);
        }