< Summary

Information
Class: Services.ApiSupplierSettingsServices.ArmtekDeliveryAddressMappingService
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiSupplierSettings/ArmtekDeliveryAddressMappingService.cs
Line coverage
100%
Covered lines: 42
Uncovered lines: 0
Coverable lines: 42
Total lines: 77
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.ctor(...)100%11100%
ResolveAsync()100%44100%
ResolveWarehouseAsync(...)100%11100%
GetAsync(...)100%11100%
ReplaceAsync()100%66100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiSupplierSettings/ArmtekDeliveryAddressMappingService.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4
 5namespace Services.ApiSupplierSettingsServices;
 6
 7public sealed record ArmtekDeliveryAddressSelection(int ShipmentWarehouseId, string BuyerKunnr, string DeliveryAddressKu
 8public sealed record ArmtekDeliveryAddressMappingInput(int ShipmentWarehouseId, string? BuyerKunnr, string? DeliveryAddr
 9
 10/// <summary>Разрешает адрес доставки Armtek из склада отгрузки заказа.</summary>
 11public sealed class ArmtekDeliveryAddressMappingService
 12{
 13    private readonly ApplicationDbContext _context;
 14    private readonly ApiSupplierDeliveryWarehouseResolver _warehouseResolver;
 15    public ArmtekDeliveryAddressMappingService(ApplicationDbContext context)
 17616        : this(context, new ApiSupplierDeliveryWarehouseResolver(context)) { }
 17
 8918    public ArmtekDeliveryAddressMappingService(ApplicationDbContext context, ApiSupplierDeliveryWarehouseResolver wareho
 19    {
 8920        _context = context;
 8921        _warehouseResolver = warehouseResolver;
 8922    }
 23
 24    public async Task<ArmtekDeliveryAddressSelection?> ResolveAsync(string providerKey, int? orderId,
 25        string? zasylWarehouseName = null, CancellationToken cancellationToken = default)
 26    {
 4027        var warehouse = await ResolveWarehouseAsync(orderId, zasylWarehouseName, cancellationToken);
 3928        if (!warehouse.WarehouseId.HasValue)
 1129            return null;
 30
 2831        var mapping = await _context.ArmtekDeliveryAddressMappings.AsNoTracking()
 2832            .SingleOrDefaultAsync(x => x.ProviderKey == providerKey && x.ShipmentWarehouseId == warehouse.WarehouseId.Va
 2833                cancellationToken);
 2834        return mapping is null ? null : new ArmtekDeliveryAddressSelection(mapping.ShipmentWarehouseId, mapping.BuyerKun
 3935    }
 36
 37    public Task<ApiSupplierDeliveryWarehouseResolution> ResolveWarehouseAsync(int? orderId,
 38        string? zasylWarehouseName = null, CancellationToken cancellationToken = default) =>
 4239        _warehouseResolver.ResolveAsync(orderId, zasylWarehouseName, cancellationToken);
 40
 41    public Task<List<ArmtekDeliveryAddressMapping>> GetAsync(string providerKey, CancellationToken cancellationToken = d
 2242        _context.ArmtekDeliveryAddressMappings.AsNoTracking()
 2243            .Where(x => x.ProviderKey == providerKey)
 2244            .Include(x => x.ShipmentWarehouse)
 2245            .OrderBy(x => x.ShipmentWarehouse.Name)
 2246            .ToListAsync(cancellationToken);
 47
 48    public async Task ReplaceAsync(string providerKey, IReadOnlyCollection<ArmtekDeliveryAddressMappingInput> inputs,
 49        CancellationToken cancellationToken = default)
 50    {
 2151        var selected = inputs
 3352            .Where(x => !string.IsNullOrWhiteSpace(x.BuyerKunnr) && !string.IsNullOrWhiteSpace(x.DeliveryAddressKunnr))
 2153            .Select(x => new ArmtekDeliveryAddressMappingInput(x.ShipmentWarehouseId, x.BuyerKunnr!.Trim(), x.DeliveryAd
 2154            .ToList();
 55
 4256        var warehouseIds = selected.Select(x => x.ShipmentWarehouseId).ToList();
 4057        if (warehouseIds.Distinct().Count() != warehouseIds.Count || warehouseIds.Any(x => x <= 0))
 458            throw new InvalidOperationException("Склад можно связать с Armtek только один раз.");
 59
 1760        var validWarehouseIds = await _context.Warehouses.Where(x => warehouseIds.Contains(x.Id)).Select(x => x.Id)
 1761            .ToListAsync(cancellationToken);
 1662        if (validWarehouseIds.Count != warehouseIds.Count)
 163            throw new InvalidOperationException("Один из выбранных складов не найден.");
 64
 1565        var existing = await _context.ArmtekDeliveryAddressMappings.Where(x => x.ProviderKey == providerKey)
 1566            .ToListAsync(cancellationToken);
 1567        _context.ArmtekDeliveryAddressMappings.RemoveRange(existing);
 2968        _context.ArmtekDeliveryAddressMappings.AddRange(selected.Select(x => new ArmtekDeliveryAddressMapping
 2969        {
 2970            ProviderKey = providerKey,
 2971            ShipmentWarehouseId = x.ShipmentWarehouseId,
 2972            BuyerKunnr = x.BuyerKunnr!,
 2973            DeliveryAddressKunnr = x.DeliveryAddressKunnr!
 2974        }));
 1575        await _context.SaveChangesAsync(cancellationToken);
 1576    }
 77}