< Summary

Class:SVETA.Api.Services.Implements.ImportingExporting.Importers.RestImporter
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/ImportingExporting/Importers/RestImporter.cs
Covered lines:0
Uncovered lines:96
Coverable lines:96
Total lines:171
Line coverage:0% (0 of 96)
Covered branches:0
Total branches:52
Branch coverage:0% (0 of 52)

Metrics

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

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using SVETA.Api.Services.Interfaces.ImportingExporting;
 3using System;
 4using System.Collections.Generic;
 5using System.ComponentModel;
 6using System.Diagnostics;
 7using System.Linq;
 8using System.Threading.Tasks;
 9using WinSolutions.Sveta.Common;
 10using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 11using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 12using WinSolutions.Sveta.Server.Data.DataModel.Extensions;
 13using WinSolutions.Sveta.Server.Services.Interfaces;
 14
 15namespace SVETA.Api.Services.Implements.ImportingExporting.Importers
 16{
 17    [Description("Шаблон загрузки остатков (* - поле обязательно для заполнения, ** - одно из полей обязательно для запо
 18    public class RestRecord
 19    {
 20        [MapTo("**Уникальный код товара")]
 21        public string UniqueCode { get; set; }
 22
 23        [MapTo("**Артикул")]
 24        public string VendorCode { get; set; }
 25
 26        [MapTo("**Штрихкод")]
 27        public string BarCode { get; set; }
 28
 29        [MapTo("**Название товара")]
 30        public string GoodName { get; set; }
 31
 32        [MapTo("*Количество")]
 33        public string Quantity { get; set; }
 34
 35
 36        public decimal QuantityDec { get; set; }
 37        public long GoodId { get; set; }
 38    }
 39
 40    public class RestImporter : RecordImporterBase, IRecordImporter<RestRecord>
 41    {
 42        private readonly IGoodService _goodService;
 43
 44        public RestImporter(IAuthenticationService authenticationService, IGoodService goodService,
 045            SvetaDbContext db) : base(authenticationService, db)
 046        {
 047            _goodService = goodService;
 048        }
 49
 050        public long DepartmentId { get => (long)Context["departmentId"]; }
 51
 52        public void AfterImport()
 053        {
 54
 055        }
 56
 57        Dictionary<string, List<Good>> goodsByUniqueCodes;
 58        Dictionary<string, List<Good>> goodsByVendorCodes;
 59        Dictionary<string, List<Good>> goodsByBarCodes;
 60        Dictionary<string, List<Good>> goodsByNames;
 61        Dictionary<long, Rest> restsDic;
 62
 63        public void AfterValidation()
 064        {
 065            goodsByUniqueCodes = _goodService.FindGoodsByUniqueCodes(goodUniqueCodes).Result
 066                .ToDictionary(x => x.UniqueCode.ToLower(), x => new List<Good> { x });
 067            goodsByVendorCodes = _goodService.FindGoodsByVendorsCodes(goodVendorCodes, DepartmentId).Result
 068                .GroupBy(x => x.GetActualVendorCode(DepartmentId))
 069                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 070            goodsByBarCodes = _goodService.FindGoodsByBarCodes(goodBarCodes).Result
 071                .GroupBy(x => x.GetActualBarCode())
 072                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 073            goodsByNames = _goodService.FindGoodsByNames(goodNames).Result
 074                .GroupBy(x => x.Name)
 075                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 076            restsDic = new Dictionary<long, Rest>(Database.Rests
 077                .Where(x => !x.IsDeleted && x.DepartmentId == DepartmentId)
 078                .Select(x => new KeyValuePair<long, Rest>(x.GoodId, x)));
 079        }
 80
 81        public void BeforeValidation()
 082        {
 83
 084        }
 85
 086        List<long> goodIds = new List<long>();
 87
 88        public void Import(RestRecord record)
 089        {
 090            List<Good> good = null;
 091            if (!String.IsNullOrEmpty(record.UniqueCode))
 092            {
 093                goodsByUniqueCodes.TryGetValue(record.UniqueCode.ToLower(), out good);
 094            }
 095            else if (!String.IsNullOrEmpty(record.VendorCode))
 096            {
 097                goodsByVendorCodes.TryGetValue(record.VendorCode.ToLower(), out good);
 098            }
 099            else if (!String.IsNullOrEmpty(record.BarCode))
 0100            {
 0101                goodsByBarCodes.TryGetValue(record.BarCode.ToLower(), out good);
 0102            }
 0103            else if (!String.IsNullOrEmpty(record.GoodName))
 0104            {
 0105                goodsByNames.TryGetValue(record.GoodName.ToLower(), out good);
 0106            }
 0107            if (good == null || good.Count == 0)
 0108            {
 0109                throw new ArgumentException($"Товар не найден");
 110            }
 0111            if (good.Count > 1)
 0112            {
 0113                throw new ArgumentException($"Найден более чем один товар");
 114            }
 0115            if (goodIds.Any(x => x == good.Single().Id))
 0116            {
 0117                throw new ArgumentException($"Остатки по данному товару уже найдены в загружаемом файле");
 118            }
 119            else
 0120            {
 0121                record.GoodId = good.Single().Id;
 0122                goodIds.Add(good.Single().Id);
 0123            }
 124
 125
 0126            if (!restsDic.TryGetValue(good.Single().Id, out Rest rest))
 0127            {
 0128                rest = new Rest
 0129                {
 0130                    GoodId = good.Single().Id,
 0131                    DepartmentId = DepartmentId
 0132                };
 0133                AddNewRecord(rest);
 0134            }
 0135            rest.Quantity = record.QuantityDec;
 0136            rest.IsDeleted = false;
 0137        }
 138
 0139        List<string> goodUniqueCodes = new List<string>();
 0140        List<string> goodVendorCodes = new List<string>();
 0141        List<string> goodBarCodes = new List<string>();
 0142        List<string> goodNames = new List<string>();
 143
 144        public void Validate(RestRecord record)
 0145        {
 0146            record.QuantityDec = TryGetDecimal(record.Quantity, $"Не могу преобразовать {nameof(record.Quantity)} в числ
 147
 0148            Assert(record.QuantityDec >= 0, "Quantity должно быть больше либо равно нулю");
 0149            Assert(!string.IsNullOrEmpty(record.UniqueCode) && !string.IsNullOrEmpty(record.VendorCode)
 0150                && !string.IsNullOrEmpty(record.BarCode) && !string.IsNullOrEmpty(record.GoodName),
 0151                "Не заданы UniqueCode, VendorCode, BarCode, GoodName. Должно быть задано хотя бы одно из полей.");
 152
 0153            if (!string.IsNullOrEmpty(record.UniqueCode))
 0154            {
 0155                goodUniqueCodes.Add(record.UniqueCode.ToLower());
 0156            }
 0157            else if (!string.IsNullOrEmpty(record.BarCode))
 0158            {
 0159                goodBarCodes.Add(record.BarCode.ToLower());
 0160            }
 0161            else if (!string.IsNullOrEmpty(record.GoodName))
 0162            {
 0163                goodNames.Add(record.GoodName.ToLower());
 0164            }
 0165            if (!string.IsNullOrEmpty(record.VendorCode))
 0166            {
 0167                goodVendorCodes.Add(record.VendorCode.ToLower());
 0168            }
 0169        }
 170    }
 171}