示例#1
0
        public void UpdatePositionIm(PositionIm positionIm, OrderPositionData opd, DbTransaction dbTran)
        {
            if (NeedReCreatePositionIm(positionIm, opd.FormatData.Id))
            {
                DeletePositionIm(positionIm, dbTran);
                CreatePositionIm(positionIm.OrderPosition.Order.BusinessUnitId, opd.OrderId, opd.OrderPositionId, opd, dbTran);
                return;
            }

            if (_stringProcessor.CanUpdateString(positionIm))
            {
                positionIm = _repository.SetPositionIm(positionIm, newTaskFile: false, newMaketFile: false, isActual: true, dbTran);
                _stringProcessor.UpdateFullString(positionIm.OrderPositionId, opd.StringData, dbTran);
            }

            if (_moduleMaketProcessor.CanUpdateModule(positionIm))
            {
                positionIm = _repository.SetPositionIm(positionIm, newTaskFile: true, newMaketFile: false, isActual: true, dbTran);

                // Обновляем графические материалы позиции ИМ-а
                var taskFileDate = (DateTime)positionIm.TaskFileDate;
                var bytes        = Base64ToBytesConverter.Convert(opd.ModuleData.Base64String);

                _moduleMaketProcessor.CreateSampleImage(positionIm.OrderPositionId, bytes, "ImgTask", taskFileDate);
                _moduleMaketProcessor.UpdateModuleGraphics(positionIm.OrderPositionId, bytes, opd.ModuleData.Name);
            }
        }
示例#2
0
        private GraphicData GetPackageGraphicData(OrderPositionData opd)
        {
            // Получаем идентификаторы графиков позиций пакета
            var graphicIds = opd.Childs
                             .SelectMany(c => c.GraphicsData)
                             .Select(g => g.Id);

            // Находим минимальную дату выхода позиций пакета
            // с поставщиком пакета
            var minOutDate = _context.Graphics
                             .Where(g => graphicIds.Contains(g.Id) && g.SupplierId == opd.SupplierId)
                             .Min(g => g.OutDate);

            // Находим график выхода пакета - его дата выхода меньше
            // или равна миминальной дате выхода позиций пакета
            var graphic = _context.Graphics
                          .Where(g =>
                                 g.SupplierId == opd.SupplierId &&
                                 g.PricePositionTypeId == opd.FormatData.FormatTypeId &&
                                 g.OutDate <= minOutDate)
                          .OrderByDescending(g => g.OutDate)
                          .First();

            var graphicData = new GraphicData {
                Id = graphic.Id, Childs = new List <int>()
            };

            return(graphicData);
        }
示例#3
0
        public IActionResult Create([FromBody] OrderPositionData orderPosition)
        {
            var clientLegalPersonId = _httpContextAccessor.HttpContext.GetClientLegalPersonId();

            if (orderPosition == null)
            {
                return(BadRequest(
                           new { message = "Создаваемая позиция не передана." }));
            }

            if (clientLegalPersonId != orderPosition.ClientLegalPersonId)
            {
                return(StatusCode(
                           (int)HttpStatusCode.Forbidden,
                           new { message = "Создание позиции заказа запрещено." }));
            }

            var logger = LogManager.GetCurrentClassLogger();

            logger.Info(JsonSerializer.Serialize(orderPosition));

            if (orderPosition.StringData != null && !orderPosition.StringData.PhonesData.Any())
            {
                throw new Exception("В строку не переданы телефоны.");
            }

            _orderPositionService.CreateOrderPosition(orderPosition);

            return(Ok());
        }
示例#4
0
        public IActionResult Update([FromBody] OrderPositionData orderPosition)
        {
            var clientLegalPersonId = _httpContextAccessor.HttpContext.GetClientLegalPersonId();

            if (orderPosition == null)
            {
                return(BadRequest(
                           new { message = "Изменяемая позиция не передана." }));
            }

            if (!_orderPositionService.ExistsById(orderPosition.OrderPositionId))
            {
                return(StatusCode(
                           (int)HttpStatusCode.NotFound,
                           new { message = string.Format("Изменяемая позиция заказа {0} не найдена.", orderPosition.OrderPositionId) }));
            }

            if (clientLegalPersonId != orderPosition.ClientLegalPersonId)
            {
                return(StatusCode(
                           (int)HttpStatusCode.Forbidden,
                           new { message = string.Format("Изменение позиции заказа {0} запрещено.", orderPosition.OrderPositionId) }));
            }

            _orderPositionService.UpdateOrderPosition(orderPosition);

            return(Ok());
        }
示例#5
0
        public List <GraphicData> GetPackageGraphicsData(OrderPositionData opd)
        {
            var graphicsData = new List <GraphicData>();

            graphicsData.Add(GetPackageGraphicData(opd));

            return(graphicsData);
        }
示例#6
0
        private bool NeedUpdateOrderPosition(OrderPosition orderPosition, OrderPositionData opd)
        {
            if (orderPosition.Id == opd.OrderPositionId &&
                orderPosition.SupplierId == opd.SupplierId &&
                orderPosition.PricePositionId == opd.FormatData.Id &&
                orderPosition.PricePositionVersion == opd.FormatData.Version &&
                orderPosition.PriceId == opd.PriceId)
            {
                return(false);
            }

            return(true);
        }
示例#7
0
        public void UpdateOrderPosition(OrderPositionData opd)
        {
            using (var сontextTransaction = _context.Database.BeginTransaction())
            {
                var dbTran = сontextTransaction.GetDbTransaction();

                var orderPosition = _orderPositionProcessor
                                    .GetInnerOperationsOrderPositionsByIds(new[] { opd.OrderPositionId }).Single();

                var basketOrder = _orderProcessor.GetBasketOrder(opd.ClientLegalPersonId, opd.PriceId);

                // Обновляем позицию заказа
                _orderPositionProcessor.UpdateFullOrderPosition(orderPosition, opd, dbTran);

                // Перебираем переданные пакетные позиции
                foreach (var child in opd.Childs)
                {
                    var childOrderPosition = _orderPositionProcessor
                                             .GetInnerOperationsOrderPositionsByIds(new[] { child.OrderPositionId }).SingleOrDefault();

                    // Если переданной позиции не существует - создаём её, иначе - обновляем
                    if (_orderPositionProcessor.NeedCreateFullOrderPosition(childOrderPosition))
                    {
                        _orderPositionProcessor.CreateFullOrderPosition(
                            basketOrder.BusinessUnitId, basketOrder.Id, orderPosition.Id, 0, child, dbTran);
                    }
                    else
                    {
                        _orderPositionProcessor.UpdateFullOrderPosition(childOrderPosition, child, dbTran);
                    }
                }

                var childOrderPositions = orderPosition.ChildOrderPositions;

                // Если в существующих пакетных позициях нет переданных - удаляем их
                foreach (var childOrderPosition in childOrderPositions)
                {
                    if (_orderPositionProcessor.NeedDeleteFullOrderPosition(childOrderPosition.Id, opd.Childs))
                    {
                        _orderPositionProcessor.DeleteFullOrderPosition(childOrderPosition, dbTran);
                    }
                }

                // Обновляем заказ-корзину
                _orderProcessor.UpdateOrder(basketOrder.Id, dbTran);

                _context.SaveChanges();
                dbTran.Commit();
            }
        }
示例#8
0
        private async Task <OrderPositionData> GetOrderPositionDataAsync(int orderPositionId)
        {
            var orderPosition = await _context.OrderPositions
                                .Include(op => op.Order.ClientCompany)
                                .Include(op => op.PricePosition)
                                .Include(op => op.RubricPositions)
                                .Include(op => op.GraphicPositions).ThenInclude(gp => gp.Graphic)
                                .Include(op => op.PositionIm)
                                .SingleAsync(op => op.Id == orderPositionId);

            var opd = new OrderPositionData
            {
                OrderId             = orderPosition.OrderId,
                OrderPositionId     = orderPosition.Id,
                ClientId            = orderPosition.Order.ClientCompanyId,
                ClientLegalPersonId = orderPosition.Order.ClientLegalPersonId,
                SupplierId          = orderPosition.SupplierId,
                FormatData          = new FormatData
                {
                    Id            = orderPosition.PricePositionId,
                    Version       = orderPosition.PricePositionVersion,
                    FormatTypeId  = orderPosition.PricePosition.PricePositionTypeId,
                    FirstSize     = orderPosition.PricePosition.FirstSize,
                    SecondSize    = orderPosition.PricePosition.SecondSize,
                    PackageLength = orderPosition.PricePosition.PackageLength,
                    Description   = orderPosition.PricePosition.Description
                },
                PriceId      = orderPosition.PriceId,
                RubricData   = GetRubricData(orderPosition),
                GraphicsData = GetGraphicsData(orderPosition)
            };

            if (orderPosition.PositionIm != null)
            {
                var positionImTypeId = orderPosition.PositionIm.PositionImTypeId;

                if (positionImTypeId == 1)
                {
                    opd.StringData = await GetStringDataAsync(orderPositionId);
                }

                if (positionImTypeId == 2)
                {
                    opd.ModuleData = await GetModuleDataAsync(orderPositionId);
                }
            }

            return(opd);
        }
示例#9
0
        public void UpdateOrderPosition(OrderPosition orderPosition, OrderPositionData opd, DbTransaction dbTran)
        {
            if (!NeedUpdateOrderPosition(orderPosition, opd))
            {
                return;
            }

            orderPosition.Id                   = opd.OrderPositionId;
            orderPosition.SupplierId           = opd.SupplierId;
            orderPosition.PriceId              = opd.PriceId;
            orderPosition.PricePositionId      = opd.FormatData.Id;
            orderPosition.PricePositionVersion = opd.FormatData.Version;
            orderPosition.BeginDate            = DateTime.Now;

            var isUnloaded = IsUnloaded(orderPosition);

            _repository.SetOrderPosition(orderPosition, isUnloaded, isActual: true, dbTran);
        }
示例#10
0
        public void CreateOrderPosition(OrderPositionData opd)
        {
            using (var сontextTransaction = _context.Database.BeginTransaction())
            {
                var dbTran = сontextTransaction.GetDbTransaction();

                // Получаем заказ-корзину
                var basketOrder = _orderProcessor.GetBasketOrder(opd.ClientLegalPersonId, opd.PriceId);

                // Если заказа-корзины не существует - создаём её
                if (basketOrder == null)
                {
                    basketOrder = _orderProcessor.CreateBasketOrder(opd, dbTran);
                }

                // Получааем скидку клиента
                var clientDiscount = _clientProcessor.GetDiscount(
                    opd.ClientLegalPersonId,
                    basketOrder.BusinessUnitId,
                    opd.SupplierId,
                    opd.FormatData.FormatTypeId);

                // Сохраняем позицию заказа
                int orderPositionId = _orderPositionProcessor.CreateFullOrderPosition(
                    basketOrder.BusinessUnitId, basketOrder.Id, null, clientDiscount, opd, dbTran);

                // Сохраняем пакетные позиции заказа
                foreach (var child in opd.Childs)
                {
                    _orderPositionProcessor.CreateFullOrderPosition(
                        basketOrder.BusinessUnitId, basketOrder.Id, orderPositionId, clientDiscount, child, dbTran);
                }

                // Обновляем заказ-корзину
                _orderProcessor.UpdateOrder(basketOrder.Id, dbTran);

                _context.SaveChanges();
                dbTran.Commit();
            }
        }
示例#11
0
        public Order CreateBasketOrder(OrderPositionData opd, DbTransaction dbTran)
        {
            var clientLegalPersonId = opd.ClientLegalPersonId;

            // Ищем бизнес юнит заказа корзины
            var businessUnitId = _basketBusinessUnitIdProvider.GetByValue(
                new Tuple <int, int>(clientLegalPersonId, opd.PriceId));

            var clientCompanyId = _context.LegalPersons
                                  .Include(lp => lp.Company)
                                  .Single(lp => lp.Id == opd.ClientLegalPersonId).Company.Id;

            var supplierLegalPersonId = _context.BusinessUnits
                                        .Single(bu => bu.Id == businessUnitId).LegalPersonId;

            var isAdvance = _context.LegalPersons
                            .Include(lp => lp.AccountSettings)
                            .Single(lp => lp.Id == clientLegalPersonId)
                            .AccountSettings.IsNeedPrepayment;

            var maxExitDate = _context.Graphics
                              .Where(gr => opd.GetGraphicsWithChildren()
                                     .Contains(gr.Id))
                              .Max(gr => gr.OutDate);

            var sum = _context.Prices
                      .Where(p => opd.GetPrices().Contains(p.Id))
                      .AsEnumerable()
                      .Sum(p => p.GetTarifCost());

            var managerId = _defaultOrderManagerId;

            var order = _basketOrderFactory.Create(
                businessUnitId, clientLegalPersonId, clientCompanyId,
                supplierLegalPersonId, isAdvance, maxExitDate, sum, managerId);

            order = _repository.SetOrder(order, true, dbTran);

            return(order);
        }
示例#12
0
        public void UpdateFullOrderPosition(OrderPosition orderPosition, OrderPositionData opd, DbTransaction dbTran)
        {
            UpdateOrderPosition(orderPosition, opd, dbTran);

            // Если рубрика не задана - удаляем все позиции рубрик
            if (opd.RubricData == null || opd.RubricData.Id == 0)
            {
                _rubricProcessor.DeleteRubricPositions(orderPosition.RubricPositions, dbTran);
            }
            else
            {
                _rubricProcessor.UpdateRubricPosition(orderPosition.Id, orderPosition.RubricPositions, opd.RubricData, dbTran);
            }

            // Если переданы есть пакетные позиции - вычисляем график на их основе
            if (opd.Childs.Any())
            {
                opd.GraphicsData = _graphicProcessor.GetPackageGraphicsData(opd);
            }

            _graphicProcessor.UpdateGraphicPositions(orderPosition.Id, orderPosition.GraphicPositions, opd.GraphicsData, dbTran);

            _positionImProcessor.UpdatePositionIm(orderPosition.PositionIm, opd, dbTran);
        }
示例#13
0
        private OrderPosition CreateOrderPosition(int orderId, int?parentOrderPositionId, float clientDiscount, OrderPositionData opd,
                                                  DbTransaction dbTran)
        {
            var markup         = _context.Prices.Single(pr => pr.Id == opd.PriceId).Markup;
            var businessUnitId = _context.Prices.Single(p => p.Id == opd.PriceId).BusinessUnitId;
            var nds            = GetNds(businessUnitId, opd.SupplierId);

            var orderPosition = _orderPositionFactory.Create(orderId, parentOrderPositionId, clientDiscount, markup, nds, opd);

            orderPosition = _repository.SetOrderPosition(orderPosition, false, isActual: true, dbTran);

            return(orderPosition);
        }
示例#14
0
        public int CreateFullOrderPosition(int businessUnitId, int orderId, int?parentOrderPositionId, float clientDiscount, OrderPositionData opd,
                                           DbTransaction dbTran)
        {
            // Создаём позицию заказа
            var orderPosition = CreateOrderPosition(orderId, parentOrderPositionId, clientDiscount, opd,
                                                    dbTran);

            // Если рубрика не задана (пакет) - не сохраняем её
            if (opd.RubricData != null)
            {
                _rubricProcessor.CreateRubricPosition(orderPosition.Id, opd.RubricData, dbTran);
            }

            // Если передан пакет - ищем график на основе его позиций
            if (opd.Childs.Any())
            {
                opd.GraphicsData = _graphicProcessor.GetPackageGraphicsData(opd);
            }

            _graphicProcessor.CreateGraphicPositions(orderPosition.Id, opd.GraphicsData, dbTran);

            _positionImProcessor.CreatePositionIm(businessUnitId, orderId, orderPosition.Id, opd, dbTran);

            return(orderPosition.Id);
        }
示例#15
0
        public void CreatePositionIm(int businessUnitId, int orderId, int orderPositionId, OrderPositionData opd, DbTransaction dbTran)
        {
            Action <int, int, DbTransaction> setOrderIm = (orderId, orderImTypeId, dbTran) =>
            {
                var orderIm = _orderImProcessor.GetOrderIm(orderId, orderImTypeId);

                if (orderIm == null)
                {
                    _orderImProcessor.CreateOrderIm(orderId, orderImTypeId, null, dbTran);
                }
            };

            if (opd.StringData != null)
            {
                var positionIm = _positionImFactory.Create(orderId, orderPositionId, positionImTypeId: 1);
                _repository.SetPositionIm(positionIm, newTaskFile: false, newMaketFile: false, isActual: true, dbTran);

                _stringProcessor.CreateFullString(businessUnitId, opd.ClientId, orderPositionId, opd.StringData, dbTran);

                setOrderIm(orderId, 1, dbTran);
            }

            if (opd.ModuleData != null)
            {
                var positionIm = _positionImFactory.Create(orderId, orderPositionId, positionImTypeId: 2);
                positionIm = _repository.SetPositionIm(positionIm, newTaskFile: true, newMaketFile: false, isActual: true, dbTran);

                _moduleProcessor.CreateModule(opd.ClientId, businessUnitId, orderPositionId, dbTran);

                var bytes        = Base64ToBytesConverter.Convert(opd.ModuleData.Base64String);
                var taskFileDate = (DateTime)positionIm.TaskFileDate;

                _moduleMaketProcessor.CreateSampleImage(orderPositionId, bytes, "ImgTask", taskFileDate);
                _moduleMaketProcessor.CreateModuleGraphics(orderPositionId, bytes, opd.ModuleData.Name);

                setOrderIm(orderId, 2, dbTran);
            }
        }
示例#16
0
        public OrderPosition Create(int orderId, int?parentOrderPositionId, float discount, float markup, float nds, OrderPositionData opd)
        {
            var orderPosition = new OrderPosition
            {
                Id = 0,
                ParentOrderPositionId = parentOrderPositionId,
                OrderId              = orderId,
                SupplierId           = opd.SupplierId,
                PriceId              = opd.PriceId,
                PricePositionId      = opd.FormatData.Id,
                PricePositionVersion = opd.FormatData.Version,
                Discount             = discount,
                Markup                = markup,
                Nds                   = nds,
                Compensation          = 0,
                Description           = string.Empty,
                ClientPackageDiscount = 0,
                BeginDate             = DateTime.Now
            };

            return(orderPosition);
        }