74 lines
3.8 KiB
C#
74 lines
3.8 KiB
C#
using AyCode.Services.Nav;
|
|
using AyCode.Services.Nav.Ekaer;
|
|
using AyCode.Services.Nav.Ekaer.Models;
|
|
using FruitBank.Common.Entities;
|
|
using FruitBank.Common.Services.Ekaer;
|
|
|
|
namespace FruitBank.Common.Server.Services.Ekaer;
|
|
|
|
/// <inheritdoc cref="IFruitBankEkaerService"/>
|
|
/// <remarks>
|
|
/// A teljes lánc: <c>map</c> (<see cref="IShippingToEkaerMapper"/>, FruitBank.Common) →
|
|
/// <c>validate → send</c> (<see cref="IEkaerSubmitService"/>, AyCode.Services). A saját cégadatot
|
|
/// (<see cref="EkaerSettings.Company"/>) és a NAV-fiók hitelesítő adatait a DI szolgáltatja.
|
|
/// </remarks>
|
|
public sealed class FruitBankEkaerService : IFruitBankEkaerService
|
|
{
|
|
private readonly IShippingToEkaerMapper _mapper;
|
|
private readonly IEkaerSubmitService _submitService;
|
|
private readonly IEkaerTradeCardValidator _validator;
|
|
private readonly EkaerSettings _settings;
|
|
|
|
public FruitBankEkaerService(IShippingToEkaerMapper mapper, IEkaerSubmitService submitService, IEkaerTradeCardValidator validator, EkaerSettings settings)
|
|
{
|
|
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
|
|
_submitService = submitService ?? throw new ArgumentNullException(nameof(submitService));
|
|
_validator = validator ?? throw new ArgumentNullException(nameof(validator));
|
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
|
}
|
|
|
|
public Task<EkaerSubmitResult> SubmitShippingAsync(Shipping shipping, OperationType operation = OperationType.Create, CancellationToken cancellationToken = default)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(shipping);
|
|
|
|
// map (FruitBank.Common) → submit: validate → send (AyCode.Services)
|
|
var operations = _mapper.MapShipping(shipping, _settings.Company, operation);
|
|
return _submitService.SubmitAsync(operations, cancellationToken);
|
|
}
|
|
|
|
public EkaerHistory GenerateEkaerXmlDocument(ShippingDocument document, EkaerHistory? ekaerHistory = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(document);
|
|
|
|
ekaerHistory ??= new EkaerHistory { ForeignKey = document.Id, IsOutgoing = false };
|
|
|
|
// Config-ellenőrzés a leképezés ELŐTT: külföldi (nem HUF) feladónál az árfolyam kötelező — különben a
|
|
// value csendben 0 lenne. Hibás configgal nem generálunk félrevezető XML-t, hanem jelezzük a hibát.
|
|
if (!EkaerValueCalculator.IsHuf(document.Partner?.Currency) && _settings.EurHufRate <= 0)
|
|
{
|
|
ekaerHistory.Status = EkaerStatus.ValidationError;
|
|
ekaerHistory.ErrorText = "EKÁER EUR-HUF árfolyam nincs konfigurálva (appsettings Ekaer:ExchangeRate:EurHuf) — a tétel-érték nem számolható.";
|
|
return ekaerHistory;
|
|
}
|
|
|
|
var operation = new TradeCardOperationType
|
|
{
|
|
Index = 1,
|
|
Operation = OperationType.Create,
|
|
TradeCard = _mapper.MapDocument(document, _settings.Company),
|
|
};
|
|
|
|
var errors = _validator.Validate(operation);
|
|
|
|
// Az XML validációs hibánál IS tárolódik — a detail-nézetben így látszik, mi hiányzik.
|
|
ekaerHistory.XmlDoc = NavXmlHelper.Serialize(operation.TradeCard);
|
|
// Audit: a value-számításhoz TÉNYLEGESEN alkalmazott árfolyam (HUF → 1, külföldi → FX-ráta) — pont az,
|
|
// amivel a value készült. A NAV-sémában nincs árfolyam-mező, csak a HUF value; ez az oszlop őrzi meg, hogyan.
|
|
ekaerHistory.ConversionRate = EkaerValueCalculator.ResolveRateToHuf(document.Partner?.Currency, _settings.EurHufRate);
|
|
ekaerHistory.Status = errors.Count == 0 ? EkaerStatus.Generated : EkaerStatus.ValidationError;
|
|
ekaerHistory.ErrorText = errors.Count == 0 ? null : string.Join(Environment.NewLine, errors.Select(e => e.ErrorMessage));
|
|
|
|
return ekaerHistory;
|
|
}
|
|
}
|