using FruitBank.Common.Entities;
namespace FruitBank.Common.Services.Ekaer;
///
/// 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
/// (CreateMissingEkaerHistories) között, hogy a kétféle számítás ne csúszhasson el egymástól.
///
///
/// A forrás-pénznem a Partner.Currency (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).
///
public static class EkaerValueCalculator
{
public static bool IsHuf(string? currency) => string.Equals(currency?.Trim(), "HUF", StringComparison.OrdinalIgnoreCase);
/// 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, — soha nem számolunk elavult /
/// üres árfolyammal (a config-default szándékosan nincs).
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;
}
/// Egy tétel értéke a számla pénznemében (egységár × dokumentum-mennyiség), átváltás előtt.
public static double ItemLineValue(ShippingItem item) => item.UnitPriceOnDocument * item.QuantityOnDocument;
/// Egy tétel értéke HUF-ban, egészre kerekítve. A NAV value > 0-t vár — 0/ismeretlen
/// esetén null (a mezőt nem töltjük, a validátor jelzi, ha kötelező lenne).
public static long? ItemValueHuf(ShippingItem item, double rateToHuf)
{
var huf = Math.Round(ItemLineValue(item) * rateToHuf, MidpointRounding.AwayFromZero);
return huf > 0 ? (long)huf : null;
}
}