using FruitBank.Common.Dtos; 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; } // ── Kimenő (Order) változatok ──────────────────────────────────────────── // Az érték a NETTÓ (ÁFA nélküli) egységár × mennyiség — az EKÁER „nettó érték"-et vár. /// Egy rendelés-tétel nettó értéke a számla pénznemében (UnitPriceExclTax × mennyiség), átváltás előtt. public static double ItemLineValue(OrderItemDto item) => (double)item.UnitPriceExclTax * item.Quantity; /// Egy rendelés-tétel értéke HUF-ban, egészre kerekítve. 0/ismeretlen → null (lásd a bejövő párját). public static long? ItemValueHuf(OrderItemDto item, double rateToHuf) { var huf = Math.Round(ItemLineValue(item) * rateToHuf, MidpointRounding.AwayFromZero); return huf > 0 ? (long)huf : null; } }