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:
parent
75ce276f64
commit
f1db5a9a99
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
};
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue