< Summary

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

Metrics

MethodLine coverage Branch coverage
get_UniqueCode()0%100%
get_VendorCode()0%100%
get_BarCode()0%100%
get_GoodName()0%100%
get_Quantity()0%100%
get_QuantityDec()0%100%
get_GoodId()0%100%

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("**Уникальный код товара")]
 021        public string UniqueCode { get; set; }
 22
 23        [MapTo("**Артикул")]
 024        public string VendorCode { get; set; }
 25
 26        [MapTo("**Штрихкод")]
 027        public string BarCode { get; set; }
 28
 29        [MapTo("**Название товара")]
 030        public string GoodName { get; set; }
 31
 32        [MapTo("*Количество")]
 033        public string Quantity { get; set; }
 34
 35
 036        public decimal QuantityDec { get; set; }
 037        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,
 45            SvetaDbContext db) : base(authenticationService, db)
 46        {
 47            _goodService = goodService;
 48        }
 49
 50        public long DepartmentId { get => (long)Context["departmentId"]; }
 51
 52        public void AfterImport()
 53        {
 54
 55        }
 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()
 64        {
 65            goodsByUniqueCodes = _goodService.FindGoodsByUniqueCodes(goodUniqueCodes).Result
 66                .ToDictionary(x => x.UniqueCode.ToLower(), x => new List<Good> { x });
 67            goodsByVendorCodes = _goodService.FindGoodsByVendorsCodes(goodVendorCodes, DepartmentId).Result
 68                .GroupBy(x => x.GetActualVendorCode(DepartmentId))
 69                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 70            goodsByBarCodes = _goodService.FindGoodsByBarCodes(goodBarCodes).Result
 71                .GroupBy(x => x.GetActualBarCode())
 72                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 73            goodsByNames = _goodService.FindGoodsByNames(goodNames).Result
 74                .GroupBy(x => x.Name)
 75                .ToDictionary(x => x.Key.ToLower(), x => x.ToList());
 76            restsDic = new Dictionary<long, Rest>(Database.Rests
 77                .Where(x => !x.IsDeleted && x.DepartmentId == DepartmentId)
 78                .Select(x => new KeyValuePair<long, Rest>(x.GoodId, x)));
 79        }
 80
 81        public void BeforeValidation()
 82        {
 83
 84        }
 85
 86        List<long> goodIds = new List<long>();
 87
 88        public void Import(RestRecord record)
 89        {
 90            List<Good> good = null;
 91            if (!String.IsNullOrEmpty(record.UniqueCode))
 92            {
 93                goodsByUniqueCodes.TryGetValue(record.UniqueCode.ToLower(), out good);
 94            }
 95            else if (!String.IsNullOrEmpty(record.VendorCode))
 96            {
 97                goodsByVendorCodes.TryGetValue(record.VendorCode.ToLower(), out good);
 98            }
 99            else if (!String.IsNullOrEmpty(record.BarCode))
 100            {
 101                goodsByBarCodes.TryGetValue(record.BarCode.ToLower(), out good);
 102            }
 103            else if (!String.IsNullOrEmpty(record.GoodName))
 104            {
 105                goodsByNames.TryGetValue(record.GoodName.ToLower(), out good);
 106            }
 107            if (good == null || good.Count == 0)
 108            {
 109                throw new ArgumentException($"Товар не найден");
 110            }
 111            if (good.Count > 1)
 112            {
 113                throw new ArgumentException($"Найден более чем один товар");
 114            }
 115            if (goodIds.Any(x => x == good.Single().Id))
 116            {
 117                throw new ArgumentException($"Остатки по данному товару уже найдены в загружаемом файле");
 118            }
 119            else
 120            {
 121                record.GoodId = good.Single().Id;
 122                goodIds.Add(good.Single().Id);
 123            }
 124
 125
 126            if (!restsDic.TryGetValue(good.Single().Id, out Rest rest))
 127            {
 128                rest = new Rest
 129                {
 130                    GoodId = good.Single().Id,
 131                    DepartmentId = DepartmentId
 132                };
 133                AddNewRecord(rest);
 134            }
 135            rest.Quantity = record.QuantityDec;
 136            rest.IsDeleted = false;
 137        }
 138
 139        List<string> goodUniqueCodes = new List<string>();
 140        List<string> goodVendorCodes = new List<string>();
 141        List<string> goodBarCodes = new List<string>();
 142        List<string> goodNames = new List<string>();
 143
 144        public void Validate(RestRecord record)
 145        {
 146            record.QuantityDec = TryGetDecimal(record.Quantity, $"Не могу преобразовать {nameof(record.Quantity)} в числ
 147
 148            Assert(record.QuantityDec >= 0, "Quantity должно быть больше либо равно нулю");
 149            Assert(!string.IsNullOrEmpty(record.UniqueCode) && !string.IsNullOrEmpty(record.VendorCode)
 150                && !string.IsNullOrEmpty(record.BarCode) && !string.IsNullOrEmpty(record.GoodName),
 151                "Не заданы UniqueCode, VendorCode, BarCode, GoodName. Должно быть задано хотя бы одно из полей.");
 152
 153            if (!string.IsNullOrEmpty(record.UniqueCode))
 154            {
 155                goodUniqueCodes.Add(record.UniqueCode.ToLower());
 156            }
 157            else if (!string.IsNullOrEmpty(record.BarCode))
 158            {
 159                goodBarCodes.Add(record.BarCode.ToLower());
 160            }
 161            else if (!string.IsNullOrEmpty(record.GoodName))
 162            {
 163                goodNames.Add(record.GoodName.ToLower());
 164            }
 165            if (!string.IsNullOrEmpty(record.VendorCode))
 166            {
 167                goodVendorCodes.Add(record.VendorCode.ToLower());
 168            }
 169        }
 170    }
 171}