41 lines
2.2 KiB
C#
41 lines
2.2 KiB
C#
using FruitBank.Common.Entities;
|
||
|
||
namespace FruitBank.Common.Services.Ekaer;
|
||
|
||
/// <summary>
|
||
/// A tétel-érték HUF-ra számítása — közös a leképezés (tradeCardItem.value) és a küszöb-kapu
|
||
/// (<c>CreateMissingEkaerHistories</c>) között, hogy a kétféle számítás ne csúszhasson el egymástól.
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// A forrás-pénznem a <c>Partner.Currency</c> (ISO 4217). Jelenleg csak HUF és EUR van használatban
|
||
/// (100%-ban a partnerből következik): HUF → nincs átváltás, minden más → EUR-ként, az árfolyammal.
|
||
/// Ha valaha más deviza is megjelenik, ezt a feltevést bővíteni kell (akkor per-deviza árfolyam kell).
|
||
/// </remarks>
|
||
public static class EkaerValueCalculator
|
||
{
|
||
public static bool IsHuf(string? currency) => string.Equals(currency?.Trim(), "HUF", StringComparison.OrdinalIgnoreCase);
|
||
|
||
/// <summary>A forrás-pénznem → HUF szorzó. HUF → 1 (árfolyam nem kell). Minden más (EUR) → a megadott
|
||
/// EUR-HUF árfolyam; ha az hiányzik/0, <see cref="InvalidOperationException"/> — soha nem számolunk elavult /
|
||
/// üres árfolyammal (a config-default szándékosan nincs).</summary>
|
||
public static double ResolveRateToHuf(string? currency, double eurHufRate)
|
||
{
|
||
if (IsHuf(currency)) return 1d;
|
||
if (eurHufRate <= 0)
|
||
throw new InvalidOperationException(
|
||
"EKÁER EUR-HUF árfolyam nincs konfigurálva (appsettings Ekaer:ExchangeRate:EurHuf) — külföldi (nem HUF) értéket nem lehet HUF-ra számolni.");
|
||
return eurHufRate;
|
||
}
|
||
|
||
/// <summary>Egy tétel értéke a számla pénznemében (egységár × dokumentum-mennyiség), átváltás előtt.</summary>
|
||
public static double ItemLineValue(ShippingItem item) => item.UnitPriceOnDocument * item.QuantityOnDocument;
|
||
|
||
/// <summary>Egy tétel értéke HUF-ban, egészre kerekítve. A NAV <c>value > 0</c>-t vár — 0/ismeretlen
|
||
/// esetén <c>null</c> (a mezőt nem töltjük, a validátor jelzi, ha kötelező lenne).</summary>
|
||
public static long? ItemValueHuf(ShippingItem item, double rateToHuf)
|
||
{
|
||
var huf = Math.Round(ItemLineValue(item) * rateToHuf, MidpointRounding.AwayFromZero);
|
||
return huf > 0 ? (long)huf : null;
|
||
}
|
||
}
|