Fix international order VAT and currencies in Enova and Optima

This commit is contained in:
janusz committed 2026-10-29 01:31:13 +01:00
1 parent 75ef1ed69c
commit 248d7bac64
23 files changed
+308 -34

No files matched your search

@@ -0,0 +1,81 @@
namespace SmartB2B.Optima.Tests;
// Atrapa granicy COM sprawdza przebieg rzeczywistej fasady bez instalacji Optimy.
public sealed class FakeOrderSession
{
public FakeOrderDocument Document { get; } = new();
public bool Saved { get; private set; }
public FakeOrderCollection CreateObject(string name) => new(name, Document);
public void Save() => Saved = true;
}
public sealed class FakeOrderCollection(string name, FakeOrderDocument document)
{
public object? Item(string filter) => name switch
{
"CDN.DefinicjeDokumentow" => new FakeOrderDefinition(),
"CDN.Kontrahenci" or "CDN.Magazyny" or "CDN.Towary" => new object(),
"CDN.Waluty" => new[] { "PLN", "EUR", "USD", "CZK" }
.Any(currency => filter == $"WNa_Symbol='{currency}'") ? new object() : null,
_ => throw new InvalidOperationException($"Nieoczekiwana kolekcja: {name}")
};
public FakeOrderDocument AddNew() => name == "CDN.DokumentyHaMag"
? document : throw new InvalidOperationException($"Nieoczekiwana kolekcja: {name}");
}
public sealed class FakeOrderDefinition
{
public int Klasa => 308;
}
public sealed class FakeOrderDocument
{
public int Rodzaj { get; set; }
public int TypDokumentu { get; set; }
public object? Podmiot { get; set; }
public int Bufor { get; set; }
public int MagazynZrodlowyID { get; set; }
public string? NumerObcy { get; set; }
public string? Uwagi { get; set; }
public string WalutaSymbol { get; set; } = "PLN";
public int Export { get; set; }
public int TypNB => 1;
public int ID => 42;
public string NumerPelny => "RO/42/2026";
public FakeOrderElements Elementy { get; }
public decimal RazemNettoWal => Elementy.Items.Sum(line => line.Net);
public decimal RazemBruttoWal => Elementy.Items.Sum(line => line.Net * (line.ExportWhenProductAssigned == 0 ? 1.23m : 1m));
public FakeOrderDocument() => Elementy = new(this);
}
public sealed class FakeOrderElements(FakeOrderDocument document)
{
public List<FakeOrderElement> Items { get; } = [];
public FakeOrderElement AddNew()
{
var item = new FakeOrderElement(document);
Items.Add(item);
return item;
}
}
public sealed class FakeOrderElement(FakeOrderDocument document)
{
public int ExportWhenProductAssigned { get; private set; }
public string? CurrencyWhenProductAssigned { get; private set; }
public object Towar
{
set
{
ExportWhenProductAssigned = document.Export;
CurrencyWhenProductAssigned = document.WalutaSymbol;
}
}
public double Ilosc { get; set; }
public decimal Cena0 { get; set; }
public double Rabat { get; set; }
public decimal Net => Convert.ToDecimal(Ilosc) * Cena0 * (1m - Convert.ToDecimal(Rabat) / 100m);
}