< Summary

Information
Class: OzonOrdersWeb.Areas.Settlements.Models.ArmtekSettlementsPageViewModel
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Settlements/Models/ArmtekSettlementsViewModels.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 12
Coverable lines: 12
Total lines: 94
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Tab()100%210%
get_SettlementsCount()100%210%
get_InvoicesCount()100%210%
get_ItemsCount()100%210%
get_LastUpdatedAtUtc()100%210%
get_LastError()100%210%
get_LastErrorAtUtc()100%210%
get_Schedule()100%210%
get_Balance()100%210%
get_BalanceCurrency()100%210%
get_BalanceDate()100%210%
get_CanSync()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Settlements/Models/ArmtekSettlementsViewModels.cs

#LineLine coverage
 1using System.Text.Json;
 2using OzonDomains.Models.ArmtekEtp;
 3
 4namespace OzonOrdersWeb.Areas.Settlements.Models;
 5
 6public sealed class ArmtekSettlementsPageViewModel
 7{
 08    public string Tab { get; init; } = "settlements";
 09    public int SettlementsCount { get; init; }
 010    public int InvoicesCount { get; init; }
 011    public int ItemsCount { get; init; }
 012    public DateTime? LastUpdatedAtUtc { get; init; }
 013    public string? LastError { get; init; }
 014    public DateTime? LastErrorAtUtc { get; init; }
 015    public string Schedule { get; init; } = string.Empty;
 016    public decimal? Balance { get; init; }
 017    public string? BalanceCurrency { get; init; }
 018    public DateTime? BalanceDate { get; init; }
 019    public bool CanSync { get; init; }
 20}
 21
 22/// <summary>Строка шапки фактуры для страницы: название, код партнёра и значение (как в кабинете Armtek).</summary>
 23public sealed record ArmtekInvoiceHeaderRow(string Label, string? Code, string Value);
 24
 25public sealed class ArmtekInvoicePageViewModel
 26{
 27    public string Kunnr { get; init; } = string.Empty;
 28    public string Vbeln { get; init; } = string.Empty;
 29    public long? InvoiceId { get; init; }
 30    public DateTime? LoadedAtUtc { get; init; }
 31    public bool HasInvoicePage { get; init; }
 32    public IReadOnlyList<ArmtekInvoiceHeaderRow> Header { get; init; } = [];
 33    public decimal TotalAmount { get; init; }
 34    public decimal TotalQuantity { get; init; }
 35    public decimal ReturnedQuantity { get; init; }
 36    public string? Currency { get; init; }
 37
 38    /// <summary>
 39    /// Шапка берётся из сохранённых строк кабинета (HeaderJson) — там все строки, в том числе те, что не разобраны в ко
 40    /// Без фактуры (платёж, ещё не загружена) показываются поля строки взаиморасчётов.
 41    /// </summary>
 42    public static ArmtekInvoicePageViewModel Build(string kunnr, string vbeln, ArmtekInvoice? invoice, ArmtekSettlement?
 43    {
 44        var header = new List<ArmtekInvoiceHeaderRow>();
 45        if (invoice != null)
 46        {
 47            try
 48            {
 49                using var doc = JsonDocument.Parse(invoice.HeaderJson);
 50                foreach (var f in doc.RootElement.EnumerateArray())
 51                {
 52                    var label = f.TryGetProperty("Label", out var l) ? l.GetString() : null;
 53                    var code = f.TryGetProperty("Code", out var c) && c.ValueKind == JsonValueKind.String ? c.GetString(
 54                    var text = f.TryGetProperty("Text", out var tx) ? tx.GetString() ?? string.Empty : string.Empty;
 55                    if (string.IsNullOrWhiteSpace(label)) continue;
 56                    if (code != null && text.StartsWith(code, StringComparison.Ordinal))
 57                        text = text[code.Length..].Trim();
 58                    header.Add(new ArmtekInvoiceHeaderRow(label, code, text));
 59                }
 60            }
 61            catch (JsonException)
 62            {
 63                // Битый снимок шапки — страница всё равно покажет позиции.
 64            }
 65        }
 66        else if (settlement != null)
 67        {
 68            void Add(string label, string? value) { if (!string.IsNullOrWhiteSpace(value)) header.Add(new ArmtekInvoiceH
 69            Add("Дата документа", settlement.DocDate?.ToString("dd.MM.yyyy"));
 70            Add("Тип документа", settlement.DocTypeName ?? settlement.DocType);
 71            Add("Номер документа", settlement.PrintNumber ?? settlement.DocNumber);
 72            Add("Клиент", settlement.ClientName);
 73            Add("Сумма", settlement.Amount.ToString("N2"));
 74            Add("Сумма возврата", settlement.ReturnAmount.ToString("N2"));
 75            Add("Сумма платежа", settlement.PaymentAmount.ToString("N2"));
 76            Add("Сальдо", settlement.Balance?.ToString("N2"));
 77            Add("Договор", settlement.Contract);
 78        }
 79
 80        return new ArmtekInvoicePageViewModel
 81        {
 82            Kunnr = kunnr,
 83            Vbeln = vbeln,
 84            InvoiceId = invoice?.Id,
 85            LoadedAtUtc = invoice?.LoadedAtUtc,
 86            HasInvoicePage = invoice != null || settlement?.DocType is { } t && Services.ArmtekEtpServices.ArmtekEtpSync
 87            Header = header,
 88            TotalAmount = invoice?.TotalAmount ?? 0,
 89            TotalQuantity = invoice?.TotalQuantity ?? 0,
 90            ReturnedQuantity = invoice?.ReturnedQuantity ?? 0,
 91            Currency = settlement?.Currency
 92        };
 93    }
 94}