Update EKÁER config, thresholds, and value logic

- Switched DB connection to FruitBank_PROD in appsettings.json
- Added Ekaer config section: company info, thresholds, exchange rate
- Refactored CreateMissingEkaerHistories to use new settings, load related data, and apply exemption/threshold logic
- Updated controller DI to use EkaerSettings
- Centralized EKÁER config binding in PluginNopStartup
- Documented currency source issue and new value/category logic in EKAER_ISSUES.md and EKAER_TODO.md
This commit is contained in:
Loretta 2026-06-11 17:40:42 +02:00
parent 75ce276f64
commit f1db5a9a99
4 changed files with 83 additions and 14 deletions

View File

@ -14,6 +14,7 @@ using FruitBank.Common.Models;
using FruitBank.Common.Server;
using FruitBank.Common.Server.Interfaces;
using FruitBank.Common.Server.Services.Ekaer;
using FruitBank.Common.Services.Ekaer;
using FruitBank.Common.SignalRs;
using LinqToDB;
using Mango.Nop.Core.Dtos;
@ -43,6 +44,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
ILocalizationService localizationService,
PreOrderConversionService preorderConversionService,
IFruitBankEkaerService fruitBankEkaerService,
EkaerSettings ekaerSettings,
IEnumerable<IAcLogWriterBase> logWriters)
: BasePluginController, IFruitBankDataControllerServer
{
@ -369,13 +371,32 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
{
_logger.Detail($"CreateMissingEkaerHistories invoked; fromDate: {fromDate:yyyy-MM-dd}");
// Bejövő: rekord nélküli szállítólevelek a dátumtól.
var missingInbound = await ctx.ShippingDocuments.GetAll(false)
// Bejövő: rekord nélküli szállítólevelek a dátumtól — Partnerrel és tételekkel betöltve a kapuhoz
// (IsEkaer-mentesség + tömeg/érték küszöb). A fájl-blobokat NEM töltjük (csak Partner + Items).
var candidates = await ctx.ShippingDocuments.GetAll()
.Where(sd => sd.ShippingDate >= fromDate)
.Where(sd => !ctx.EkaerHistories.Table.Any(eh => eh.ForeignKey == sd.Id && !eh.IsOutgoing))
.Select(sd => new EkaerHistory { ForeignKey = sd.Id, IsOutgoing = false, StatusId = (int)EkaerStatus.Pending })
.LoadWith(sd => sd.Partner)
.LoadWith(sd => sd.ShippingItems)
.ToListAsync();
var missingInbound = new List<EkaerHistory>();
foreach (var doc in candidates)
{
// Explicit mentesítés (pl. nagybani piac, azonos cím — nincs közúti fuvar a partnerek között).
if (doc.Partner?.IsEkaer == false) continue;
var items = doc.ShippingItems ?? [];
var totalWeight = items.Sum(i => i.MeasuredGrossWeight);
var rateToHuf = EkaerValueCalculator.ResolveRateToHuf(doc.Partner?.Currency, ekaerSettings.EurHufRate);
var totalValueHuf = items.Sum(EkaerValueCalculator.ItemLineValue) * rateToHuf;
// Küszöb alatt (tömeg ÉS érték is) → nem kötelező EKÁER → nem hozunk létre sort.
if (totalWeight < ekaerSettings.ThresholdWeightKg && totalValueHuf < ekaerSettings.ThresholdValueHuf) continue;
missingInbound.Add(new EkaerHistory { ForeignKey = doc.Id, IsOutgoing = false, StatusId = (int)EkaerStatus.Pending });
}
// Kimenő: rekord nélküli, lezárt (Complete) rendelések, DateOfReceipt a dátumtól (jövőbeli is — előre-bejelentés).
var missingOutgoing = await ctx.OrderDtos.GetAllByOrderStatus(OrderStatus.Complete, false)
.Where(o => o.GenericAttributes.Any(ga => ga.Key == nameof(OrderDto.DateOfReceipt) && DateTime.Parse(ga.Value) >= fromDate.Date))

View File

@ -21,6 +21,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Nop.Core;
using Nop.Core.Domain.Orders;
using Nop.Core.Infrastructure;
using Nop.Data;
@ -192,18 +193,29 @@ public class PluginNopStartup : INopStartup
BaseUrl = c["BaseUrl"] ?? "https://import-test-b.ekaer.nav.gov.hu", // TEST; PROD: https://import.ekaer.nav.gov.hu
};
});
// EKÁER konfiguráció — egyetlen objektum (cégadat + küszöb + árfolyam), configból (appsettings "Ekaer").
// A bejelentő cégadata: a NAV-helyes 11-jegyű adószám + telefon/e-mail itt adható meg, a webshop Store-tól függetlenül.
services.AddSingleton(sp =>
{
var c = sp.GetRequiredService<IConfiguration>().GetSection("Ekaer:Company");
return new EkaerCompanyInfo
var c = sp.GetRequiredService<IConfiguration>().GetSection("Ekaer");
var co = c.GetSection("Company");
return new EkaerSettings
{
Name = c["Name"],
TaxId = c["TaxId"],
CountryCode = c["CountryCode"] ?? "HU", // a NAV EKÁER magyar
PostalCode = c["PostalCode"],
City = c["City"],
Street = c["Street"],
// UnloadLocation (saját telephely): magyar címnél a NAV Name/VatNumber/Phone/Email-t is kér — TODO configból összeállítani.
Company = new EkaerCompanyInfo
{
Name = co["Name"],
TaxId = co["TaxId"],
CountryCode = co["CountryCode"] ?? "HU", // a NAV EKÁER magyar
PostalCode = co["PostalCode"],
City = co["City"],
Street = co["Street"],
// UnloadLocation (saját telephely): magyar címnél a NAV Name/VatNumber/Phone/Email-t is kér — TODO összeállítani.
},
// Default ÉRTÉK szándékosan nincs: be nem töltött config → 0. A 0 árfolyam a számításkor hibát dob,
// a 0 küszöb „mindent jelentünk" — egyik sem számol elavult, kódba égetett értékkel.
EurHufRate = c.GetValue<double>("ExchangeRate:EurHuf"),
ThresholdWeightKg = c.GetValue<double>("Thresholds:WeightKg"),
ThresholdValueHuf = c.GetValue<long>("Thresholds:ValueHuf"),
};
});

View File

@ -27,3 +27,18 @@ Egy termékhez a kettő nem azonos; a `Gtin` oszlop VTSZ-ként való használata
**Affected:**
- `FruitBank.Common/Dtos/ProductDto.cs``Gtin` property (a `[Column(nameof(Product.Gtin))]` jelöléssel, summary-ban megjelölve)
- jövőbeli: `ShippingToEkaerMapper` (`FruitBank.Common/Services/Ekaer/`) — a `productVtsz`-t a külön `Vtsz` mezőből olvassa
## MGFBANKPLUG-EKAER-I-M6Y2: A számla-pénznem a Partnerből jön — jobb lenne a ShippingDocument-en
**Status:** Open · **Priority:** P3 · **Type:** I (adatmodell)
Az EKÁER tétel-érték HUF-ra számításához a forrás-pénznem jelenleg a **`Partner.Currency`**-ből jön (a beszállító alap-devizája). **Most 100%-ban megbízható** — a partner egyértelműen meghatározza a devizát.
**Hatás:** működik; de a pénznem **konceptuálisan a szállítmányhoz / dokumentumhoz tartozik**, nem a partnerhez (egy partner elvileg többféle devizában is számlázhat).
**Javítási irány:** külön **`Currency` oszlop a `ShippingDocument`-en**, és az `EkaerValueCalculator` / `ShippingToEkaerMapper` onnan olvasson; a `Partner.Currency` maradjon fallback. **Nem prioritás** — a jelenlegi partner-alapú forrás elegendő.
**Affected:**
- `FruitBank.Common/Entities/ShippingDocument.cs` — jövőbeli `Currency` oszlop
- `FruitBank.Common/Services/Ekaer/EkaerValueCalculator.cs` + `ShippingToEkaerMapper.cs` — a deviza-forrás
- jelenlegi forrás: `PartnerBase.Currency`

File diff suppressed because one or more lines are too long