| | | 1 | | namespace Services.ApiServices.OzonApi.Filters; |
| | | 2 | | |
| | | 3 | | /// <summary>Приводит сырые начисления Seller API к модели исторического окна отправления.</summary> |
| | | 4 | | public static class FinanceAccrualSummaryBuilder |
| | | 5 | | { |
| | | 6 | | public static FinanceAccrualSummary Build( |
| | | 7 | | FinanceAccrualPostingsResponse response, |
| | | 8 | | FinanceAccrualTypesResponse types) |
| | | 9 | | { |
| | | 10 | | ArgumentNullException.ThrowIfNull(response); |
| | | 11 | | ArgumentNullException.ThrowIfNull(types); |
| | | 12 | | |
| | | 13 | | var typeNames = types.AccrualTypes.ToDictionary( |
| | | 14 | | x => x.Id, |
| | | 15 | | x => x.Description ?? x.Name ?? $"Тип {x.Id}"); |
| | | 16 | | var operations = new List<FinanceTransactionOperation>(); |
| | | 17 | | var totals = new FinanceTransactionTotalsResult(); |
| | | 18 | | var sellerPrices = new HashSet<string>(StringComparer.Ordinal); |
| | | 19 | | |
| | | 20 | | foreach (var posting in response.PostingAccruals) |
| | | 21 | | foreach (var accrual in posting.Accruals) |
| | | 22 | | { |
| | | 23 | | var amount = accrual.Accrued?.Amount ?? 0d; |
| | | 24 | | var typeName = typeNames.GetValueOrDefault(accrual.TypeId, $"Тип начисления {accrual.TypeId}"); |
| | | 25 | | operations.Add(new FinanceTransactionOperation |
| | | 26 | | { |
| | | 27 | | OperationType = accrual.TypeId.ToString(), |
| | | 28 | | OperationTypeName = typeName, |
| | | 29 | | OperationDate = accrual.AccrualDate, |
| | | 30 | | Amount = amount, |
| | | 31 | | Posting = new FinanceTransactionPosting { PostingNumber = posting.PostingNumber }, |
| | | 32 | | Items = accrual.Sku > 0 ? new List<FinanceTransactionItem> { new() { Sku = accrual.Sku } } : new() |
| | | 33 | | }); |
| | | 34 | | |
| | | 35 | | var sellerPrice = accrual.SellerPrice?.Amount ?? 0d; |
| | | 36 | | if (sellerPrice != 0d && sellerPrices.Add($"{posting.PostingNumber}|{accrual.AccrualDate}|{accrual.Sku}|{sel |
| | | 37 | | totals.AccrualsForSale += sellerPrice; |
| | | 38 | | |
| | | 39 | | AddToCategory(totals, accrual.TypeId, typeName, amount); |
| | | 40 | | } |
| | | 41 | | |
| | | 42 | | return new FinanceAccrualSummary { Operations = operations, Totals = totals }; |
| | | 43 | | } |
| | | 44 | | |
| | | 45 | | private static void AddToCategory(FinanceTransactionTotalsResult totals, int typeId, string typeName, double amount) |
| | | 46 | | { |
| | | 47 | | var name = typeName.ToLowerInvariant(); |
| | | 48 | | if (name.Contains("commission", StringComparison.Ordinal) || name.Contains("комис", StringComparison.Ordinal)) |
| | | 49 | | totals.SaleCommission += amount; |
| | | 50 | | else if (typeId is 29 or 32 or 98 || name.Contains("delivery", StringComparison.Ordinal) || name.Contains("logis |
| | | 51 | | totals.ProcessingAndDelivery += amount; |
| | | 52 | | else if (typeId is 6 or 45 or 59 || name.Contains("return", StringComparison.Ordinal) || name.Contains("cancel", |
| | | 53 | | totals.RefundsAndCancellations += amount; |
| | | 54 | | else if (typeId is 10 or 25 || name.Contains("compensation", StringComparison.Ordinal)) |
| | | 55 | | totals.CompensationAmount += amount; |
| | | 56 | | else if (typeId is 12 or 15 or 38 or 39 or 41 or 46 or 48 or 54 or 77 or 78 or 84 or 96 || name.Contains("promot |
| | | 57 | | totals.ServicesAmount += amount; |
| | | 58 | | else |
| | | 59 | | totals.OthersAmount += amount; |
| | | 60 | | } |
| | | 61 | | } |
| | | 62 | | |
| | | 63 | | public sealed class FinanceAccrualSummary |
| | | 64 | | { |
| | 3 | 65 | | public List<FinanceTransactionOperation> Operations { get; init; } = new(); |
| | 5 | 66 | | public FinanceTransactionTotalsResult Totals { get; init; } = new(); |
| | | 67 | | } |