public TransfersController(
     UserManager <ApplicationUser> userManager,
     ITransfersService transfersService,
     IWarehousesService warehousesService,
     IGoodsService goodsService)
 {
     this.userManager       = userManager;
     this.transfersService  = transfersService;
     this.warehousesService = warehousesService;
     this.goodsService      = goodsService;
 }
 public WarehousesController(IWarehousesService warehousesService)
 {
     _warehousesService = warehousesService;
 }
Exemple #3
0
        private bool ProcessOrderFile(IServiceProvider serviceProvider, string fileName, string fileContent)
        {
            IWarehousesService         warehousesService         = serviceProvider.GetService <IWarehousesService>();
            IShippingWarehousesService shippingWarehousesService = serviceProvider.GetService <IShippingWarehousesService>();
            IOrdersService             ordersService             = serviceProvider.GetService <IOrdersService>();

            // Загружаем данные из файла
            XmlDocument doc = new XmlDocument();

            using (StringReader reader = new StringReader(fileContent))
            {
                doc.Load(reader);
            }

            var docRoots = doc.SelectNodes("//IDOC");

            int totalCount     = docRoots.Count;
            int processedCount = 0;

            var orders = new List <OrderFormDto>();

            foreach (XmlNode docRoot in docRoots)
            {
                ++processedCount;

                string       orderNumber = docRoot.SelectSingleNode("E1EDK02[QUALF='002']/BELNR")?.InnerText?.TrimStart('0');
                OrderFormDto dto         = ordersService.GetFormByNumber(orderNumber);
                bool         isNew       = dto == null;
                if (dto == null)
                {
                    dto = new OrderFormDto();
                }

                dto.AdditionalInfo = $"INJECTION - {fileName}";

                decimal weightUomCoeff = docRoot.ParseUom("E1EDK01/GEWEI", new[] { "GRM", "GR", "KGM", "KG" }, new[] { 0.001M, 0.001M, 1M, 1M }, 1);

                string soldTo = docRoot.SelectSingleNode("E1EDKA1[PARVW='AG']/PARTN")?.InnerText?.TrimStart('0');

                dto.OrderNumber             = new LookUpDto(orderNumber);
                dto.OrderDate               = docRoot.ParseDateTime("E1EDK02[QUALF='001']/DATUM")?.ToString("dd.MM.yyyy") ?? dto.OrderDate;
                dto.WeightKg                = docRoot.ParseDecimal("E1EDK01/BRGEW").ApplyDecimalUowCoeff(weightUomCoeff) ?? dto.WeightKg;
                dto.BoxesCount              = docRoot.ParseDecimal("E1EDK01/Y0126SD_ORDERS05_TMS_01/YYCAR_H") ?? dto.BoxesCount;
                dto.DeliveryDate            = docRoot.ParseDateTime("E1EDK03[IDDAT='002']/DATUM")?.ToString("dd.MM.yyyy") ?? dto.DeliveryDate;
                dto.OrderAmountExcludingVAT = docRoot.ParseDecimal("E1EDS01[SUMID='002']/SUMME") ?? dto.OrderAmountExcludingVAT;

                string shippingAddressCode = docRoot.SelectSingleNode("E1EDP01/WERKS")?.InnerText;
                var    shippingWarehouse   = shippingWarehousesService.GetByCode(shippingAddressCode);
                dto.ShippingAddress     = shippingWarehouse?.Address ?? dto.ShippingAddress;
                dto.ShippingCity        = string.IsNullOrEmpty(shippingWarehouse?.City) ? dto.ShippingCity : new LookUpDto(shippingWarehouse.City);
                dto.ShippingWarehouseId = shippingWarehouse?.Id == null ? dto.ShippingWarehouseId : new LookUpDto(shippingWarehouse.Id.ToString(), shippingWarehouse.WarehouseName);

                dto.DeliveryAddress = null;
                dto.DeliveryCity    = null;
                dto.DeliveryRegion  = null;
                dto.PickingTypeId   = null;
                dto.TransitDays     = null;
                dto.DeliveryType    = null;

                if (isNew)
                {
                    dto.ClientOrderNumber = docRoot.SelectSingleNode("E1EDK02[QUALF='001']/BELNR")?.InnerText ?? dto.ClientOrderNumber;
                    dto.Payer             = docRoot.SelectSingleNode("E1EDKA1[PARVW='RG']/PARTN")?.InnerText?.TrimStart('0') ?? dto.Payer;
                }

                if (isNew || dto.ManualPalletsCount != true)
                {
                    dto.PalletsCount = docRoot.ParseInt("E1EDK01/Y0126SD_ORDERS05_TMS_01/YYPAL_H") ?? dto.PalletsCount;
                }

                IEnumerable <string> missedRequiredFields = ValidateRequiredFields(dto);
                if (missedRequiredFields.Any())
                {
                    string fields = string.Join(", ", missedRequiredFields);
                    Log.Error("В файле {fileName} отсутствуют следующие обязательные поля: {fields}. Заказ ({processedCount}/{totalCount}) не создан.",
                              fileName, fields, processedCount, totalCount);
                }
                else
                {
                    int entryInd  = 0;
                    var itemRoots = docRoot.SelectNodes("E1EDP01");
                    dto.Items = dto.Items ?? new List <OrderItemDto>();
                    var updatedItems = new HashSet <string>();
                    foreach (XmlNode itemRoot in itemRoots)
                    {
                        ++entryInd;

                        string posex    = itemRoot.SelectSingleNode("POSEX")?.InnerText ?? string.Empty;
                        int    posexNum = -1;
                        int.TryParse(posex.TrimStart('0'), out posexNum);
                        if ((posexNum % 10) != 0)
                        {
                            continue;
                        }

                        string nart = itemRoot.SelectSingleNode("E1EDP19/IDTNR")?.InnerText?.TrimStart('0');
                        if (string.IsNullOrEmpty(nart))
                        {
                            Log.Warning("Пустое значение NART в позиции #{entryInd} заказа ({processedCount}/{totalCount}) из файла {fileName}, пропуск.",
                                        entryInd, processedCount, totalCount, fileName);
                            continue;
                        }

                        int?quantity = itemRoot.ParseInt("MENGE");
                        if (quantity == null || quantity == 0)
                        {
                            Log.Warning("Пустое количество в позиции #{entryInd} заказа ({processedCount}/{totalCount}) из файла {fileName}, пропуск.",
                                        entryInd, processedCount, totalCount, fileName);
                            continue;
                        }

                        OrderItemDto itemDto = dto.Items.Where(i => i.Nart == nart).FirstOrDefault();

                        if (itemDto == null)
                        {
                            itemDto = new OrderItemDto();
                            dto.Items.Add(itemDto);
                        }
                        else
                        {
                            updatedItems.Add(itemDto.Id);
                        }

                        itemDto.Nart     = nart;
                        itemDto.Quantity = quantity ?? itemDto.Quantity;
                    }

                    var itemsToRemove = dto.Items.Where(x => !string.IsNullOrEmpty(x.Id) && !updatedItems.Contains(x.Id)).ToList();
                    itemsToRemove.ForEach(x => dto.Items.Remove(x));

                    if (isNew)
                    {
                        Log.Information("Создан новый заказ {OrderNumber} ({processedCount}/{totalCount}) на основании файла {fileName}.",
                                        dto.OrderNumber, processedCount, totalCount, fileName);
                    }
                    else
                    {
                        Log.Information("Обновлен заказ {OrderNumber} ({processedCount}/{totalCount}) на основании файла {fileName}.",
                                        dto.OrderNumber, processedCount, totalCount, fileName);
                    }

                    orders.Add(dto);
                }
            }

            bool isSuccess = orders.Any();

            if (isSuccess)
            {
                ordersService.Import(orders);
            }

            return(isSuccess);
        }
 public DocumentsController(IDocumentsService documentsService, IWarehousesService warehousesService)
 {
     _documentsService  = documentsService;
     _warehousesService = warehousesService;
 }