< Summary

Class:SVETA.Api.Services.Implements.ImportingExporting.Importers.GoodSettingImporter
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/ImportingExporting/Importers/GoodSettingImporter.cs
Covered lines:0
Uncovered lines:123
Coverable lines:123
Total lines:211
Line coverage:0% (0 of 123)
Covered branches:0
Total branches:88
Branch coverage:0% (0 of 88)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
get_DepartmentId()0%100%
BeforeValidation()0%100%
AfterImport()0%100%
AfterValidation()0%0%
Import(...)0%0%
Validate(...)0%0%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/ImportingExporting/Importers/GoodSettingImporter.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using SVETA.Api.Services.Interfaces.ImportingExporting;
 3using System;
 4using System.Collections.Generic;
 5using System.ComponentModel;
 6using System.Linq;
 7using System.Threading.Tasks;
 8using WinSolutions.Sveta.Common;
 9using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 10using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 11using WinSolutions.Sveta.Server.Data.DataModel.Extensions;
 12using WinSolutions.Sveta.Server.Services.Interfaces;
 13
 14namespace SVETA.Api.Services.Implements.ImportingExporting.Importers
 15{
 16    [Description("Шаблон загрузки сеттингов (* - поле обязательно для заполнения, ** - одно из полей обязательно для зап
 17    public class GoodSettingRecord
 18    {
 19        [MapTo("**Уникальный код товара")]
 20        public string UniqueCode { get; set; }
 21
 22        [MapTo("**Артикул")]
 23        public string VendorCode { get; set; }
 24
 25        [MapTo("**Штрихкод")]
 26        public string BarCode { get; set; }
 27
 28        [MapTo("**Название товара")]
 29        public string GoodName { get; set; }
 30
 31        [MapTo("*Минимальная партия поставки")]
 32        public string MinQuantity { get; set; }
 33
 34        [MapTo("*Квант поставки")]
 35        public string PickingQuantum { get; set; }
 36
 37        [MapTo("*Видимость на витрине")]
 38        public string ShowcaseVisible { get; set; }
 39
 40
 41        public decimal MinQuantityDec { get; set; }
 42        public decimal PickingQuantumDec { get; set; }
 43        public bool ShowcaseVisibleBool { get; set; }
 44        public bool HasVendorCodeOnly { get; set; }
 45        public long GoodId { get; set; }
 46    }
 47
 48    public class GoodSettingImporter : RecordImporterBase, IRecordImporter<GoodSettingRecord>
 49    {
 50        private readonly IGoodService _goodService;
 51
 52        public GoodSettingImporter(IAuthenticationService authenticationService, IGoodService goodService,
 053            SvetaDbContext db) : base(authenticationService, db)
 054        {
 055            _goodService = goodService;
 056        }
 57
 058        public long DepartmentId { get => (long)Context["departmentId"]; }
 59
 60        public void BeforeValidation()
 061        {
 62
 063        }
 64        public void AfterImport()
 065        {
 66
 067        }
 68
 69        Dictionary<string, List<Good>> goodsByUniqueCodes;
 70        Dictionary<string, List<Good>> goodsByVendorCodes;
 71        Dictionary<string, List<Good>> goodsByBarCodes;
 72        Dictionary<string, List<Good>> goodsByNames;
 73        Dictionary<long, DepartmentGoodSetting> settingsDic;
 74
 75        public void AfterValidation()
 076        {
 077            goodsByUniqueCodes = _goodService.FindGoodsByUniqueCodes(goodUniqueCodes).Result
 078                .ToDictionary(x => x.UniqueCode.ToLower(), x => new List<Good> { x });
 079            goodsByVendorCodes = _goodService.FindGoodsByVendorsCodes(goodVendorCodes, DepartmentId).Result
 080                .GroupBy(x => x.GetActualVendorCode(DepartmentId))
 081                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 082            goodsByBarCodes = _goodService.FindGoodsByBarCodes(goodBarCodes).Result
 083                .GroupBy(x => x.GetActualBarCode())
 084                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 085            goodsByNames = _goodService.FindGoodsByNames(goodNames).Result
 086                .GroupBy(x => x.Name)
 087                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 088            settingsDic = new Dictionary<long, DepartmentGoodSetting>(Database.DepartmentGoodSetting
 089                    .Include(x => x.Good)
 090                    .Where(x => !x.IsDeleted && !x.Good.IsDeleted && x.DepartmentId == DepartmentId)
 091                    .Select(x => new KeyValuePair<long, DepartmentGoodSetting>(x.GoodId, x)));
 092        }
 93
 094        List<long> goodIds = new List<long>();
 95
 96        public void Import(GoodSettingRecord record)
 097        {
 098            List<Good> good = null;
 099            if (!String.IsNullOrEmpty(record.UniqueCode))
 0100            {
 0101                goodsByUniqueCodes.TryGetValue(record.UniqueCode.ToLower(), out good);
 0102                if (good == null || good.Count == 0) throw new ArgumentException($"Товар не найден");
 0103            }
 0104            else if (!String.IsNullOrEmpty(record.VendorCode))
 0105            {
 0106                goodsByVendorCodes.TryGetValue(record.VendorCode.ToLower(), out good);
 0107                if ((good == null || good.Count == 0) && record.HasVendorCodeOnly) throw new ArgumentException($"Товар н
 0108            }
 0109            if (good == null || good.Count == 0)
 0110            {
 0111                if (!String.IsNullOrEmpty(record.BarCode))
 0112                {
 0113                    goodsByBarCodes.TryGetValue(record.BarCode.ToLower(), out good);
 0114                    if (good == null || good.Count == 0) throw new ArgumentException($"Товар не найден");
 0115                }
 0116                else if (!String.IsNullOrEmpty(record.GoodName))
 0117                {
 0118                    goodsByNames.TryGetValue(record.GoodName.ToLower(), out good);
 0119                    if (good == null || good.Count == 0) throw new ArgumentException($"Товар не найден");
 0120                }
 0121            }
 0122            if (good == null || good.Count == 0)
 0123            {
 0124                throw new ArgumentException($"Товар не найден");
 125            }
 0126            if (good.Count > 1)
 0127            {
 0128                throw new ArgumentException($"Найден более чем один товар");
 129            }
 130
 0131            if (goodIds.Any(x => x == good.Single().Id))
 0132            {
 0133                throw new ArgumentException($"Сеттинги по данному товару уже найдены в загружаемом файле");
 134            }
 135            else
 0136            {
 0137                record.GoodId = good.Single().Id;
 0138                goodIds.Add(good.Single().Id);
 0139            }
 140
 141
 142            DepartmentGoodSetting setting;
 0143            setting = settingsDic.Values.FirstOrDefault(x => x.GetActualVendorCode().ToLower() == record.VendorCode.ToLo
 0144            if (setting != null)
 0145            {
 0146                throw new ArgumentException($"Товар {setting.Good.UniqueCode} с таким артикулом уже существует у данного
 147            }
 148
 0149            if (!settingsDic.TryGetValue(record.GoodId, out setting))
 0150            {
 0151                setting = new DepartmentGoodSetting
 0152                {
 0153                    GoodId = record.GoodId,
 0154                    DepartmentId = DepartmentId
 0155                };
 0156                AddNewRecord(setting);
 0157            }
 0158            setting.MinQuantity = record.MinQuantityDec;
 0159            setting.PickingQuantum = record.PickingQuantumDec;
 0160            setting.VendorCode = string.IsNullOrEmpty(record.VendorCode) ? setting.VendorCode : record.VendorCode;
 0161            setting.ShowcaseVisible = record.ShowcaseVisibleBool;
 0162            setting.IsDeleted = false;
 0163            if (setting.Id == 0)
 0164            {
 0165                settingsDic.Add(record.GoodId, setting); //добавляем ко всем товарам, чтобы учесть, если в файле есть од
 0166            }
 0167        }
 168
 0169        List<string> goodUniqueCodes = new List<string>();
 0170        List<string> goodVendorCodes = new List<string>();
 0171        List<string> goodBarCodes = new List<string>();
 0172        List<string> goodNames = new List<string>();
 173
 174        public void Validate(GoodSettingRecord record)
 0175        {
 0176            record.MinQuantityDec = TryGetDecimal(record.MinQuantity, $"Не могу преобразовать {nameof(record.MinQuantity
 0177            record.PickingQuantumDec = TryGetDecimal(record.PickingQuantum, $"Не могу преобразовать {nameof(record.Picki
 0178            record.ShowcaseVisibleBool = TryGetBool(record.ShowcaseVisible, $"Не могу преобразовать {nameof(record.Showc
 179
 0180            Assert(!string.IsNullOrEmpty(record.UniqueCode) && !string.IsNullOrEmpty(record.VendorCode)
 0181                && !string.IsNullOrEmpty(record.BarCode) && !string.IsNullOrEmpty(record.GoodName),
 0182                "Не заданы UniqueCode, VendorCode, BarCode, GoodName. Должно быть задано хотя бы одно из полей.");
 183
 0184            Assert(record.MinQuantityDec > 0, "MinQuantity должно быть больше нуля");
 0185            Assert(record.PickingQuantumDec > 0, "PickingQuantum должно быть больше нуля");
 0186            Assert(record.MinQuantityDec % record.PickingQuantumDec == 0, "MinQuantity должно быть кратно PickingQuantum
 187
 0188            record.HasVendorCodeOnly = !string.IsNullOrEmpty(record.VendorCode)
 0189                    && string.IsNullOrEmpty(record.UniqueCode)
 0190                    && string.IsNullOrEmpty(record.BarCode)
 0191                    && string.IsNullOrEmpty(record.GoodName);
 192
 0193            if (!string.IsNullOrEmpty(record.UniqueCode))
 0194            {
 0195                goodUniqueCodes.Add(record.UniqueCode.ToLower());
 0196            }
 0197            else if (!string.IsNullOrEmpty(record.BarCode))
 0198            {
 0199                goodBarCodes.Add(record.BarCode.ToLower());
 0200            }
 0201            else if (!string.IsNullOrEmpty(record.GoodName))
 0202            {
 0203                goodNames.Add(record.GoodName.ToLower());
 0204            }
 0205            if (!string.IsNullOrEmpty(record.VendorCode))
 0206            {
 0207                goodVendorCodes.Add(record.VendorCode.ToLower());
 0208            }
 0209        }
 210    }
 211}