示例#1
0
        //Сохранение
        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
            }
        }
示例#2
0
        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
        }